Eine Visual Basic 6.0-Anwendung um das ReportViewer-Steuerelement erweitern

Sales Support: Eine hybride Visual Basic 6.0- & Visual Basic 2005-Anwendung, Teil 3

Scott Swigart

Februar 2008

Zusammenfassung: Dieser Artikel ist der dritte einer vierteiligen Serie und zeigt, wie Sie in einer existierenden Microsoft Visual Basic 6.0-Anwendung moderne, einfach zu konfigurierende Visual Basic 2005-Berichtskomponenten verwenden.

Klicken Sie hier, um das Setupprogramm für die Anwendung herunterzuladen.

Klicken Sie hier, um den Quellcode der Anwendung herunterzuladen.

Inhalt

Einführung

Die Anwendung "Sales Support"

Installation

Verwendung

Anwendungsarchitektur

Die Implementierung in Visual Basic .NET

Die Interoperabilitätsschicht in Visual Basic 6.0

Schlussfolgerung

@@HINWEIS: Inhaltsverzeichnis als mit den Bereichen verlinken@@

Einführung

Wollen Sie Ihre Microsoft Visual Basic 6.0-Anwendungen modernisieren? Möchten Sie die Vorteile von Webdiensten, der Desktopsuche usw. nutzen und haben Sie nicht die Zeit oder die Ressourcen, Ihre produktiven Anwendungen nach Microsoft Visual Basic 2005 zu portieren?

In Teil 1 dieser Artikelserie, „Eine Visual Basic 6.0-Anwendung durch die Integration der Windows-Desktopsuche und von Office Outlook erweitern“, habe ich gezeigt, dass es nicht erforderlich ist, eine Visual Basic 6.0-Anwendung nach Visual Basic 2005 zu migrieren, um die Vorteile der .NET-Funktionalität nutzen zu können. Stattdessen können Sie die Microsoft Windows-Desktopsuche in eine Visual Basic 6.0-Anwendung integrieren, indem Sie COM-Objekte verwenden, die mit Visual Basic 2005 erstellt wurden.

In Teil 2, „Eine Visual Basic 6.0-Anwendung um den MapPoint-Webdienst erweitern“, habe ich gezeigt, wie die gleiche Anwendung Karten für Adressen aus einer bestehenden Datenbank anzeigen kann, indem der Microsoft MapPoint-Webdienst verwendet wird.

Mit diesem hybriden Ansatz können Sie die gesamte Funktionalität von .NET Framework nutzen, ohne dazu die gesamte Anwendung portieren zu müssen.

Dieser Artikel beschäftigt sich mit einem Thema, das Entwickler häufig vernachlässigen, das aber für Endanwender sehr wichtig ist: Berichtsmöglichkeiten. Anstatt sich mit den eingeschränkten Berichtsmöglichkeiten von Visual Basic 6.0 herumzuquälen, werden Sie erfahren, wie Sie moderne, einfach zu konfigurierende Visual Basic 2005-Berichtskomponenten in einer vorhandenen Visual Basic 6.0-Anwendung verwenden können.

Die Anwendung "Sales Support"

"Sales Support" ist eine sehr einfache Anwendung zur Unterstützung der Vertriebsmitarbeiter, mit der Kundenkonten, Kontaktinformationen und Umsatzprognosen abgerufen werden können. Diese Anwendung soll keine umfassende Lösung darstellen, sie dient als Beispiel für eine vorhandene Geschäftslösung, die mit Visual Basic 6.0 erstellt wurde. Des Weiteren dient sie als Ausgangspunkt für eine Reihe von nützlichen Anwendungserweiterungen, die sich am besten mit Visual Basic 2005 implementieren lassen.

Installation

