Autor Beitrag
peppi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 65


delphi 7
BeitragVerfasst: Fr 14.03.03 15:00 
Hallo,

kurze Erläuterung meines Problems:

ich möchte ein Dokument drucken (angenommen Kundenrechnungen), für jeden Kunden soll anhand der Nummer allerdings ein extra Dokument bzw. Datei (PDF) gedruckt werden. Durch eine Query selektiere ich die gesamte Datenmenge (alle Kunden) und lasse sie im DBGrid anzeigen. Die erste Spalte ist die Kd.-Nr.

Nun würde ich gern (evtl. über eine Schleife) drucken. Sobald ich auf den Button "Print" drücke soll also das Grid nach Kd.-Nr. abgearbeitet werden und jeweils ein Dokument drucken. Problem: Ich hab KEINE Ahnung wie!!

Geht das über die Eigenschaft TDBGridColums.Items irgendwie??

Danke für jeden Tipp!!

LG Jana!
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Fr 14.03.03 16:07 
Nein, Du musst das direkt im Query machen. Am Anfang einfach ein Query1.First und dann kannst Du mit Query1.Next jeweils den nächsten Datensatz nehmen. Das Ganze dann in einer Schleife verpackt, in etwa so:
ausblenden Quelltext
1:
2:
3:
4:
5:
Query1.FetchAll;
for i:=0 to Query1.RecordCount do begin
     {Druck-Prozedur, einzelne Felder liste Du mit Query1.FieldByName('Feldname').AsString}
     Query1.Next;
     end;


Hoffe, das hilft Dir...
kiwicht
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1021

Win 7, MacOS
Delphi x, VBA, PHP, ...
BeitragVerfasst: Fr 14.03.03 16:53 
UGrohne hat folgendes geschrieben:

[code]
for i:=0 to Query1.RecordCount -1 do begin


muss es nicht -1 heissen? Bin mir nich sicher, hoffe also das ich dich jetzt nicht zu Unrecht verbessere... :roll:
peppi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 65


delphi 7
BeitragVerfasst: Mo 17.03.03 11:49 
Titel: Exception: EDatabaseError!
@UGrohne

Hmm .. haut irgendwie nich ganz hin. Ich stell mal die Anweisung für den Print-Button rein:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TForm1.BitBtn2Click(Sender: TObject);
var i:Integer;
begin
 if comboBox2.ItemIndex = 0 then
 begin
    Query1.FetchAll; 
    for i:=0 to Query1.RecordCount do begin
    ppReport1.Print;
    Query1.Next; 
    end;
 end
 else if
    comboBox2.ItemIndex = 1 then
 begin
    ppReport2.Print;
 end
 else if
    comboBox2.ItemIndex = 2 then
 begin
    ppReport3.Print;
 end
...


Ich weiß ... das mit den Reports iss etwas umständlich aber ich bin nu auch kein Delphi-Profi :lol:

So .. wie man sieht hab ich deinen Tipp erstmal nur beim ersten Report mit eingebaut. Wenn ich jetzt auf den Button klicke krieg ich die Fehlermeldung:

"Im Projekt ... ist eine Exception der Klasse EDatabaseError aufgetreten. Operation bei geschlossener Datenmenge nicht ausführbar". Ich hab's dann mit Query1.Open versucht aber das haut auch nich hin. Versteh den Fehler auch nich ganz. Wieso geschlossene Datenmenge?? Im Grid seh ich alles ... dann ist die Query doch aktiv???

Hmm .. hoffe du kannst mir da weiterhelfen.

LG inco
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Mo 17.03.03 11:58 
Also das Open solltest Du am Anfang schon machen,.

Dan hab ich einen kleinen logischen Fehler entdeckt: Wenn in der ComboBox2 nicht der erste Eintrag selektiert ist, wird ja die Schleife gar nicht durchlaufen, es sollte also in etwa so heißen (habs auch noch etwas lesbarer geschrieben):
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
Query1.Open;
Query1.FetchAll; 
for i:=0 to Query1.RecordCount-1 do begin 
    case ComboBox2.ItemIndex of
    0: ppReport1.Print; 
    1: ppReport2.Print; 
    2: ppReport3.Print;
    end; 
    Query1.Next; 
   end;


Wenn Du ne SQL-Anweisung in dem Query drinhast, dann dürfte das ohne Probleme funktionieren, was fürne Datenbank verwendest Du denn?
Gruß

P.S.: Den Einwand von kiwicht hab ich auch noch eingebaut, da hab ich wohl was vergessen *g*.
peppi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 65


delphi 7
BeitragVerfasst: Mo 17.03.03 14:35 
@ UGrohne

hey, danke erstmal für die super-schnelle Antwort. Ich verwende ne Sybase-Datenbank.

Bin auch schon auf's nächste Problem gestoßen :cry:

Leider wird die Query erst zur Laufzeit gefüllt, da je nach auswahl der ComboBox verschiedene Abfragen gestartet werden. Mit der jetzigen Anweisung von Dir krieg ich die Fehlermeldung: Keine SQL-Anweisung verfügbar. Das versteh ich allerdings nich ganz. Klar, in der Query ist tatsächlich keine Anweisung zur Entwicklung, aber wenn das Programm läuft und ich in der ComboBox eine Auwahl getroffen habe füllt sich ja auch das Grid, welches ebenfalls mit der Query verbunden ist. Dann ist doch aber ne Anweisung da??? *grübel* Warum klappt's dann nicht beim Report. Ich probier mal noch 'n bissel rum. Vielleicht fällt dir ja auch noch was dazu ein.

