MySQL, Visual Basic 6 und Crystal Reports 9 verwenden

Von Mike Hillyer

Letzte Aktualisierung: 22. Mai 2003

Übersetzt von: Stefan Hinz
Stand: 5. Juni 2003

Anmerkungen des Übersetzers:

  • Einige der in der verwendeten Software benutzten Begriffe wurden zweisprachig gehalten, um sowohl englisch- als auch deutschsprachige Programmversionen zu behandeln.
  • Die Codebeispiele sind nicht übersetzt, um verschiedene Sprachversionen dieses Artikels konsistent halten zu können. Wo das sinnvoll erschien, wurden im Code verwendete Begriffe in einem davor stehenden Absatz übersetzt.

Zum Forum für diesen Artikel

Beispielcode #1
Beispielcode #2

Sie haben also eine große Menge von Daten in Ihrer MySQL™-Datenbank und Ihre Benutzer können Daten mit der VB-Applikation, die Sie geschrieben haben, hinzufügen und herausholen. Jetzt aber wollen sie die Daten in einer aussagefähigeren Form haben. In der ersten Visual-Basic-Applikation, die ich schrieb, versuchte ich Ihnen Zusammenfassungen und Berichte zu präsentieren, indem ich Formulare schrieb, die dynamisch zugeordnete Arrays von Beschriftungen (Labels) enthielten, und baute das Formular beim Durcharbeiten der Daten auf.

Diese Methode funktionierte auch, und das Formular sah recht ansehnlich aus, aber Änderungen ließen sich nur schwer anbringen. Das Umherschieben von Elementen auf dem Formular erforderte Änderungen an diversen Konstanten, die zur Steuerung von Positionen und Abständen benutzt wurden, und außerdem musste nach Änderungen neu kompiliert werden. (Ich hätte die Konstanten natürlich auch aus einer Textdatei laden können, doch das Gebiet war für mich neu.) Später entdeckte ich dann Crystal Reports®, ein mächtiges Werkzeug zur Erzeugung von Berichten. Mit Crystal Reports war ich in der Lage, meinen Code-basierten Bericht in wenigen Minuten neu aufzubauen und ihn nach Belieben zu ändern. Nach der Durchführung von Änderungen musste ich einfach nur die Berichtsdatei ersetzen, und Visual Basic zeigte beim nächsten Anschauen den neuen Bericht. Das ersparte mir beim Erstellen von Datenberichten viel Zeit, und ich konnte neue Berichte auf Anforderung von Benutzern wie am Fließband herstellen.

Eine der Herausforderungen bei der Arbeit mit Crystal Reports bestand darin, den Bericht in meiner VB-Applikation anzeigen zu lassen, und zwar mit Daten, die mithilfe eines ADO-Recordsets und MySQL erzeugt wurden. Mit der Version von Crystal Reports, die VB 6 beiliegt (Version 4.6 von Crystal Reports), wurde diese Eigenschaft nicht richtig unterstützt. Persönlich bevorzuge ich, Software zu entwickeln, die keine DSN benutzt, aber in diesem Fall musste ich eine Ausnahme machen und auf meinem Zielsystem eine DSN einrichten, so dass Crystal Reports auf Echtdaten zugreifen konnte, wobei die VB-Applikation die Auswahlformel des Berichts veränderte, um es dem Benutzer zu gestatten, die Daten zu steuern, die im Bericht angezeigt werden sollten.

Glücklicherweise war ich damals Entwickler in einem Unternehmen, das Wiederverkäufer von Crystal Reports ist, so dass ich mit Crystal Reports 9 arbeiten konnte. Der Schritt von Crystal Reports 4.6 zu Crystal Reports 9 war eine Verbesserung, die sich mit dem Handcodieren von Berichten und der Benutzung von Crystal Reports vergleichen lässt. In Crystal Reports Version 6 wurde Active Data eingeführt, womit man Berichte erzeugen kann, die auf von ADO bereitgestellte Daten zurückgreifen. In Crystal Reports Version 8 kam die Programmkomponente Report Designer hinzu, die die Art und Weise, wie Berichte in VB eingeladen und betrachtet werden können, erheblich verbessert. In dem vorliegen Artikel beschreibe ich, wie Berichte mit Visual Basic 6, Crystal Reports 9 und MySQL erstellt und angezeigt werden. (In einem zukünftigen Artikel werde ich auch die Anzeige von Daten mit Crystal Reports 6 und 4.6 beschreiben.)

