AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein QuickReport mit Connection verknüpfen?
Thema durchsuchen
Ansicht
Themen-Optionen

QuickReport mit Connection verknüpfen?

Ein Thema von Getox · begonnen am 22. Okt 2020 · letzter Beitrag vom 23. Okt 2020
Antwort Antwort
Getox

Registriert seit: 28. Dez 2012
155 Beiträge
 
Delphi XE3 Professional
 
#1

QuickReport mit Connection verknüpfen?

  Alt 22. Okt 2020, 13:14
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?
Ist ein Nilpferd ein Pferd, das nicht vorhanden ist?

Geändert von Getox (22. Okt 2020 um 13:16 Uhr)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: QuickReport mit Connection verknüpfen?

  Alt 22. Okt 2020, 14:11
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.
Heiko
  Mit Zitat antworten Zitat
Getox

Registriert seit: 28. Dez 2012
155 Beiträge
 
Delphi XE3 Professional
 
#3

AW: QuickReport mit Connection verknüpfen?

  Alt 22. Okt 2020, 14:26
Ich kann mir ja TAdoQuerys erstellen, diese Connection zuweisen und verwenden. Das funktioniert. Ich muss das nur irgendwie mit meinem Quickreport verbinden :/
Ist ein Nilpferd ein Pferd, das nicht vorhanden ist?
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: QuickReport mit Connection verknüpfen?

  Alt 22. Okt 2020, 14:49
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.
Heiko
  Mit Zitat antworten Zitat
Getox

Registriert seit: 28. Dez 2012
155 Beiträge
 
Delphi XE3 Professional
 
#5

AW: QuickReport mit Connection verknüpfen?

  Alt 22. Okt 2020, 15:08
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.
Ist ein Nilpferd ein Pferd, das nicht vorhanden ist?
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: QuickReport mit Connection verknüpfen?

  Alt 22. Okt 2020, 15:20
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.
Heiko

Geändert von hoika (22. Okt 2020 um 15:34 Uhr)
  Mit Zitat antworten Zitat
Getox

Registriert seit: 28. Dez 2012
155 Beiträge
 
Delphi XE3 Professional
 
#7

AW: QuickReport mit Connection verknüpfen?

  Alt 22. Okt 2020, 16:21
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"
Ist ein Nilpferd ein Pferd, das nicht vorhanden ist?
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#8

AW: QuickReport mit Connection verknüpfen?

  Alt 22. Okt 2020, 16:34
Hallöle...
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. 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.
  Mit Zitat antworten Zitat
Getox

Registriert seit: 28. Dez 2012
155 Beiträge
 
Delphi XE3 Professional
 
#9

AW: QuickReport mit Connection verknüpfen?

  Alt 22. Okt 2020, 16:40
Hallöle...
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. 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.
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.
Ist ein Nilpferd ein Pferd, das nicht vorhanden ist?
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: QuickReport mit Connection verknüpfen?

  Alt 23. Okt 2020, 07:30
Hallo,
wiederspricht oder widerspricht
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:55 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