Announcement

Collapse
No announcement yet.

crystal report

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

  • crystal report

    Hi
    hat jemand Erfahrung mit der Einbindung von crystal report in delphi6?

    Wir benutzen die crystal report9.0 prof-version

    Friedel

  • #2
    Hallo,

    im Fall von Crystal Report 9 stehen für Delphi 6 sogar 2 Wege zur Verfügung:

    1. Der alte Weg über die VCL-Komponente für die CRPE (<b>TCrpe</b>)

    Wenn die vom Crystal Report 9-Setup abgelegte Package in Delphi installiert wird, steht die VCL-Komponente TCrpe zur Verfügung. Das folgende Beispiel demonstriert, wie eine Handvoll Programmzeilen ausreichen, um die Report-Vorschau im eigenen Programmfenster anzuzeigen. Nachdem eine TPanel-Instanz als Eltern-Fenster sowie die Report-Datei zugewiesen wird, legt die DatabaseName-Eigenschaft die auszulesende Datenbankdatei fest. Wird dann die Methode Execute aufgerufen, kann der angezeigte Report entweder ausgedruckt oder in den Formaten PDF, DOC, XLS, HTML oder XML (um nur einige zu nennen) exportiert werden

    <pre>

    Crpe1.WindowStyle.BorderStyle := bsNone;
    Crpe1.WindowParent := Panel1;
    Crpe1.ReportName := sAppPath + 'OSD7CR9.rpt';
    Crpe1.Connect.DatabaseName := sAppPath + 'OSCR9DEMO.mdb';
    Crpe1.Execute;

    </pre>

    2. Der neue Weg über das ActiveX Crystal Report Viewer Control 9

    Der neue Zugriffsweg führt Sie direkt in das Objektmodell von RDC, 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 Crystal Report Viewer Control 9 (Version 9.2) installiert werden. Über die dabei von Delphi angelegten Unit-Dateien CRVIEWER9Lib_TLB.pas und CRAXDDRT_TLB.pas greift das nächste Beispiel direkt auf die COM-Objekte zu. Nachdem eine Instanz des Application-Objekts von RDC angefordert wurde, öffnet die OpenReport-Methode die Report-Datei. Allerdings greift mein zweites Beispiel nicht direkt auf die Datenbank zu, sondern nutzt ein bereits gefülltes Recordset-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>

    var
    aCRApp : IApplication;
    aCRRpt : IReport;
    aCRDB : IDatabase;
    begin
    aCRApp := CoApplication.Create;
    aCRRpt := aCRApp.OpenReport(sPath, 0);
    aCRDB := aCRRpt.Database;
    // bereits gefülltes Recordset-Objekt als Datenquelle nutzen
    aCRDB.SetDataSource(FRecordSet, 3, 1);
    CRViewer91.ReportSource := aCRRpt;
    CRViewer91.ViewReport;
    end;

    </pre&gt

    Comment


    • #3
      Crystal Reports + SetdataSource

      Hallo,

      ich benutze wie beschrieben den "neuen Weg", allerdings bleibt das Setzen der Datasource-Eigenschaft ohne Effekt. Der Report wird immer mit den Daten der Datenbank angezeigt, mit der er designed wurde.

      Folgender Code:
      ...
      ...
      var
      aCRApp : IApplication;
      aCRRpt : IReport;
      aCRDB : IDatabase;
      sCS: string;
      begin
      aCRApp := CoApplication.Create;
      aCRRpt := aCRApp.OpenReport('D:\Standard.rpt', 0);
      aCRDB := aCRRpt.Database;

      // bereits gefülltes Recordset-Objekt als Datenquelle nutzen
      FCon := CoConnection.Create;
      FCon.CursorLocation := adUseClient;
      sCS := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\MULTILINErep.mdb';
      FCon.Open(sCS, '', '', adConnectUnspecified);
      FRS := CoRecordSet.Create;
      FRS.CursorLocation := adUseClient;
      FRS.Open('SELECT * FROM MPXBHF ', FCon, adOpenStatic, adLockReadOnly, adCmdText);
      //

      aCRDB.SetDataSource(FRS, 3, 1);
      CRPreview.ReportSource := aCRRpt;
      CRPreview.ViewReport;
      end;
      ...
      ...

      Entworfen wurde der Report mit Daten die in einer Access-Datenbank auf "C:\Test\MULTILINErep.mdb" liegen, diese werden immer angezeigt, obwohl ich ja mit SetDatasource die Datenbank "D:\MULTILINErep.mdb'" auswähle.
      Wo liegt der Fehler ?

      Gruss

      Andreas

      Comment


      • #4
        LogOnServer

        Habe das Problem (ein Stück weit) lösen können:
        mit folgendem Code wird die richtige Datenbank ausgwählt (Einschränkung kommt gleich...)
        ...
        ...
        ...
        aCRApp := CoApplication.Create;
        aCRRpt := aCRApp.OpenReport('D:\Test\standard.rpt',0);
        aCRDB := aCRRpt.Database;
        sMDB:= 'D:\Test\Multilinerep.mdb';

        aCRApp.LogOnServer('crdb_dao.dll', sMDB, sMDB, '', '');

        for nC:= 1 to aCRDB.Tables.Count do
        aCRDB.Tables[nC].ConnectBufferString:= 'Databasename='+sMDB+';;Database Type=Access;;Database Password=;'+
        ';Session UserID=;;System Database Path=;;Session Password=';
        CRPreview.ReportSource := aCRRpt;
        CRPreview.ViewReport;
        ...
        ...

        Allerdings wird nicht automatisch die im Parameter sMDB übergebene Access-Datenbank verwendet, vielmehr wird ein (Business-Objects)Dialog angezeigt, in dem man die Datenbank dann per "Datei öffnen" auswählen muss...

        Kann mir da jemand weiterhelfen ?

        Vielen Dank

        Andreas

        Comment

        Working...
        X