Fastreport aus einer XML-Datei



  • Hallo zusammen

    Kann ich aus einer XML-Datei ein Fastreport erstellen? Falls ja wie geht das.

    Gruss Renato



  • Details?



  • Wie soll ich das nur erklären. Ich versuchs einfach mal.

    Ich habe eine XML-Datei mit Personen und Adressen. Diese Daten möchte ich nun mit Hilfe von Fastreport Drucken. Ich kenne Fastreport im Zusammenhang mit Datenbanken. Dort kann ich die Ausgabe einer Query ganz einfach gestalten und später ausdrucken. Dies möchte ich nun mit meiner XML-Datei ebenfalls machen.

    Ich habe im Internet gesucht aber nichts brauchbares gefunden. Daher nun meine Frage ob dies überhaupt geht.

    Gruss Renato



  • Klar geht das, du wirst allerdings etwas programmieren müssen, um die FastReports mit den entsprechenden Daten zu versorgen.
    Ich kenne mich mit FastReports nicht aus, aber es wird ähnlich wie die QuickReports funktionieren.

    Bei einer tabellarischen Auflistung besteht ein Report im Grunde aus zwei Bändern:

    1. Header-Band
      Hier stehen z.B. die Überschriften für die Tabelle
    2. Detail Band
      Hier stehen die Informationen eines einzelnen Datensatzes. Dieses Band wird für jeden Datensatz wiederholt, bei den QuickReports passiert das vor dem Behandeln des aktuellen Datensatzes und wird über Callback gelöst. Das sieht prinzipiell so aus:
    void __fastcall TMyForm::OnbeforePrint( TObject* Sender )
    {
       // ersten Datensatz bestimmen bzw. Index zurücksetzen
    }
    
    void __fastcall TMyForm::OnNeedData( TObject* Sender, bool& NeedData )
    {
       // prüfen, ob alle Datensätze ausgegeben wurden
       // Kann über Indexüberprüfung erledigt werden
       NeedData = ...
    }
    
    void __fastcall TMyForm::OnBeforePrintBand( TObject* Sender, bool& PrintBand )
    {
       // PrintbBnd kann ignoriert werden
       // aber hier musst du die Daten des aktuellen Datensatzes den
       // Ausgabeelementen des Detailbandes zuweisen
       LabelName->Caption   = ...
       LabelAddres->Caption = ...
    }
    
    void __fastcall TMyForm::OnAfterPrintBand( TObject* Sender )
    {
       // Datensatz wurde ausgegeben, zum nächsten Datensatz springen
    }
    

    Das kann man ganz gut lösen, indem man die Daten der XML Datei zunächst in einen std::vector liest und diesen vector dem Reportformular übergibt. Das Formular kann einen Index führen, der den aktuellen Datensatz identifiziert bzw. ob alle Datensätze ausgegeben wurden.



  • Bei FastReport.NET geht dies über Einbinden als "xml database", s.a. Connection to a database within the report (s. screenshot "Connection").
    Schau mal, ob es dies auch beim VCL basierten FastReports gibt.

    Evtl. hilft dir sonst Using an XML Document as the Source for a Provider.



  • Hallo zusammen

    Im Manuel von Fastreport hat es ein Beispiel für eine StringList. Dies dient mir mehr. Denn ich möchte eine StringGrid ausdrucken. Ich werde mal das Beispiel anschauen und versuchen zu reproduzieren.

    Herzlichen Dank für die schnelle Hilfe.

    Gruss Renato



  • Ciao DocShoe

    Ich komme nicht mehr weiter. Ich habe versucht deine Lösung um zusetzen. Gelingt mir aber nicht.

    Wie komme ich zu diesen Ereignissen wie etwa "OnBeforePrintBand"? Wenn ich den Report öffne, dann hat es jeweils Taps mit event. Aber wenn ich versuche diese anzuklicke geschieht nichts.

    Irgendwie trete ich an Ort.

    Gruss Renato



  • Naja, du musst deinen Report auch selbst zusammenbauen (entsprechende Bänder auf dem Report). Für jedes Band gibt es die entsprechenden Events.

    Edit:
    Zumindest für die QuickReports. Dass es sowas für die FastReports gibt ist nur meine Vermutung.



  • Ich habe es nun mit der Klasse TPrinter gelöst. Aber ich bin mir nicht sicher, ob dies eine gute Lösung ist. Auf jeden Fall funktioniert es.

    Gruss Renato


Log in to reply