LTUDQL 2




Tạo Report trên VS .NET



                    Bùi Tấn Lộc
               btloc@fit.hcmus.edu.vn




                          .         -1-   ©HCMUS
LTUDQL 2

Nội dung


   • Loại report hỗ trợ cơ bản trên VS.NET
   • Crystal Report hay RDLC?
   • Làm thế nào sử dụng Crystal Report trên VS .NET 2010?
   • Đã cài Crystal Report, nhưng khi tạo mới 1 report (*.rpt) lại
     báo lỗi lúc biên dịch, không tìm thấy control ReportViewer?
   • Tạo Crystal Report với file *.mdf




                               .            -2-          ©HCMUS
LTUDQL 2

1.Loại report hỗ trợ cơ bản trên VS.NET


    • Crystal Report (*.rpt)
       • Từ phiên bản VS 2010 không còn cài sẵn, muốn sử dụng phải cài thêm
         gói SAP Crystal Report
    • RDLC - Report Definition Language Client-side (*.rdlc)
       • Còn gọi là SQL Server Reporting Services hoặc Microsoft Report




                                   .               -3-           ©HCMUS
LTUDQL 2

2.Crystal Report hay RDLC?


   • Thông tin thảo luận trên forum Microsoft:
      • http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/b1068dca-
          75d6-4d93-bf9f-2371547b94e9
   • So sánh giữa Crystal Report và RDLC:
      • http://www.crystalreportsbook.com/SSRSandCR_Conclusion.asp
   • Ý kiến cá nhân:
      • RDLC có giao diện in ấn đẹp mắt
      • Khi tạo setup cho ứng dụng RDLC tự động nhúng vào gói cài đặt, còn
          Crystal Report phải dùng merge module
      •   Khi chạy trên máy khác, đối với Crystal Report cài cho VS2010 cần cài
          “DotNet Framework 4 full” trên client để chạy tốt.
      •   Crystal Report dễ sử dụng hơn RDLC



                                     .               -4-           ©HCMUS
LTUDQL 2

3.Làm thế nào sử dụng Crystal Report trên VS .NET 2010?


    • Cài đặt bản “SAP Crystal Reports, version for Visual Studio 2010 - Standard”
        • http://www.businessobjects.com/jump/xi/crvs2010/us2_default.asp




                                       .               -5-            ©HCMUS
LTUDQL 2
4.Đã cài Crystal Report, nhưng khi tạo mới 1 report (*.rpt) lại
báo lỗi lúc biên dịch, không tìm thấy control ReportViewer?




                                .            -6-         ©HCMUS
LTUDQL 2

4.(tt) Sửa lỗi trên project VB.NET


    •   Right Click Project/Properties/Compile/Advanced Compile Options




                                     .               -7-           ©HCMUS
LTUDQL 2

4.(tt) Sửa lỗi trên project VB.NET


    • Target framework/.NET Framework 4




                               .          -8-   ©HCMUS
LTUDQL 2

4.(tt) Sửa lỗi trên project C#


    • Right Click Project/Properties/Application/Target
       framework/.NET framework 4




                                 .      -9-        ©HCMUS
LTUDQL 2

5.Tạo Crystal Report với file *.mdf


    • Crystal Report không kết nối trực tiếp đến *.mdf. Có thể giải
        quyết như sau:
          • Attach *.mdf vào SQL Server (khi attach phải run as Administrator)
    USE [master]
    GO
    CREATE DATABASE [TruongHoc] ON
    ( FILENAME = N'C:QuanLyTruongHocPresentationbinDebugTruongHoc.mdf' ),
    ( FILENAME = N'C:QuanLyTruongHocPresentationbinDebugTruongHoc_Log.ldf' )
    FOR ATTACH
    GO

          • Sử dụng Crystal Report kết nối đến CSDL SQL Server
    • Vấn đề: Cystal Report sẽ xung đột truy xuất CSDL với kỹ
      thuật LINQ nếu làm theo cách này!
    • Nên sử dụng cùng một cách thức truy xuất CSDL cho LINQ
      và Crystal Report (thông qua SQL Server)

                                                       .                      - 10 -   ©HCMUS
LTUDQL 2

6.Áp dụng LINQ vào Crystal Report


   • DataSource của CrystalReportDocument có thể là dạng kiểu
     tập hợp (danh sách, bảng dữ liệu, DataSet, …)
   • Chuyển kết quả truy vấn của LINQ sang dạng danh sách,
     DataTable, DataSet (DataTable không bị lỗi biên dịch)
   • Sử dụng .NET Framework 3.5 để biên dịch




                             .           - 11 -     ©HCMUS
