![]() |
Array[..] of record mit FastReport in MasterDataBand ausgebe
Hallo,
ich arbeite nicht mit DataBases, stattdessen mit Listen of record
Delphi-Quellcode:
Nun will ich im FastReport jedes Datenfeld des Arrays in ein MasterDataBand (eine Zeile)
type
Tds = record a:string; b:string; c:string; end; .... ds : array[1..n] of Tds; ausgeben .... MasterData ds[i].a ds[i].b ds[i].c .... Wenn ich die Größen in das OnGetValue Event eintrage wird nur eine Zeile (der erste Datensatz) im Report angezeigt. Wie stelle ich das mit Script, frxUserDataSet und co. an? Vielen Dank für Hilfe E. B. |
Re: Array[..] of record mit FastReport in MasterDataBand aus
Mit deinem Record und deinem Array bildest du ja im Grunde nur ein Dataset nach.
Du bist allerdings recht unflexibel, da du keine Suchfunktion (Locate) hast. Löschen ist auch schwierig, denn es entsteht ja ein Loch und du musst alle restlichen Datensätze verschieben. Es gibt aber auch Memory-Datasets, die deinen Record und das Array komplett ablösen. Nachteil: dein Programm wird etwas "dicker" und das Einfügen von Daten etwas langsamer (im Millisekundenbereich, das spürt der User nicht) Vorteile: Problemlose Anbindung an FastReport Such- und Filtermöglichkeiten durch das Dataset Du kannst deine Daten problemlos in einem DBGrid anzeigen/editieren Exportmöglichkeiten für deine Daten In deiner Enterprise Version hast du ja das TClientDataset, was unter anderem ja auch ein Memory-Dataset ist. ![]() |
Re: Array[..] of record mit FastReport in MasterDataBand aus
Danke, danke,
ist so mit Records gewollt, Will ja nur Daten darstellen, nicht suchen und löschen. Databases kann und darf ich nicht benutzen, da meine Programme auf Rechnern, die dem Medizinproduktegesetz unterliegen, laufen. Daher darf keine weitere DataBaseEngine laufen und die bereits laufende darf ich nicht mitbenutzen. Daher Datensammnungen nur als Filesystem möglich, welches ich mittels separater Filesammlung im Ini-Format mache. Nun genug der Vorrede - werde Deinen Vorschlag nachher mal probieren und mich dann nochlam melden. Bis denne E. B. |
Re: Array[..] of record mit FastReport in MasterDataBand aus
Du musst im User-Dataset noch die Ereignisse 'OnCheckEof', 'OnFirst' und 'OnNext' (eventuell 'OnPrior') setzen.
Code:
Im OnGetValue beziehst Du dich dann einfach auf 'Array[Counter]'
OnCheckEof: Eof := (Counter = Array.Size-1)
OnFirst: Count := 0 OnNext: Count := Count + 1; |
Re: Array[..] of record mit FastReport in MasterDataBand aus
Vielen Dank Alzaimar,
Vielen Dank! Und genau dieser Code funktionierte bei mir nicht, deshalb habe ich angefangen zu fragen. Ich sende Dir mal meinen Code
Delphi-Quellcode:
Wer weiss... was ich da falsch gemacht habe.
...
//.............................................................................. procedure TF_EB_Tagebuch_Tabelle.frxUserDataSet1GetValue(const VarName: string; var Value: Variant); begin if VarName = 'Datum' then Value := StringGrid1.Cells[0, frxUserDataSet1.Tag] else if VarName = 'Zeit' then Value := StringGrid1.Cells[1, frxUserDataSet1.Tag] else if VarName = 'Typ' then Value := StringGrid1.Cells[2, frxUserDataSet1.Tag] else if VarName = 'Patient' then Value := StringGrid1.Cells[3, frxUserDataSet1.Tag] else if VarName = 'FehlerID' then Value := StringGrid1.Cells[4, frxUserDataSet1.Tag] else if VarName = 'Energie' then Value := StringGrid1.Cells[5, frxUserDataSet1.Tag] else if VarName = 'Fehler' then Value := StringGrid1.Cells[9, frxUserDataSet1.Tag] else if VarName = 'Loesung' then Value := StringGrid1.Cells[10, frxUserDataSet1.Tag] else if VarName = 'Wer' then Value := StringGrid1.Cells[6, frxUserDataSet1.Tag] else if VarName = 'SR' then Value := StringGrid1.Cells[7, frxUserDataSet1.Tag] else if VarName = 'TA' then Value := StringGrid1.Cells[8, frxUserDataSet1.Tag]; end; //.............................................................................. procedure TF_EB_Tagebuch_Tabelle.frxUserDataSet1First(Sender: TObject); begin frxUserDataSet1.Tag := 1; end; //.............................................................................. procedure TF_EB_Tagebuch_Tabelle.frxUserDataSet1Next(Sender: TObject); begin frxUserDataSet1.Tag := frxUserDataSet1.Tag + 1; end; //.............................................................................. procedure TF_EB_Tagebuch_Tabelle.frxUserDataSet1Prior(Sender: TObject); begin frxUserDataSet1.Tag := frxUserDataSet1.Tag - 1; end; //.............................................................................. procedure TF_EB_Tagebuch_Tabelle.frxUserDataSet1CheckEOF(Sender: TObject; var Eof: Boolean); begin eof := frxUserDataSet1.Tag > fmax end; //.............................................................................. ... Vielleicht fällt Dir / Euch da etwas auf (Die Lösung dieses Problems ist für viele meiner Programme von Bedeutung, ich bin gerade beim Umstieg auf RAD2007 und FastReport) Danke für Eure Hilfe E .B. |
Re: Array[..] of record mit FastReport in MasterDataBand aus
Liste der Anhänge anzeigen (Anzahl: 1)
Dann müsstest Du noch dem Masterband sagen, das es sich um dieses Userdataset kümmern muss und da kannst Du dann auch einstellen, ob er alle oder nur einen Record nehmen kann/soll. Doppelklick einfach auf das Dataset-Symbol rechts oben im Masterband-Titel. Dort schreibst Du '0' rein. Ach, warte mal. Ich bastle Dir ne Demo.
tick tack tick tack *bastel* tick tack *bastel* tick ta... *compilier*.... funzt. |
Re: Array[..] of record mit FastReport in MasterDataBand aus
Vielen Dank Alzaimar,
ich hatte gleich mehrere Fehler in meinem Programm 1. Beim Prüfen des Datenendes
Delphi-Quellcode:
2. Das aufrufen des Reports
//falsch
procedure TF_EB_Tagebuch_Tabelle.frxUserDataSet1CheckEOF(Sender: TObject; var Eof: Boolean); begin eof := frxUserDataSet1.Tag > fmax end; //richtig procedure TF_EB_Tagebuch_Tabelle.frxUserDataSet1CheckEOF(Sender: TObject; var Eof: Boolean); begin eof := (frxUserDataSet1.Tag = fmax); end;
Delphi-Quellcode:
2. Im FastReport Designer / Masterband
//falsch
procedure TF_EB_Tagebuch_Tabelle.B_DruckemClick(Sender: TObject); begin frxReport1.ShowReport(); end; //richtig procedure TF_EB_Tagebuch_Tabelle.B_DruckemClick(Sender: TObject); begin frxReport1.PrepareReport(); frxReport1.ShowPreparedReport; end; Im Fenster DataSet auswählen falsch:
Delphi-Quellcode:
richtig:
Anzahl der Datensätze=1
Delphi-Quellcode:
Er zeigt zwar noch nicht alle Datensätze an aber das bekomme ich nun raus.
Anzahl der Datensätze=0
Ich habe zwar noch nicht begriffen warum Anzahl der Datensätze=0 sein muß... Nochmals vielen Dank Alzaimar. Eine gute Anleitung für das Database-freie Arbeiten mit FastReport Grüße E. B. |
Re: Array[..] of record mit FastReport in MasterDataBand aus
Danke allerseits, besonders Alzaimar,
es funktioniert, Nachahmen empfohlen Grüße E. B. |
Re: Array[..] of record mit FastReport in MasterDataBand aus
Zitat:
Zitat:
Memory-Datasets sind einfach nur eine intelligente Art um tabellenartige Daten zu verpacken und über eine wohl definierte Schnittstelle (nämlich TDataset) zugänglich zu machen. Ich habe selbst schon öfters den Fall gehabt, dass ich mit einem Record begonnen habe zu programmieren, dann eine Klasse von TList abgeleitet, um viele Records zu halten. Und dann sollte nachträglich noch eine Druckfunktion hinzu. Meistens kam mir dann die Erleuchtung: "du Dackel, nimm doch ein Memorydataset". Also den ganzen Code umgebaut, aber ich hab's nie bereut. Es programmiert sich einfach viel leichter. |
Re: Array[..] of record mit FastReport in MasterDataBand aus
Danke für die ausführliche Empfehlung.
ich will ja immer dazulernen. Werde es mal probieren. Also nochmal Danke - es war ein prima Thread. Grüße E. B. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:38 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