Dieser Artikel geht von der Annahme aus, dass der Leser das relationale Datenbankmanagementsystem (RDBMS) MySQL verwendet, sollte aber auch für Entwickler hilfreich sein, die andere RDBMS verwenden. Warum MySQL für Visual-Basic-Programmierer eine gute Wahl ist, ist im Artikel Warum VB/MySQL dargestellt. Weitere informationen zu MySQL und woher man das RDBMS bezieht (Download) finden Sie auf der MySQL-Website. Die in diesem Artikel gezeigten Beispiele setzen die neuste Version von Connector/ODBC (vormals MyODBC) voraus, das Sie hier herunterladen können (bei Redaktionsschluss Version 3.51.06). Dieser Artikel basiert wie gesagt auf Crystal Reports 9 (eine Evaluierungsversion können Sie hier herunter laden). Ich empfehle die Installation von Servicepack 1 und von allen monatlichen Hotfixes, die Sie von support.crystaldecisions.com erhalten.

Auf der Visual-Basic-Seite empfehle ich die Installation von Servicepack 5 für VB, das Sie hier herunterladen können. Zusätzlich sollte die neuste Version von MDAC installiert sein (Microsoft Data Access Components), die Sie hier finden (zum Redaktionsschluss 2.7 SP1). Zum Schluss sei gesagt, dass sich dieser Artikel auf ADO 2.7 und VB6 bezieht und nicht auf ADO.NET unter VB.NET zutrifft, es sei denn, Sie verweisen in Ihrem Projekt auf ADODB und benutzen es für den Datenbankzugriff.

Erstellen eines Berichts

Aufbau eines Berichts

Ein Crystal-Bericht besteht aus mehreren Abschnitten:

  • Berichtskopf (Report Header)
  • Seitenkopf (Page Header)
  • Gruppenkopf (Group Header)
  • Detailzeile (Detail Line)
  • Gruppenfuß (Group Footer)
  • Seitenfuß (Page Footer)
  • Berichtsfuß (Report Footer)

Alles, was in den Berichtskopf und -fuß platziert wird, wird im Bericht einmal angezeigt. Elemente im Seitenkopf und -fuß werden auf jeder Seite angezeigt. Gruppenköpfe und -füße werden einmal pro Gruppe von Detailzeilen angezeigt; es gibt eine Detailzeile für jede Zeile von Daten. Alle Abschnitte können entweder versteckt oder unterdrückt werden, so dass sie im Bericht nicht erscheinen. Versteckte Abschnitte können durch “drilling-down” angezeigt werden, indem auf einen zugeordneten Abschnitt doppelt geklickt wird, der angezeigt wird. Unterdrückte Abschnitte dagegen werden überhaupt nicht angezeigt.

In jedem Berichtsabschnitt können verschiedene Informationen platziert werden, unter anderem:

  • Beschriftungen (Text Labels)
  • Datenbankfelder (Database Fields)
  • Bilder (Images)
  • Diagramme (Graphs)
  • Zusammenfassungen (Summaries)
  • Formeln (Formulas)

Die meisten davon sind selbsterklärend. Zu den Zusammenfassungen gehören Summen, Zählergebnisse, Durchschnitte und andere Aggregatwerte auf der Grundlage unterschiedlicher Felder. Formeln erlauben es dem Ersteller eines Berichts, verschiedenen Feldern komplexe logische Ausdrücke und Formatierungen hinzuzufügen.

Erzeugen der Felddefinitionen

Das Erzeugen eines typischen Berichts ist sehr einfach. Zuerst definieren wir die Felder, mit denen der Bericht erzeugt werden soll, ordnen diese dann auf dem Formular an und gruppieren und summieren sie dann wie benötigt. Eine Felddefinitionsdatei erlaubt uns die Definition der Daten, auf die wir in unserem Bericht zugreifen werden. Fangen wir mit der Tabelle an, aus der wir den Bericht erstellen werden:

