QuickRep soll wenn Seite voll ist mit der 2 seite Anfangen
-
Hallo,
Ja im Titel steht schon die Frage .. ich schreibe halt in die QuickRep und wenn die Seite voll ist soll er die 2(usw.) machen solange bis keine Datensätze mehr kommen. ist das möglich ?? Wenn ja jemand ne idee ??
mfg
|23|
-
Hallo
das ist doch genau das was QuickRep macht

du erzeugst ein "Formulat" (QuickRep)
dieses Formular verbindest du mit einer Datenquelle (Query)
und startest das Drucken (Vorschau)MfG
Klaus
-
Hmm ja gut bei mir tut er das irgendwie ned

naja sprich bei den code den ich bekommen habe..
void __fastcall TfrmLADrucken::qrLADruckenNeedData(TObject *Sender, bool &MoreData) { AnsiString test; DateSeparator = '-'; ShortDateFormat = "m/d/yyyy"; test= AnsiString("SELECT name ,COUNT(termintreue) as Anz,COUNT(iif(termintreue=4 ,tbewertung.bw, NULL)) as tpp, ")+ AnsiString("COUNT(iif(termintreue=3 , tbewertung.bw , NULL )) as tp , COUNT(iif( termintreue=2 , tbewertung.bw , NULL )) as tm, ")+ AnsiString("COUNT(iif(termintreue=1 , tbewertung.bw , NULL )) as tmm , COUNT(iif( qualität=4 , qbewertung.bw , NULL )) as qpp, ")+ AnsiString("COUNT(iif(qualität=3 , qbewertung.bw , NULL )) as qp , COUNT(iif( qualität=2 , qbewertung.bw , NULL )) as qm,")+ AnsiString("COUNT(iif(qualität=1 , qbewertung.bw , NULL )) as qmm FROM ((bestellung INNER JOIN tbewertung ON bestellung.termintreue=tbewertung.bwnr) ")+ AnsiString("INNER JOIN qbewertung ON bestellung.qualität=qbewertung.bwnr) INNER JOIN Lieferant ON lieferant.liefererid=bestellung.liefererid ")+ AnsiString("WHERE Datbest >= #") + frmMain->dtpVonErfassung->Date.DateString() + AnsiString("# AND Datbest <= #") + frmMain->dtpBisErfassung->Date.DateString() + AnsiString("# AND offen=false GROUP BY name;"); if (frmMain->adoQry->Active) frmMain->adoQry->Close(); frmMain->adoQry->SQL->Clear(); frmMain->adoQry->SQL->Add(test); frmMain->adoQry->Open(); frmLADrucken->qrlblLALieferant->DataSet = frmMain->adoQry; frmLADrucken->qrlblLALieferant->DataField = "name"; frmLADrucken->qrlblLAAnz->DataSet = frmMain->adoQry; frmLADrucken->qrlblLAAnz->DataField = "Anz"; frmLADrucken->qrlblLAtpp->DataSet = frmMain->adoQry; frmLADrucken->qrlblLAtpp->DataField = "tpp"; frmLADrucken->qrlblLAtp->DataSet = frmMain->adoQry; frmLADrucken->qrlblLAtp->DataField = "tp"; frmLADrucken->qrlblLAtm->DataSet = frmMain->adoQry; frmLADrucken->qrlblLAtm->DataField = "tm"; frmLADrucken->qrlblLAtmm->DataSet = frmMain->adoQry; frmLADrucken->qrlblLAtmm->DataField = "tmm"; frmLADrucken->qrlblLAqpp->DataSet = frmMain->adoQry; frmLADrucken->qrlblLAqpp->DataField = "qpp"; frmLADrucken->qrlblLAqp->DataSet = frmMain->adoQry; frmLADrucken->qrlblLAqp->DataField = "qp"; frmLADrucken->qrlblLAqm->DataSet = frmMain->adoQry; frmLADrucken->qrlblLAqm->DataField = "qm"; frmLADrucken->qrlblLAqmm->DataSet = frmMain->adoQry; frmLADrucken->qrlblLAqmm->DataField = "qmm"; frmMain->adoQry->Close(); }und durch diesen Druckbutton wird er ausgelöst:
frmLADrucken->qrLADruckenNeedData(Sender,true); frmLADrucken->qrLADrucken->Preview();sicht jemand ein fehler ?
-
Hallo
auf die Gefahr, das ich mich (zum 1000en mal) wiederhole
Hmm ja gut bei mir tut er das irgendwie ned

