Benutzung Quickreport



  • Hallo

    Mit Platzhalter meine ich alle Elemente von Report, die ein Wert aus der Datenbank bekommen, also z.B. TQRDBText.
    Wenn du die Query zur Laufzeit änderst, mußt du eben danach die Verbindung wieder herstellen. Probier mal folgendes : Mach zur Entwurfszeit eine Abfrage ohne Bedingung. Dadurch bekommst du eine aktive Abfrage und du kannst die Verbindungen (Report->DataSet zu Query und Platzhalter zu Feldern und DataSet) zuweisen.
    Teste, ob es mit der fester Abfrage funktioniert (also so wie im Beispiel). Wenn es nicht geht, mußt du den Report noch mal überprüfen.

    Wenn es geht, Ändere die Abfrage zur Laufzeit. Wenn du weiterhin Reporte erstellen kannst, ist dein Problem gelöst. Wenn nicht, mußt du dieVerbindungen, die zur Entwurfszeit festgelegt hast, noch mal nach Query-Open() nach mal zuweisen.
    TQuery Query;
    Query->Open();
    ...
    TQuickReport->DataSet = Query;
    TQRDBText->DataSet = Query;
    TQRDBText->DataField = <Feldname>;

    ich hoffe das funktioniert.

    bis bald
    akari



  • Also es geht mit fester abfrage auch nich,er zeigt immer nur ersten datensatz an! Nicht mehr!

    Meine Labels zeigt er auch nicht!

    Kann mir nichtmal jemand sagen wie genau ein QR aufgebaut sein muss?

    Also mit bänder etc...!

    Will nur anzeigen aus einer Tabelle mit 5 verschiedenen Spalten!

    Drüber paar labels und vielleicht die Sys Koponenten noch!

    Mehr brauch ich garnich...!

    Danke!



  • Hallo

    da ich selber nicht mir QReport arbeite, kann ich nur sagen, schau dir das funktionierende Beispiel an und experimentiere ein bißchen damit, damit du die Komponenten verstehst.

    bis bald
    akari



  • Das hab ich ja schon...und eigentlich hab ichs auch verstanden!

    Hab sogar das beispiel genau nachgebaut...und es geht nicht! Hab jede Koponenten verwendet,überll selbe einstellungen!

    Hmm....was verwendest du denn eigentlich @ akari?



  • Hallo

    vielleicht findest du ja im Netz noch andere Beispiele, die klarer aufgebaut sind.
    Ich selber setze genau das selbe, d.h. aus einer Datenbank soll aus einem Template (Vorlage) ein Report erstellt werden. Dazu würde ich wahrscheinlich auch QReport nehmen, aber leider sollen meine Templates auch im Nachhinein vom Anwender änderbar sein. Und da müßte ich ja erst mal ein Editor für QReport schreiben..
    Ich habe mich erstmal für HTML und RTF-Dateien entschieden, in die ich meine eigenen Platzhalter (d.h. die Feldnamen) reinschreibe, um ein Template zu erstellen. Um den Report zu bekommen, ersetze ich einfach alle Platzhalter durch Werte aus einem Datensatz. Da man die Dateien direkt (d.h. im Klartext) bearbeiten kann, ist es relativ einfach und gut kontrollierbar.

    bis bald
    akari



  • Schau dir doch mal das Ereignis OnNeedData an.

    mySQLQuery1->Next();
    MoreData=!mySQLQuery1->Eof;
    


  • @ akari: kannst du mir vielleicht mal ein Beispiel von dir schicken? Würd mich interessieren ob das einfacher ist!

    @ norman: was ist mit dem moredata?



  • Hallo

    kannst du mir vielleicht mal ein Beispiel von dir schicken? Würd mich interessieren ob das einfacher ist!

    Nein, das bringt nichts. Ich habe das oben sehr vereinfacht ausgedrückt. Das Erstellen eines Reports ist bei mir nur ein Teil einer ganzen Datenbank-Umgebung und kann nicht seperat ausgeführt werden.
    Im Prinzip basiert es auf zwei Dingen :
    Zuerst die Platzhalter aus einer von meinem Programm angezeigten Liste von vorhandenen Feldern einen Platzhalter in einen externen Editor (z.b. Word) per Clipboard kopieren, um ein Template zu erstellen.
    Dann zum Erstellen des Reports Template-Datei kopieren, per fstream öffnen und mit den üblichen string-Methoden alle Platzhalter suchen und mit Daten aus Datenbank ersetzen, dann fertige Daten in Report-Datei speichern.

    Schau mal auf die Seite http://www.qusoft.com/. Das ist die Firma, die QReports entwickelt hat. Dort gibt es anscheinend weitere Downloads und Dokumentationen.
    Das Problem muß lösbar sein. Wie Kamill geschrieben hat, ist der Event TQuickRep->OnNeedData interessant.

    bis bald
    akari



  • Also MoreData hat sich erledigt...er zeigt mir trotzdem nur einen Datensatz an!
    Muss ich bei den QDBRTexten was spezielles einstellen?
    Bei dem Detailband?

    Oder spziellen Code?
    Danke!



  • @ norman: was ist mit dem moredata?

    Du wanderst durch dein Query (->Next()) bis EOF.
    Wenn EOF erreicht dann setzt du MoreData = false;
    ansonsten setzt du MoreData = true;



  • Muss ich bei den QDBRTexten was spezielles einstellen?

    Nein

    Bei dem Detailband?

    Nein

    Oder spziellen Code?

    void __fastcall TForm1::QuickRep1NeedData(TObject *Sender, bool &MoreData)
    {
    mySQLQuery1->Next();
    MoreData=!mySQLQuery1->Eof;
    }
    


  • bei mir funktioert der QReport mit Query wie folgt:

    - QuickReport auf Form
    - darauf 2 Bands (BandType: rbColumnHeader, rbDetail)
    - auf das "Spaltentitel"-Band die QRLabels
    - auf das Detail-Band die QRDBTexts
    - die QRDBText müssen mit einem DataSet und einem DataField verbunden werden:
    -> DataSet ist das Query
    -> DataField ist das Feld welches angezeigt werden soll z.B. Name

    soweit zu den Einstellungen des Quickreport

    beim Query die Abfrage erstellen und dann mit Open() starten, danach den Preview des Qucikreport

    Query->Close();
    Query->SQL->Clear();
    Query->SQL->Add("select * from tabelle");
    Query->Open();
    FormX->QuickRep->Preview();
    

    OnNeedData hab ich nicht verwendet/nicht gebraucht



  • Ich hab mal das mit Table gemacht...müsste ja auch gehen!

    Table1->next();
    MoreData =! Table1->Eof;
    

    er zeigt mir aber trotzdem immer nur einen Datensatz an!
    Wenn ich beende und wieder neu zeigt er mir dann einen anderen an....aber nie alle!
    Warum denn nur nicht?

    Bin echt am verzweifeln!



  • @Linnea: naja aber bei DataField kann ich ja nix eingeben wenn ich ein Query habe...und den select zur laufzeit erstelle!
    Da kommt ja "Keine SQL Anweisung"!

    oder hab ich was verpasst?



  • Kamill schrieb:

    oder hab ich was verpasst?

    Ja.



  • du MUSST bei DataField was eingeben und wenn nicht zur Entwurfszeit, dann zur Laufzeit

    QRDBText1->DataField = "Name";
    


  • Wow!
    @Linnea
    Also ich hab jetzt mal bei DataField ein Feld meiner Datenbank eingegben, und es geht wirklich 😃 🙂 🙂

    Aber bei jedem Buchstabe den ich eingegebn hab kam immer "Keine SQL Anweisung verfügbar...kann ich das irgendwie umgehen?

    @All: langsam sehen wir licht im tunnel! 🙂


  • Mod

    Hallo

    natuerlich kannst du das

    einfach deinem Query ein SQL-Statement mitgeben

    (SELECT * .....)
    MfG
    Klaus



  • Ja danke leute das funktioniert jetzt!

    Jetzt hab ich ein neues problem...ich schreibs einfach mal,wenn ihr meinung seit neuer thread...mach ich einen auf!

    Also ich meiner Datenbank eine neue Tabelle hinzugefügt...!
    Und wenn ich nun mein Programm starte, kommt Exception, das das Feld "Masterrechte" nicht indiziert ist!
    Es ist aber indiziert! (masterrechte ist in einer tabelle die es schon länger gibt!

    Und die form wo der Fehler verursacht wird hat auch garnix mit der neuen Tabelle zu tun...kann ich da jetzt irgendwas retten oder muss ich neue DB machen?


  • Mod

    Hallo

    schau doch mal mit dem Debuffer

    Was/Wer/Wie/Wo der Fehler liegt

    Wenn du nicht weiterkommst zeig uns den Codeabschnitt

    MfG
    Klaus


Anmelden zum Antworten