Übersetzung der Begriffe im Code:

  • transactionid = Transaktionskennung
  • salesman = Verkäufer
  • region = Region
  • amount = Betrag

CREATE TABLE report(
	transactionid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
	salesman CHAR(20) NOT NULL,
	region CHAR(20) NOT NULL,
	amount FLOAT
);

Zum Erzeugen einer Felddefinition öffnen wir den Datenbankassistenten (database expert) von Crystal Reports. Der Zugriff auf den Datenbankassistenten kann durch Öffnen eines leeren Berichts oder durch Auswahl des Menüpunkts Datenbank-Assistent (Database Expert) im Menü Datenbank (Database) erfolgen. Die daraufhin erscheinende Baumansicht enthält den Zweig Neue Verbindung erzeugen (Create New Connection), die beim Ausklappen die Option Nur Felddefinitionen (Field Definitions Only) beinhaltet. (Anmerkung des Übersetzers: Diese Option verbirgt sich in der von mir verwendeten Version im Zweig Weitere Datenquellen.) Durch Anklicken der Schaltfläche Datei erzeugen… (Create File… ) im Dialogfenster erscheint das Definitionswerkzeug (Database Definition Tool) zum Erzeugen von Felddefinitionsdateien.

Thumb of TTX tool

Felddefinitionsdateien enthalten durch Tabulatoren getrennte Daten. Ihre Extension ist .ttx, und sie enthalten vier Werte:

  • Feldname
  • Feldtyp
  • Feldlänge (falls vom Typ Zeichenfolge)
  • Beispieldaten

Der Feldname wird direkt vom Namen des Feldes in Ihrer Datenmenge genommen (das könnte der Feldname der zugrundeliegenden Tabelle oder der Alias, den Sie ihm mit dem Schlüsselwort AS in der Abfrage zugewiesen haben). Der Feldtyp ist der Datentyp des Feldes, die Feldlänge legt die Breite einer Zeichenfolge fest und die Beispieldaten sind ein statischer Wert, der zur Hilfestellung beim Festlegen des Feldlayouts verwendet wird.

Eine Felddefinitionsdatei for die obige Tabelle könnte wie folgt aussehen:

transactionid	uLong		1salesman	String	20	Georgeregion	String	20	Calgaryamount	Currency		30.00

Sobald wir die Felddefinitionsdatei erzeugt haben, können wir sie zum Erstellen unseres Berichts verwenden, indem wir sie aus dem Kasten ‘Verfügbare Datenquellen’ (’Available Data Sources’) in den Kasten ‘Ausgewählte Tabellen’ (’Selected Tables’) im Datenbank-Assistenten ziehen und auf OK klicken. Bevor wir weitermachen, soll festgehalten werden, dass eine .ttx-Datei auch automatisch aus einer Datenmenge erzeugt werden kann. Das ist nützlich, um festzustellen, welche Berichtsdatentypen man verwenden soll. Dennoch besteht die Notwendigkeit, nachzuarbeiten und sinnvolle Beispielwerte anzugeben. Das folgende Beispiel zeigt auf die Schnelle, wie eine .ttx-Datei automatisch erzeugt wird. Erstellen Sie hierfür ein neues Projekt mit einem Verweis zu ADO 2.7 und platzieren Sie folgenden Code in den Code-Abschnitt von form1.:

Option Explicit
	'ps2mon.dll MUSS IN SYSTEMVERZEICHNIS VORHANDEN SEIN
	'ES BEFINDET SICH IM UNTERORDNER \TOOLS\DEVELOPERS
	'IHRES CR9-VERZEICHNISSES 

Private Declare Function  CreateFieldDefFile Lib "p2smon.dll" (lpUnk As Object, _
ByVal fieldDefFile  As String, ByVal bOverWriteFile As Long) As Long 