ist keine Fehlerbeschreibung !
- Bitte erklaer uns doch was nicht geht
- beschreib uns was du schon unternommen hast den Fehler zu beseitigenWas ist eigentlich der Grund NeedData zu verwenden
MfG
Klaus
-
Was genau willst Du mit dem permanenten Öffnen und Schließen der Datenquelle in der OnNeedData() erreichen? OnNeedData() benötigt man nur in Aushnahmefällen, um zB Daten auszugeben, die man nicht direkt per SQL ermitteln kann (zB, wenn Daten aus 2 verschiedenen Datenbanken stammen).
-
void __fastcall TfrmLADrucken::qrLADruckenNeedData(TObject *Sender, bool &MoreData) { MoreData = true; AnsiString asSQLLA; DateSeparator = '-'; ShortDateFormat = "m/d/yyyy"; asSQLLA= AnsiString("SELECT name ,COUNT(termintreue) as Anz,COUNT(iif(termintreue=4 ,tbewertung.bw, NULL)) as tpp, ")+ AnsiString("COUNT(iif(termintreue=3 , tbewertung.bw , NULL )) as tp , COUNT(iif( termintreue=2 , tbewertung.bw , NULL )) as tm, ")+ AnsiString("COUNT(iif(termintreue=1 , tbewertung.bw , NULL )) as tmm , COUNT(iif( qualität=4 , qbewertung.bw , NULL )) as qpp, ")+ AnsiString("COUNT(iif(qualität=3 , qbewertung.bw , NULL )) as qp , COUNT(iif( qualität=2 , qbewertung.bw , NULL )) as qm,")+ AnsiString("COUNT(iif(qualität=1 , qbewertung.bw , NULL )) as qmm FROM ((bestellung INNER JOIN tbewertung ON bestellung.termintreue=tbewertung.bwnr) ")+ AnsiString("INNER JOIN qbewertung ON bestellung.qualität=qbewertung.bwnr) INNER JOIN Lieferant ON lieferant.liefererid=bestellung.liefererid ")+ AnsiString("WHERE Datbest >= #") + frmMain->dtpVonErfassung->Date.DateString() + AnsiString("# AND Datbest <= #") + frmMain->dtpBisErfassung->Date.DateString() + AnsiString("# AND offen=false GROUP BY name;"); frmMain->ADOQryLAD->SQL->Clear(); frmMain->ADOQryLAD->SQL->Add(asSQLLA); frmMain->ADOQryLAD->Open(); frmLADrucken->qrlblLALieferant->DataSet = frmMain->ADOQryLAD; frmLADrucken->qrlblLALieferant->DataField = "name"; frmLADrucken->qrlblLAAnz->DataSet = frmMain->ADOQryLAD; frmLADrucken->qrlblLAAnz->DataField = "Anz"; frmLADrucken->qrlblLAtpp->DataSet = frmMain->ADOQryLAD; frmLADrucken->qrlblLAtpp->DataField = "tpp"; frmLADrucken->qrlblLAtp->DataSet = frmMain->ADOQryLAD; frmLADrucken->qrlblLAtp->DataField = "tp"; frmLADrucken->qrlblLAtm->DataSet = frmMain->ADOQryLAD; frmLADrucken->qrlblLAtm->DataField = "tm"; frmLADrucken->qrlblLAtmm->DataSet = frmMain->ADOQryLAD; frmLADrucken->qrlblLAtmm->DataField = "tmm"; frmLADrucken->qrlblLAqpp->DataSet = frmMain->ADOQryLAD; frmLADrucken->qrlblLAqpp->DataField = "qpp"; frmLADrucken->qrlblLAqp->DataSet = frmMain->ADOQryLAD; frmLADrucken->qrlblLAqp->DataField = "qp"; frmLADrucken->qrlblLAqm->DataSet = frmMain->ADOQryLAD; frmLADrucken->qrlblLAqm->DataField = "qm"; frmLADrucken->qrlblLAqmm->DataSet = frmMain->ADOQryLAD; frmLADrucken->qrlblLAqmm->DataField = "qmm"; if(!frmMain->adoQry->Eof) { MoreData = false; frmMain->ADOQryLAD->Close(); } }Probolem wurde so gelöst. Das größe Problem an der ganze Sache war das der Programmierer der das geschrieben hat, die gleiche Query genommen hat die auch in einem Timer war und da der Time so eine kleine interval zeit hatte der er los ging gab es da kleien probleme.
Naja jetzt geht das ganze ganz gut. (bin froh wenn ich den kram Fertig hab und mich wieder meinen Projekten widmen kann.)
Aber danke für die Hilfe.

-
und anstatt es richtig zu machen, schreibst Du einen mehr oder weniger zweifelhaften Workaround?!?
-
Joe_M. schrieb:
und anstatt es richtig zu machen, schreibst Du einen mehr oder weniger zweifelhaften Workaround?!?

Warum sollte das ein Workaround ?? Gibts noch ne bessere Lösung ?
Wenn ja bitte einen Vorschlag.
jetzt bleibt nur noch dieses:
http://www.c-plusplus.net/forum/viewtopic.php?t=97826
Das ist aber nurnoch ne kleinigkeit die ned so Wichtig ist..
MfG
|23|
-
Noch mal die Frage, wozu steht da überhaupt etwas in OnNeedData()? Ich habe eher den Eindruck, dass ihr die Verwendung von QR nicht richtig verstanden habt.
Bei mir sieht der Aufruf eines Drucks in etwa so aus:
if (Form_PrintReport->PrintDialog1->Execute()) { int CurPrinterIndex; TPrinter* Prt = Printer(); CurPrinterIndex = Prt->PrinterIndex; Form_PrintReportSummary->qrepsum->PrinterSettings->PrinterIndex = CurPrinterIndex; Form_PrintReport->qrep->PrinterSettings->PrinterIndex = CurPrinterIndex; Form_PrintReport->qrep->Print(); }Wenn der Report korrekt mit der Datenquelle verbunden ist, sind keine weiteren Aktionen nötig. Es werden alle Datensätze der Datenquelle gedruckt.
In dem QR verwende ich nur in Ausnahmefällen spezifische Funktionen, wie OnNeedData().