LTUDQL 2

6.Áp dụng LINQ vào Crystal Report (tt)

    'Thong ke hoc sinh theo diem trung binh
    lstHs = hsBus.ThongKeHocSinhTheoDTB(5)
    Dim tableDemo As New DataTable("demo")
    tableDemo.Columns.Add("Ma")
    tableDemo.Columns.Add("Ten")
    tableDemo.Columns.Add("DTB")
    tableDemo.Columns.Add("TenLop")

    For Each item In lstHs
         Dim dr As DataRow
         dr = tableDemo.NewRow()
         dr("Ma") = item.Ma
         dr("Ten") = item.Ten
         dr("DTB") = item.DTB
         dr("TenLop") = item.LopHoc.Ten
         tableDemo.Rows.Add(dr)
    Next

    rpt.SetDataSource(tableDemo)
    CrystalReportViewer1.ReportSource = rpt


                                          .   - 12 -   ©HCMUS
LTUDQL 2

7.Chạy ứng dụng trên máy khác – App.Config (Presentation)

    <?xml version="1.0"?>
    <configuration>
        <startup>
        <supportedRuntime version="v2.0.50727"/></startup>
      <appSettings>
        <add key="connectionString" value="Data Source=BTLOC-
    LAPTOPSQLEXPRESS;Initial Catalog=TruongHoc;Integrated
    Security=True" />
      </appSettings>
    </configuration>


    • Khi biên dịch sẽ tạo ra file <TenProject>.exe.config có nội dung
      như trên. File này nằm cùng thư mục với tập tin thực thi. Chỉ
      cần chỉnh sửa giá trị của file config được biên dịch này là có thể
      chạy trên máy khác.
                                 .             - 13 -       ©HCMUS
LTUDQL 2

7.Chạy ứng dụng trên máy khác – Đọc chuỗi kết nối


    Dim cnStr As String
    cnStr =
    System.Configuration.ConfigurationSettings
    .AppSettings("ConnectionString")




                              .           - 14 -    ©HCMUS
LTUDQL 2
7. Chạy ứng dụng trên máy khác
Thay đổi chuỗi kết nối cho Crystal Report

    Dim rpt As New rptDanhSachHocSinh()
    MyModule.ChangeConnection(rpt, cnStr)

    Dim lhBus As New LopHocBus(cnStr)
    Dim dsLopHoc As IList
    dsLopHoc = lhBus.LayDanhSach()




                               .            - 15 -   ©HCMUS
LTUDQL 2
7. Chạy ứng dụng trên máy khác
Hàm ChangeConnection

   Dim conn_string_array() As String =               For i = 0 To rpt.Database.Tables.Count - 1
   Split(cnStr, ";")                                    Dim logoninfo As TableLogOnInfo
   Dim key_value() As String                            logoninfo = rpt.Database.Tables(i).LogOnInfo
                                                        logoninfo.ConnectionInfo.ServerName =
   For i = 0 To conn_string_array.Count - 1          server_name
      key_value = Split(conn_string_array(i), "=")      logoninfo.ConnectionInfo.DatabaseName =
      If key_value(0).ToLower = "data source" Then   database_name
         server_name = key_value(1)                     logoninfo.ConnectionInfo.UserID = user_id
      ElseIf key_value(0).ToLower = "initial            logoninfo.ConnectionInfo.Password = password
   catalog" Then                                        logoninfo.ConnectionInfo.IntegratedSecurity
         database_name = key_value(1)                = sspi
      ElseIf key_value(0).ToLower = "user id" Then   rpt.Database.Tables.Item(i).ApplyLogOnInfo(logo
         user_id = key_value(1)                      ninfo)
      ElseIf key_value(0).ToLower = "password"       Next
   Then
         password = key_value(1)
      ElseIf key_value(0).ToLower = "integrated
   security" Then
         sspi = key_value(1)
      End If
   Next




                                             .                  - 16 -             ©HCMUS
LTUDQL 2
7. Chạy ứng dụng trên máy khác
Thay đổi chuỗi cnStr cho LINQ

   Public Class LopHocBus
       Private _cnStr As String
       Public Sub New(ByVal cnStr As String)
           _cnStr = cnStr
       End Sub
       Public Function LayDanhSach() As IList
           'Kiem tra business rule neu co
           Dim db As New TruongHocDataContext(_cnStr)
           Dim query = From lh In db.LopHocs
                       Select lh
           Return query.ToList()
       End Function
   End Class


                             .          - 17 -     ©HCMUS
