So sánh crystal report với reporting

presently we are giving reports to our customers using ASP technology, we get data from database using sql and print data as html to browser.

our database is getting migrated to oracle from sql server. so they want to use either oracle reports or crystal reports

i have gone through the crystal reports, in crystal reports. can any one tell me whether below things are also possible in oracle reports we need to dispaly the reports in the web browser using ASP 1. you can create summary reports and drill down to details 2. create sub reports and link with main report. limitation here is you can navigate onely to one sub report level.. you cannot have nested sub reports 3. can call crystal report from asp page 4. export the report to excel/pdf/word formats 5. matrix kind of reports are possible, crystal calls them as cross tab reports 6. you can link a stored procedure to the report and crystal report will execute this stored procedure and didplay data

are there any special features in oracle whic are unique to oracle reports

Thanks in advance. what ever information you can give will be of lot of help in our evaluation

Krishna

  • 1.
  • 2. 1: Tổng quan về Crystal Reports .NET............................................................5 1.1 Crystal Reports là gì?.................................................................................................5 1.2 Đặc điểm của Crystal Reports....................................................................................5 Chương 2: Thiết kế một báo cáo sử dụng Report Design Environment......................7 2.1 Các thành phần Report Designer...............................................................................7 2.2 Các vần đề cơ bản thiết kế báo cáo............................................................................8 2.2.1 Các Section của một báo cáo..............................................................................8 2.2.2 Các đối tượng trong Field Explorer:...................................................................9 2.3 Thiết kế một báo cáo đơn giản:................................................................................10 2.3.1 Thêm một báo cáo mới vào ứng dụng..............................................................11 2.3.2 Chọn dữ liệu nguồn (data source).....................................................................14 2.3.3 Thiết lập mối quan hệ giữa các bảng................................................................17 2.3.4 Chọn ra các Field cho bản báo cáo...................................................................17 2.3.5 Gộp nhóm và Sắp xếp (Grouping - Sorting).....................................................19 2.3.6 Bổ sung thông tin tổng kết................................................................................20 2.3.7 Các tính năng phân tích.....................................................................................21 2.3.8 Biểu đồ và Đồ thị (Charting - Graphing)..........................................................23 2.3.9 Sàng lọc thông tin trên bản báo cáo..................................................................24 2.3.10 Chọn kiểu định dạng cho báo cáo...................................................................25 2.3.11 Hoàn tất cơ bản việc thiết kế bản báo cáo.......................................................26 2.4 Preview bản báo cáo................................................................................................27 2.5 Tinh chỉnh và hoàn thiện bản báo cáo.....................................................................28 2.5.1 Định dạng các phân đoạn..................................................................................30 2.5.2 Định dạng các Field:.........................................................................................31 2.5.3 Hiệu chỉnh Sắp xếp...........................................................................................32 2.5.4 Hiệu chỉnh Gộp nhóm.......................................................................................34 2.5.5 Vẽ khung...........................................................................................................35 Chương 3 : Công thức Basic Syntax..............................................................................38 3.1 Hộp thoại Formula Editor........................................................................................38 3.1.1 Các thành phần chính........................................................................................39 2
  • 3. lỗi cú pháp..........................................................................................40 3.2 Định dạng động sử dụng công thức.........................................................................41 3.3 Tạo các công thức với Basic Syntax........................................................................44 3.3.1 Các qui ước lập trình Basic Syntax...................................................................44 3.3.1.1 Viết các ghi chú, diễn giải..........................................................................44 3.3.1.2 Trình bày các câu lệnh...............................................................................44 3.3.1.3 Tham chiếu các field báo cáo.....................................................................45 3.3.1.4 Khai báo biến.............................................................................................45 3.3.2 Các kiểu dữ liệu................................................................................................46 3.3.2.1 Các kiểu dữ liệu chuẩn...............................................................................46 3.3.2.2 Kiểu dữ liệu mảng......................................................................................46 3.3.2.3 Kiểu dữ liệu Range....................................................................................47 3.3.3 Các toán tử đơn giản.........................................................................................49 3.3.3.1 Toán tử toán học........................................................................................50 3.3.3.2 Toán tử Boolean.........................................................................................50 3.3.3.3 Toán tử so sánh..........................................................................................51 3.3.3.4 Toán tử chuyển đổi kiểu dữ liệu................................................................51 3.3.4 Các Hàm cơ bản................................................................................................53 3.3.4.1 Các hàm tổng kết.......................................................................................53 3.3.4.2 Các hàm xử lý chuỗi..................................................................................53 3.3.4.3 Các hàm Date & Time ..............................................................................57 3.3.4.4 Các hàm toán học.......................................................................................58 3.3.4.5 Định dạng các trị kết xuất..........................................................................59 3.3.5. Các cấu trúc điểu khiển....................................................................................60 3.3.5.1 Các cấu trúc điều kiện................................................................................60 3.3.5.2 Các cấu trúc lặp..........................................................................................61 3.4 Công thức chuyển đổi số thành chuỗi Tiếng Việt....................................................62 Chương 4: Crystal Reports Object Model....................................................................66 4.1 Các bước cơ bản để tùy biến bảng báo cáo..............................................................66 4.2 Đối tượng ReportDocument.....................................................................................68 4.3 Đối tượng DataDefinition:.......................................................................................70 3
  • 4. các lớp Sorting và Grouping:............................................................70 4.3.2 Ví dụ Modify Sorting:.......................................................................................74 4.4 Đối tượng CrystalReportViewer:.............................................................................76 Chương 5: Vấn đề kết xuất báo cáo trong trường hợp dữ liệu nguồn bị thay đổi....80 5.1 Lớp Database:..........................................................................................................81 5.2 Thay đổi thông tin kết nối với bảng dữ liệu nguồn..................................................81 5.2.1 Sử dụng ReportDocument.................................................................................83 5.2.2 Sử dụng CrystalReportViewer .........................................................................83 Chương 6: Kết xuất báo cáo ra máy in, word, excel:...................................................85 6.1 Xuất báo cáo thông qua Viewer...............................................................................85 6.1.1 Ra máy in..........................................................................................................85 6.1.2 Ra tập tin...........................................................................................................86 6.2 Xuất báo cáo thông qua lập trình.............................................................................87 6.2.1 Ra máy in..........................................................................................................87 6.2.2 Ra tập tin...........................................................................................................88 Tài liệu tham khảo...........................................................................................................88 4
  • 5. Crystal Reports .NET Chương 1: Tổng quan về Crystal Reports .NET 1.1 Crystal Reports là gì? Crystal Reports là công cụ thiết kế báo cáo cho phép bạn tạo ra những báo cáo bằng cách tìm và định dạng dữ liệu từ một nguồn dữ liệu hay từ những nguồn dữ liệu khác nhau .Bên cạnh đó , Crystal Reports có một ngôn ngữ riêng để tính toán và một số tính năng khác để biến những dữ liệu thô thành những báo cáo đầy tính chuyên nghiệp.Bạn có thể tạo những báo cáo đi từ những danh sách đơn giản chỉ gồm vài cột cho đến những báo cáo phức tạp có kém biểu đồ ,bảng và chỉ số Key Performance Indicator (KPI).Ngoài ra , Crystal Reports có một số hàm API cũng như công cụ đặc biệt được thiết kế dành cho các nhà phát triển phần mềm cho phép hội nhập các báo cáo này vào trong ứng dụng riêng của họ. 1.2 Đặc điểm của Crystal Reports - Bạn không cần mở một ứng dụng riêng rẽ để thiết kế báo cáo khi dùng Crystal Reports - Đối với Windows Form , Crystal Reports cho phép xem báo cáo và cung cấp tất cả các chức năng cho người sử dụng bao gồm xoáy sâu vào chi tiết ,truy xuất ,xuất khẩu…Đối với ASP.NET ,cung cấp phần lớn các chức năng trong Windows Form Viewer trong môi trường DHTML “zero client ” (Nghĩa là không client nào được nạp xuống hay cài đặt). - Crystal Reports giúp việc truy cập dữ liệu trở nên dễ dàng hơn. - Crystal Reports cho phép truy cập những dữ liệu nguồn khác nhau. 03HC329 – 03HC330 – 03HC437 5
  • 6. Crystal Reports .NET - Crystal Reports cho phép chia sẻ sử dụng các bảng báo cáo cũng như tạo những ứng dụng được phân phối sử dụng cho nhiều người dùng. 03HC329 – 03HC330 – 03HC437 6
  • 7. Chương 2: Thiết kế một báo cáo sử dụng Report Design Environment Trong chương này ta sẽ lần lượt sử dụng Report Designer bên trong Visual Studio.NET để thiết kế một báo cáo đơn giản. Bạn sẽ thấy trong chương này bạn chỉ đơn giản là click chọn và kéo thả là có thể hoàn thành một báo cáo mà không cần phải lập trình gì cả. 2.1 Các thành phần Report Designer Trên Crystal Reports.NET cung cấp cho bạn các cửa sổ và các thanh công cụ giúp bạn thuận tiện hơn trong khi thiết kế báo cáo như hình 2-01. Hình 2-01: Các thành phần của Report Designer 03HC329 – 03HC330 – 03HC437 7
  • 8. Thanh công cụ Crystal Reports – Main chứa các control định dạng như Font, Size... .Thanh công cụ Crystal Reports – Insert cho phép bạn chèn vào Summary, Group, Subreport, Chart và Picture. Hộp công cụ Crystal Reports cho phép bạn thêm vào các đối tượng Text, Line và Box. Muốn thêm một Field vào báo cáo, thì có cửa sổ Field Explorer. Bạn chỉ cần bung các nhánh tương ứng trên cửa sổ này và kéo thả Field nào bạn cần lên bản báo cáo. Cuối cùng là cửa sổ Report Designer, đây chính là nơi bạn thiết kế bản báo cáo, nó bao gồm các section, trên mỗi section sẽ chứa các field, các đối tượng báo cáo. 2.2 Các vần đề cơ bản thiết kế báo cáo 2.2.1 Các Section của một báo cáo Bảng 2-01 Các section trên báo cáo Section báo cáo Mô tả Report Header Xuất hiện trên trang đầu tiên của bản báo cáo và thường bị huỷ theo mặc nhiên .Có thể được dùng cho biết bắt đầu của một bản báo cáo mới hay dùng làm trang bìa Report Footer Xuất hiện vào cuối trang chót của bảng báo cáo,theo mặc nhiên là cho thấy và có thể dùng tổng kết báo cáo(ghi số mẫu tin ,ngày in báo cáo ,tên tập tin,…) Page Header Xuất hiện trên đầu mỗi trang (khi sang trang) và có thể dùng ghi tựa đề báo cáo,tiêu đề các cột ,số trang… Page Footer Xuất hiện vào cuối mỗi trang và có thể dùng in số trang ngày in báo cáo,… Group Header Xuất hiện trên đầu mỗi nhóm (khi có ngắt cấp bậc) và thường ghi tên nhóm mới Group Footer Xuất hiện vào cuối một nhóm mẫu tin , và thường được dùng để in ra tên nhóm cũ ,tổng cộng của nhóm hay tổng kết Details Xuất hiện đối với mỗi mẫu tin thường được dùng in thông tin của cột và có thể được bung thành section các vùng mục tin lớn hơn hoặc để tạo biểu mẫu Hình 2-02 sau đây cho thấy cách bố trí các section trên bản báo cáo 03HC329 – 03HC330 – 03HC437 8
  • 9. Hình 2-02 Cách bố trí section trên báo cáo 2.2.2 Các đối tượng trong Field Explorer: - Database Fields: Chứa tất cả các field mà bạn đưa vào bản báo cáo, các field này có thể được lấy từ Table, View hay Stored Procedures. Các field được đưa vào bản báo cáo thì một dấu check sẽ hiện lên bên cạnh, cho biết field này đang được sử dụng. - Formula Fields: dùng để đưa các tính toán phức tạp vào báo cáo.Có 2 cú pháp phải chọn là Crystal syntax , Basic syntax. - Parameter Fields: dùng để nhắc nhở người dùng nhập vào các thông tin cần thiết đối với báo cáo đang chạy. Khi bạn tạo một parameter field và đưa vào báo cáo,thì Crystal Reports .NET sẽ hiển thị một khung đối thoại mặc nhiên nhắc nhở người dùng nhập vào chi tiết mà bạn vừa nhập vào ,khi nào bản báo cáo của bạn được xem trước. - Running Total Field: dùng để tính toán dựa trên giá trị các mẫu tin của một field khác. - Group Name Fields: Thể hiện các nhóm đang được sử dụng trong báo cáo. 03HC329 – 03HC330 – 03HC437 9
  • 10. - SQL Experssion Fields: để đảm bảo việc tính toán của bạn được hiện trên server và bạn có thể thâm nhập vào tất cả các hàm của SQL. - Special Fields: thể hiện các vùng mục tin đặc biệt. Bảng 2-02 sau đây liệt kê các field đặc biệt. Bảng 2-02 Danh sách các field đặc biệt Tên field đặc biệt Mô tả Print Date In ra ngày báo cáo được in Print Time In ra thời giờ khi báo cáo được in ra Modification Date Ngày thay đổi chót của báo cáo Modification Time Thời giờ thay đổi chót của báo cáo Data Date Ngày khi dữ liệu được đọc từ căn cứ dữ liệu Data Time Thời giờ khi dữ liệu được đọc từ căn cứ dữ liệu Record Number Con số thứ tự nội bộ của mẩu tin được gán cho tất cả các mẫu tin được trả về cho bản báo cáo Page Number Số thứ tự trang Group Number Số thứ tự nội bộ nhóm Total Page Count Tổng số trang đếm được Report Title Tựa đề báo cáo như đã được lưu trữ trong Summary Infomationcủa tập tin báo cáo Report Comments Chú giải sẽ được đưa vào trong Summary Information của tập tin báo cáo. Record Selection Formula Công thức tuyển chọn mẫu tin được sử dụng bởi báo cáo Group Selection Formula Công thức tuyển chọn nhóm được sử dụng bởi báo cáo File Path and Name Đường dẫn và tên tập tin của .rpt File Author Tác giả báo cáo sẽ được đưa vào trong Summary Information của tập tin báo cáo. File Creation Date Ngày bản báo cáo được tạo ra Pagd N of M Theo đây N là trang hiện hành và M là tổng số trang báo cáo - Unbound Fields: gồm có 7 loại kiểu dữ liệu Boolean, Currency, Date, Date Time, Number, String , và Timer. Unbound dùng để tạo một bản báo cáo generic rồi dùng lập trình cho đặt để nội dung các vùng mục tin này vào lúc chạy. 2.3 Thiết kế một báo cáo đơn giản: Ví dụ sau đây sẽ giúp bạn tạo ra một báo cáo đơn giản, các bạn chỉ việc click và click để tạo ra một bản báo cáo mà không cần phải lập trình gì cả. Tùy theo đặc trưng của từng bản báo cáo mà bạn có thể bỏ qua một số bước không cần thiết, nhưng để giúp bạn hiểu 03HC329 – 03HC330 – 03HC437 10
  • 11. rõ hơn các bước nên với ví dụ này chúng ta sẽ khảo sát tất cả các bước mặc dù có một số bước chúng ta không làm gì cả mà chỉ nhấn Next để qua bước kế tiếp. 2.3.1 Thêm một báo cáo mới vào ứng dụng Khởi động Microsoft Visual Studio .NET và tạo một project có tên SimpleReport. Sau đó, chọn Project | Add New Item sẽ xuất hiện hộp thoại Add New Item (Hình 2- 03). Trên khung Templates, bạn chọn Crystal Report và đặt trên báo cáo là InternationalSales.rpt, rồi chọn Open. Hình 2-03 Hộp thoại Add New Item Hộp thoại Crystal Report Gallery sẽ hiển thị (Hình 2-04). Trên khung Create a New Crystal Report Document có ba lựa chọn được giải thích trong Bàng 2-03. Và trên khung Choose an Expert có bảy lựa chọn được giải thích trong Bảng 2-04. Bạn để các lựa chọn này theo giá trị mặc định ban đầu và nhấn OK. 03HC329 – 03HC330 – 03HC437 11
  • 12. Hình 2-04: Hộp thoại Crystal Report Gallery Bảng 2-03: Các phương pháp tạo một Crystal Report Document mới Phương pháp Mô tả Using the Report Expert Như bạn có thể thấy trong hình 2-04 có nhiều Report Expert (Standard,Form Letter Form,…) mà bạn phải bước qua từng bước để tạo báo cáo .Đây là phương pháp phổ biến nhất như là điểm xuất phát cho những triển khai về sau.Lập trình viên kinh nghiệm cũng thích sử dụng phương pháp này. As a Blank Report Đối với lập trình viên kinh nghiệm quá quen thuộc với Report Designer thường dùng phương pháp này để tạo báo cáo rỗng và tự tay mình bổ sung từng phần vào bản báo cáo không cần sự hỗ trợ của Report Wizard. Khi mục chọn này được chọn thì các Expert khác sẽ không có sẵn. From an Existing Report Tạo một báo cáo mới tương tự một bản báo cáo đã có sẵn. Một lần nữa khi chọn mục này thì các Expert khác sẽ không có sẵn. 03HC329 – 03HC330 – 03HC437 12
  • 13. Bảng 2-04: Các loại Expert Report Loại Expert Mô tả Standard Được sử dụng thường xuyên và mang tính chung (generic) nhiều nhất. Bạn có thể sử dụng Standard Expert để tạo kiểu báo cáo kiểu hàng cột (tabular), bao gồm một số tính năng như grouping (gộp nhóm), sorting (sắp xếp) và summary (tổng kết) . Standard Expert còn bao gồm khả năng thêm các hình đồ hoạ kiểu thống kê được gọi là chart, áp dụng một số style định sẵn và sàng lọc các mẫu tin cũng như có những tính năng phân tích cao cấp chẳng hạn TopN, BottomN (thí dụ Top10 hoặc Bottom100). From Letter Bằng cách phối hợp các đối tượng văn bản và các Field CSDL, Crystal Reports.NET có thể dùng để tạo những văn thư (form letter). Form Dùng để tạo những bản báo cáo được thiết kế cho một biểu mẫu đặt trưng (hoá đơn, bảng kê khai, ...). Bằng cách sử dụng form expert, bạn có khả năng cho nằm ẩn một hình ảnh ở dưới bản báo cáo (ví dụ như một hoá đơn trống) để có thể đưa vào đúng chỗ các field trên biểu mẫu.Từ đây, bạn có thể hoặc để yên hình ảnh và in ra biểu mẩu kèm theo các vùng mục tin lên giấy hoặc cho gỡ bỏ hình ảnh và in trực tiếp bản báo cáo lên các biểu mẫu. Cross-Tad Cross-tabs trong lòng Crystal Reports.NET trông giống như một bản tính (spreadsheet) với hàng cột chứa dữ liệu tổng kết. Bằng cách sử dụng Cross-tab Expert bạn có thể tạo một bản báo cáo với đối tượng cross-tab trong section report header. Subreport Subreport là những báo cáo con được chèn vào bản báo cáo chính. Subreport có thể không liên hệ hoặc các thông số có thể được trao qua giữa báo cáo chính và subreport để xác định nội dung cần hiển thị . Mail Lable Crystal reports.NET hỗ trợ những báo cáo gồm nhiều cột và chức năng này làm cho ta có khả năng tạo những nhãn bìa thư (mail lable). 03HC329 – 03HC330 – 03HC437 13
  • 14. Drill Down Khái niệm nằm đằng sau drill down (xoáy sâu vào chi tiết ) là bạn cho hiển thị một summary (tổng kết) trong bản báo cáo của bạn và người sử dụng có thể xoáy vào summary để xem chi tiết hình thành tổng kết này thế nào. 2.3.2 Chọn dữ liệu nguồn (data source) Hộp thoại Standard Report Expert hiển thị lên như Hình 2-05.và mặc định sẽ focus về Tab Data. Khi đó bạn sẽ chọn dữ liệu nguồn thông qua Tab Data này, đây là bước đầu tiên cho bất kỳ loại expert nào. Có nhiều cách để chọn ra dữ liệu nguồn, Bảng 2-05 sau đây sẽ giải thích các lựa chọn trên khung Available data source, trong ví dụ này bạn click vào nút Database Files và hộp thoại Open mở ra ,chọn cơ sở dữ liệu xtreme.mdb. Lưu ý: Cơ sở dữ liệu xtreme.mdb có sẵn tại thư mục C:ProgramFilesMicrosoft Visual Studio.NETCrystal ReportsSamplesDatabase. Bạn bung nhánh Tables rồi double click lên bảng dữ liệu Customer để thêm vào khung Tables in Report bên phải. Nhấn Next để tiếp tục. Lưu ý: Để bỏ chọn một bảng ra khỏi khung Tables in Report bạn click vào bảng đó sau đó nhấn nút Delete Table ở bên dưới khung Tables in Report. 03HC329 – 03HC330 – 03HC437 14
  • 15. Hình 2-05: Hộp thoại Standard Report Expert – Tab Data Bảng 2-05: Các dữ liệu nguồn khác nhau Dữ liệu nguồn Mô tả Project Data Crystal Reports.NET có thể theo .NET Framework và báo cáo trực tiếp từ dataset xuất hiện trong ứng dụng của bạn. Bạn có thể thấy ADO.NET Datasets và Current Connections trong nhánh này. ADO.NET Datasets cho biết các lớp dataset được liệt kê trong cửa sổ Project Explorer. Các lớp này cho phép bạn uyển chuyển gắn kết hầu như với bất cứ kiểu dữ liệu nào. Còn Current Connections cho phép bạn chọn bất cứ kết nối nào hiện được thiết lập trong cửa sổ Server Explorer OLE DB (ADO) Mục này cho phép tạo một connection string để truy cập các dữ liệu nguồn sử dụng một OLE BD driver bao gồm SQL server, Oracle, MS Jet 3.51/4.00 (Access, Excel, Paradox, Dbase , …). 03HC329 – 03HC330 – 03HC437 15
  • 16. Mục này sẽ cho hiện lên hai màn hình wizard “OLE DB Provider” và “Connection Information” yêu cầu bạn cho biết dữ liệu nguồn phải kết nối và bất cứ thông tin nào có ý nghĩa về vị trí và đăng nhập. ODBC (RDO) Mục này cho phép tạo một connection string để truy cập các dữ liệu nguồn sử dụng một ODBDC driver cũng có 2 màn hình wizard “Datasource Selection” và “Connection information” cho phép bạn chọn một System DSN hoặc file DSN hiện hữu.Ngoài việc báo cáo từ các bảng dữ liệu, view và stored procedure , … Crystal Reports.NET còn cho phép bạn nhập vào một lệnh SQL dùng làm cơ sở cho bản báo cáo của bạn. Database Files Mục này cho phép bạn chọn một trong số những dạng thức CSDL kiểu tập tin bao gồm Access, Excel, XML, TTS(loại tập tin định nghĩa của Crystal Field Definition). Favorites Mục này cho phép bạn chọn ra dữ liệu nguồn thường xuyên được dùng đến mà bạn đã đưa vào danh sách Favorites. Các item hiện hữu có thể được thêm vào bằng cách right-click lên chúng và chọn mục Add to Favorites . Bạn cũng có thể gỡ bỏ một item khỏi Favorites bằng cách click lên item rồi ấn <F2>. History Mục này cho phép bạn chọn ra dữ liệu nguồn được dùng trong các bản báo cáo khác trong cùng dự án. More Data Sources Mục này bao gồm : ADO.NET(XML), access/Excel(DAO) và Field Definition Only. ADO.NET(XML) cho phép tìm đọc các mẫu tin bằng cách khai báo một lối tìm về tập tin XML. Bạn cũng có thể chọn ra một ADO.NET datasets hiện hữu. Còn Access/Excel (ADO) cho phép tìm đọc các mẫu tin bằng các dùng ADO recordset truy cập một CSDL MS Access hoặc Excel spreadsheet. Còn Field Definition Only chỉ dùng đối với Crystal Field Definition (TTX) mang tính tương thích lùi và không được triển khai mới. 03HC329 – 03HC330 – 03HC437 16
  • 17. 2.3.3 Thiết lập mối quan hệ giữa các bảng Nếu ở bước trước bạn chọn ra cùng lúc nhiều bản dữ liệu thì bây giờ hộp thoại Standard Report Export sẽ hiển thị Tab Link cho phép bạn khai báo các bảng dữ liệu này có những mối quan hệ nào, hình 2-06. Lưu ý: Trong ví dụ này chúng ta chỉ sử dụng một bảng customer nên sẽ bỏ qua bước này. Hình 2-06: Hộp thoại Standard Report Expert – Tab Link 2.3.4 Chọn ra các Field cho bản báo cáo Bước kế tiếp trên hộp thoại Standard Report Export là chọn ra các field sẽ xuất hiện lên bản báo cáo. Trên Tab Field (Hình 2-07), muốn sử dụng field nào bạn chọn field đó trên khung Available Fieds rồi nhấn nút Add  để chuyển field chọn qua danh sách Field to Display bên phải. Để tiện dụng hơn, hộp thoại Standard Report Export cung cấp cho bạn hai chức năng Browse Data và Find Field trên Tab Field. Browse Data 03HC329 – 03HC330 – 03HC437 17
  • 18. giúp bạn xem trước nội dung của Field mà bạn chọn và nếu bạn có một danh sách các Field rất dài thì Find Field giúp bạn tìm ra một Field nào đó trong danh sách đó. Hình 2-07: Tab Field dùng để chọn các Field sử dụng Các Field mà bạn đã chọn ra ở trên sẽ xuất hiện theo thứ tự từ trái qua phải và mỗi mẫu tin trên DataSet sẽ được in ra trên một hàng của báo cáo. Bạn có thể thay đổi thứ tự các Field bằng cách sử dụng hai nút mũi tên lên xuống trên hộp thoại hình 2-07. Trong ví dụ này, chúng ta chọn ra các Field theo thứ tự: Customer Name, Contact Last Name, Contact Title, E-mail và Last Year’s Sales. Với mỗi Field thì sẽ có một tiêu đề cột tương ứng trên bản báo cáo (mặc định là lấy trùng tên với Field), bạn có thể thay đổi tiêu đề cột ngay tại bước này thông qua ô textbox Column Heading trên hình 2-07 hoặc thay đổi trực tiếp ngay trên Report Designer sau này. Sau khi chọn ra các Field dữ liệu, bạn có thể nhấn Finish để làm việc với bản báo cáo trên Report Designer. Tuy nhiên, chúng ta sẽ qua bước kế tiếp bằng việc nhấn Next. 03HC329 – 03HC330 – 03HC437 18
  • 19. 2.3.5 Gộp nhóm và Sắp xếp (Grouping - Sorting) Tại bước này, hộp thoại Standard Report Export sẽ chuyển sang Tab Group (hình 2-08), bạn có thể chọn những Field làm cơ sở sắp xếp và tổng kết theo nhóm bằng cách click lên Field muốn chọn từ khung Available Fields sau đó nhấn nút Add  để chuyển Field chọn qua khung Group By. Trong ví dụ này, bạn chọn Group theo Customer.Contry. Hình 2-08: Hộp thoại Standard Report Expert – Tab Group Trên hộp thoại hình 2-08 cũng có hai ô mũi tên lên và xuống cho phép bạn thay đổi thứ tự các Group nếu báo cáo của bạn có nhiều hơn một Group. Ngoài ra ô combobox Sort Oder nằm bên dưới khung Group By có bốn lựa chọn cho việc sắp xếp được giải thích theo bảng 2-06 dưới đây. 03HC329 – 03HC330 – 03HC437 19
  • 20. Bảng 2-06 Các lựa chọn sắp xếp Sort Oder Mô tả Ascending Sắp xếp theo thứ tự tăng dần từ A-Z, 1-9, ... Decending Sắp xếp theo thứ tự giảm dần từ Z-A, 9-1, ... Original Dữ liệu sẽ có thứ tự theo thứ tự của dataset. Specified Dùng để tạo một custom group cho riêng bạn 1. Sau khi chọn xong Field dùng để Group bạn nhấn Next để tiếp tục. 2.3.6 Bổ sung thông tin tổng kết Bạn click lên Tab Total trên hộp thoại Standard Report Export (hình 2-09) để thêm thông tin tổng kết (summary) vào báo cáo. Các field tổng kết (summary field) sẽ chứa kết quả của phép tính toán phổ biến nhất như sum, average ... Muốn thêm một summary field, bạn cần chọn ra một field trên khung Available Fields đưa vào khung Summaried Fields ( trong ví dụ này là Customer.Last Year’s Sales ), sau đó chọn ra kiểu summary từ hộp combo box Summary Type như trên hình 2-09.Trong trường hợp này chúng ta chọn sum và check vào ô check box Add Grand Totals2. Có tất cả 20 tác tử summary khá phổ biến mà bạn có thể sử dụng3. Tùy theo kiểu dữ liệu của Field bạn chọn mà có thể có hoặc không một vài tác tử summary, ví dụ như bạn không thể tính trung bình (Average) trên một Field kiểu string. Với ví dụ này đến đây là chúng ta có thể nhấn nút Finish để chuyển sang Report Designer nhưng để giúp các bạn hiểu rõ hơn các bước còn lại nên chúng ta sẽ tiếp tục khảo sát tất cả các bước còn lại. Bạn nhấn Next để qua bước tiếp theo. Lưu ý: Bạn không thể có bước này nếu báo cáo của bạn không có ít nhất một Group 1 Specified: xem thêm trong tài liệu tham khảo “Lập trình báo cáo dùng CRYSTAL REPORT .NET và C# - Dương Quang Thiện” trang 75 2 Grand Total là tổng cộng cuối cùng, còn gọi là Final Total 3 Bạn tham khảo MSDN với từ khóa SummaryOperation enumeration để biết rõ hơn. 03HC329 – 03HC330 – 03HC437 20
  • 21. Hình 2-09: Hộp thoại Standard Report Expert – Tab Total 2.3.7 Các tính năng phân tích Ngoài các summary phổ biến ta còn có khả năng thêm vào bản báo cáo một số chức năng phân tích giúp nhấn mạnh thông tin có thể là quang trọng. Ví dụ, thay vì liệt kê tất cả các nhân viên bán hàng trong công ty bạn có thể in ra danh sách 10 nhân viên nào thực hiện doanh thu cao nhất (để khen thưởng) hay có thể cho ra 10 nhân viên bán hàng tệ nhất trong tháng để lưu ý họ. Trên hộp thoại Standard Report Export bạn click Tab TopN (hình 2-10) để thêm các chức năng phân tích vào bản báo cáo. Bạn để ý có một Tab là Customer.Country (nếu bản báo cáo của bạn có bao nhiêu Group thì sẽ có bấy nhiêu Tab, mỗi Tab có tên tương ứng với một Group) và hộp combo For this group sort có năm lựa chọn được giải thích theo bảng 2-07. 03HC329 – 03HC330 – 03HC437 21
  • 22. Hình 2-10: Tab TopN - Sắp xếp và gộp nhóm dựa trên summarized totals. Bảng 2-07 Các lựa chọn trên hộp combo For this group sort Các kiẻu phân tích Mô tả All Hiển thị tất cả các giá trị Top N Bạn nhập vào một số N vào ô text box where N is. Bản báo cáo sẽ liệt kê N nhóm đầu tiên dựa trên giá trị summary field theo thứ tự giảm dần. Bottom N Bạn nhập vào một số N vào ô text box where N is. Bản báo cáo sẽ liệt kê N nhóm cuối cùng dựa trên giá trị summary field theo thứ tự tăng dần. Top Percentage Bạn nhập vào tỉ lệ N% (0-100) vào ô text box where Percentage is. Bản báo cáo sẽ liệt kê N% nhóm đầu tiên dựa trên giá trị summary field theo thứ tự giảm dần. Bottom Percentage Bạn nhập vào tỉ lệ N% vào ô text box where Percentage is. Bản 03HC329 – 03HC330 – 03HC437 22
  • 23. báo cáo sẽ liệt kê N% nhóm cuối cùng dựa trên giá trị summary field theo thứ tự tăng dần. Với ví dụ này bạn để giá trị All trên hộp combo For this group sort, nhấn Next để tiếp tục. Lưu ý: Tab TopN chỉ có thể thực hiện được khi bạn đã có sự thiết lập nào đó trên hai Tab Group và Tab Total. 2.3.8 Biểu đồ và Đồ thị (Charting - Graphing) Trên hộp thoại Standard Report Export bạn có thể thêm một số loại Graph khác nhau vào bản báo cáo thông qua Tab Chart1 (Hình 2-11). Bạn nhấn Next tiếp tục. Hình 2-11: Hộp thoại Standard Report Expert – Tab Chart 1 Muốn tạo bản báo cáo charting và graphing bạn xem thêm tài liệu tham khảo “Lập trình báo cáo dùng CRYSTAL REPORT .NET và C# - Dương Quang Thiện” Chương 8 - Vẽ biểu đồ như thế nào. 03HC329 – 03HC330 – 03HC437 23
  • 24. 2.3.9 Sàng lọc thông tin trên bản báo cáo Khi in báo cáo từ nhiều bảng dữ liệu khác nhau, chắc chắn là bạn không muốn xem tất cả mọi dữ liệu trên bản báo cáo. Bạn muốn chọn sử dụng những mẫu tin nào đó mà thôi dựa trên những tiêu chí nào đó. Tab Select (hình 2-12) sẽ giúp bạn thực hiện ý định này. Có một số tác tử cơ bản có sẵn dùng cho việc chọn lọc mẫu tin được giải thích theo bảng 2-08. Đối với ví dụ này, ta không quan tâm việc chọn lọc mẫu tin, nghĩa là tất cả các mẫu tin sẽ được xử lý, do đó ta bỏ qua Tab Select, bạn nhấn Next để qua Tab cuối cùng. Hình 2-12: Tab Select 03HC329 – 03HC330 – 03HC437 24
  • 25. Bảng 2-08: Các tác tử chọn lọc cơ bản Tác tử chọn lọc Mô tả Is equal to So sánh bằng Is not equal to So sánh không bằng Is less than So sánh nhỏ hơn Is less than or equal to So sánh nhỏ hơn hoặc bằng Is greater than So sánh lớn hơn Is greater than or equal to So sánh lớn hơn hoặc bằng Is one of Thuộc một tập hợp định trước Is between Nằm giữa Is not between Không nằm giữa Is like Giống như (dùng tương tụ like của SQL) Is starting with Bắt đầu bởi 2.3.10 Chọn kiểu định dạng cho báo cáo Tab cuối cùng trên Standard Report Expert là Tab Style (Hình 2-13), giúp bạn chọn lựa format cho bản báo cáo trước khi hoàn tất. Có tất cả 10 style đã được định sẵn mà bạn có thể chọn sử dụng nhưung bạn không thể thêm vào style riêng của bạn. Bạn có thể thêm tựa đề (title) của bản báo cáo vào ô Title. Trong trường hợp của chúng ta tựa đề của báo cáo là “International Sales Report”, thông tin nỳa sẽ được lưu trữ trong Summary Infomation của tập tin báo cáo và một Report Title Field sẽ được thêm vào Report Designer. Bạn nhấn nút Finish để hoàn tất việc thiết kế báo cáo. 03HC329 – 03HC330 – 03HC437 25
  • 26. Hình 2-13: Hộp thoại Standard Report Expert – Tab Style 2.3.11 Hoàn tất cơ bản việc thiết kế bản báo cáo Sau khi bạn chọn Finish trên hộp thoại Standard Report Expert, một tập tin báo cáo mang tên InternationalSales.rpt sẽ được tạo ra với những thiết lập mà bạn vừa mới thực hiện, như theo hình 2-14. Đến đây coi như bạn đã hoàn tất cơ bản việc thiết kế bản báo cáo. 03HC329 – 03HC330 – 03HC437 26
  • 27. Hình 2-14: Tập tin báo cáo InternationalSales.rpt 2.4 Preview bản báo cáo Muốn in ra bản báo cáo InternationalSales.rpt bạn thêm vào Form1 ô control CrystalReportViewer trên Toolbox. Khi đó IDE tự động tạo ra một đối tượng crystalReportViewer1, bạn gán thuộc tính Dock của đối tượng này thành Fill để ô control viewer này bao phủ toàn bộ vùng Client trên Form1. Đồng thời bạn thay đổi thuộc tính WindowState của Form1 thành Maximized. Tại hàm xử lý sự kiện Form_Load bạn bổ sung dòng lệnh in đậm sau đây: private void Form1_Load(object sender, System.EventArgs e) { crystalReportViewer1.ReportSource = new InternationalSales(); } Lệnh trên tạo một đối tượng InternationalSales (là bản báo cáo của bạn vừa thiết kế xong) và gán cho thuộc tính ReportSource của ô control viewer. Khi ban cho chạy ứng dụng, nó sẽ cho thấy một viewer của bản báo cáo như hình 2-15. 03HC329 – 03HC330 – 03HC437 27
  • 28. Hình 2-15: Báo cáo InternationalSales ở chế độ Preview 2.5 Tinh chỉnh và hoàn thiện bản báo cáo Qua ví dụ trên, bạn dễ dàng tạo ra một bản báo cáo mà không cần mất nhiều thời gian, tuy nhiên báo cáo này rất thô thiển, chưa có gì là tinh tế. Phần này sẽ giúp bạn hoàn thiện bản báo cáo của mình, làm cho bản báo cáo trở nên dễ nhìn hơn bằng cách thêm vào một vài chi tiết nhỏ hay bỏ đi một số chi tiết không cần thiết. Kết quả sau khi tinh chỉnh sẽ cho ta bản báo cáo trên hình 2-15 và kết quả Preview trên hình 2-16. 03HC329 – 03HC330 – 03HC437 28
  • 29. Hình 2-15 File báo cáo sau khi tinh chỉnh Hình 2-16: Kết quả preview của file báo cáo sau khi tinh chỉnh 03HC329 – 03HC330 – 03HC437 29
  • 30. 2.5.1 Định dạng các phân đoạn Xem lại hình 2-14 bạn thấy phần Report Header được đánh dấu chéo, điều này có nghĩa là sẽ không được hiển thị, vậy bây giờ ta sẽ định dạng lại cho Report Header section và xác lập màu nền cho Group Header

    1 section là màu xám như hình 2-15. Bạn right click lên Report Designer và chọn Format Section để hiển thị hộp thoại Section Expert như hình 2-17. Trong khung Sections bên tay trái sẽ liệt kê tất cả các section trên bản báo cáo và bên tay phải có hai Tab Common và Color chứa những ô checkbox dùng để định dạng cho một section được giải thích theo bảng 2-09. Cạnh bên mỗi ô checkbox có một nút được gọi là Fomular Button. Nhấn lên nút này sẽ hiển thị hộp thoại Formular Editor cho phép bạn tạo ra một công thức, điều này sẽ được đề cập sau. Hình 2-17: Hôp thoại Section Expert 03HC329 – 03HC330 – 03HC437 30

  • 31. Bảng 2-09: Các thuộc tính định dạng section Thuộc tính định dạng Mô tả Hide (Drill-Down OK) Không cho hiển thị section, nhưng cho phép Drill down vào chi tiết dữ liệu. Suppress (No Drill-Down) Không cho hiển thị section và cũng không cho phép Drill down vào chi tiết dữ liệu. Print at Bottom of Page Làm cho section bao giờ cũng in ra vào cuối trang. New Page Before Page break - sang trang - trước khi section được in ra. New Page After Page break - sang trang – sau khi section được in ra. Reset Page number After Cho chỉ số trang về 1 sau khi in ra section. Keep Together Giữ cho section in ra trên cùng 1 trang, không cho in qua trang sau. Suppress Blank Section Nếu không có dữ liệu trong section thì không in nó ra. Underlay Following Xem MSDN. Sections Format with Multiple Colums Xem MSDN. Đối với bản báo cáo của chúng ta, bạn hãy uncheck hai thuộc tính Hide (Drill- Down OK) và Suppress (No Drill-Down) đối với Report Header section, và đối với Group Header

    1 section bạn click lên Tab Color và đánh dấu check vào ô Background Color sau đó bạn có thể chọn màu tùy ý trên hộp combobox, ở đây chúng tôi chọn là màu Silver. Đến đây bạn hãy loại bỏ một số Field không cần thiết và bổ sung Report Title Field lên phần Report Header bằng cách cho bung nhánh Special Fields trên khung Field Explorer chọn Report Title kéo và thả vào Report Header section. Sau đó bạn sắp xếp lại vị trí các Field theo hình 2-15. Nếu khi di chuyển các Field đến vị trí mới, bạn có thể làm cho các Field không còn thẳng hàng với nhau nữa hay kích thước không còn bằng nhau. Để khắc phục lỗi này bạn chọn các Field bị lệch trước, sau cùng ban chọn một Field làm chuẩn right click lên Field chuẩn này rồi chọn Align nếu bạn muốn canh hàng - cột hoặc Size nếu bạn muốn canh lại kích thước. 2.5.2 Định dạng các Field: Sau khi thiết kế báo cáo, trên Report Deport có một số Field dạng tổng hợp kết quả như Grand Total Field (hình 2-14) có định dạng mặc định trông không được đẹp mắt, bạn 03HC329 – 03HC330 – 03HC437 31

  • 32. có thể định lại bất kỳ Field nào mà bạn muốn bằng cách right click lên Field đó và chọn Format để hiển thị hộp thoại Format Editor như hình 2-18. Trong trường hợp này, đối với những Field tương tự như Grand Total Field nói trên bạn click vào Tab Border trên hộp thoại Format Editor, trong khung Line Style bạn thiết lập giá trị None cho các ô control Left, Top, Right và Bottom. Hình 2-18: Hộp thoại Format Editor 2.5.3 Hiệu chỉnh Sắp xếp Bạn hãy để ý khi preview bản báo cáo của chúng ta hiện tại đã được gộp nhóm và sắp thứ tự theo Customer.Contry, tuy nhiên nội dung trong lòng mỗi nhóm lại không có thứ 03HC329 – 03HC330 – 03HC437 32
  • 33. tự do đó ta sẽ sử dụng hộp thoại Record Sort Oder để bổ xung các sắp xếp trong lòng mỗi nhóm. Muốn hiển thị hộp thoại này bạn right click lên Report Designer rồi chọn Report | Sort Record. Hình 2-19 cho thấy bản báo cáo hiện đang được sắp xếp theo Field: Customer.Contry , và bạn không thể tác động gì lên Field này được vì nó được tạo ra khi ta chọn Group ở bước trước đó, muốn hiệu chỉnh Field này ta sẽ có cách làm khác. Muốn chọn một Field để sắp xếp bạn click một item trên khung Available Fields bên trái rồi nhấn nút mũi tên “>” để chuyển item đó qua khung Sort Fields bên phải. Thứ tự bạn thêm các Field sẽ ấn định mức độ ưu tiên sắp xếp. Ngược lại nếu không muốn sắp xếp thì bạn sử dụng nút mũi tên “<” để gỡ bỏ một Field khỏi khung Sort Fields. Phía dưới khung Sort Fields có frame Sort Direction, với 2 lựa chọn Ascending (tăng) và Decending (giảm) giúp bạn chọn thứ tự sắp xếp cho Field tương ứng trong khung Sort Fields. Trong ví dụ này, chúng ta sẽ bổ xung sắp xếp theo Field Customer.Name và theo thứ tự tăng dần như hình 2-19. Hình 2-19: Hộp thoại Record Sort Oder 03HC329 – 03HC330 – 03HC437 33
  • 34. 2.5.4 Hiệu chỉnh Gộp nhóm Mặc dù bản báo cáo cũng chúng ta sẽ không có hiệu chỉnh Group nhưng phần này sẽ giúp bạn hiệu chỉnh trên các Group hiện hành cũng như bổ sung thêm Group vào bản báo cáo nếu cần thiết. Muốn thêm một nhóm lên bản báo cáo, bạn right click lên bản báo cáo, rồi chọn Insert | Group. Hộp thoại Insert Group (hình 2-20) sẽ hiển thị với một Tab Common duy nhất. Tab Common có 2 frame. Frame đầu tiên, với ô combobox đầu tiên để xác định Field dùng để gộp nhóm và ô combobox thứ hai để xác định thứ tự sắp xếp. Frame còn lại Group Options cho phép định dạng nhóm. Nếu bạn đánh dấu check vào ô Group Together thì nếu cả nhóm không nằm vừa trên phần còn lại của trang thì sẽ để trắng và nhóm sẽ được in bắt đầu từ trang sau. Còn ô checkbox Repeat Group On Each Page, cho biết liệu group header có phải in lặp lại trên mỗi trang hay không. Hình 2-20: Hộp thoại Insert Group Khi bạn thêm một nhóm vào, thì mặc định nhóm này sẽ được nằm trong cùng so với các nhóm hiện hữu, muốn thay đổi thứ tự này cũng như thay đổi các giá trị khác của nhóm bạn right click lên bản báo cáo chọn Report | Change Group Expert để hiển thị hộp thoại Change Group như hình 2-21. 03HC329 – 03HC330 – 03HC437 34
  • 35. Hình 2-21: Hộp thoại Change Group Trên hộp thoại này, các nhóm được liệt kê theo thứ tự hiện hành, bạn có thể sử dụng hai mũi tên lên xuống để sắp xếp lại thứ tự. Còn muốn thay đổi một nhóm, thì bạn nhấn nút Options để hiển thị hộp thoại Change Group Options tương tụ như hộp thoại Insert Group. 2.5.5 Vẽ khung Sau khi hoàn tất hai phần 2.5.1 và 2.5.2 thì bản báo cáo của bạn đã gần giống như trên hình 2-22. Trong phần này sẽ giúp bạn bổ xung các đối tượng Box và Line vào bản báo cáo. Đây là phần thường làm cho người mới thiết kế gặp nhiều lúng túng bởi vì nó liên quan đến nhiều section của báo cáo, đòi hỏi bạn phải hiểu rõ sự bố trí và thể hiện nội dung của các section trên bản báo cáo đã được đề cập đến trong phần 2.2.1 “Các section của một báo cáo”. 03HC329 – 03HC330 – 03HC437 35
  • 36. Hình 2-22: File báo cáo sau khi tinh chỉnh với các đối tượng Box và Line được làm nổi bậc Lưu ý: Trên hình 2-15 màu xanh da trời và màu đỏ chỉ để giúp các bạn nhìn rõ các đối tượng Box và Line, thực tế chúng có màu đen và có độ rộng là 1. Trước hết ta sẽ bổ sung đối tượng Box vào bản báo cáo. Bạn right click lên Report Designer chọn Insert | Box, khi đó con trỏ chuột sẽ thay đổi thành hình dạnh cây bút, bạn click và kéo để tạo ra một hình chữ nhật, bạn di chuyển và thay đổi kích thước của hình chữ nhật này sao cho nó bao tất cả các Field thuộc các section: Page Header, Group Header

    1, Details, Group Footer

    1 và Report Footer ngoại trừ PrintDate Field nằm trong Page Header section như hình 2-22 (Box có màu xanh da trời). Sau đó bạn cho chạy ứng dụng để preview xem có đúng như ý bạn mong muốn hay không trước khi ta bổ xung các đối tượng Line. Đến đây ta vẫn chưa gặp trở ngại gì cả. 03HC329 – 03HC330 – 03HC437 36

  • 37. Tiếp theo ta sẽ bổ xung các đối tượng Line vào bản báo cáo để phân cách các mẫu tin ra thành từng hàng riêng biệt bằng cách right click lên Report Designer chọn Insert | Line. Ta sẽ bổ sung 3 đường thẳng lên bản báo cáo. Đường thẳng thứ nhất dùng để phân cách giứa phần Page Header và Group Header như hình 2-22 (Line là đường màu đỏ), bạn chỉ cần kéo một đường thẳng sao cho nó nằm trùng với cạnh trên của vùng nội dung của Group Header section, bạn đừng quan tâm canh 2 biên trái phải của đường thẳng ta có cách giải quyết sau. Để canh 2 biên trái và phải của đường thẳng sao cho trùng với biên của đối tượng Box có hai cách. Cách 1 bạn di chuyển con trỏ đến đầu mỗi biên và kéo để thay đổi theo ý bạn. Cách 2 bạn thay đổi giá trị 2 thuộc tính Left và Right của đường thẳng trên khung Properties sao cho bằng với giá trị Left và Right của đối tượng Box như hình 2-22. Sau đó bạn preview lại xem có đúng ý mình chưa. Bạn tiếp tục bổ sung hai đường thẳng còn lại như trên hình 2-22 theo cách làm trên để hoàn chỉnh cho bản báo cáo. Lưu ý: Khi vẽ các đường thẳng và preview lại có thể bạn thấy không như ý mình thì lý do có thể là bạn để sai vị trí ví dụ như thay vì để trên phần top của vùng nội dung thuộc section thì bạn lại cho nằm ở bottom hay thay vì để ở section này bạn lại để ở section khác. Do đó bạn cứ thử đặt đường thẳng vào một vị trí khác và so sánh kết quả với lần preview trước đó rồi từ đó đưa ra vị trí hợp lý. Để dễ dàng cho việc vẽ trên Report Designer bạn nên zoom kích thước ra khoảng 200% để định vị vị trí cho chính xác hơn. 03HC329 – 03HC330 – 03HC437 37
  • 38. 3 : Công thức Basic Syntax Rất ít bản báo cáo chỉ đơn thuần liệt kê thông tin - phần lớn sẽ bao gồm ít nhất một vài tính toán cơ bản, tổng kết và phần logic chương trình. Chắc hẳn bạn không muốn có một hóa đơn mà không có tính thuế GTGT và hàng tổng cộng cuối hoá đơn hoặc tổng kết doanh thu mà không có tổng doanh thu. Phần logic chương trình sẽ được đưa vào báo cáo , thông qua các công thức, tùy thuộc vào yêu cầu do người sử dụng đặt ra. Crystal Reports cho bạn chọn lựa sử dụng hoặc Crystal Syntax hoặc Basic Syntax. Trong tài liệu này chúng tôi chỉ đề cập đến Basic Syntax vì nó tương tự như cú pháp Visual Basic.NET mặc khác giữa Crystal Syntax và Basic Syntax cũng có nhiều điểm tương đồng, cho nên nắm rõ Basic Syntax thì bạn cũng có thể dễ dàng tự tìm hiểu Crystal Syntax. 3.1 Hộp thoại Formula Editor Hộp thoại Formula Editor có thể được hiển thị khi bạn muốn tạo mới một công thức hoặc hiệu chỉnh một công thức hiện có. Để tạo mới một công thức bạn right click lên Formula Fields trong cửa sổ Field Explorer sau đó chọn New để hiển thị hộp thoại Formula Name yêu cầu bạn nhập vào tên của công thức (ví dụ như LearnSyntax) như hình 3-01. Hình 3-01: Một công thức mới Sau khi bạn nhập vào tên công thức và nhấn OK, hộp thoại Formula Editor (hình 3- 02) sẽ hiển thị để bạn soạn thảo nội dung của công thức. 03HC329 – 03HC330 – 03HC437 38
  • 39. 3-02: Hộp thoại Formula Editor 3.1.1 Các thành phần chính Quan sát hộp thoại Formula Editor (hình 3-02), trên hàng đầu tiên của thanh công cụ có một ô combobox chứa chuỗi LearnSyntax cho biết công thức mà bạn đang soạn thảo. Nếu bạn click lên mũi tên của ô combobox thì bạn sẽ thấy danh sách các formula field hiện có trên bản báo cáo. Trên hàng thứ hai của thanh công cụ, cũng có ô combobox chứa hai giá trị là Basic Syntax và Crytal Syntax tương ứng với hai loại ngôn ngữ. Lưu ý: Do chúng ta chỉ thực hiện với ngôn ngữ Basic Syntax nên bạn cần phải chọn lại ngôn ngữ này vì Crystal Systax là ngôn ngữ mặc định của Formula Editor. 03HC329 – 03HC330 – 03HC437 39
  • 40. dưới 2 thanh công cụ là 3 cửa sổ Field Tree, Function Tree và Operator Tree. Cả 3 cửa sổ này đều được thiết kế khi bạn double click lên một item nào đó trên một trong 3 cây thì item này sẽ được chèn vào cửa sổ soạn thảo bên dưới ngay tại vị trí con nháy. Như vậy bạn có thể viết phần lớn các công thức mà không cần phải nhập vào. Ba cửa sổ trên được mô tả như sau.  Cửa sổ Field Tree hiển thị tất cả các field hiện có trên bản báo cáo hiện hành. Bao gồm các field trên bảng dữ liệu, các formula field, các total field, các group field và cả các của dữ liệu nguồn mặc dù chúng không xuất hiện trên bản báo cáo. Bạn có thể sử dụng tất cả các field được liệt kê ở đây vào trong công thức.  Cửa sổ Function Tree nằm ở giữa chứa các công thức có sẵn mà phần lớn các hàm này thì tương tự như các hàm của Visual Basic .NET.  Cửa sổ Opertor Tree cho bạn thấy phần lớn các toán tử quen thuộc. Cuối cùng là cửa sổ Formula, nằm ở bên dưới hộp thoại Formula Editor, là nơi bạn viết ra nội dung công thức. Các lệnh sẽ được hiển thị với những màu khác nhau: các từ khóa sẽ mang màu xanh, các chú giải sẽ có màu lục và các hằng sẽ là màu đen. Khi bạn viết xong công thức, bạn cần kiểm tra cú pháp xem có đúng chưa. Nếu đúng thì bạn nhấn nút Save trên thanh công cụ để lưu lại công thức. 3.1.2 Kiểm tra lỗi cú pháp Để kiểm tra công thức của bạn xem có lỗi cú pháp hay không, bạn có thể sử dụng nút Check có hình trên thanh công cụ.  Nếu không có lỗi bạn sẽ nhận được thông báo như hình 3-03(a).  Nếu có lỗi bạn sẽ nhận được thông báo tương ứng với lỗi đầu tiên được tìm thấy, và con nháy sẽ nằm ngay vị trí gây ra lỗi này.  Nếu bạn công thức của bạn có lỗi và bạn nhấn nút Save thì bạn sẽ nhận được thông báo như hình 3-03(b). 03HC329 – 03HC330 – 03HC437 40
  • 41. 3-03: Một số thông báo kiểm tra cú pháp 3.2 Định dạng động sử dụng công thức Theo bản chất các bản báo thường mang tính tĩnh, mặc dù dữ liệu in ra là có thay đổi nhưng những định dạng ban đầu thì không thay đổi. Ví dụ, nếu Field trên một cột nào dó có font chữ là Arial và màu đen thì mọi mẫu tin trong cột này đều mang phông chữ là Arial đen. Nếu bạn muốn thay đổi màu chữ (màu đỏ chẳng hạn) khi giá trị doanh thu dưới một mức báo động nào đó để người đọc báo cáo chú ý. Trong trường hợp này, làm cho báo cáo sông động hơn sẽ tăng sự hữu ích của bản báo cáo mà không gây nặng nề cho người đọc. Crystal Reports cung cấp cho bạn nhiều cách khác nhau làm cho bản báo cáo sinh động hơn. Nó cho phép bạn có khả năng sử dụng công thức để thay đổi thuộc tính của các field và các section trên một bản báo cáo. Khi thêm một công thức vào một thuộc tính, bạn phải xác định kiểu dữ liệu mà thuộc tính này sử dụng để công thức trả về kiểu dữ liệu tương ứng. Nếu ban trả về một kiễu dữ liệu không tương thích thì Formula Editor sẽ thông báo lỗi khi bạn cố lưu trữ công thức. Có nhiều kiểu dữ liệu, từ kiểu Boolen ứng với các thuộc tính được thể hiện dưới dạng checkbox, hoặc là các hằng số được định nghĩa sẵn trước ứng với các thuộc tính được thể hiện dưới dạng combobox, đến các kiểu dữ liệu đơn giản như string hoặc number. 03HC329 – 03HC330 – 03HC437 41
  • 42. lại bản báo cáo InternationalSales.rpt đã được đề cập ở Chương 2, chúng ta sẽ tiếp tục bổ xung định dạng bằng công thức vào bản báo cáo này. Chúng ta sẽ định dạng màu nền cho một hàng trên bản báo cáo dựa trên giá trị Customer.Last Year's Sales. Mở bản báo cáo InternationalSales.rpt sau đó bạn right click lên bản báo cáo và chọn FormatSection. Trong hộp thoại Section Expert bạn chọn section Details bên tay trái và click vào Tab Color bên tay phải như hình 3-04. Hình 3-04: Hộp thoại Section Expert với Tab Color Trên hộp thoại hình 3-04, bạn thấy nút có hình , đó là formula button nằm cạnh bên phải của mỗi thuộc tính. Bạn click lên nút formula này để hiển thị hộp thoại Format Formula Editor (hộp thoại này rất giống với hộp thoại Formula Editor) cho phép bạn đưa vào một công thức để thay đổi thuộc tính. Trên hộp thoại Format Formula Editor bạn thêm vào nội dung như sau, sau đó nhấn nút Save and close hay Ctrl + S: 03HC329 – 03HC330 – 03HC437 42
  • 43. {Customer.Last Year's Sales} > 100000 Then Formula = crAqua ElseIf {Customer.Last Year's Sales} < 1000 Then Formula = crRed Else Formula = DefaultAttribute End If Giá trị DefaultAttribute là giá trị bạn gán cho thuộc tính vào lúc thiết kế. Sau khi lưu công thức, quay trở lại hộp thoại Section Expert bạn để ý thấy nút đã thay đổi thành nút có hình cho biết thuộc tính này có sử dụng công thức. Cho preview bản báo cáo bạn sẽ có được kết quả như trên hình 3-05. Hình 3-05: Kết quả preview của file báo cáo sau định dạng bằng công thức 03HC329 – 03HC330 – 03HC437 43
  • 44. Tạo các công thức với Basic Syntax Basic Syntax được đưa vào từ phiên bản Crystal Reports 7.0 trở đi. Nó gần giống với Visual Basic, sử dụng cùng hàm và toán tử, nhưng có khả năng truy cập tất cả các hàm và chức năng đặc trưng của Crystal Reports. 3.3.1 Các qui ước lập trình Basic Syntax Basic Syntax không phân biệt chữ hoa chữ thường. Cho dù công thức của bạn không cần kết xuất ra giá trị, nhưng bạn phải dùng đến biến Formula và gán cho nó một trị tuỳ ý. 3.3.1.1 Viết các ghi chú, diễn giải Các ghi chú, diễn giải trong công thức được bắt đầu bằng dấu nháy đơn (‘) như ví dụ sau ' Công thức tính Tổng tiêu thụ Global TotalOrders as Number TotalOrders = TotalOrders + {Orders_Detail.Quantity} Formula = 999 ' Do sử dụng Basic Syntax nên bắt buộc phải có dòng này 3.3.1.2 Trình bày các câu lệnh Bạn có thể viết một câu lệnh trên nhiều dòng bằng cách sử dụng ký tự gạch chân “_” để liên kết giữa hai dòng. Mặc khác, trên một dòng bạn cũng có thể viết nhiều câu lệnh bằng cách sử dụng ký tự dấu hai chấm “:” để phân cách giữa hai lệnh. Dim x As Number Dim y As String ‘ Gán giá trị cho x = 30 x = 10 + _ 10 + 10 ‘ 3 câu lệnh được viết trên một dòng y = "Hello" : x = 30 : Formula = True 03HC329 – 03HC330 – 03HC437 44
  • 45. Tham chiếu các field báo cáo Để tham chiếu đến các field cơ sở dữ liệu phải theo qui ước {tablename.fieldname} như ví dụ sau: {Orders_Detail.Quantity} * {Orders_Detail.Unit Price} Các field khác sử dụng một tiền tố (prefix) cho biết loại field đang làm việc. Parameter field sẽ có tiền tố là dấu chấm hỏi (?). Formula field có tiền tố là dấu a móc (@). Running Total Field sẽ là dấu thăng (#). 3.3.1.4 Khai báo biến Việc khai báo biến sẽ theo dạng chuẩn sau, khai báo phạm vi rồi đến tên biến kế tiếp là từ khoá As và kiểu dữ liệu. Dim var As datatype Lần đầu tiên một công thức được gọi, các biến sẽ được gán về những giá trị mặc định như trong bảng 3-01. Bảng 3-01: Các giá trị mặc định đối với kiểu dữ liệu khác nhau Kiểu dữ liệu Giá trị mặc định Number 0 Boolean False String “” Date 00/00/00 Time Không có trị mặc nhiên Datetime Không có trị mặc nhiên Một khi biến đã được gán một giá trị nào đó thì nó sẽ giữ nguyên các giá trị trong suốt cuộc sống của nó. Bất cứ lời gọi thực thi nào trong tương lai đối với cùng công thức sẽ không khởi gán lại giá trị mặc định cho biến. Bởi vì với Crystal Reports thì formula và report section cùng hoạt động với nhau. Các công thức thường được thêm vào report section (thường là Details section) và report section luôn được vào ra khi mẫu tin được xử lý. Nếu một biến được khởi gán laị mặc định mỗi lần một mẫu tin được xử lý thì sẽ không cách nào theo dõi việc gì xảy ra với mẫu tin cuối cùng. Nếu bạn muốn gán lại giá trị mặc định mỗi lần mẫu tin được xử lý thì bạn hãy tự làm bằng tay. Phạm vi hoạt động của một biến được khai báo bằng 1 trong 3 tử khoá sau:  Local/Dim: biến có phạm vi Local. 03HC329 – 03HC330 – 03HC437 45
  • 46. Global: biến có phạm vi global nhưng các subreport không thể truy cập được biến này.  Shared: giống như Global, nhưng các subreport có thể truy cập biến này. Lưu ý: Một vấn để bất thường của các biến Global/Shared là cho dù phạm vi của chúng cho biết là có thể sử dụng chúng trong các công thức khác, nhưng bạn vẫn phải khai báo chúng trong mỗi công thức muốn sử dụng chúng. 3.3.2 Các kiểu dữ liệu 3.3.2.1 Các kiểu dữ liệu chuẩn Basic Syntax hỗ trợ những kiểu dữ liệu chuẩn đơn giản thường có ở trong một ngôn ngữ: Boolean, Number, Currency, String, DateTime, Date và Time. Kiểu String được dánh chỉ số bắt đầu từ 1 (chứ không phải từ 0, các bạn quen lập trình với .NET nên lưu ý điều này). Chiều dài của một hằng chuỗi là 65.534 ký tự. ‘ Ví dụ gán một string constant cho một biến chuỗi Dim Var As String Var = “Đây là một chuỗi” Muốn gán một hằng kiểu DateTime, bạn cho bao bởi dấu # như sau: Dim NgayLapHoaDon As DateTime NgayLapHoaDon =

    3/29/2006# 3.3.2.2 Kiểu dữ liệu mảng Khác với .NET, một mảng trên Basic Syntax bắt đầu với chỉ số là 1 (thay vì 0 như thao .NET). Kích thước một mảng tối đa là 100 phần tử. Muốn thay đổi kích thước mảng sau khi khai báo bạn dùng lệnh ReDim, nếu bạn muốn duy trì giá trị của các phần tử hiện có thì bạn dùng thêm từ khoá Preserve. Ví dụ: Dim var() As datatype ‘ khai báo một mảng không có kích thước Redim var(number) ‘ redim lại kích thước và reset tất cả các giá trị Redim Preserve var(number) ‘redim kích thước và duy trì giá trị hiện có Để gán giá trị ban đầu cho các phần tử trong mảng bạn sử dụng hàm Array() như sau: 03HC329 – 03HC330 – 03HC437 46

  • 47. DaysInWeek() As String DaysInWeek = Array(“Mon”, “Tue”, “Wed”, “Thu”, “Fri”, “Sat”, “Sun”) Để truy xuất giá trị của phần tử thứ i bạn theo cú pháp sau ArrayName(i). Để xác định xem một giá trị đã tồn tại trong mảng hay chưa, bạn sử dụng tác tử In bạn sẽ tránh được việc phải duyệt qua toàn bộ mảng để tìm một trị đặt biệt nào đó. Nếu giá trị cần tìm có trong mảng thì tác tử In sẽ trả về True. Xem ví dụ sau: ‘ Thí dụ đoạn code lấy danh sách zipcode của tất cả khách hàng được in ‘ ra và lưu vào trong mảng ZipCodes Dim RecordCounter As Number Dim ZipCodes(100) As Number If Not {Customer.ZipCode} In ZipCodes Then RecordCounter = RecordCounter + 1 ZipCodes(RecordCounter ) = {Customer.ZipCode} End If Basic Syntax cung cấp một số hàm cho phép bạn tổng kết các giá trị trên mảng, được liệt kê theo bảng 3-02. Bảng 3-02: Các hàm Array Summary Hàm Mô tả Average(array) Tính ra trung bình trên tất cả các phần tử của mảng. Count (array) Đếm xem có bao nhiêu phần tử trên mảng. DistinctCount(array) Đếm xem có bao nhiêu phần tử phân biệt. Maximum(array) Trả về phần tử có trị lớn nhất. Minimum(array) Trả về phần tử có trị nhỏ nhất. PopulaionStdDev(array) Trả về tính toán Population Standart Deviation. PopulaionVariance(array) Trả về tính toán Population Variance. StdDev(array) Trả về tính toán Standard Deviation. Variance(array) Trả về tính toán Variance. 3.3.2.3 Kiểu dữ liệu Range Range là kiểu dữ liệu rất hữu ích nhưng lại chưa có trên .NET. Nó cho phép bạn lưu trữ một range bên trong một biến rồi dùng biến đó để kiểm tra xem một biến khác có lọt vào trong range này hay không dựa vào điểm bắt đầu và điểm kết thúc của range (điểm bắt đầu và điểm kết thúc phải thuộc cùng một kiểu dữ liệu). 03HC329 – 03HC330 – 03HC437 47
  • 48. khai báo một biến thuộc kiểu dữ liệu range, bạn khai báo biến theo kiểu dữ liệu chuẩn: Boolean, Number, Currency, String, DateTime, Date và Time rồi kết thúc bằng từ khóa Range. Dim var As datatype Range Định nghĩ một range sẽ dùng nhiều tác tử khác nhau để khai báo giá trị bắt đầu và kết thúc cảu range. Tác tử cơ bản nhất là To. Nó được đặt ở giữa giá trị bắt đầu và kết thúc. Một biến thể của tác tử To là sử dụng nó với một ký tự gạnh dưới (underscore). Đặt underscore tại một phía của tác tử To cho biết giá trị của phía đó sẽ không thuộc về range. Hãy xem ví dụ sau Dim NumberRange As Number Range NumberRange = 0 To 1000 ' range: 0..1000 NumberRange = 0 To_ 1000 ' range: 0..999 NumberRange = 0 _To 1000 ' range: 1..1000 NumberRange = 0 _To_ 1000 ' range: 1..999 ' Dùng trực tiếp không cần khai báo biến If {Customer.Last Year's Sales} In (30000 To_ 100000) Then Formula = "Great Job" End If Basic Syntax cung cấp sẵn cho chúng ta một số Predefined Date Range để chúng ta sử dụng được liệt kê trong bảng 3-03. Bảng 3-03: Predefined Date Range Tên Mô tả AllDatesToToday Từ ngày hôm nay trở về trước AllDatesToYesterday Từ ngày hôm qua trở về trước AllDatesFromToday Bắt đầu: ngày hôm nay Kết thúc: ngày cuối cùng trên vùng mục tin AllDatesFromTomorrow Bắt đầu: ngày mai Kết thúc: ngày cuối cùng trên vùng mục tin Aged0to30Days Aged31to60Days Aged61to90Days Nhóm ngày theo khối 30 ngày trước ngày hôm nay.Ngày của ngày hôm nay được bao gồm trong Aged0to30Days Calendar1stQtr Calendar2ndQtr Calendar3rdQtr Nhóm ngảy trong khối 3 tháng .Nếu ngày đầu tiên là ngày 01 tháng 01 năm hiện hành. 03HC329 – 03HC330 – 03HC437 48
  • 49. Calendar1stHalf Calendar2ndHalf Bắt đầu: 01 tháng giêng năm hiện hành đến 30 tháng 06 Kết thúc: 01 tháng 07 năm hiện hành cho đến 31 tháng 12 Last7Days Bắt đầu: 6 ngày trước ngày hôm nay Kết thúc: Ngày hôm nay Last4WeeksToSun Bắt đầu: ngày thứ hai đầu tiên của 4 tuần trước ngày chủ nhật cuối cùng Kết thúc: ngày chủ nhật cuối cùng Bạn để ý: không bao gồm các ngày sau ngày chủ nhật cuối cùng cho đến ngày hôm nay LastFullWeek Bắt đầu: ngày chủ nhật của chọn tuần lễ cuối . Kết thúc: ngày thứ bảy của chọn tuần lễ cuối. Bạn chú ý: không bao gồm những ngày sau ngày thứ bảy đến ngày hôm nay LastFullMonth Bắt đầu: ngày đầu tiên của tháng cuối cùng Kết thúc: ngày cuối cùng của tháng cuối cùng MonthToDate Bắt đầu: ngày đầu tiên của tháng Kết thúc: ngày hôm nay Next30Days Next31To60Days Next61To90Days Next91To365Days Nhóm ngày theo 4 khối 30 ngày sau ngày hôm nay.Ngày của ngày hôm nay được bao gồm trong range Next30Days Over90days Bao gồm tất cả các ngày trước 90 ngày ,trước ngày hôm nay WeekToDateFromSun Bắt đầu: ngày chủ nhật cuối Kết thúc: ngày hôm nay YearToDate Bắt đầu: 01 tháng 01 năm hiện hành Kết thúc: ngày hôm nay 3.3.3 Các toán tử đơn giản Bây giờ ta xem xem qua một vài tác tử đã được định nghĩa sẵn trên Operator Tree trong hộp thoại Formula Editor hình 3-02. 03HC329 – 03HC330 – 03HC437 49
  • 50. Toán tử toán học Crystal Reports .NET hỗ trợ tât cả các toán tử toán học cơ bản (bao gồm cộng trừ nhân chia) nhưng còn hỗ trợ một số tác tử khác như trên bản 3-04 sau đây. Bảng 3-04: Các toán tử toán học khác Toán tử Ký hiệu Mô tả Integer Divide Chia lấy phần nguyên. ( Ví dụ , 9 2 sẽ trả về kết quả là 4) Modulus Mod Chia lấy phần dư. ( Ví dụ, 9 Mod 2 sẽ trả về số dư là 1) Negate -() Cho thay đổi dấu âm dương (sign) của một con số. Exponentiate ^ Tính số mũ, dùng tính bình phương(Ví dụ, 3^2 sẽ trả về 9) 3.3.3.2 Toán tử Boolean Crystal Reports .NET cung cấp cho chúng ta một số toán tử Boolean trả về giá trị True hoặc False, như theo bảng 3-05 sau đây: Bảng 3-05: Các toán tử Boolean Tác tử Boolean Mô tả Not [Not x] Đảo ngược trị - thí dụ Not (True) là False And [x And y] Nếu tất cả các điều kiện là True thì trả về là True. Nếu một trong các điều kiện không thoả tiêu chí , thì trả về False. Or [x Or y] Trả về True nếu một trong hai điều kiện hoặc cả hai thoả mãn tiêu chí Xor [x Xor y] Logical exclusion ,cho biết khi nào hai biểu thức là khác nhau.Trả về True nếu một điều kiện là True và điều kiện kia là False .Nếu cả hai biểu thức là True hoặc là False ,thì trả về False Eqv [x Eqv y] Logical equivalence,cho biết khi nào hai biểu thức là giống nhau.Trả về True nếu cả hai trị được so sánh là True hoặc nếu cả hai trị được so sánh là False.Nếu hai trị được so sánh khác nhau thì trả về False. Imp [x Imp y] Logical implication ,cho biết là nếu biểu thức đầu tiên là True thì ngầm hiểu biểu thức thứ hai cũng là True.Nếu biểu thức thứ hai cũng là True thì thì Imp trả về True.Còn nếu biếu thức thứ hai là False thì Imp trả về False vì nó không thoả theo những ngầm hiểu.Ngược lại nếu biểu thức thứ nhất là False ,thì không có gì đuợc ngầm hiểu và kết quả bao giờ cũng là True .Như vậy ,lần duy nhất Imp sẽ trả về là False là khi biểu thức thứ nhất là True và biểu thức thứ hai là False. 03HC329 – 03HC330 – 03HC437 50
  • 51. Toán tử so sánh Khi so sánh hai giá trị (biến hoặc hằng) Basic Syntax những toán tử so sánh chuẩn: Equal to (=), Not equal (<>), Less than (<), Greater than (>), Less or Equal (<=) và Greater or Equal (>=). 3.3.3.4 Toán tử chuyển đổi kiểu dữ liệu Bảng 3-06 sau đây liệt kê tất cả các hàm chuyển đổi kiểu dữ liệu. Các hàm này hoạt động tương tự như các hàm tương đương trên .NET. Bảng 3-06: Các hàm chuyển đổi kiẻu dữ liệu Hàm chuyển đổi Mô tả Cbool(number) Cbool(currency) Hàm này nhận tham số kiểu Number hoặc Currency và chuyển đổi thành trị boolean : True hoặc False.Bất cứ trị non-zero nào âm hoặc dương đều trả về True còn trị nào zero sẽ trả về False .Khi hiển thị các bản báo cáo sẽ in ra các từ “True” hoặc “False”. Ccur(number) Ccur(string) Hàm này nhận thông số kiểu Number hoặc String và chuyển đổi thành kiểu dữ liệu Currency.Khi chuyển đổi một string ,có thể có những ký tự định dạng trong chuỗi ,chẳng hạn “$” , ”,” ,…và chuỗi sẽ được chuyển đổi một cách thích hợp. CDbl(currency) CDbl(string) CDbl(boolean) Hàm này chuyển đổi thành Number khi nhận thông số kiểu dữ liệu Currency, String hoặc Boolean .Hàm này tương đương với hàm ToNumber(). CStr() Chuyển đổi các kiểu dữ liệu kiểu Number, Currency hoặc Date thành String .Tương đương với ToText(). Cdate(string) CDate(year, month, day) CDate(Datetime) Hàm này chuyển đổi thành một field thực sự Date Ghi chú: Các hàm CDate(), CTime() và CDateTime() tất cả giống nhau. Trao cho chúng một string nó sẽ chuyển đổi thành kiểu dữ liệu thích ứng. String parser đối với các hàm này rất tin vi. Chúng cho phép bạn nhập những chuỗi khác nhau chẳng hạn “May 23, 2004”, “25/25/2004” hoặc “2004, Dec 21”. Bạn cũng 03HC329 – 03HC330 – 03HC437 51
  • 52. thể trao các con số như là các thông riêng rẽ tượng trưng cho các thành phần khác nhau của một ngày hoặc thời gian. Ctime(string) CTime(hour,min,sec) CTime(DateTime) Hàm này chuyển đổi thành một field Time .Xem ghi chú trên CDate(). CdateTime(string) CDateTime(date) CDateTime(date, time) CDateTime(year, month, day) CDateTime(year, month, day, hour, min, sec) Hàm này chuyển đổi thành một field DateTime .Xem ghi chú trên CDate(). ToNumber(string) ToNumber(boolean) Hàm này nhận thông số kiểu string và boolean và chuyển thành Number .Hàm này tương đương với CDble(). ToText() Hàm này nhận thông số kiểu Number, Currency, Date, Time hoặc boolean và chuyển đổi thành văn bản. Hàm này tương đương với CStr(). IsDate(string) IsTime() IsDateTime() Khi chuyển đổi một kiểu dữ liệu Date ,Time hoặc DateTime bạn sẽ gặp nguy cơ lỗi xảy ra nếu chuỗi không đúng dạng thức .Các hàm này giúp bạn trắc nghiệm trước xem chuỗi có hợp lệ hay không trước khi ra lệnh chuyển đổi.Hàm sẽ trả về True nếu chuỗi có thể được chuyển đổi thích ứng ,bằng không sẽ trả về False. IsNumber (string) Khi chuyển đổi một kiểu dữ liệu Number bạn sẽ gặp nguy cơ lỗi xảy ra nếu chuỗi không đúng dạng thức. Hàm này giúp bạn trắc nghiệm trước xem chuỗi có hợp lệ hay không trước khi ra lệnh chuyển đổi. Hàm sẽ trả về True nếu chuỗi có thể được chuyển đổi thích ứng ,bằng không sẽ trả về False. ToWords (number) ToWords(number,decimals) Hàm này chuyển đổi số thành chữ giống như khi các chi phiếu hoặc các hoá đơn (Ví dụ, 101 sẽ thành “One hundred and one”)1 03HC329 – 03HC330 – 03HC437 52
  • 53. Các Hàm cơ bản Bây giờ ta xem xem qua một hàm đã được định nghĩa sẵn trên Functions Tree trong hộp thoại Formula Editor hình 3-02. 3.3.4.1 Các hàm tổng kết Khi bạn cho chèn một tổng kết vào bản báo cáo, một hàm tổng kết (summary function) tương ứng sẽ được dùng để tạo một field summary chuyên biệt. Các hàm tổng kết bao gồm như sau: Sum(), Average(), Count(), Maximum(), Minimum() ... Các summary field thường được sử dụng theo một trong hai cách khác nhau. Cách thứ nhất, theo đó hàm tổng kết và một field đơn lẽ được tượng trưng cho grand total trên bản báo cáo. ‘ Tính tổng tất cả các giá trị trong Customer.Sales Sum({Customer.Sales}) Ngoài ra, các summary field cũng có thể được dùng trong group level. Ví dụ, nếu filed group là {Customer.Coutry} thì summary field sẽ như sau ‘ Tính tổng tất cả các giá trị trong Customer.Sales ‘ được group theo Customer.Coutry Sum({Customer.Sales}, {Customer.Coutry}) 3.3.4.2 Các hàm xử lý chuỗi Khả năng thay đổi và ráp nối chuỗi là một tính năng cực mạnh của đa số ngôn ngữ lập trình và Basic Syntax cũng không ngoại lệ. Phần này phân loại các hàm xử lý chuỗi thành: phân tích chuỗi Nhiều hàm được liệt kê sau đây thường có hai tham số sau đây: compare và start. Tham số compare xác định phép so sánh chuỗi là case-sensitive (không phân biệt chữ hoa chữ thường). Nếu compare = 0, sẽ là so sánh case-sensitive. Tham số compare là tuỳ chọn, nếu không ghi rõ ra thì sao mặc định sẽ là case-sensitive. Tham số start, tuỳ chọn, cho biết hàm sẽ bắt đầu xử lý tại vị trí start này. Nếu không ghi rõ tham số này ra, thì mặc định là toàn bộ chuỗi sẽ được xử lý. Sau đây là bảng 3-07 sẽ liệt kê các hàm xử lý chuỗi. Bảng 3-07 Các hàm xử lý chuỗi 1 Công thức chuyển đổi số thành chuỗi Tiếng Việt xem phần 3.4 03HC329 – 03HC330 – 03HC437 53
  • 54. Mô tả Các hàm đơn giản Asc(str) Trả về trị ASCII của một ký tự str. Chr(val) Trả về một ký tự tương đương với một trị ASCII val. Len(str) Cho biết số ký tự trong một chuỗi str. IsNumeric(str) Trị boolean, cho biết liệu trong str có thể được chuyển đổi thành một Number hay không. Val(str) Hàm này trả về trị số tương đương với str. Space(val) Hàm này trả về một số space được khai báo như là một chuỗi đơn độc. Các hàm chuyển đổi chuỗi UCase(str) Chuyển đổi một chuỗi biến tất cả các ký tự thành chữ hoa. LCase(str) Chuyển đổi một chuỗi biến tất cả các ký tự thành chữ thường. StrReverse(str) Hàm này cho đảo ngược tất cả các ký tự trong chuỗi str. Các hàm xén chuỗi Trim(str) Xén bỏ các khoảng trắng (space) ở cả 2 đầu chuỗi str. LTrim(str) Xén bỏ các khoảng trắng (space) nằm ở bên trái chuỗi str. RTrim(str) Xén bỏ các khoảng trắng (space) nằm ở bên phải chuỗi str. Mid(str,start,length) Trả về một số ký tự nào đó bắt đầu từ một vị trí được khai báo. Các tham số start và length là tuỳ chọn. Nếu không khai báo length thì hàm sẽ trả về tất cả các ký tự bắt đầu từ ký tự đầu tiên được khai báo. Left(str,length) Trả về một số ký tự nào đó (dài do length chỉ định ) bắt đầu từ ký tự tận cùng bên trái. Right(str,length) Trả về một số ký tự nào đó (dài do length chỉ định ) bắt đầu từ ký tự tận cùng bên phải. Các hàm xử lý dựa trên 2 chuỗi InStr(start,str1,str2 ,compare) Hàm này xác định liệu xem chuỗi str2 có phải là một chuỗi con trong str1 hay không. Cả hai tham số start và compare là tuỳ chọn. InStrRev(start,str1,s tr2,compare) Hàm này tương tự như hàm Instr() nhưng làm ngược lại đi từ cuối ngược lên đầu. StrCmp(str1,str2,comp So sánh 2 chuỗi str1 và str2 với nhau. Trị trả về dựa trên 03HC329 – 03HC330 – 03HC437 54
  • 55. việc so sánh 2 chuỗi với nhau: · -1 nếu str1<str2 · 0 nếu str1= str2 · 1 nếu str1>=str2 Tham số compare tuỳ chọn. Filter (str, find, include, compare) Hàm này cho truy tìm trên một mảng các chuỗi str xem có chuỗi con find khớp hay không. include là một trị boolean, tuỳ chọn, cho biết liệu xem có trả về những chuỗi con có bao gồm find hay không. Nếu include là True, thì hàm trả về là mảng tập hợp con chứa find như là một chuỗi con. Còn nếu include là False thì hàm sẽ trả về mảng tập hợp không chứa find như là một chuỗi con. Replace(str, find, replace, start , count, compare) Hàm này tìm trên chuỗi str một chuỗi con find và nếu có thay thế nó bởi một chuỗi con khác replace. Các tham số start, count và compare là tuỳ chọn . ReplicateString(str, copies) Hàm này trả về bản sao của một chuỗi str. Join (list,delimiter) Hàm này trả về một chuỗi hình thành bằng cách ráp một mảng các chuỗi list và ngăn cách các chuỗi bởi một ký tự phân cách delimiter. Split(str,delimiter, count, compare) Tách một chuỗi đơn lẻ str thành một mảng các chuỗi dựa trên ký tự phân cách delimiter. Các tham số count, compare là tuỳ chọn. Picture(str,template) Hàm này cho định dạng các ký tự trong một chuỗi str lên một template. template bao gồm một loạt các ký tự ‘x’ dùng để ánh xạ một ký tự trên str lên nó. Nếu kích thước chuỗi str lớn hơn template thì các ký tự còn lại sẽ được thêm vào cuối. Nếu tempate có bất kỳ ký tự nào khác ‘x’ thì ký tự đó sẽ được giữ nguyên. 03HC329 – 03HC330 – 03HC437 55
  • 56. đây là một số ví dụ vể các hàm sử lý chuỗi ‘ Ví dụ sử dụng hàm Filter() Dim StringArray() As String Dim FilterArray() As String StringArray = Array (“abcd”, “bcde”, “cdrf”) ‘ Kết quả là một mảng gồm các phần tử “abcd” và “bcde” FilterArray = Filter(StringArray, “bcd”) ‘ Kết quả là một mảng với chỉ một phần tử “cdef” ‘ vì phần tử “cdef” không chứa chuỗi “bcd” FilterArray = Filter(StringArray, “bcd”, False) ‘ Ví dụ hàm Replace() làm thay đổi các địa chỉ sử dụng cách viết tắt Address = “127 Nguyễn Văn Cừ Street – 05 District” Address = Replace(Address , “Street”, “St.”) Address = Replace(Address , “District”, “Dst.”) ‘ Kết quả Address = “127 Nguyễn Văn Cừ St. – 05 Dst.” ‘ Ví dụ sử dụng hàm Join() & Split() Dim Names As String Dim NameArray() As String Names = “Mr.Jones, Sir Alfred, Ms.Bee, Mr.Smith” NameArray = Split(Names, “,”) ‘ Kết quả: NameArray = {“Mr.Jones”, “Sir Alfred”, “Ms.Bee”, “Mr.Smith”} NameArray = Filter(NameArray, “Mr.” ) ‘ Kết quả: NameArray = {“Mr.Jones”, “Mr.Smith”} ‘ Ráp lại mảng với dấu phẩy làm dấu phân cách Names = Join(NameArray, “,”) ‘ Kết quả: Names = “Mr.Jones, Mr.Smith” ‘ Ví dụ hàm Picture() để ánh xạ một chuỗi Formula = Picture(“yahoo”, “www.xxxxx.com”) ‘ Kết quả là www.yahoo.com 03HC329 – 03HC330 – 03HC437 56
  • 57. Các hàm Date & Time Vì phần lớn các bản báo cáo đều có liên quan đên thông tin ngày giò dưới hình thức này hay hình thức khác, nên Crystal Reports cung cấp cho chúng ta một số hàm liên quan đến ngày giờ được liệt kê theo bảng 3-08 sau. Bảng 3-08: Các hàm Date & Time Hàm Mô tả CurrentDate CurrentTime CurrentDateTime Hàm này trả về ngày giờ hiện hành. DateSerial(year, month ,day) DateTime(hour, minute, second) Hàm này trả về một ngày hoặc giờ. DateAdd (interval, number,date) Hàm này tăng ngày thêm một khoảng thời gian. DateDiff (interval, startdate, enddate, firstdayofweek ) Hàm này trả về sai biệt giữa hai ngày firstdayofweek là tuỳ chọn DatePart (interval, date, firstdayofweek,firstweekofyear) Hàm này trả về một con số tượng trưng khoảng cách hiện hành của một ngày. MonthName(date, abbreviate) Hàm này nhận một con số tượng trưng cho tháng và trả về chọn tên tháng hoặc trả về tháng viết tắt theo 3 mẫu tựa như thông số abbreviate là True. Theo mặc nhiên abbreviate là False trả về chọn tên tháng. Timer Hàm này trả về số giây đã đi qua kể từ nửa đêm. Weekday(date,firstdayofweek) Hàm này trả về một con số (1, 2, …7) cho biết ngày trong tuần. WeekdayName(weekday ,abbreviate, firstdayofweek) Hàm này nhận một con số (1 đến 7)tượng trưng ngày trong tuần và trả về trọn tên ngày hoặc trả về ngày viết tắt theo 3 mẫu tự nếu thông số abbreviate là True. Bảng 3-09: Liệt kê các chuỗi interval dùng lam tham số cho các hàm DateAdd(), DateDiff() và DatePart(). 03HC329 – 03HC330 – 03HC437 57
  • 58. 3-09: Interval String String Mô tả “yyyy” Year “q” Quarter – Quý “m” Month - Tháng “ww” Week (7 days) - Tuần lễ 7 ngày “w” Weekday – Ngày trong tuần “y” Day of year – Ngày trong năm “d” Day – Ngày “h” Hour-giờ “n” Minute – Phút “s” Second - Giây 3.3.4.4 Các hàm toán học Bảng 3-10 sau đây liệt kê các hàm toán học trên Crystal Reports. Bảng 3-10: Các hàm toán học Hàm Mô tả Abs(number) Trả về trị tuyệt đối. Fix(number,decimals) Trả về một con số với một số ký tự (digit) có ý nghĩa. Int(number) Numeratordenominator Trả về phần số nguyên của một phân số. Pi Trả về 3.14… Remainder(numerator,denominator) Numerator Mod denominator Trả về số dư khi chia numerator cho denominator. Round(number,decimals) Trả về một số được làm tròn với một số ký tự số có ý nghĩa. Sgn(number) Trả về một số nguyên cho biết dấu âm dương của một con số. Số trả về bằng 1 cho biết lớn hơn zero, 0 là bằng zero, còn -1 là nhỏ hơn zero Sqr(number) Exp(number) Log(number) Các hàm số học chuẩn. Cos(number) Sin(number) Tan(number) Atn(number) Các hàm khoa học chuẩn. 03HC329 – 03HC330 – 03HC437 58
  • 59. Định dạng các trị kết xuất Muốn xây dựng một chuỗi kết xuất với tổ hợp những kiểu dữ liệu khác nhau, bạn sử dụng hàm CStr(). Hàm này nhận tham số đầu tiên là giá trị cần định dạng, và tham số thứ hai là chuỗi định dạng bao gồm một hay nhiều ký tự định dạng liệt kê trong bảng 3-11. Bảng 3-11: Các ký tự định dạng của CStr() Format Mô tả # Dùng định dạng các con số. Nếu con số không đủ dài thì space sẽ được dùng thay vào đó. Nếu con số quá dài, so với chuỗi định dạng, thì phần số nguyên sẽ vẫn được hiển thị đấy đủ. Nhưng digit không dùng đến sau dấu phẩy số lẻ sẽ được điền bởi zero. 0 Dùng định dạng các con số. Nếu con số không đủ dài thì zero sẽ được dùng thay vào đó. Nếu con số quá dài, so với chuỗi định dạng, thì phần số nguyên sẽ vẫn được hiển thị đấy đủ. Nhưng digit không dùng đến sau dấu phẩy số lẻ sẽ được điền bởi zero. , Dùng định dạng các con số chỉ định dấu phân cách số ngàn. . Dùng định dạng các con số chỉ định dấu phân cách số lẻ. d,M Day, Month như là con số (không có zero trước). dd,MM,yy Day, Month và Year như là 2 con số (với zero đi đầu nếu thấy cần thiết). ddd,MMM Day, Month như là viết tắt gồm 3 mẫu tự. dddd,MMMM.yyyy Day, Month và Year viết ra đấy đủ. h,m,s Hour, Minute và Second như là con số không có zero đi đầu. hh,mm,ss Hour, Minute và Second như là hai con số (với zero đi đầu nếu thấy cần thiết). HH Cho thấy Hour sử dụng 24 giờ (military time). t Một ký tự tương tự AM/PM. tt Hai ký tự tương tự AM/PM. Bảng 3-12 là những ví dụ cho thấy những giá trị khác nhau sau khi được định dạng. Bảng 3-12 :Các thí dụ kết xuất CStr() Stt CStr() Kết xuất 1 CStr(1234,2) 1,234.00 2 CStr(1234.567,2) 1,234.57 3 CStr(1234.567,”#”) 1234 4 CStr(1234.567,”0”) 1234 03HC329 – 03HC330 – 03HC437 59
  • 60. CStr(1234,”0.##”) 1234.00 6 CStr(1234,”0.00”) 1234.00 7 CStr(1234.567,”#.##”) 1234.57 8 CStr(1234.567,”0.00”) 1234.57 9 CStr(1234.567,”#####”) 1234 10 CStr(1234.567,”00000”) 01234 11 CStr(1234.567,”#”,2) 1234 12 CStr(1234.567,”#.##”,2) 1234.57 13 CStr(1234.567,”#.###”,2) 1234.57 14 CStr(1234.567,”#.##”,2,”,”) 1234.57 15 CStr(1234.567,”#.##”2,”.”,”,”) 1234,57 16 CStr(1234.567,2,”.” , ”,”) 1.234,57 17 CStr(1234.567,”###,###.##”) 1,234.57 18 CStr (

    1/2/2003 04:05:06 am#, ”d/M/yy H/m/s t”) 1/2/03 4:5:6 A 19 CStr (

    1/2/2003 04:05:06 am#, ”dd/MM/yyyy HH/mm/ss tt”) 01/02/2003 04:05:06 AM 20 CStr(

    3:20 PM#, ”HH:mm”) 15:20 3.3.5. Các cấu trúc điểu khiển Crystal Report hỗ trợ một số cấu trúc điều kiện mà hầu hết các lập trình viên đều rất quen thuộc. 3.3.5.1 Các cấu trúc điều kiện Câu lệnh If..Then Cú pháp: If <Biểu thức 1> Then ... ElseIf <Biểu thức 2> Then ... Else ... End If Ví dụ: If {Customer.Last Year's Sales} > 30000 Then Formula = "Excellent Job" ElseIf {Customer.Last Year's Sales} > 20000 Then 03HC329 – 03HC330 – 03HC437 60

  • 61. = "Great Job" ElseIf {Customer.Last Year's Sales} > 10000 Then Formula = "Fine Job" End If Câu lệnh Select Case Cú pháp Select Case var Case <Biểu thức 1> ... Case <Biểu thức 2> ... Case <Biểu thức 3>, <Biểu thức 4> ... Case Else ... End Select Lưu ý: câu lệnh này không có từ khoá break, nó tự hiểu ngầm khi so sánh biểu thức. Ví dụ: Select Case {Customer.PriorityNumber} Case 1, 2, 3 Formula = “Hight priority” Case 4 Formula = “Medium priority” Case Else Formula = “Low priority” End Select 3.3.5.2 Các cấu trúc lặp Vòng lặp For Next Cú pháp 03HC329 – 03HC330 – 03HC437 61
  • 62. var = start To end Step increment .... Next Vòng lặp While Do Cú pháp While true_condition ... Wend Các vòng lặp khác Do While true_condition ... Loop Do ... Loop While true_condition Do Until false_condition ... Loop Do ... Loop Until false_condition  Từ khóa While tiếp tục lặp khi biểu thức true_condition = True  Từ khóa Until tiếp tịc lặp khi biểu thức false_condition = False  Bạn có thể ngắt ngang vòng lặp Do bằng cách sử dụng câu lệnh Exit Do. 3.4 Công thức chuyển đổi số thành chuỗi Tiếng Việt Trong thực tế các dạng report như hóa đơn, biên lai ... ngoài những giá trị ghi bằng con số còn có một phần gọi là ghi bằng chữ, công thức chúng tôi sẽ trình bày sau đây sẽ giúp các bạn thực hiện được điều này. Công thức này gồm có 2 biến strSourceValue và strUnitOfCalculate. Trong đó strSourceValue lưu các con số cần chuyển đổi còn strUnitOfCalculate là chuỗi lưu đơn vị tính (đồng, cái, mét, kg ...). Vậy để sử dụng công thức này bạn chỉ cần 2 bước sau:  Chuyển đổi giá trị Field mà bạn muốn chuyển đổi thành chuỗi và lưu vào biến strSourceValue (strSourceValue chỉ chứa các con số 0-9, không chứa bất kỳ ký tự khác). 03HC329 – 03HC330 – 03HC437 62
  • 63. Xác định đơn vị tính của bạn bằng cách thay đổi trực tiếp giá trị biến strUnitOfCalculate.  Lưu ý: công thức chỉ xử lý được với giá trị tối đa là 999.999.999.999 ' Công thức ToVieWord chuyển đổi giá trị số của một Field thành các từ Tiếng ' Việt ' Ví dụ ' Input: ' Value = 15250005045 ' Đơn vị tính = "đồng" ' Output: ' "Mười lăm tỉ hai trăm năm mươi triệu năm nghàn không trăm bốn mươi ' lăm đồng" ' Lưu ý: công thức chỉ xử lý được với giá trị tối đa là 999.999.999.999 Dim strSourceValue As String ' Chuỗi lưu các con số cần chuyển đổi Dim strUnitOfCalculate As String ' Chuỗi lưu đơn vị tính (đồng, cái, _ mét, kg, ...) ' Bạn xác lập các giá trị cho công thức ở đây ==================================== ' Nhiệm vụ của bạn ở đây là bổ sung thêm các câu lệnh để chuyển đổi Field cần sử lý về _ dạng chuỗi chỉ chứa những con số, không có các ký tự khác. ' Nếu Field có kiểu là Number thì dùng câu lệnh sau strSourceValue = ToText({?TestNumber},"#") strUnitOfCalculate = "đồng" ' Thay đổi đơn vị tính của bạn ở đây (mặc định là "đồng") ' Phần xử lý của công thức bạn không cần thay đổi gì cả ========================== ' Khai báo các biến và các hằng giá trị ========================================== Dim strResult As String ' Chuỗi lưu kết quả phân tích Dim ThreeDigit As String ' Chuỗi lưu 3 chữ số ' Mảng lưu các đơn vị (const) tương ứng của 1 chữ số Dim UnitArray1() As String UnitArray1 = Array ("", "mươi ", "trăm ") Dim idUnit1 As Number ' idUnit1 = 1: hàng đơn vị 2: hàng chục 3: hàng trăm ' Mảng lưu các hằng đơn vị (const) tương ứng của cụm 3 chữ số Dim UnitArray2() As String UnitArray2 = Array ("", "ngàn ", "triệu ", "tỉ ") ' Mảng lưu các chữ số đơn lẻ đã được phân tích trong một cụm 3 chữ số Dim OneWordArray(3) As String ' Stack lưu các cụm 3 chữ số đã được phân tích Dim ThreeWordStack(4) As String ' Số lượng các phần tử có nghĩa trong ThreeWordStack Dim nTop As Number nTop = 1 ' Bắt đầu xử lý ================================================================= If Not IsNumeric(strSourceValue) Then ' Input không phải là giá trị số strResult = "Dữ liệu không hợp lệ !" Else If ToNumber(strSourceValue) = 0 Then ' Giá trị Input = 0 strResult = "Không " + strUnitOfCalculate Else If Len(strSourceValue) > 12 Then strResult = "Giá trị vượt quá con số 999 999 999 999!" Else 'Convert chuỗi strSourceValue về dạng đầy đủ XXX XXX XXX XXX Dim lenght As Number lenght = Len(strSourceValue) Mod 3 If lenght = 1 Then strSourceValue = "00" + strSourceValue Else 'lenght = 2 strSourceValue = "0" + strSourceValue 03HC329 – 03HC330 – 03HC437 63