![]() |
Re: Crystal Reports XI + Delphi und unterschiedliche Datenba
Zitat:
Und da es über SQL schneller geht, brauch ich ne SQL Schnittstelle... |
Re: Crystal Reports XI + Delphi und unterschiedliche Datenba
Zitat:
Evtl. wären Hilfsview als virtueller DS hilfreich die diesen INNER JOIN schon realisiert haben? |
Re: Crystal Reports XI + Delphi und unterschiedliche Datenba
Noe, denn ich weiß ja nicht was für Verknüpfungen der Report braucht.
Ich weiß ja nicht, ob du mit CR schonmal gearbeitet hast, aber um dort z.B. einen INNER JOIN zu erstellen, geht man in die Datenbankverwaltung rein, da hat man z.B. seine zwei Tabellen und zieht das eine zu verknüpfende Feld auf das der anderen Tabelle - genauso wie z.B. bei Access. Ich kann bei den TCrpeDS Komponenten nicht mehr machen also zu sagen: CrpeDS1.connection := myZconnection; CrpeDS1.sql("SELECT * FROM tbl_1"); CrpeDS2.connection := myZConnection; CrpeDS2.sql("SELECT * FROM tbl_2"); CrpeViewer.open(report.rpt); CrpeViewer.tableByName(tbl_1).datapointer := crpeDS1.datapointer; CrpeViewer.tableByName(tbl_2).datapointer := crpeDS2.datapointer; Damit bekommt CR zwei komplette Resultsets und muss diese anhand der im Report hinterlegten verknüpfung selbst ausrechnen. Mit einer SQL fähigen Schnittstelle hängt man einfach die Datenbankverbindung an das CrpeVier Object, z.b. eine ODBC Verbindung, CR sieht er hat eine SQL Datenbank zu Verfügung, erzeugt einen SQL INNER JOIN, schickt das an die Datenbank und das eine Resultset dass es bekommt wir einfach nur noch ausgedruckt. Es sollte dir wohl klar sein, dass erste Methode länger dauert, zum einen weil die ganzen datenbankspezifischen Optimierungen wegfallen, die ein Datenbanktreiber hätte, zum anderen weil auch Datenstätze geholt werden, die z.B. keinen passenden verknüpften Datensatz in der zweiten Tabelle enthält und CR die dann selbst "wegwerfen" muss. (Den Code soll jetzt kein Delphicode sein sondern nur die Vorgehensweise verdeutlichen :lol: ) |
Re: Crystal Reports XI + Delphi und unterschiedliche Datenba
Ok, damit wird mir klar was CR macht und wo der vermutlich Mangel von CR in diesem Fall ist.
CR wird einfach für jeden Datensatz aus DS1 einen Full-Table Scan in DS2 durchführen. Besser wäre es wenn er sich indern einen Index auf DS2 anlegt (im Speicher) und dann genau die gleichen Optimierungen wie bei einer "richtigen" Datenbank durchfühen würde. CR weiß ja welche Spalte Indiziert werden müssen. Zu deinem ODBC-Treiber: Welches DBMS willst du denn "Faken". Du mußt ja ein von CR unterstützten DBMS nachbilden damit CR die Queries dafür optimieren kann (z.B. INNER JOINs werden bei jeder Datenbank Syntax-Technisch anders aufgebaut). |
Re: Crystal Reports XI + Delphi und unterschiedliche Datenba
Zitat:
Das hab ich ja auch in meinen "Fragenkatalog" oben reingeschrieben. CRXI hat datenbankspezifische Treiber mit dabei, also z.b. für Access, Oracle, Paradox usw. Aber man hat natürlich auch die Möglichkeit über ODBC oder JDBC zu gehen. In dem Fall muss ja nur ein ODBC Treiber in Windows registriert sein, der wird dann über die ODBC-Unterstützung von CR angesprochen. Ich muss also kein DBMS "nachbilden", sondern einfach nur einen ODBC Treiber zu verfügung stellen. Aber genau hier komme ich auf die selbe Frage wie du: Wie sag ich CR wie z.B. ein INNER JOIN aufgebaut sein muss? Ich denke, dass das irgendwie der ODBC Treiber vorgeben muss, nur weiß ich noch nicht wie. In der Doku von Microsoft hab ich diesbezüglich noch nichts gefunden. Darum hab ich die Frage ja auch hier reingeschrieben ;) |
Re: Crystal Reports XI + Delphi und unterschiedliche Datenba
Zitat:
Zitat:
|
Re: Crystal Reports XI + Delphi und unterschiedliche Datenba
Dem kann ich nicht ganz zustimmen.
Ich hab mir den Firebird ODBC Treiber mal runtergeladen, bei einem meinen Reports die Verbindung gegen ODBC ausgetauscht (das geht im Designer zum Glück extrem einfach) und einen Testlauf gemacht, das klappt wunderbar. Edit: Wen man das ein Stück weiterdenkt könnte man im Notfall ja sagen man legt im ODBC Treiber z.B. MSSQL oder INTERBASE fest und hängt in der Applikation einen Parser dazwischen der das Statement nochal durchgeht und dann erst an die Datenank schickt. Das werden wir wohl eh machen müssen, da wir z.Z. nur mit Zeos und Firebird arbeiten. Die Frage ist ja, ob unsere Statements, die wir direkt im Programm verwenden, auch mit anderen Datenbanken laufen - ich denke nämlich Zeos hat da keinen eigenen Parser der das auf die ausgewählte Datenbank umschreibt. |
Re: Crystal Reports XI + Delphi und unterschiedliche Datenba
Den SQL bekommst du doch vom Report geliefert über die Property SQL und einem Retrieve, die ungefähr so aussieht
SQL-Code:
Wenn du mit dieser etwas anfangen kannst und du daraus deine eigenen Datasets füllen kannst.
SELECT
AUFTRAG."NR", AUFTRAG."KUNDENNR", AUFPOS."NR", AUFPOS."POSNR", AUFPOS."ARTIKELNR" FROM { oj "AUFTRAG" AUFTRAG INNER JOIN "AUFPOS" AUFPOS ON AUFTRAG."NR"=AUFPOS."NR"} WHERE AUFPOS."NR" < 10000 Eine Auswahl welche Datensätze ermittelt werden sollen, kannst du direkt über die Selection bzw. GroupSelection auslesen. Der genauere Syntax, den CR beim Erstellen der SQL's verwenden soll, ist in der Registry eingestellt, weiss es aber nicht mehr wo genau. |
Re: Crystal Reports XI + Delphi und unterschiedliche Datenba
Das geht aber nicht bei der Verwendung von den TCrpeDS Komponenten. Da die für CR keine SQL-Schnittstelle anbieten, wird auch kein SQL String erzeugt.
Dass der Syntax in der Registry festgelegt wird bezweifle ich auch (aber kann ja sein). Dass der ODBC Treiber einen Namen ausspuckt und dieser Name im CR mit einer Snytax-Definition verbunden sein muss erscheint mir da schon logischer. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz