QReport manuell füllen



  • Hallo,

    wenn du mir damit sagen willst das ich erstmal die Grundlagen lernen soll
    dann mach ich das gerne. Die Grundlagen von C++ kenn ich aber schon. Mir fehlen
    die Grundlagen vom QReport das kann ich auch ganz offen zugeben. Mir ist zwar
    klar wie ich den QReport von einer DB füllen lassen kann (dafür gibt es ja
    ein Beispiel) aber wie das eben manuell geht weiß ich nicht und ich find auch
    nichts darüber bis auf eben das Beispiel das bei mir leider nicht geht.

    Leider find ich in der Borland Hilfe nichts was mich weiterbringt. Deshalb
    frag ich hier nach.



  • Bsp. in 5 min zusammengeschossen, gleich mit 4 Werten(DS) je Zeile (wie in Frage gestern).

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        m_nCounter=0;
        QuickRep1->Preview();
    }
    
    void __fastcall TForm1::QRBand1BeforePrint(TQRCustomBand *Sender,
          bool &PrintBand)
    {
       m_nCounter = m_nCounter + 1;
       AnsiString asCounter = m_nCounter;
       ZeilenNummer->Caption= "Zeile " + asCounter;
    
       if (!ADOQuery1->Eof) {
          QRLabel1->Caption=ADOQuery1->FieldByName("auftrag")->AsString;
          ADOQuery1->Next();
       }
       else 
          QRLabel1->Caption="EOF";
    
       if (!ADOQuery1->Eof) {
          QRLabel2->Caption=ADOQuery1->FieldByName("AUFTRAG")->AsString;
          ADOQuery1->Next();
       }
       else
          QRLabel2->Caption="EOF";
    
       if (!ADOQuery1->Eof) {
          QRLabel3->Caption=ADOQuery1->FieldByName("AUFTRAG")->AsString;
          ADOQuery1->Next();
       }
       else
          QRLabel3->Caption="EOF";
    
       if (!ADOQuery1->Eof) {
          QRLabel4->Caption=ADOQuery1->FieldByName("AUFTRAG")->AsString;
       }
       else 
          QRLabel4->Caption="EOF";
    }
    

    Deklaration
    int m_nCounter; in unit1.h

    Die eigentliche Frage ist, hilft Dir das weiter?
    Jetzt hast Du gesehen, wie ich das schnell und ohne Nachdenken gemacht habe.

    Das ist eine simple Lösung, keine schöne, keine intelligente!



  • Hallo!

    Danke für deine Antwort. Leider hilft mir das nicht wirklich weiter.
    Also was mir klar ist:
    - wie man einen QReport mit Daten aus einer Datenbank füllt
    - wie man Labels eines QReports mit Daten vollpackt

    Das einzigste wo es klemmt ist dem QReport zu sagen, dass nun eine
    neue Zeile kommen soll. Ich nehme an der QReport wird dann wohl die
    aktuelle Zeile fixieren und daher kann man dann wieder auf Label1 zugreifen.

    Es hängt bei mir wirklich nur an der einen Zeile
    QReport->NextDataLine() oder was auch immer.



  • Bau das doch mal auf fixe Werte um!

    Nimm OnNeedData zur Abfrage, ob weitere Daten (=Zeile !!!!) benötigt werden.
    Zähle Deine Werte in BeforePrint hoch.

    Und Du wirst sehen, es funktioniert einwandfrei.

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        m_nCounter=0;
        m_nCounter2=0;
        QuickRep1->Preview();
    }
    
    void __fastcall TForm1::QRBand1BeforePrint(TQRCustomBand *Sender,
          bool &PrintBand)
    {
       m_nCounter = m_nCounter + 1;
       AnsiString asCounter = m_nCounter;
       ZeilenNummer->Caption= "Zeile " + asCounter;
    
       QRLabel1->Caption=m_nCounter;
       m_nCounter2 = m_nCounter2 + 1;
    
       QRLabel2->Caption=m_nCounter;
       m_nCounter2 = m_nCounter2 + 1;
    
       QRLabel3->Caption=m_nCounter;
       m_nCounter2 = m_nCounter2 + 1;
    
    }
    
    //und in OnNeedData
    
    if (m_nCounter2=250)
       MoreData=false;
    else
       MoreData=true;
    

    Wo also liegt Dein Problem?
    Die Lösung liegt direkt vor Deinen Augen. 🕶



  • Danke für deine Hilfe aber bei mir klappt das einfach nicht. Da muss irgendwas
    anderes nicht stimmen. Ich hab auch versucht deine Beispiele umzuwandeln oder
    das andere Beispiel das neulich gepostet wurde.

    Auf der Form:
    - TButton (Button1)
    - TQReport (QuickRep1) darauf TQRBand (QRBand1) darauf TQRLabel (QRLabel1)

    in der Form als private deklariert:

    unsigned int iRow;
    

    OnNeedData:

    void __fastcall TForm1::QuickRep1NeedData(TObject *Sender, bool &MoreData)
    {
        QRLabel1->Caption = "test " + IntToStr(iRow);
        iRow++;
        MoreData = iRow < 5;
    }
    

    Button1

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        iRow = 1;
        QuickRep1->Preview();
    }
    

    normal müsste nun 4 mal "test " und die Nummer dastehen. Bei mir
    kommt aber nur Test 1
    NeedData wird laut Debugger 4 mal aufgerufen das passt also. Durch spielerei
    mit verschiedenen Bändern hab ich es auch schon (leider nicht reproduzierbar)
    geschafft bis zu 3 Zeilen darzustellen. Das war mit einem ChildBand.

    Also irgendwie funktioniert bei mir der QReport nicht so wirklich...



  • void __fastcall TForm1::QuickRep1NeedData(TObject *Sender, bool &MoreData)
    {
    QRLabel1->Caption = "test " + IntToStr(iRow);
    iRow++;
    MoreData = iRow < 5;
    }

    Weisst du überhaupt für was MoreData zuständig ist?

    MoreData heißt "mehr Daten" und ist ein bool Variable mit der du der Methode mitteilst ob noch Daten(Zeilen) kommen,
    also es kommen noch Zeilen dann JA (true) und wenn nicht NEIN (false) übergeben.



  • und was mach ich mit dieser Zeile?

    MoreData = iRow < 5;
    

    ich schaue ob iRow kleiner 5 ist (true) oder größer gleich 5 (false)

    somit gibt es mehr Daten wenn iRow kleiner als 5 ist und sonst nicht.
    Ist doch alles richtig oder? Ich hab schon verstanden was ich gemacht
    hab aber nciht warum die anderen geposteten Beispiele bei euch funktionieren
    und bei mir nicht.

    Muss man vom QReport noch irgendwelche Updates einspielen? Ich verwende die
    Version die bei BCB6 dabei ist. Die BCB6 Updates (v4 + Linker) hab ich gemacht.



  • hast du QRBand1->BandType = rbDetail; eingestellt?
    falls nicht mach das mal



  • void __fastcall TForm1::QuickRep1NeedData(TObject *Sender, bool &MoreData) 
    { 
        QRLabel1->Caption = "test " + IntToStr(iRow); 
        iRow++; 
        MoreData = iRow < 5; 
    }
    

    Ist dir ist bewusst, das er so auch kein "test 4" anzeigen kann ?



  • Danke! Es lag am BandType 🙂


Anmelden zum Antworten