Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   QuickReport mit Connection verknüpfen? (https://www.delphipraxis.net/205845-quickreport-mit-connection-verknuepfen.html)

Getox 22. Okt 2020 12:14

QuickReport mit Connection verknüpfen?
 
Ich bin gerade dabei einen Programmteil umzubauen und dabei die Programmlogik übersichtlicher zu strukturieren.

Ich habe ein TQRPreview:
Code:
FPreview := TQRPreview.Create(nil);
FPreview.Parent := Self;
FPreview.Align := alClient;
FPreview.ZoomState := qrZoom100;
FPreview.Zoom := 100;
FPreview.TabStop := True;
FPreview.TabOrder := 0;
FPreview.OnMouseWheelUp := SetMouseWheelUp;
FPreview.OnMouseWheelDown := SetMouseWheelDown;
Und einen TReportDesignerDialog:
Code:
qrdQuickrep.bQrdPromptParams := (FReportTyp = rtVorschau);
FDesignerDialog := TReportDesignerDialog.Create(nil);
FDesignerDialog.QRPreview           := FPreview;
FDesignerDialog.BeforeOpenDataset   := ReportDesignerDialog1BeforeOpenDataset;
FDesignerDialog.BeforeGetQueryParams := ReportDesignerDialog1BeforeGetQueryParams;
FDesignerDialog.BandBeforePrint     := ReportDesignerDialog1BandBeforePrint;
FDesignerDialog.DefaultFileFilter   := ReportDesignerDialog1.DefaultFileFilter;
FDesignerDialog.EditorSettings      := ReportDesignerDialog1.EditorSettings;
FDesignerDialog.PrevFormStyle       := ReportDesignerDialog1.PrevFormStyle; { #3.3.0.6 TT 2009-11-16 }
FDesignerDialog.PreviewHeight       := ReportDesignerDialog1.PreviewHeight;
FDesignerDialog.PreviewWidth        := ReportDesignerDialog1.PreviewWidth;
FDesignerDialog.PreviewInitialState := ReportDesignerDialog1.PreviewInitialState;
FDesignerDialog.PrintIfEmpty        := ReportDesignerDialog1.PrintIfEmpty;
FDesignerDialog.PrinterSettings.UseStandardprinter := True;
FDesignerDialog.PrinterSettings.UseCustomPaperCode := False;
FDesignerDialog.UseCurrentDatasets  := FALSE; // muss False sein!
FDesignerDialog.UseDatamodules      := FALSE; // muss False sein!
FDesignerDialog.UserSettings        := ReportDesignerDialog1.UserSettings;
FDesignerDialog.UsePrinterSettings  := True;
FDesignerDialog.PrepareAutomatically := False;
FDesignerDialog.UseModalPreview := False;
FDesignerDialog.PrinterSettings.MemoryLimit := 250000;
FDesignerDialog.PrinterSettings.UseCustomBinCode := True;
FDesignerDialog.PrinterSettings.CustomBinCode := getDruckerSchacht;
FDesignerDialog.PrinterSettings.Duplex := getDuplex;
Diese Werte habe ich aus dem vorherigen Wust aus Code übernommen. Dort gab es auch eine Connection (globale Variable in der Unit):
Code:
aADOConnection := TADOConnection.Create(self);
aADOConnection.Connected := False;
aADOConnection.Name := 'MSSQL';
aADOConnection.LoginPrompt := False;
aADOConnection.ConnectionString := sConnectionString;
aADOConnection.IsolationLevel := ilReadUncommitted;
aADOConnection.ConnectOptions := coAsyncConnect;
aADOConnection.CursorLocation := clUseClient;
aADOConnection.Mode := cmRead;
aADOConnection.KeepConnection := False;
aADOConnection.Connected := True;
Da das Formular der ursprünglichen Connection zukünftig keine Programmlogik oder ähnliches mehr enthalten soll und nur noch mit einem dahinter liegenden Objekt interagiren soll, habe ich eine Connection in einer gesonderten unit erzeugt und die Alte gelöscht. Ich habe beim Erzeugen exakt die selben Werte gesetzt wie es in der ursprünglichen Connection getan wurde.

Meine Quickreport Komponenten (oben beschrieben) werden jetzt auch während der instanzierung einer neuen Klasse erstellt und sind mit dem ursprünglichen Form nicht verknüpft oder ähnliches. Darin wird auch der eigentliche Druck ausgeführt:

Code:
qrdQuickrep.bQrdPromptParams := true;
if not FDesignerDialog.PrintReport(FReportInfos.reportPfad) then begin
   //Fehlermedung
end
solange die Connection auf dem ursprünglichen Form ist, funktioniert das. Wenn ich diese entferne kommt die Fehlermeldung:
Zitat:

Fehlende Connection oder ConnectionString.
Der Aufrufstack ist folgender:
Zitat:

main thread ($e04):
042c7f7e +0de REPORT.DLL Data.DB DatabaseError
043009a5 +0a1 REPORT.DLL Data.Win.ADODB TADOCommand.OpenConnection
043008bc +034 REPORT.DLL Data.Win.ADODB TADOCommand.SetConnectionFlag
04301565 +011 REPORT.DLL Data.Win.ADODB TCustomADODataSet.SetConnectionFlag
04301607 +09b REPORT.DLL Data.Win.ADODB InitializeConnection
04301925 +035 REPORT.DLL Data.Win.ADODB TCustomADODataSet.OpenCursor
042dcae1 +055 REPORT.DLL Data.DB TDataSet.SetActive
042dc65f +033 REPORT.DLL Data.DB TDataSet.Loaded
0430152b +01b REPORT.DLL Data.Win.ADODB TCustomADODataSet.Loaded
04111590 +024 REPORT.DLL System.Classes NotifyGlobalLoading
0473c92d +1a9 REPORT.DLL thsdComponentStorage 243 +52 TComponentLoader.ReadComponent
047414df +08f REPORT.DLL thsdRuntimeLoader 483 +7 TRuntimeComponentLoader.LoadDatamoduleFromStream
0474189c +038 REPORT.DLL thsdRuntimeLoader 611 +15 TRuntimeComponentLoader.LoadCompsAndDatamoduleFrom Stream
0479fc29 +119 REPORT.DLL QRDesign 484 +24 TQRDLoader.LoadCompsAndDatamoduleFromStream
0474192a +05a REPORT.DLL thsdRuntimeLoader 627 +4 TRuntimeComponentLoader.LoadCompsAndDatamoduleFrom File
0477ab85 +041 REPORT.DLL qrddlgs 570 +2 TReportPrinterDialog.LoadReport
0477a7d8 +048 REPORT.DLL qrddlgs 475 +4 TReportPrinterDialog.CreatePrintForm
0477ae32 +032 REPORT.DLL qrddlgs 639 +2 TReportPrinterDialog.PrintReport
04b01664 +0a0 REPORT.DLL UnitEinzelReport 98 +10 TFormEinzelReport.drucken
Ich weiß nicht, wie ich meine neue Connection mit dem Report verbinden soll... Ich habe auch im alten Code keine Stelle gefunden, wo so eine Verküpfung hergestellt werden würde... Ich bin an dem Problem schon knappe 6 Stunden dran. :(

Hat jemand eine Idee?

hoika 22. Okt 2020 13:11

AW: QuickReport mit Connection verknüpfen?
 
Hallo,
aADOConnection.Connected := True;

Das müsste die betreffende Zeile sein.
Ich denke, du öffnest die ADO-Connection zu früh oder zu spät.

Getox 22. Okt 2020 13:26

AW: QuickReport mit Connection verknüpfen?
 
Ich kann mir ja TAdoQuerys erstellen, diese Connection zuweisen und verwenden. Das funktioniert. Ich muss das nur irgendwie mit meinem Quickreport verbinden :/

hoika 22. Okt 2020 13:49

AW: QuickReport mit Connection verknüpfen?
 
Hallo,
was macht ReportDesignerDialog1BeforeOpenDataset.
Wird das vor dem Erzeugen der AdoQuery aufgerufen?

Ich denke, der Connection-String ist noch nicht gesetzt.

Hangel dich doch mit ein paar Breakpointen durch.

Getox 22. Okt 2020 14:08

AW: QuickReport mit Connection verknüpfen?
 
Darin wird ein Array mit Parametern geparst, die später im Report verarbeitert werden und diese werden in das übergebene Dataset geschrieben.

Ich habe diese Events mal komplett auskommentiert - Der Fehler tritt trotzdem auf. Ich habe auch direkt vor dem Funktionsaufruf (FDesignerDialog.PrintReport) wo der Fehler kommt eine adoQuery erzeugt, meine Connection zugewiesen, eine Abfrage gemacht und es funktioniert. Das bedeutet, dass ich eine funktionierende offene Connection habe und nur Quickreport nicht drauf zugreifen kann denke ich.

hoika 22. Okt 2020 14:20

AW: QuickReport mit Connection verknüpfen?
 
Hallo,
Zitat:

nur Quickreport nicht drauf zugreifen kann
Wie hattest Du denn vorher dem Quickreport deine ADOQuery "zugewiesen".

Bist Du so vorgegangen?
https://www.delphipower.xyz/ado_2/qu...hi_report.html
Vielleicht liegt ja noch eine ADOQuery auf dem QR-Formular.

Getox 22. Okt 2020 15:21

AW: QuickReport mit Connection verknüpfen?
 
Ich habe es gefunden... des Rätsels Lösung ist, dass die Connection in jeder einzelnen QR2 Datei abgelegt ist in Form von "FormReports.MSSQL"

haentschman 22. Okt 2020 15:34

AW: QuickReport mit Connection verknüpfen?
 
Hallöle...:P
Zitat:

dass die Connection in jeder einzelnen QR2 Datei abgelegt ist in Form von "FormReports.MSSQL"
Nennt mich altmodisch...Ich finde, auch wenn der Report die Möglichkeit bietet, daß der Report nur Datasets und/oder Variablen kennen sollte. Diese Datasets werden in der Logic zusammengebaut. Aus einer Quelle, die der Report nicht kennen darf/sollte. :warn: Den Report darf es nicht interresieren, ob die Daten aus einer Datenbank oder z.B. aus einer XML kommen.

Ich meine, die Aufgabe des Report´s ist, die Daten die er bekommt anzuzeigen. :thumb:

Getox 22. Okt 2020 15:40

AW: QuickReport mit Connection verknüpfen?
 
Zitat:

Zitat von haentschman (Beitrag 1475961)
Hallöle...:P
Zitat:

dass die Connection in jeder einzelnen QR2 Datei abgelegt ist in Form von "FormReports.MSSQL"
Nennt mich altmodisch...Ich finde, auch wenn der Report die Möglichkeit bietet, daß der Report nur Datasets und/oder Variablen kennen sollte. Diese Datasets werden in der Logic zusammengebaut. Aus einer Quelle, die der Report nicht kennen darf/sollte. :warn: Den Report darf es nicht interresieren, ob die Daten aus einer Datenbank oder z.B. aus einer XML kommen.

Ich meine, die Aufgabe des Report´s ist, die Daten die er bekommt anzuzeigen. :thumb:

Würde ich auch so sehen, aber ich muss leider mit historisch gewachsenem Code arbeiten und darf nicht alles auf den Kopf stellen. Ich muss großteils auch in einer Art und Weise Entwickeln, die meinem Verständnis von "schönem Code" in allen Punkten wiederspricht... aber so ist das halt. Man muss mit dem arbeiten, was man hat.

hoika 23. Okt 2020 06:30

AW: QuickReport mit Connection verknüpfen?
 
Hallo,
wiederspricht oder widerspricht :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz