Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Array[..] of record mit FastReport in MasterDataBand ausgebe (https://www.delphipraxis.net/111711-array%5B-%5D-record-mit-fastreport-masterdataband-ausgebe.html)

EccoBravo 8. Apr 2008 08:17


Array[..] of record mit FastReport in MasterDataBand ausgebe
 
Hallo,

ich arbeite nicht mit DataBases, stattdessen mit Listen of record

Delphi-Quellcode:
type
    Tds = record
             a:string;
             b:string;
             c:string;
         end;
....

ds : array[1..n] of Tds;
Nun will ich im FastReport jedes Datenfeld des Arrays in ein MasterDataBand (eine Zeile)
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.

shmia 8. Apr 2008 10:03

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.
http://delphi.about.com/od/usedbvcl/...entdataset.htm

EccoBravo 8. Apr 2008 11:14

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.

alzaimar 8. Apr 2008 11:37

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:
OnCheckEof: Eof := (Counter = Array.Size-1)
OnFirst: Count := 0
OnNext: Count := Count + 1;
Im OnGetValue beziehst Du dich dann einfach auf 'Array[Counter]'

EccoBravo 8. Apr 2008 14:57

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:
...
//..............................................................................
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;
//..............................................................................
...
Wer weiss... was ich da falsch gemacht habe.

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.

alzaimar 8. Apr 2008 15:03

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.

EccoBravo 8. Apr 2008 15:27

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:
//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;
2. Das aufrufen des Reports
Delphi-Quellcode:
//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;
2. Im FastReport Designer / Masterband
Im Fenster DataSet auswählen
falsch:
Delphi-Quellcode:
Anzahl der Datensätze=1
richtig:
Delphi-Quellcode:
Anzahl der Datensätze=0
Er zeigt zwar noch nicht alle Datensätze an aber das bekomme ich nun raus.

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.

EccoBravo 8. Apr 2008 16:21

Re: Array[..] of record mit FastReport in MasterDataBand aus
 
Danke allerseits, besonders Alzaimar,
es funktioniert,
Nachahmen empfohlen

Grüße
E. B.

shmia 8. Apr 2008 16:25

Re: Array[..] of record mit FastReport in MasterDataBand aus
 
Zitat:

Zitat von EccoBravo
... Will ja nur Daten darstellen, nicht suchen und löschen.

Was nicht ist, kann ja noch werden. Und sei es nur zu Test- und Debugzwecken...
Zitat:

Zitat von EccoBravo
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.

Es handelt sich bei Memory-Datasets nicht um eine Datenbank oder Datenbankengine.
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.

EccoBravo 9. Apr 2008 10:23

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 23:18 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