Ακολούθησε τις παρακάτω οδηγίες γιά την εμφάνιση Crystal Reports από το .NET χρησιμοποιώντας Datasets.
1. Κατέβασέ τα από αυτό το link:
http://downloads.businessobjects.com/akdlm/cr4vs2010/CRforVS_13_0_4.exe
2. Φτιάξε ένα VB windows Forms application.
3. Κάνε open το My Project του Solution Explorer και επέλεξε το tab Compile.
4. Click στο [Advanced Compile Options] Command Button και άλλαξε το Target Framework του Combo Box από [.NET Framework 4.0 Client Profile] σε [.NET Framework 4.0]
(σε παλαιότερα versions του Framework < 3.5 δεν χρειάζεται να γίνει αυτή η διαδικασία).
5. Πήγαινε στο Design Mode της Φόρμας, βάλε
a. ένα command button και
b. κάνε expand το Reporting Tab και βάλε ένα Crystal Report Viewer Control.
6. [Add new Item] από το Project και βάλε ένα Crystal Report Document,
Δώσε ένα όνομα και επέλεξε [As a Blank Report] κάνωντας Click στο Αντίστοιχο Radio Button.
7. [Show All Files] από τον Solution explorer και κάνε expand το Report που δημιουργήθηκε και
θα δεις ένα .vb αρχείο το οποίο έχει το ίδιο όνομα με to rpt. Right Click και Delete.
8. Πήγαινε στα properties του rpt και επέλεξε Build Action None, μετά κάνε το rpt exclude από το project.
9. μετακίνησε το rpt από το project folder σε κάποιο άλλο σημείο ή network path που θέλεις π.χ. στο "\Visual Studio 2010\Projects\[Όνομα Project]\bin\Debug" γιά ευκολία.
Όλη αυτή η ιστορία γίνεται γιά 2 κυρίως λόγους:
a. Όταν χρειάζονται αλλαγές στο rpt δεν θα χρειάζεται να κάνεις build, εκτός των
περιπτώσεων που αλλάζει το Datasource του rpt.
b. Μπορεί και ο χρήστης να κάνει αλλαγές στην εκτύπωση και στο datasource και έτσι
δεν είναι απαραίτητο να κρατάς εσύ 800 versions του ίδιου report.
10. Γράψε τον παρακάτω κώδικα στο button Click event γιά να φτιάξουμε ένα Master-Detail Datasource γιά εκτύπωση:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
| Option Strict On
Option Infer Off
Public Class Form1
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim dtOrder As New DataTable("Order Master")
Dim r As DataRow
dtOrder.Columns.Add("ID", GetType(Integer))
dtOrder.Columns.Add("Code", GetType(String))
dtOrder.Columns.Add("Customer", GetType(String))
dtOrder.Columns.Add("Dispatch Date", GetType(Date))
For i As Integer = 1 To 20
r = dtOrder.NewRow()
r.Item("ID") = i
r.Item("Code") = "ORD_" & i.ToString()
r.Item("Customer") = "Nikos"
dtOrder.Rows.Add(r)
Next i
' Order Items
Dim dtOrderItems As New DataTable("Order Detail")
dtOrderItems.Columns.Add("ID", GetType(Integer))
dtOrderItems.Columns.Add("Order_ID", GetType(Integer))
dtOrderItems.Columns.Add("Product", GetType(String))
dtOrderItems.Columns.Add("Quantity", GetType(Integer))
Dim iOrderID As Integer = 1
For i As Integer = 1 To 200
r = dtOrderItems.NewRow()
r.Item("ID") = i
r.Item("Order_ID") = iOrderID
If i Mod 10 = 0 Then
iOrderID += 1
End If
r.Item("Product") = "Product" & i.ToString()
r.Item("Quantity") = 1
dtOrderItems.Rows.Add(r)
Next
dtOrderItems.AcceptChanges()
Dim dsOrders As New DataSet("Orders")
dsOrders.Tables.AddRange({dtOrder, dtOrderItems})
dsOrders.WriteXmlSchema(Application.StartupPath & "\Orders.xsd")
End Sub
End Class |
Η γραμμή dsOrders.WriteXmlSchema(Application.StartupPath & "\Orders.xsd") θα εκτελεστεί μόνο μία φορά γιά να γράψουμε απλά το xsd (σχήμα) με το οποίο θα κάνουμε "bind" το datasource από τον κώδικα με το rpt, μετά απλά κάνε την σχόλια.
Παρατήρησε ότι δεν κάναμε Data relations από τον κώδικα (δηλαδή να πούμε ότι η κάθε παραγγελία συνδέεται με τα είδη της μέσω της σχέσης [Order Master].ID με [Order Detail].Order_ID) αυτό θα γίνει από το rpt.
11. Κάνε Drag & Drop το rpt από το folder που το έσωσες στο Visual Studio.
12. Στον Field Explorer κάνε δεξί click στο Database Fields και Uncheck το Verify On every Print.
13. Στον Field Explorer κάνε δεξί click στο Database Fields και Click στο Database expert menu item.
14. Κάνε expand το [Create New Connection] Node και μετά expand το [ADO.NET (XML)] Node.
15. Βρες το xsd που σώσαμε πριν και πάτα [OK].
(Παρατήρησε ότι σου έχει φτιάξει ένα Orders Connection (Το Dataset στην ουσία) και μέσα σε αυτό 2 Datatables.)
16. Βάλε τα DataTables στο rpt χρησιμοποιώντας τα βέλη.
Όταν τα datatables είναι παραπάνω από ένα όπως στην δική μας περίπτωση θα σου δείξει και ένα καινούργιο Links Tab. Πήγαινε σε αυτό και βγάλε τα Joins by name (ID με ID) και φτιάξε το σωστό (Order_Master.ID --> Order_Detail.Order_ID).
Γιά λεπτομέρεις που αφορούν τον τύπο του join και τα enforce joins πάτα το κουμπί [Link Options] και δες το help.
17. Συμπλήρωσε τον παρακάτω κώδικα στο Event του Button:
1
2
3
4
5
6
7
8
| ' Crystal
Dim report As New CrystalDecisions.CrystalReports.Engine.ReportDocument
report.Load(Application.StartupPath & "\" & "Orders.rpt")
report.SetDataSource(dsOrders)
Me.CrystalReportViewer1.ReportSource = report |
18. Βάλε αυτό στο config (γιά Framework 4 μόνο):
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
</startup>
19. Design και τέλος...
Αυτό το mixed mode δεν μου αρέσει αλλά έχω καιρό να το ψάξω το θέμα, επίσης δεν γνωρίζω το τι θα γίνει με το VS 2012,
οπότε να σιγουρευτείς πριν επιλέξεις ανάμεσα σε Crystal ή κάτι άλλο. Το σίγουρο είναι ότι οποιαδήποτε μετατροπή εκτυπώσεων από το ένα "Format" στο άλλο είναι δύσκολη
παρόλες τις προσπάθειες που έχουν γίνει παλαιότερα (τελερικ κλπ), τουλάχιστον σε ότι αφορά εκτυπώσεις π.χ με κώδικα γιά barcodes κλπ.