Entwickler-Ecke

Datenbanken - String Variable mit Fastreport ausgeben


mira - So 05.08.12 08:50
Titel: String Variable mit Fastreport ausgeben
Guten Tag,

Ich hoffe wieder auf Hilfe....

In meinem Projekt werden aus einer Access-Datenbank Daten mit ADO-Komponeten ausgelesen.
Es werden alle z.B. Rechnungssummen addiert und als String-Variable in ein TEdit-Feld geschrieben.
Das heißt erst zur Laufzeit wird die Variable mit Inhalt gefüllt.
Wie ist es möglich diese Variable in Fastreport auszugeben.

Habe seit zwei Tagen viele Hilfen durchsucht, aber leider kein einfaches Beispiel gefunden.
In einem anderen Projekt habe ich mit frxDataset direkten Zugriff auf die Datenbank, da hat das reletiv einfach funktioniert.

Danke im Voraus

mira


bummi - So 05.08.12 09:00


Delphi-Quelltext
1:
2:
3:
4:
5:
          with Report.Variables.Add do
          begin
            Name := 'MeineVariable';
            Value := 'DerWert';
          end;


gegf. Value mit QutedStr

Falls Du bereits im Report Variablen definiert hast kannst Du deren Wert auch setzen.
Ich verwende in einer generischen Routine, welche verwendet wird Reports aus Listen von Querys, Definitionen, Callbacks, Variablen, dynamisch zu erstellen ... , Design findet im Programm zur Laufzeit statt.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
    for i := 0 to Report.Variables.Count - 1 do
    begin
      Report.Variables.Items[i].Value := QuotedStr('');
    end;
    if Assigned(Variables) then
      for i := 0 to Variables.Count - 1 do
      begin
        k := Report.Variables.IndexOf(Variables.Items[i].Name);
        if k > -1 then
          Report.Variables.Items[k].Value := Variables.Items[i].Value
        else
        begin
          with Report.Variables.Add do
          begin
            Name := Variables.Items[i].Name;
            Value := Variables.Items[i].Value;
          end;
        end;
      end;


    with Report.Variables.Add do
      begin
        Name := 'ReportFileName';
        Value := QuotedStr(FReportName);
      end;


mira - So 05.08.12 14:40

Erst mal Danke für so schnelle Reaktion.

Mein Report heißt: frxReport1
Name der Variablen soll Rechnungssumme sein.
Der Wert der Variablen im Programm ist gessumstr (Abkürzung für gesamtsummen-string)

Habe im Code folgendes eigetragen:


Delphi-Quelltext
1:
2:
3:
4:
5:
      with frxReport1.Variables.Add do
          begin
            Name := 'Rechnungssumme';
            Value := 'gessumstr';
          end;

Im Report kann ich aber die Variable Rechnungssumme nicht sehen.
Es kommt aber auch kein Fehler beim kompilieren.

Was tun?

Moderiert von user profile iconMartok: Delphi-Tags hinzugefügt


bummi - So 05.08.12 14:53

Rufst Du den Report mit rcDesign auf? Dann solltest Du die Variable unter Variablen sehen und einfügen können.
Wenn Du anders vorgehst, was ich vermute kann st Du dort anlegen und auf die Oberfläche ziehen, dann allerdings über


Delphi-Quelltext
1:
2:
3:
        k := Report.Variables.IndexOf('Rechnungssumme');
        if k > -1 then
          Report.Variables.Items[k].Value :=  QuotedStr(gessumstr);

verwenden ....


mira - So 05.08.12 15:10

Schon wieder großer Danke!!!

Den Report rufe ich in einer eigenen Procedure "Drucken" auf.


Delphi-Quelltext
1:
2:
frxReport1.PrepareReport();
frxReport1.ShowPreparedReport;


rcdesign... kenne ich nicht gibts da einen Hilfelink zur Anwendung?

Habe den Code wie angegeben geändert.
Die Variable in Report neu erstellt, Memofeld mit Variable verknüpft.

Die Variable wird tatsächlich gedruckt.... oh Wunder!!??

Die Verwendung der Variablen k in der if/then Funktion ist mir nicht klar.
Ich habe natürlich mehrere Variablen. Was muss ich da machen?

Moderiert von user profile iconMartok: Delphi-Tags hinzugefügt


bummi - So 05.08.12 16:05

k soll nur sicher stellen daß die Variable auf die Du zugreifen möchtest existiert.
Du kannst auch:

Delphi-Quelltext
1:
frxreport1.variables.Variables['Variablenname'].value := QuotedStr(Inhhalt);                    

verwenden ....


mira - So 05.08.12 16:20

Diese Änderung bring zur Laufzeit einen Fehler, Debugger-Exeption.
EVariantInvalidOpError....Ungültige Variantenoperation...


bummi - So 05.08.12 16:24

Es wird davon abhängen wie die Variable verwendet wird, lass' mal das QuotedStr weg ...


mira - So 05.08.12 16:49

Fehlermeldung bleibt Gleich


bummi - So 05.08.12 19:19

das kommt davon, wenn man ohne Delphi versucht es aus dem Gedächtnis zu machen, sorry ...

Delphi-Quelltext
1:
2:
3:
4:
5:
  frxreport1.LoadFromFile('C:\temp\test.fr3');
  frxreport1.Variables.Items[frxreport1.variables.IndexOf('Variablenname')].value := QuotedStr('Inhalt') ;
  //oder
  frxreport1.variables['Variablenname'] := QuotedStr('Inhalt') ;
  frxreport1.DesignReport;


Komponente frxDesigner auf das Form/Datenmodul legen ...


mira - Mo 06.08.12 13:40

Klappt beides nicht.

Ich habe jetzt die Variante realisiert mit der Variablenabfrage k.
Damit geht es. Ich wäre mit dem Ergebnis zufrieden.
Bitte nochmal um eine kleine Erläuterung zum Code:

k := frxReport1.Variables.IndexOf('Variablenname');
if k > -1 then frxReport1.Variables.Items[k].Value := QuotedStr(Variablenwert);


Lemmy - Mo 06.08.12 14:17

Hi,

mit der ersten Anweisung (k := frxReport1.Variables.IndexOf....) wird in der Liste der Variablen des Reports nach einer Variable namens "Variablenname" gesucht. Wird diese gefunden, wird der Index dieser Variable in der Liste zurück gegeben, wird nichts gefunden wird -1 zurückgegeben.

In der nächsten Anweisung wird dann k überprüft: Nur wenn k größer als -1 ist wird der Wert der Variable gesetzt, denn nur dann ist sie auch da...

SChau dir mal bei Gelegenheit die Hilfe bzw. Tutorials zu den Listen (TStringList, TObjectList) in Delphi an.

Grüße


mira - Mi 08.08.12 06:44

Ich möchte mich auf diesem Wege noch einmal für die sehr schnelle Problemlösung bedanken.
Es ist sehr Hilfreich jemanden zu kennen der sich Zeit nimmt, sogar am Sonntag Nachmittag.

Also ein großes Danke an das Team der Entwickler-Ecke.

Bis bald!

Michael