Private Sub Form_Load()
	Dim conn  As ADODB.Connection
	Dim rs As ADODB.Recordset
	Dim result As Long 

	Set conn = New  ADODB.Connection
	conn.CursorLocation = adUseClient
	conn.ConnectionString = "DRIVER={MySQL  ODBC 3.51 Driver};" _
		& "SERVER=123.456.789.101;" _
		& "DATABASE=test;" _
		& "UID=myuser;" _
		& "PWD=mypass;" _
		& "OPTION=" & 1 + 2 + 8 + 32 + 2048 + 163841 

	conn.Open Set rs = New ADODB.Recordset
	rs.Open "SELECT * FROM report", conn, adOpenStatic,  adLockReadOnly 

	'RECORDSET UND PFAD ZU ERZEUGTER DATEI UEBERGEBEN, TRUE/FALSE ZUM UEBERSCHREIBEN  

	result = CreateFieldDefFile(rs, App.Path & "\report.ttx", True)  

	If result Then
		MsgBox "Datei " & App.Path & "\data.ttx erfolgreich angelegt", vbInformation, "Fertig!"
	Else
		MsgBox "Erzeugen der ttx-Datei fehlgeschlagen!", vbCritical
	End If
End Sub  

Felder, Gruppierungen und Zusammenfassungen anordnen

Mit dem Feld-Explorer (Field Explorer), den Sie im Menü Feld-Explorer (field explorer) unter Ansicht (View) finden, wählen Sie Felder aus und platzieren sie auf dem Formular. Nachdem alle Felder auf das Formular gezogen wurden, können wir Daten gruppieren, um sie aussagekräftiger darzustellen.

Im Menü Bericht (Report) finden Sie den Gruppen-Assistenten (Grouping Expert). Mit diesem können Sie auswählen, nach welchen Feldern Sie gruppieren wollen (in unserem Fall nach dem Feld region und anschließend nach salesman).

thumb of group expert

Nachdem die Gruppierungen festgelegt sind, sehen wir, dass unserem Bericht zwei Gruppen hinzugefügt wurden, wobei die Gruppennamen als Teil des Hauptberichts in den Gruppenköpfen dargestellt sind. Durch Rechtsklick auf diese zwei Abschnittsköpfe können wir die Option Unterdrücken auswählen, was bewirkt, dass die Gruppenköpfe nicht angezeigt werden.

Um Daten zusammenzufassen, klicken Sie auf das Feld, das zusammengefasst werden soll, und wählen aus dem Menü Einfügen (Insert) Gruppenergebnis (Summary). Das daraufhin erscheinende Dialogfeld stellt Optionen zur Verfügung, mit denen festgelegt werden kann, nach welchem Feld zusammengefasst werden soll (in unserem Fall nach dem Feld amount), welche Art von Zusammenfassung durchgeführt werden soll (wir wollen die Summe berechnen) und wo der Ergebniswert platziert werden soll (wir werden einen im Fuß jeder Gruppe und einen weiteren im Berichtsfuß platzieren). Anschließend stehen uns die Zusammenfassungen auf dem Bericht zur Formatierung und Positionierung zur Verfügung..

thumb of add summary

Formeln hinzufügen

Nachdem unsere Daten im Bericht platziert wurden, können wir berechnete Felder erzeugen, indem wir Formeln eingeben. Formeln können entweder in der Syntax von Crystal Reports oder (in CR 9) der von Visual Basic geschrieben werden. Wir wollen eine einfache Formel hinzufügen, die Provisionen für unsere Verkäufe anzeigt. Hierzu klicken wir im Feld-Explorer mit der rechten Maustaste auf die Formelfelder-Überschrift und wählen Neu. Hierdurch wird der Formeleditor angezeigt, nachdem ein Name für die Formel abgefragt wurde (als Name reicht hier Provision aus). In der rechten oberen Ecke befindet sich ein Klappmenü für die Crystal-Syntax. Dieses sollten Sie auf die Basic-Syntax einstellen, so dass wir mit der Syntax im Stil von Visual Basic arbeiten können. Als Nächstes geben Sie im Formelfenster Folgendes ein:

formula = {article.amount} * 0.05

Anschließend klicken Sie auf Speichern und schließen das Formelfenster. Die neue Formel ist jetzt im Feld-Browser verfügbar und kann im Detailbereich des Berichts eingefügt werden. Wir können auch Zusammenfassungen der Formel hinzufügen, wenn wir das wollen.

thumb of formula editor