LTUDQL 2

8.Áp dụng


   • Làm lại theo video demo
   • Thử đem ứng dụng lên máy 1 người khác chạy




                            .          - 18 -     ©HCMUS
LTUDQL 2

Câu hỏi?




           .   - 19 -   ©HCMUS

Report

  • 1.
    LTUDQL 2 Tạo Reporttrên VS .NET Bùi Tấn Lộc btloc@fit.hcmus.edu.vn . -1- ©HCMUS
  • 2.
    LTUDQL 2 Nội dung • Loại report hỗ trợ cơ bản trên VS.NET • Crystal Report hay RDLC? • Làm thế nào sử dụng Crystal Report trên VS .NET 2010? • Đã cài Crystal Report, nhưng khi tạo mới 1 report (*.rpt) lại báo lỗi lúc biên dịch, không tìm thấy control ReportViewer? • Tạo Crystal Report với file *.mdf . -2- ©HCMUS
  • 3.
    LTUDQL 2 1.Loại reporthỗ trợ cơ bản trên VS.NET • Crystal Report (*.rpt) • Từ phiên bản VS 2010 không còn cài sẵn, muốn sử dụng phải cài thêm gói SAP Crystal Report • RDLC - Report Definition Language Client-side (*.rdlc) • Còn gọi là SQL Server Reporting Services hoặc Microsoft Report . -3- ©HCMUS
  • 4.
    LTUDQL 2 2.Crystal Reporthay RDLC? • Thông tin thảo luận trên forum Microsoft: • http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/b1068dca- 75d6-4d93-bf9f-2371547b94e9 • So sánh giữa Crystal Report và RDLC: • http://www.crystalreportsbook.com/SSRSandCR_Conclusion.asp • Ý kiến cá nhân: • RDLC có giao diện in ấn đẹp mắt • Khi tạo setup cho ứng dụng RDLC tự động nhúng vào gói cài đặt, còn Crystal Report phải dùng merge module • Khi chạy trên máy khác, đối với Crystal Report cài cho VS2010 cần cài “DotNet Framework 4 full” trên client để chạy tốt. • Crystal Report dễ sử dụng hơn RDLC . -4- ©HCMUS
  • 5.
    LTUDQL 2 3.Làm thếnào sử dụng Crystal Report trên VS .NET 2010? • Cài đặt bản “SAP Crystal Reports, version for Visual Studio 2010 - Standard” • http://www.businessobjects.com/jump/xi/crvs2010/us2_default.asp . -5- ©HCMUS
  • 6.
    LTUDQL 2 4.Đã càiCrystal Report, nhưng khi tạo mới 1 report (*.rpt) lại báo lỗi lúc biên dịch, không tìm thấy control ReportViewer? . -6- ©HCMUS
  • 7.
    LTUDQL 2 4.(tt) Sửalỗi trên project VB.NET • Right Click Project/Properties/Compile/Advanced Compile Options . -7- ©HCMUS
  • 8.
    LTUDQL 2 4.(tt) Sửalỗi trên project VB.NET • Target framework/.NET Framework 4 . -8- ©HCMUS
  • 9.
    LTUDQL 2 4.(tt) Sửalỗi trên project C# • Right Click Project/Properties/Application/Target framework/.NET framework 4 . -9- ©HCMUS
  • 10.
    LTUDQL 2 5.Tạo CrystalReport với file *.mdf • Crystal Report không kết nối trực tiếp đến *.mdf. Có thể giải quyết như sau: • Attach *.mdf vào SQL Server (khi attach phải run as Administrator) USE [master] GO CREATE DATABASE [TruongHoc] ON ( FILENAME = N'C:QuanLyTruongHocPresentationbinDebugTruongHoc.mdf' ), ( FILENAME = N'C:QuanLyTruongHocPresentationbinDebugTruongHoc_Log.ldf' ) FOR ATTACH GO • Sử dụng Crystal Report kết nối đến CSDL SQL Server • Vấn đề: Cystal Report sẽ xung đột truy xuất CSDL với kỹ thuật LINQ nếu làm theo cách này! • Nên sử dụng cùng một cách thức truy xuất CSDL cho LINQ và Crystal Report (thông qua SQL Server) . - 10 - ©HCMUS
  • 11.
    LTUDQL 2 6.Áp dụngLINQ vào Crystal Report • DataSource của CrystalReportDocument có thể là dạng kiểu tập hợp (danh sách, bảng dữ liệu, DataSet, …) • Chuyển kết quả truy vấn của LINQ sang dạng danh sách, DataTable, DataSet (DataTable không bị lỗi biên dịch) • Sử dụng .NET Framework 3.5 để biên dịch . - 11 - ©HCMUS
  • 12.
    LTUDQL 2 6.Áp dụngLINQ vào Crystal Report (tt) 'Thong ke hoc sinh theo diem trung binh lstHs = hsBus.ThongKeHocSinhTheoDTB(5) Dim tableDemo As New DataTable("demo") tableDemo.Columns.Add("Ma") tableDemo.Columns.Add("Ten") tableDemo.Columns.Add("DTB") tableDemo.Columns.Add("TenLop") For Each item In lstHs Dim dr As DataRow dr = tableDemo.NewRow() dr("Ma") = item.Ma dr("Ten") = item.Ten dr("DTB") = item.DTB dr("TenLop") = item.LopHoc.Ten tableDemo.Rows.Add(dr) Next rpt.SetDataSource(tableDemo) CrystalReportViewer1.ReportSource = rpt . - 12 - ©HCMUS
  • 13.
    LTUDQL 2 7.Chạy ứngdụng trên máy khác – App.Config (Presentation) <?xml version="1.0"?> <configuration> <startup> <supportedRuntime version="v2.0.50727"/></startup> <appSettings> <add key="connectionString" value="Data Source=BTLOC- LAPTOPSQLEXPRESS;Initial Catalog=TruongHoc;Integrated Security=True" /> </appSettings> </configuration> • Khi biên dịch sẽ tạo ra file <TenProject>.exe.config có nội dung như trên. File này nằm cùng thư mục với tập tin thực thi. Chỉ cần chỉnh sửa giá trị của file config được biên dịch này là có thể chạy trên máy khác. . - 13 - ©HCMUS
  • 14.
    LTUDQL 2 7.Chạy ứngdụng trên máy khác – Đọc chuỗi kết nối Dim cnStr As String cnStr = System.Configuration.ConfigurationSettings .AppSettings("ConnectionString") . - 14 - ©HCMUS
  • 15.
    LTUDQL 2 7. Chạyứng dụng trên máy khác Thay đổi chuỗi kết nối cho Crystal Report Dim rpt As New rptDanhSachHocSinh() MyModule.ChangeConnection(rpt, cnStr) Dim lhBus As New LopHocBus(cnStr) Dim dsLopHoc As IList dsLopHoc = lhBus.LayDanhSach() . - 15 - ©HCMUS
  • 16.
    LTUDQL 2 7. Chạyứng dụng trên máy khác Hàm ChangeConnection Dim conn_string_array() As String = For i = 0 To rpt.Database.Tables.Count - 1 Split(cnStr, ";") Dim logoninfo As TableLogOnInfo Dim key_value() As String logoninfo = rpt.Database.Tables(i).LogOnInfo logoninfo.ConnectionInfo.ServerName = For i = 0 To conn_string_array.Count - 1 server_name key_value = Split(conn_string_array(i), "=") logoninfo.ConnectionInfo.DatabaseName = If key_value(0).ToLower = "data source" Then database_name server_name = key_value(1) logoninfo.ConnectionInfo.UserID = user_id ElseIf key_value(0).ToLower = "initial logoninfo.ConnectionInfo.Password = password catalog" Then logoninfo.ConnectionInfo.IntegratedSecurity database_name = key_value(1) = sspi ElseIf key_value(0).ToLower = "user id" Then rpt.Database.Tables.Item(i).ApplyLogOnInfo(logo user_id = key_value(1) ninfo) ElseIf key_value(0).ToLower = "password" Next Then password = key_value(1) ElseIf key_value(0).ToLower = "integrated security" Then sspi = key_value(1) End If Next . - 16 - ©HCMUS
  • 17.
    LTUDQL 2 7. Chạyứng dụng trên máy khác Thay đổi chuỗi cnStr cho LINQ Public Class LopHocBus Private _cnStr As String Public Sub New(ByVal cnStr As String) _cnStr = cnStr End Sub Public Function LayDanhSach() As IList 'Kiem tra business rule neu co Dim db As New TruongHocDataContext(_cnStr) Dim query = From lh In db.LopHocs Select lh Return query.ToList() End Function End Class . - 17 - ©HCMUS
  • 18.
    LTUDQL 2 8.Áp dụng • Làm lại theo video demo • Thử đem ứng dụng lên máy 1 người khác chạy . - 18 - ©HCMUS
  • 19.
    LTUDQL 2 Câu hỏi? . - 19 - ©HCMUS