LG Jana
peppi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 65


delphi 7
BeitragVerfasst: Mo 17.03.03 15:16 
Sooo ... jetzt sind wir dem Ziel schon etwas näher. Ich erklär nochmal kurz was zu der Query, ich habe auf meiner Form zu jeder Auwahl der ComboBox ne zugehörige Query. Da ich damit allerdings Probleme bei einer Suchfunktion hatte hab ich das etwas geändert und gebe nun zur laufzeit den jeweiligen Text der Querys mit Sucheinschränkungen an eine weitere Query (die ist zur Eintwicklung leer). Das war anscheinend das Problem. Ich hab das jetzt folgendermaßen geschrieben:



ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.BitBtn2Click(Sender: TObject);
var i:Integer;
begin
 if comboBox2.ItemIndex = 0 then 
 begin
    AusgangsQuery.open;
    AusgangsQuery.FetchAll;
          for i:=0 to Ausgangsquery.RecordCount-1 do begin
          ppReport1.Print;
          end;
          AusgangsQuery.Next;
 end
 else if
    comboBox2.ItemIndex = 1 then 
 begin
    ppReport2.Print;
 end
...


So, aber das ist nicht so ganz was ich wollte. Jetzt kommt bei ButtonClick die Druckvorschau aber da sind schon wieder ALLE "Kunden" mit bei. Beim Druck wird auch nur EIN Dokument mit der ganzen Ergebnismenge gedruckt. Wenn ich die Druckvorschau schließe öffent sie sich gleich wieder (so oft wie Datensätze vorhanden sins.) Das wäre ja auch richtig .. aber es soll nich die ganze Datenmenge gedruckt werden!!
Luncustaf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 324

Win 2k
D7 Ent.
BeitragVerfasst: Mo 17.03.03 16:29 
sers

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TForm1.BitBtn2Click(Sender: TObject); 
var i:Integer; 
begin 
AusgangsQuery.open; 
AusgangsQuery.First; 
if comboBox2.ItemIndex = 0 then 
begin 
      while not AusgangsQuery.Eof do
      begin
          ppReport1.Print; 
          AusgangsQuery.Next; 
      end;
end 
else if 
    comboBox2.ItemIndex = 1 then 
begin 
    ppReport2.Print; 
end 
...



probiers mal so

gr€€tz
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Mo 17.03.03 17:45 
So, bin jetzt wieder zurück vom Campus.

Also, Du hast jetzt Deine SQL-Anweisung drin. Nimmst Du den QuickReport?
Wenn der die ganze Query nimmt, dann musste wohl oder übel immer eigene SQL-Anweisungen dafür schreiben. Dann brauchste dafür aber entweder 2 Queries oder Du speicherst irgendein eindeutiges Feld (Primary Key ) zwischen, um dann diese einzeln abzufragen.

Du musst dann die Schleife durchlaufen und z.B. in einem array of integer die Kundennummer speichern
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
var knr:array of integer;
begin
Query1.Open;
Query1.FetchAll;
SetLength(knr,Query1.RecordCount);
for i:=0 to Query1.RecordCount-1 do
     knr[i]:=Query1.FieldByName['KNR'].AsInteger;


Dann nimmste den Query und das Array und machst für jeden Kunden(Datensatz) eine SQL-Anweisung:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
for i:=0 to Length(knr)-1 do begin
     Query1.SQL.Text:='SELECT * FROM kunden WHERE KNR='+inttostr(knr[i]);
     Query1.Open
     ppReport1.Print;
     Query1.Close;
     end;

So, könnte das funktionieren, is aber net getestet, muss auch gleich wieder weg aufn Campus.

Gruß[/code]
peppi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 65


delphi 7
BeitragVerfasst: Mi 19.03.03 11:52 
@UGrohne

Sooo, da bin ich wieder. Vielleicht hätte ich gleich am Anfang sagen sollen das ich nicht den QuickReport verwende :?

Ich erstelle meine Reports mit dem ReportBuilder (falls dir das überhaupt was sagt) und da scheint das RecordCount nicht zu funktionieren. hab also nochmal ganz neu angefangen (natürlich in etwas abgespeckter Funktion :lol: ) Und das so wie du ganz am Angang schon sagtest geschrieben:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.Button1Click(Sender: TObject);
var i:Integer;
begin
query1.open;
query1.FetchALL;
   for i:=0 to Query1.RecordCount-1 do begin
     QuickRep1.print;
     end;
     Query1.Next;
   end;


Das scheint jetzt zu funktionieren *freu* ... aber ich weiß net wo das hin gedruckt wird. In der Hilfe steht an den "aktuelle ausgewählten" Drucker, aber da kommt nichts. Mit dem QuickReport kenn ich mich GAR net aus *schäm* ... Wenn ich da nun z.B. auf Druckvorschau klicke seh ich überhaupt nichts. Die Query läuft aber. naja ... iss ja eigentlich auch 'n anderes Thema :lol: Das mit dem Drucken geht denk ich mal so!!

Dank dir ganz herzlich!!!

Bis dann, Jana!!!


Zuletzt bearbeitet von peppi am Mi 19.03.03 11:54, insgesamt 1-mal bearbeitet