Hierdurch erhalten wir nun einen grundlegenden Bericht. Mit F5 sehen Sie eine Vorschau des Berichts, die dieselben Beispieldaten verwendet, die Sie in Ihrer .ttx-Datei eingegeben haben. Der nächste Schritt besteht darin, den Bericht für Benutzer in der VB-Applikation anzuzeigen, die aus MySQL abgerufene Daten verwendet.

thumb of preview of sample report

Anzeige der Daten

Bei Crystal Reports 8 und höher wurde der OCX Crystal Viewer durch den Berichtsdesigner (Report Designer) ersetzt. Hierdurch wird ein stärker objektorientierter Ansatz zum Anzeigen von Berichten erzielt. Ein Vorteil davon ist, dass der Berichtsanzeiger nicht direkt auf dem Formular platziert wird, wodurch man den Bericht an einer bestimmten Stelle des Formulars unterbringen kann, ohne ein neues Formular zu eröffnen.

Die Prozedur zur Darstellung des Berichts in VB ist recht einfach:

  • ADODB-Verbindung und Datengruppenobjekte (recordset objects) einrichten
  • Datengruppenobjekt mit Anfrage füllen
  • Crystal-Reports-Applikation und Berichtsobjekte einrichten
  • Bericht öffnen
  • Bericht an Datengruppe anbinden
  • Bericht an Anzeiger (Viewer) anbinden
  • Bericht anzeigen

Zur Anzeige eines Berichts in Ihrer VB-Applikation benötigen Sie Folgendes:

Verweise (Referenzen):

  • Microsoft ActiveX Data Objects 2.7 Bibliothek
  • Crystal Reports 9 ActiveX Designer Laufzeitbibliothek

Komponenten:

  • Crystal Reports Viewer Control 9

Außerdem benötigen Sie auf Ihrem Formular eine Crystal-Reports-Anzeigesteuerung namens CRViewer.

Vorbereitung der Daten

Zuerst benötigen wir Daten, aus denen wir den Bericht erstellen. Hierfür verwenden wir ADO:

Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset

Set conn = New ADODB.Connection
conn.CursorLocation = adUseClient 'SERVER-SEITIG NICHT EMPFOHLEN
conn.ConnectionString = "DRIVER={MySQL ODBC 3.51 Driver};" _
   & "SERVER=123.456.789.101;" _
   & "DATABASE=test;" _
   & "UID=myusername;" _
   & "PWD=mypass;" _
   & "OPTION=" & 1 + 2 + 8 + 32 + 2048 + 163841 'ALLE PARAMETER SETZEN
conn.Open 'FOLGENDE OPTIONSWERTE SIND FUER VB AM BESTEN GEEIGNET

conn.Execute "DROP TABLE IF EXISTS report", , adExecuteNoRecords
   								'ADEXECUTENORECORDS WIRD FUER ANFRAGEN BENUTZT,
   								'DIE KEINE DATEN ZURUECKGEBEN
   								'(CREATE, INSERT, DELETE USW.)

conn.Execute "CREATE TABLE report(" _
   & "transactionid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,"    _
   & "salesman CHAR(20) NOT NULL," _
   & "region CHAR(20) NOT NULL," _
   & "amount Float)", , adExecuteNoRecords 	'DIE TABELLE, AUS DER DER BERICHT KOMMT

							'EINIGE DATEN IN DIE TABELLE EINFUEGEN
conn.Execute "INSERT INTO report(salesman, region, amount) VALUES('George','Calgary',30.00)",    , adExecuteNoRecords
conn.Execute "INSERT INTO report(salesman, region, amount) VALUES('George','Calgary',15.00)",    , adExecuteNoRecords
conn.Execute "INSERT INTO report(salesman, region, amount) VALUES('George','San    Jose',10.00)", , adExecuteNoRecords
conn.Execute "INSERT INTO report(salesman, region, amount) VALUES('Jerry','Calgary',30.00)",    , adExecuteNoRecords
conn.Execute "INSERT INTO report(salesman, region, amount) VALUES('Jerry','San    Jose',100.00)", , adExecuteNoRecords

Set rs = New ADODB.Recordset
rs.Open "SELECT * FROM report", conn, adOpenStatic, adLockReadOnly

Vorbereiten und Anzeigen des Berichts

