Announcement

Collapse
No announcement yet.

CrystalReport mit einem Recordset füttern

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • CrystalReport mit einem Recordset füttern

    Hallo zusammen <br><P>
    Ich versuche gerade aus Delphi heraus einen CrystalReport anzuzeigen. Das funktioniert
    bis jetzt auch. Wenn ich allerdings mein Programm auf einem anderen Rechner starte,
    erhalte ich die Fehlermeldung, dass die Datei, die ich für das Designen des Reports
    benutzt habe, nicht vorhanden ist, obwohl ich die Daten über ein Recordset (ADO) an den Report übergebe. <br>

    Hier mein Code:
    <pre>CrReport := Application1.OpenReport('F:\Projekte\Delphi\Crysta l2\bericht6.rpt',1);
    CrReport.DiscardSavedData;
    CrReport.Database.SetDataSource(oQuery.Recordset,3 ,1);
    CRViewer91.ReportSource := CrReport;
    </pre>
    Kennt irgendjemand das Problem und kann mir dabei helfen?<br>
    Vielen Dank<br>
    Gruss Beat

  • #2
    Hallo,

    das folgende Beispiel für <i>Crystal Report 9</i> läuft bei mir so wie erwartet.

    Der Zugriffsweg führt direkt in das Objektmodell von <i>Report Designer Component 9</i> (<b>RDC</b>), so dass der erste Schritt darin besteht, die Typbibliothek von Report Designer Component 9 (RDC) zu importieren. Da nun die Report-Vorschau über ein separates ActiveX-Control läuft, muss als zweiter Schritt auch das <i>Crystal Report Viewer Control 9 (Version 9.2)</i> installiert werden. Über die dabei von Delphi angelegten Unit-Dateien <i>CRVIEWER9Lib_TLB.pas</i> und <i>CRAXDDRT_TLB.pas</i> greift das Beispiel direkt auf die COM-Objekte zu. Nachdem eine Instanz des <b>Application</b>-Objekts von RDC angefordert wurde, öffnet die <b>OpenReport</b>-Methode die Report-Datei. Allerdings greift mein zweites Beispiel nicht direkt auf die Datenbank zu, sondern nutzt ein bereits gefülltes <b>Recordset</b>-Objekt von ADO als Datenquelle. Da man ein Recordset völlig unabhängig von einer Datenbank direkt im Programm neu definieren und mit Daten füllen kann, steht so ein verblüffend einfacher Weg zur Verfügung, um beliebige Daten an den Report zu übergeben. Außerdem hat der Zugriff über das Recordset auch den Vorteil, dass man völlig unabhängig von den Datenbank-Treibern von Crystal Report ist und an dieser Stelle nichts dazulernen muss.
    <pre>
    <b>unit</b> D7RDCDemoFrm;
    <br>
    <b>interface</b>
    <br>
    <b>uses</b>
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls, OleCtrls, CRVIEWER9Lib_TLB, OleServer,
    CrystalReportsObjectFactoryLib_TLB, CrystalClientDocLib_TLB, ExtCtrls,
    ComCtrls, ADOInt;
    <br>
    <b>type</b>
    TForm1 = <b>class</b>(TForm)
    CRViewer91: TCRViewer9;
    StatusBar1: TStatusBar;
    Panel1: TPanel;
    Button1: TButton;
    <b>procedure</b> Button1Click(Sender: TObject);
    <b>procedure</b> FormCreate(Sender: TObject);
    <b>private</b>
    <font color="#003399"><i>{ Private-Deklarationen }</i></font>
    FCon : _Connection;
    FRS : _Recordset;
    <b>public</b>
    <font color="#003399"><i>{ Public-Deklarationen }</i></font>
    <b>end</b>;
    <br>
    <b>var</b>
    Form1: TForm1;
    <br>
    <b>implementation</b>
    <br>
    <font color="#003399"><i>{$R *.dfm}</i></font>
    <br>
    <font color="#003399"><i>{
    Schritt 1: Report Designer Component 9 (RDC) importieren
    a) Projekt | Typbibliothek importieren...
    b) &quot;Crystal Reports 9 ActiveX Designer Design and Runtime Library &quot;
    <br> (C:\Programme\Gemeinsame Dateien\Crystal Decisions\2.0\bin\craxddrt9.dll)
    <br>
    Schritt 2: ActiveX-Viewer importieren
    a) Komponente | ActiveX importieren...
    b) &quot;Crystal Report Viewer Control 9 (Version 9.2)&quot;
    }</i></font>
    <br>
    <b>uses</b> CRAXDDRT_TLB;
    <br>
    <b>resourcestring</b>
    cCS = <font color="#9933CC">'Provider=Microsoft.Jet.OLEDB.4.0; Data Source=%s;'</font>;
    cSQL = <font color="#9933CC">'SELECT * FROM CrystalReport9Demo ORDER BY RecID DESC'</font>;
    <br>
    <b>procedure</b> TForm1.FormCreate(Sender: TObject);
    <b>var</b>
    sCS : <b>String</b>;
    <b>begin</b>
    FCon := CoConnection.Create;
    FCon.CursorLocation := adUseClient;
    sCS := Format(cCS, [<font color="#9933CC">'OSCR9DEMO.mdb'</font>]);
    FCon.Open(sCS, <font color="#9933CC">''</font>, <font color="#9933CC">''</font>, adConnectUnspecified);
    StatusBar1.SimpleText := sCS;
    FRS := CoRecordSet.Create;
    FRS.CursorLocation := adUseClient;
    FRS.Open(cSQL, FCon, adOpenStatic, adLockReadOnly, adCmdText);
    <b>end</b>;
    <br>
    <b>procedure</b> TForm1.Button1Click(Sender: TObject);
    <b>var</b>
    aCRApp : IApplication;
    aCRRpt : IReport;
    aCRDB : IDatabase;
    sPath : <b>String</b>;
    <b>begin</b>
    sPath := ExtractFilePath(Forms.Application.ExeName) + <font color="#9933CC">'OSD7CR9.rpt'</font>;
    aCRApp := CoApplication.Create;
    aCRRpt := aCRApp.OpenReport(sPath, 0);
    aCRDB := aCRRpt.Database;
    <font color="#003399"><i>// Report soll ein bereits gefülltes Recordset-Objekt als Datenquelle nutzen</i></font>
    aCRDB.SetDataSource(FRS, 3, 1);
    CRViewer91.ReportSource := aCRRpt;
    CRViewer91.ViewReport;
    <b>end</b>;
    <br>
    <b>end</b>.
    </pre>
    Siehe auch <i>http://www.entwickler.com/itr/features/psecom,id,101,nodeid,77.html</i&gt

    Comment


    • #3
      Hallo Herr Kosch<br><br>
      Ersteinmal danke für Ihre prompte Antwort.<p>
      Ich habe ihr Beispiel getestet und so hat es bei mir auch funktioniert. Der Fehler tritt erst dann auf, wenn ich eine 2te Tabelle, die Verknüpfungen zur ersten hat, in den Bericht einfüge und dann den Report aufrufe.<br><br>
      Auf der Delphi-Seite ändert sich nur der Abfragestring:<br><pre>cSQL := 'SELECT PA197.FAMNAME, PA197.VORNAME, KTOA197.KONTOART FROM KTOA197 KTOA197 INNER JOIN PA197 PA197 ON KTOA197.ID=PA197.ID';</pre><p>Kennen Sie vielleicht dieses Problem?<br><br>Vielen Dank<br>Bea

      Comment

      Working...
      X