Der Installer für Sales Support (https://download.microsoft.com/download/A/5/6/A56DD645-14AF-4CC2-BEC6-EEBE5B284167/installer.03.zip) wurde auf Microsoft Windows XP SP2 und auf Windows Vista getestet; er sollte aber auch mit älteren Betriebssystemversionen funktionieren. Da es sich um eine hybride Visual Basic 6.0- und Visual Basic 2005-Anwendung handelt, wird vom Installationsprogramm .NET Framework als Voraussetzung installiert. Diese Anwendung speichert die Daten in einer Backend-Datenbank. Aus diesem Grund installiert das Setupprogramm Microsoft SQL Server 2005 Express Edition, das Microsoft SQL Server 2000 Desktop Engine (MSDE 2000) ersetzt.

Wenn die benötigten Komponenten noch nicht installiert sind, werden sie vom Installer automatisch heruntergeladen. Eine vorhandene Installation wird automatisch erkannt; es wird dann mit der Installation der Anwendung weitergemacht.

Verwendung

Nachdem die Anwendung installiert wurde, können Sie sie im Startmenü aufrufen. Suchen Sie nach dem Eintrag Sales Support8_3. Die Anwendung fordert Sie auf, sich einzuloggen. Um die Nutzung zu vereinfachen, stehen in den Textfeldern bereits Standardwerte, was Abbildung 1 zeigt. Klicken Sie einfach auf die Schaltfläche Login, um fortzufahren.

Cc299496.8782d2eb-80d3-4eb7-8587-b1a1a6c0d93c(de-de,VS.80).gif

Abbildung 1: Das Anmeldeformular der Anwendung Sales Support

Nachdem Sie sich erfolgreich angemeldet haben, wird das Hauptfenster der Anwendung angezeigt, das Sie in Abbildung 2 sehen. Die Anwendung stellt drei verschiedene Sichten auf die Verkaufsinformationen zur Verfügung. Die Registerkarte Accounts zeigt alle Kunden sowie einige Umsatzdaten an. Diese Ansicht kann sortiert werden, indem man die gewünschte Spaltenüberschrift anklickt. Auf der Registerkarte Contacts finden Sie die zweite Ansicht; diese zeigt ausführlichere Informationen zu den einzelnen Kontakten an. Die Registerkarte Forecast bietet die dritte Ansicht und zeigt Informationen zu den prognostizierten Umsätzen an.

Cc299496.8221a71b-5c71-4bfb-8371-26fff55fe88f(de-de,VS.80).gif

Abbildung 2: Das Hauptfenster der Anwendung

Die Anwendung Sales Support soll keine fertige Lösung darstellen, sondern dient als Grundlage für realistische Erweiterungen einer Visual Basic 6-Anwendung.

Berichte

Die meisten Geschäftsanwendungen bestehen aus Formularen für Daten und dienen dazu, unterschiedliche Informationen, die in Backend-Datenbanken gespeichert werden, einzugeben, zu bearbeiten, anzusehen und darzustellen. Benutzer wollen diese Daten häufig in aggregierter Form ansehen. Aus diesem Grund stellen Berichte eine Schlüsselkomponente moderner Geschäftsanwendungen dar (auch wenn diese häufig erst nach der Version 1.0 einer Anwendung entwickelt werden). Berichte standen bereits in Visual Basic 6.0 zur Verfügung; hierzu wurden entweder die Crystal Reports, die Datenumgebung oder eine Reihe von Berichtswerkzeugen von Drittanbietern verwendet.

Mit Visual Studio 2005 hat Microsoft das neue, mächtige Steuerelement ReportViewer bereitgestellt, mit dem Sie aus Ihrer Anwendung heraus Berichte erstellen und betrachten können. Das ReportViewer-Steuerelement unterstützt interaktive Berichte und das Drucken, ermöglicht das Layout des Berichts einzustellen und die Berichte zu exportieren.

Um eine Visual Basic 6.0-Anwendung um neue Berichte zu erweitern, könnten Sie weiterhin die Werkzeuge verwenden, die im Jahre 1998 mit dem Produkt ausgeliefert wurden. Jedoch fordern die Nutzer unserer fiktiven Sales Support-Anwendung das Neueste und Beste; darum war das ReportViewer-Steuerelement die beste Wahl. Dieses Steuerelement kann einfach in ein .NET-Form eingefügt werden. Durch die Verwendung des Interop Forms Toolkit 2.0 lässt sich dieses Form von einer vorhandenen Visual Basic 6.0-Anwendung aus anzeigen. Abbildung 3 zeigt einen Umsatzbericht für mehrere Kunden.

Cc299496.39f1bf0d-0d08-490d-9535-f4404be6a6af(de-de,VS.80).gif

Abbildung 3: Umsatzbericht für mehrere Kunden

Sie können diesen Bericht über den neuen Menübefehl Reports anzeigen lassen; er enthält Berichte für Kunden, Kontakte sowie die Umsatzprognosen.

Anwendungsarchitektur

Den Kern der Anwendung bildet eine Visual Basic 6.0-Anwendung, die mit einer SQL Server 2005 Express-Datenbank kommuniziert. Wenn der Anwender im neuen Report-Menü einen Bericht auswählt, erstellt die Visual Basic 6.0-Anwendung eine Instanz des .NET-Berichtformulars als ob es ein COM-Objekt ist. Die Visual Basic 6.0-Anwendung übergibt die Daten als ADO Recordset-Objekt an das .NET-Form. Das .NET-Form konvertiert das Recordset-Objekt in ein DataSet-Objekt. Dies ist erforderlich, weil das ReportViewer-Steuerelement nicht an ein an ADO Recordset-Objekt, wohl aber an ein ADO.NET DataSet-Objekt gebunden werden kann. Anschließend wird der Bericht angezeigt, was Sie in Abbildung 3 sehen. (Weitere Informationen hierzu finden Sie unter "Sharing ADO Recordsets Between Visual Basic 6.0 and Visual Basic 2005" in der MSDN Library.)

Cc299496.577a99bb-528c-469e-bdbf-6fff52103f74(de-de,VS.80).gif

Abbildung 4: Der Datenfluss der Anwendung

Die Implementierung in Visual Basic .NET

Um die Visual Basic 6.0-Anwendung erweitern zu können, wird ein Visual Basic .NET Framework-Klassenbibliotheksprojekt mit dem Namen VBNET_Extensions benötigt. Dieses Projekt erhält von der Visual Basic 6.0-Anwendung ein Recordset-Objekt und konvertiert es in ein DataSet-Objekt, das dann als Grundlage für den Bericht dient. Das DataSet-Objekt stellt einen visuellen Designer zur Verfügung, mit dem Sie die Tabellen definieren können, die die Daten aufnehmen sollen. Wenn Sie einen Blick auf den Designer werfen, können Sie erkennen, dass das DataSet-Objekt mit den Tabellen definiert wurde, die den Daten entsprechen, die von der Anwendung Sales Support zur Verfügung gestellt werden.

Cc299496.d319c9ef-8ca1-4e72-988d-b2eeae74aba7(de-de,VS.80).gif

Abbildung 5: Der DataSet-Designer

Wenn .NET Framework für Sie Neuland darstellt, sollten Sie wissen, dass sich ein DataSet-Objekt sehr von den vier Haupt-ADO-Objekten, vor allem den Recordset-Objekten, unterscheidet. Ein DataSet-Objekt lässt sich als Sammlung von hierarchisch zueinander in Beziehung stehenden Recordset Objekten (DataTables) beschreiben, das nicht mit der Datenbank verbunden ist, für das jedoch geeignete Command-Objekte zur Verfügung stehen, die sich um die Änderung der Daten in der Datenbank kümmern. Noch interessanter ist, dass ein DataSet-Objekt auch mit Daten gefüllt werden kann, die nicht direkt aus einer Datenbank kommen. In diesem Beispiel wird das DataSet-Objekt mit Daten aus ADO Recordset-Objekten gefüllt.

Die Tabellen Contacts, Account und Forecast enthalten Daten, die von der Visual Basic 6.0-Anwendung Sales Support bereitgestellt werden. Die Visual Basic 6.0-Anwendung übergibt diese Daten in Recordset-Objekten, die dann von der Klassenbibliothek VBNET_Extensions in diese DataTable-Objekte kopiert werden. Die Tabellen TopAccounts und TopForecast wurden speziell entworfen, um Diagramme zu erstellen, die in einigen Berichten vorkommen. Diese Diagramme zeigen die zehn umsatzstärksten Kunden, und zwar sowohl für die aktuellen als auch für die prognostizierten Umsätze.

Nachdem Sie das DataSet erstellt haben, können Sie sich an das Erzeugen der eigentlichen Berichte machen. In Visual Basic standen zahlreiche Optionen für das Erstellen von Berichten zur Verfügung. Mit der Einführung von Visual Studio 2005 hat Microsoft das ReportViewer-Steuerelement verfügbar gemacht. Dieses Berichtstool enthält alles, was Sie brauchen, um leistungsstarke, interaktive Berichte zu erstellen. Jedoch handelt es sich hierbei um ein .NET-Steuerelement und muss daher auf einem .NET-Form eingefügt werden, das dann von der vorhandenen Visual Basic 6.0-Anwendung aus aufgerufen wird.

Um ein .NET-Form zu erstellen, auf das von Visual Basic 6.0 aus zugegriffen werden kann, benötigen Sie das Interop Forms Toolkit 2.0, ein kostenloses und unterstütztes Visual Basic 2005 PowerPack, mit dem .NET-Forms für eine Visual Basic 6.0-Anwendung wie COM-Objekte aussehen. Nach der Installation steht in Visual Basic 2005 die neue Vorlage Visual Basic 6.0 InteropForm zur Verfügung, wie es Abbildung 6 zeigt.

Cc299496.63861ba1-aa62-4696-9d46-681db54236e4(de-de,VS.80).gif

Abbildung 6: Ein Visual Basic 6.0 InteropForm hinzufügen

Ein InteropForm ist wie ein ganz normales .NET-Form, jedoch wird es mit zusätzlichen Attributen versehen, wodurch es via COM aufrufbar ist. Nachdem Sie ein neues Form in das Projekt eingefügt haben, ziehen Sie aus dem Abschnitt Daten der Toolbox ein ReportViewer-Steuerelement auf das Form. Das ReportViewer-Steuerelement besitzt in seiner oberen rechten Ecke ein kleines Smarttagmenü, mit dem das ReportViewer-Steuerelement an das Form angedockt werden kann. Wenn Sie ein Steuerelement andocken, füllt es automatisch den zur Verfügung stehenden Platz; außerdem ändert sich die Größe automatisch, wenn sich die Größe des Forms ändert – eine Aufgabe, die bei Visual Basic 6.0 eine echte Herausforderung war. Der Smarttag wird außerdem verwendet, um einen neuen Bericht zu entwerfen. Das Smarttagmenü sehen Sie in Abbildung 7.

Cc299496.8f658fc2-4a06-42f2-a392-ce3ab2495858(de-de,VS.80).gif

Abbildung 7: Mit dem Smarttagmenü einen neuen Bericht entwerfen

Während der Report-Designer geöffnet ist, wird die Toolbox aktualisiert und zeigt eine Reihe von speziellen Berichtselementen an. Für diesen Bericht werden die Elemente Tabelle und Diagramm verwendet. Ziehen Sie aus der Toolbox eine Tabelle auf den Bericht im Layoutmodus. Nachdem die Tabelle an der gewünschten Stelle steht, ziehen Sie aus dem Fenster Datenquellen einzelne Spalten auf die Tabelle, um so die Tabellenzellen an die Spalten des DataSet zu binden, wie es Abbildung 8 zeigt. Sie können die Datenfelder auch auf dem Diagramm ablegen, um so festzulegen, woher die Datenwerte und die Kategorienbeschriftungen stammen.

Cc299496.330d392a-8f39-4843-86bf-f3adfcd0eaa7(de-de,VS.80).gif

Abbildung 8: Den Bericht entwerfen

Damit der Bericht besser lesbar ist, sollten Sie die Eigenschaft BackgroundColor der Tabellenzellen auf den folgenden Ausdruck setzen: =iif(RowNumber(Nothing) Mod 2, "PaleGreen", "White"). Hierdurch wird die Hintergrundfarbe der Zeilen der Tabelle abwechselnd auf Grün bzw. Weiß gesetzt. Klicken Sie das Diagramm mit der rechten Maustaste an und wählen Sie dann Properties (Eigenschaften), um die weiteren Eigenschaften dieses Diagramms anzeigen zu lassen, was Abbildung 9 zeigt. Mit den verschiedenen Registerkarten können Sie das Diagramm wie gewünscht gestalten, indem Sie beispielsweise einen Diagrammtitel eingeben oder die Label der x-Achse als Währung formatieren.

Cc299496.3d858f4a-f9ad-4aa8-b1f3-77b0d1b70be6(de-de,VS.80).gif

Abbildung 9: Die Eigenschaften eines Diagramms festlegen

Der letzte Schritt besteht darin, das ReportViewer-Steuerelement mit dem SalesSupportDataSet zu verknüpfen. Um mit der Visual Basic 6.0-Anwendung Sales Support interagieren zu können, benötigt die Anwendung eine Möglichkeit, um dem AccountReportForm ein Recordset-Objekt zu übergeben. Dieser Schritt wird möglich gemacht, indem das Berichtsformular um eine Eigenschaft ergänzt wird. Den hierfür erforderlichen Code sehen Sie in Listing 1.

    Private mRecordset As Object
    <InteropFormProperty()> _
    Public Property Recordset() As Object
        Get
            Return mRecordset
        End Get
        Set(ByVal value As Object)
            If (value IsNot mRecordset) Then
                mRecordset = value
                SalesSupportDataSet.Account.Clear()
                Dim da As New OleDbDataAdapter()
                da.Fill(SalesSupportDataSet.Account, mRecordset)
                GenerateTopAccounts()
                AccountReportViewer.RefreshReport()
            End If
        End Set
    End Property

Listing 1: Die Eigenschaft Recordset auf dem Visual Basic .NET-Form

Diese Eigenschaft verwendet ein .NET Framework OleDbDataAdapter-Objekt, um die Inhalte des Recordset-Objekts in das DataTable-Objekt Account des DataSet zu kopieren, das bereits mit dem DataSet-Designer erstellt wurde. Um die ADO-Daten von Visual Basic 6.0 in ein ADO.NET DataSet zu transformieren, wird genau eine Codezeile benötigt:

da.Fill(SalesSupportDataSet.Account, mRecordset)

Der DataAdapter erledigt dann die gesamte Arbeit.

In einigen der Berichte werden Diagramme verwendet, die die Top 10 anzeigen. Sie können eine Funktion verwenden, um die Daten für diese Berichte zu generieren. Für den Bericht Accounts erledigen Sie dies mit der Funktion GenerateTopAccounts, die Sie in Listing 2 sehen.

    Private Sub GenerateTopAccounts()
        Dim bs As New BindingSource(SalesSupportDataSet, _
            SalesSupportDataSet.Account.TableName)

        bs.Sort = SalesSupportDataSet.Account. _
            sales_last_3_monthsColumn.ColumnName & _
            " asc"

        SalesSupportDataSet.TopAccounts.Clear()
        For i As Integer = bs.Count - 11 To bs.Count - 1
            Dim accountRow As SalesSupportDataSet.AccountRow
            accountRow = bs.Item(i).Row
            SalesSupportDataSet.TopAccounts. _
                AddTopAccountsRow(accountRow.CompanyName, _
                accountRow.sales_last_3_months)
        Next
    End Sub

Listing 2: Die Funktion GenerateTopAccounts

Die Funktion GenerateTopAccounts verwendet ein .NET Framework BindingSource-Objekt, um die Kunden nach Umsätzen zu sortieren. Anschließend werden die ersten zehn Zeilen aus dem BindingSource-Objekt in das DataTable-Objekt TopAccounts kopiert. Da das Diagramm bereits an diese Tabelle gebunden wurde, zeichnet das Diagramm sich selbst und zeigt die zehn umsatzstärksten Kunden an.

Die Interoperabilitätsschicht in Visual Basic 6.0

Wie bereits weiter oben erwähnt ermöglicht es Ihnen das Interop Forms Toolkit 2.0 in Visual Basic 2005 Forms zu erstellen, die dann von Visual Basic 6.0 aufgerufen werden können. Das Interop Forms Toolkit 2.0 installiert die Vorlage Visual Basic 6.0 InteropForm, die verwendet wird, um die Berichtsformulare zu erstellen. Nachdem die Berichte fertig sind, rufen Sie den Menübefehl Tools | Generate InteropForm Wrapper Classes (siehe Abbildung 10) auf, um die COM-Wrapper zu erstellen, die Visual Basic 6.0 benötigt, um mit dem .NET-Form interagieren zu können.

Cc299496.2a107f96-c018-4968-9d17-72b7848f9ef4(de-de,VS.80).gif

Abbildung 10: Die COM-Wrapperklassen erstellen lassen

Nachdem die Wrapperklassen erstellt sind, können Sie den Menübefehl Build | Build Solution (Erstellen | Projektmappe erstellen) verwenden, um das Projekt zu kompilieren.

Öffnen Sie dann in Visual Basic 6.0 die Anwendung Sales Support und fügen Sie einen Verweis auf das COM-Objekt VBNET_Extensions ein. Dadurch kann der Visual Basic 6.0-Code eine Instanz dieses Objekts erstellen und es so aufrufen, als wenn es sich um ein „normales“ COM-Objekt handeln würden. Listing 3 zeigt den Visual Basic 6.0-Code, mit dem die Kundendaten an das Visual Basic .NET-Berichtsformular übergeben werden.

Private Sub mnuAccounts_Click()
    Dim f As New VBNET_Extensions_AccountReportForm

    If rsAccount Is Nothing Then
        LoadAccountData
    End If

    f.Recordset = rsAccount
    f.Show
End Sub

Listing 3: Ein Recordset-Objekt an ein Visual Basic .NET-Berichtsformular übergeben

Sie können erkennen, dass in Visual Basic 6.0 nur wenig Code erforderlich ist, um die neue Funktionalität von Visual Basic .NET zu nutzen.

Zusammenfassung

Für das Erstellen von neuen Anwendungen ist Visual Basic .NET die beste Wahl. Microsoft setzt seine Bestrebungen fort, .NET Framework und die damit zusammenhängenden Technologien zu verbessern. Gleichzeitig werden in vielen Unternehmen wichtige Visual Basic 6.0-Anwendungen eingesetzt. Der Artikel hat gezeigt, dass nichts dagegenspricht, hybride Anwendungen zu erstellen und dabei das Beste aus beiden Technologien zu nutzen.

Über den Autor

Scott Swigart verbringt seine Zeit mit Consulting, mit Autorentätigkeit und ist als Referent über sich entwickelnde und neu entstehende Technologien tätig. Dank seiner mehr als 15-jährigen Erfahrung als Programmierer und seines permanenten Kontakts mit zukünftigen Technologien im Bereich der Softwareentwicklung ist Scott Swigart in der Lage, Unternehmen dabei zu unterstützen, das Beste aus den heutigen Technologien herauszuholen und sich dabei gleichzeitig auf die Verwendung von zukünftigen Technologien vorzubereiten. Scott Swigart ist außerdem Autor von mehreren Büchern zu .NET, zertifizierter Microsoft Trainer (MCT) und Entwickler (MCSD) sowie Microsoft MVP. Nehmen Sie mit Scott Swigart Kontakt auf über scott@swigartconsulting.com oder lesen Sie seine aktuellen Grübeleien unter blog.swigartconsulting.com.