Jetzt haben wir einen Satz von Daten (recordset). Wir müssen den Bericht jetzt nur noch laden, ihn mit dem Satz von Daten und dem Betrachter (viewer) verknüpfen und ihn anzeigen:

Dim crystal As CRAXDRT.Application 'BERICHT AUS DATEI LADEN
Dim report As CRAXDRT.report 		'ENTHAELT BERICHT

CRViewer.DisplayBorder = False 	'SORGT DAFUER, DASS DER BERICHT DAS GESAMTE FORMULAR AUSFUELLT
CRViewer.DisplayTabs = False 		'BERICHT OHNE DRILL-DOWN, DAHER NICHT BENOETIGT
CRViewer.EnableDrillDown = False 	'BERICHT UNTERSTUETZT KEIN DRILL-DOWN
CRViewer.EnableRefreshButton = False 	'ADO-RECORDSET AENDERT SICH NICHT, DAHER NICHT BENOETIGT
Set crystal = New CRAXDRT.Application 		'VERWALTET BERICHTE

Set report = crystal.OpenReport(App.Path & "\report1.rpt") 	'BERICHT OEFFNEN

report.DiscardSavedData 			'BERICHT LEEREN, UM MIT DEN RECORDSET-DATEN ZU ARBEITEN
report.Database.SetDataSource rs 	'BERICHT MIT RECORDSET VERKNUEPFEN

CRViewer.ReportSource = report 	'BETRACHTER (VIEWER) MIT BERICHT VERKNUEPFEN
CRViewer.ViewReport 				'BERICHT ANZEIGEN

Do While CRViewer.IsBusy 			'ZOOM-METHODE FUNKTIONIERT NICHT,
   DoEvents 						'WAEHREND BERICHT GELADEN WIRD, DAHER WARTEN
Loop 								'BIS BERICHT GELADEN IST.

CRViewer.Zoom 94

Sobald der Bericht angezeigt wird, können wir unsere Objekte aufräumen:

rs.Close 'AB HIER IST ALLES AUFRAEUMARBEIT
Set rs = Nothing

conn.Close
Set conn = Nothing

Set crystal = Nothing
Set report = Nothing

Schließlich können wir dem Ereignis Form_Resize etwas Code hinzufügen, um sicherzustellen, dass unser Bericht das gesamte Formular bedeckt:

Private Sub Form_Resize() 'SICHERSTELLEN, DASS BERICHT FORMULAR FUELLT
   CRViewer.Top = 0 'WENN DAS FORMULAR VERGROESSERT ODER VERKLEINERT WIRD
   CRViewer.Left = 0
   CRViewer.Height = ScaleHeight
   CRViewer.Width = ScaleWidth
End Sub

Fazit

Das war’s! Wenn alles geklappt hat, haben Sie jetzt einen Bericht, der auf Ihrem VB-Formular angezeigt wird, der aus MySQL-Daten erzeugt wird. Diesen können Sie als Grundlage nehmen und komplexere Formeln erzeugen, Daten aus mehreren Sätzen von Daten (recordsets) abrufen und Berichte aus Anfragen erzeugen, die komplexer sind als die typische SELECT * -Anfrage.

Crystal Reports ist eine eingetragenes Warenzeichen von Crystal Decisions:
www.crystaldecisions.com

Beispielcode #1

Anzeige eines Crystal Reports 9-Berichts mit MySQL und VB6 (kann von http://www.vbmysql.com/download/cr9vbmysql.zip) heruntergeladen werden)

Private Sub Form_Load()
    ‘DIESER CODE IS FUER DIE ANZEIGE EINES CRYSTAL REPORTS 9-BERICHTS GEDACHT,
    ‘DER DATEN AUS EINER MYSQL-DATENBANK ABRUFT UND DAFUER ADO UND VISUAL BASIC 6 VERWENDET 
    ‘SIE BENOETIGEN VERWEISE AUF: Microsoft ActiveX Data Objects 2.7 Library 
    ‘                        Crystal Reports 9 ActiveX Designer Laufzeitbibiothek 
    ‘SIE BENOETIGEN DIE KOMPONENTE: Crystal Reports Viewer Control 9 
    ‘FUEGEN SIE DIE CRVIEWER91-KOMPONENTE IHREM FORMULAR HINZU UND NENNEN SIE SIE CRViewer. 

    Dim conn As ADODB.Connection            ‘VERBINDUNG ZUM ABSETZEN VON ANFRAGEN 
    Dim rs As ADODB.Recordset               ‘ENTHÄLT ALLE DATEN, DIE DIE ANFRAGE ZURUECKGIBT 
    Dim crystal As CRAXDRT.Application      ‘LAEDT BERICHT AUS DATEI
    Dim report As CRAXDRT.report            ‘ENTHAELT BERICHT 

    CRViewer.DisplayBorder = False          ‘SORGT DAFUER, DASS BERICHT DAS GESAMTE FORMULAR BEDECKT
    CRViewer.DisplayTabs = False            ‘BERICHT OHNE DRILL-DOWN, DAHER NICHT BENOETIGT 
    CRViewer.EnableDrillDown = False        ‘BERICHT UNTERSTUETZT KEIN DRILL-DOWN 
    CRViewer.EnableRefreshButton = False    ‘ADO-RECORDSET AENDERT SICH NICHT, DAHER NICHT BENOETIGT

    Set conn = New ADODB.Connection
    conn.CursorLocation = adUseClient       ‘SERVER-SEITIG NICHT EMPFOHLEN
    conn.ConnectionString = “DRIVER={MySQL ODBC 3.51 Driver};” _
        & “SERVER=polibase.dynamergy.com;” _
        & “DATABASE=test;” _
        & “UID=mike;” _
        & “PWD=irn2ktss!;” _
        & “OPTION=” & 1 + 2 + 8 + 32 + 2048 + 163841    ‘SET ALL PARAMETERS 
    conn.Open                                   ‘THESE OPTION VALUES ARE BEST FOR VB 

    conn.Execute “DROP TABLE IF EXISTS report”, , adExecuteNoRecords
                                                ‘ADEXECUTENORECORDS WIRD BENUTZT FUER ANFRAGEN, 
                                                ‘DIE KEINE DATEN ZURUECKGEBEN 
                                                ‘(CREATE, INSERT, DELETE, ETC.) 
    conn.Execute “CREATE TABLE report(” _
            & “transactionid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,” _
            & “salesman CHAR(20) NOT NULL,” _
            & “region CHAR(20) NOT NULL,” _
            & “amount Float)”, , adExecuteNoRecords     ‘DIE TABELLE, AUS DER WIR DEN BERICHT ERZEUGEN 

                                                ‘TABELLE MIT EIN PAAR DATEN FUELLEN 
    conn.Execute “INSERT INTO report(salesman, region, amount) VALUES(‘George’,'Calgary’,30.00) ” , , adExecuteNoRecords 
    conn.Execute “INSERT INTO report(salesman, region, amount) VALUES(‘George’,'Calgary’,15.00) ” , , adExecuteNoRecords 
    conn.Execute “INSERT INTO report(salesman, region, amount) VALUES(‘George’,'San Jose’,10.00) ” , , adExecuteNoRecords 
    conn.Execute “INSERT INTO report(salesman, region, amount) VALUES(‘Jerry’,'Calgary’,30.00) ” , , adExecuteNoRecords 
    conn.Execute “INSERT INTO report(salesman, region, amount) VALUES(‘Jerry’,'San Jose’,100.00) ” , , adExecuteNoRecords 

    Set rs = New ADODB.Recordset
    rs.Open “SELECT * FROM report”, conn, adOpenStatic, adLockReadOnly 

    Set crystal = New CRAXDRT.Application           ‘VERWALTET BERICHTE 

    Set report = crystal.OpenReport(App.Path & “\report1.rpt”)  ‘BERICHT OEFFNEN 

    report.DiscardSavedData                      ‘BERICHT LEEREN, UM MIT DEN RECORDSET-DATEN ZU ARBEITEN 
    report.Database.SetDataSource rs             ‘BERICHT MIT RECORDSET VERKNUEPFEN

    CRViewer.ReportSource = report              ‘BETRACHTER (VIEWER) MIT BERICHT VERKNUEPFEN
    CRViewer.ViewReport                         ‘BERICHT ANZEIGEN

    Do While CRViewer.IsBusy              ‘ZOOM-METHODE FUNKTIONIERT NICHT,
        DoEvents                          ‘REPORT IS LOADING, SO WE MUST PAUSE 
    Loop                                  ‘WAEHREND BERICHT GELADEN WIRD, DAHER WARTEN: 

    CRViewer.Zoom 94 

    rs.Close                            ‘AB HIER IST ALLES AUFRAEUMARBEIT
    Set rs = Nothing 

    conn.Close
    Set conn = Nothing 

    Set crystal = Nothing
    Set report = Nothing
End Sub 

Private Sub Form_Resize()               ‘SICHERSTELLEN, DASS BERICHT FORMULAR FUELLT
    CRViewer.Top = 0                    ‘WENN DAS FORMULAR VERGROESSERT ODER VERKLEINERT WIRD
    CRViewer.Left = 0
    CRViewer.Height = ScaleHeight
    CRViewer.Width = ScaleWidth
End Sub
 

Beispielcode #2

Erzeugen einer .ttx-Felddefinitionsdatei aus einem ADO-Recordset

Option Explicit
	‘ps2mon.dll MUSS IN SYSTEMVERZEICHNIS VORHANDEN SEIN 
	‘ES BEFINDET SICH IM UNTERORDNER \TOOLS\DEVELOPERS 
	‘IHRES CR9-VERZEICHNISSES

Private Declare Function  CreateFieldDefFile Lib “p2smon.dll” (lpUnk As Object, _
		ByVal fieldDefFile  As String, ByVal bOverWriteFile As Long) As Long  

Private Sub Form_Load()
	Dim conn  As ADODB.Connection
	Dim rs As ADODB.Recordset
	Dim result As Long  

	Set conn = New  ADODB.Connection
	conn.CursorLocation = adUseClient
	conn.ConnectionString = “DRIVER={MySQL  ODBC 3.51 Driver};” _
		& “SERVER=123.456.789.101;” _
		& “DATABASE=test;” _
		& “UID=myuser;” _
		& “PWD=mypass;” _
		& “OPTION=” & 1 + 2 + 8 + 32 + 2048 + 163841  

	conn.Open Set rs = New ADODB.Recordset
	rs.Open “SELECT * FROM report”, conn, adOpenStatic,  adLockReadOnly  

	‘RECORDSET UND PFAD ZU ERZEUGTER DATEI UEBERGEBEN, TRUE/FALSE ZUM UEBERSCHREIBEN 

	result = CreateFieldDefFile(rs, App.Path & “\report.ttx”, True)   

	If result Then
		MsgBox “Datei ” & App.Path & “\data.ttx erfolgreich angelegt”, vbInformation, “Fertig!”
	Else
		MsgBox “Erzeugen der ttx-Datei fehlgeschlagen!”, vbCritical
	End If
End Sub
 

4 Responses to “MySQL, Visual Basic 6 und Crystal Reports 9 verwenden”

  1. Andreas Hanssen Says:

    Die Links auf der Seite
    http://www.vbmysql.com/articles/deutsch/mysql-visual-basic-6-und-crystal-reports-9-verwenden/
    zeigen leider ins Leere.
    Schade eigentlich.
    Gruß,
    Andreas

  2. Klyk Says:

    Die Beschreibung ist gut, habe sie in einem VB-Projekt mit dem MS SQL-Server 2000 nutzen können. Als Gelegenheitsprogrammierer habe ich mal eine Bitte. Das Steuerelement von Crystal 6 hatte die Möglichkeit Destination. Da war 0 copy to Window, 1 to Printer. Gibt es so etwas auch für Crystal 9.0 z.B. für den Report Viewer.

    I try, say it in my bad English. Is it possible with “CRViewer 9″ use Destination: copy to windows, so it is posible with crystalReport (CR 6). I use for programming Vasial Basic 6 Sp.5
    Best wishes Lutz

  3. Saleem awan Says:

    I like your website… I am a visual basic developers and want to work with mysql and vb. please convert your site into ENGLISH…

  4. Saleem awan Says:

    I like your website… I am a visual basic developers and want to work with mysql and vb. please convert your site into ENGLISH…so that developers like me can understand.

    Thanks

    Saleem

Leave a Reply