Autor Beitrag
Krischa
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 118

Windows 7 64 Bit
Delphi 2007
BeitragVerfasst: Di 16.06.09 10:44 
Hi,
ich schreibe gerade ein Delphiprogramm und hänge an einer Datenbankabfrage. Ich lese aus einer Checklistbox die Rechnungsnummer aus und möchte dann den Pfand,Nettowarenwert,... brechnen. Da ich mehrere Rechnungen habe läuft alles in einer Schleife und die Ergebnisse werden für die spätere Verwendung in Stringlisten gespeichert.
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
query3.DatabaseName:=pfad1;
query3.SQL.Text:='SELECT MW0,MW1,MW2 FROM '+mws1+' WHERE MAND="'+mandant+'"';
query3.open;
nettoliste:=Tstringlist.Create;
pfandliste:=Tstringlist.Create;
mwsliste:=Tstringlist.Create;
ebliste:=Tstringlist.Create;
for i := 0 to checklistbox1.items.Count - 1 do
begin
  if checklistbox1.checked[i] then
  begin
     betrag:=0;
     netto:=0;
     mwsteuer:=0;
     pfand:=0;
     items:=tstringlist.create;
     ExtractStrings([','], [], PChar(checklistbox1.items[i]), Items);
     query2.SQL.Text:='SELECT * FROM '+abe1+' WHERE RENR="'+items[2]+'" AND ART IS NOT NULL';
     items.free;
     query2.open;
     while not query2.Eof do
     begin
       if (query2.FieldByName('AKZ').Value='W'OR (query2.FieldByName('AKZ').Value='C'then
       begin
          pfand:=pfand+query2.FieldByName('VP').Value;
       end
       else
       begin
          netto:=netto+query2.FieldByName('VP').Value;
       end;
       case query2.FieldByName('MWS').Value of
        0:
        begin
           mwsteuer:=mwsteuer+(query2.FieldByName('VP').value * query3.fieldbyname('MW0').Value / 100);
           betrag:=betrag + query2.FieldByName('VP').value + (query2.FieldByName('VP').value*query3.fieldbyname('MW0').Value/100);
         end;
         1:
         begin
         mwsteuer:=mwsteuer+(query2.FieldByName('VP').value*query3.fieldbyname('MW1').Value/100);
         betrag:=betrag + query2.FieldByName('VP').value + (query2.FieldByName('VP').value*query3.fieldbyname('MW1').Value/100);
         end;
         2:
         begin
         mwsteuer:=mwsteuer+(query2.FieldByName('VP').value*query3.fieldbyname('MW2').Value/100);
         betrag:=betrag + query2.FieldByName('VP').value + (query2.FieldByName('VP').value*query3.fieldbyname('MW2').Value/100);
         end;
       end;
       query2.Next;
     end;
     query2.First;
     query2.close;
     nettoliste.Add(floattostr(netto));
     pfandliste.Add(floattostr(pfand));
     mwsliste.Add(floattostr(mwsteuer));
     ebliste.Add(floattostr(betrag));
   end;
end;
query3.close;


Es gibt Probleme bei Query2. Die Abfrage liefert mir keine Datensätze zurück. Ich habe die Abfrage daraufhin 1:1 direkt an der Datenbank angewand und da gibt es Datensätze. Woran könnte das jetzt liegen das mir Delphi keine Datensätze bringt?


Zuletzt bearbeitet von Krischa am Di 16.06.09 11:36, insgesamt 1-mal bearbeitet
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 16.06.09 11:00 
Hast Du Dir das SQL mal ausgeben lassen?
Krischa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 118

Windows 7 64 Bit
Delphi 2007
BeitragVerfasst: Di 16.06.09 11:03 
Jo habe ich. Und auch query2.Databasename habe ich mir ausgeben lassen. Der passt auch

SELECT * FROM abe.DB WHERE RENR="003643/08/PS" AND ART IS NOT NULL

Das habe ich ja dann kopiert und direkt an der Datenbank die Abfrage gestartet. Da hat alles prima funktioniert.
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 16.06.09 11:14 
Und was passiert, wenn Du die Abfrage parametrisierst? Außerdem fällt mir auf, dass Du immer auf die 3. Zeile Deiner Stringlist zugreifst, ist das richtig so?
Krischa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 118

Windows 7 64 Bit
Delphi 2007
BeitragVerfasst: Di 16.06.09 11:18 
Wenn du Items[3] meinst ist das korrekt. Ich lese ich die Checklistbox zeilenweise aus und da steht mehr drin als nur dir Rechnungsnummer. Ich splitte immer die ganze Zeile in die Stringlist und das 3.te Element ist die Rechnungsnummer.


Parametrisiert habe ich auch aber selbes Ergebnis. Ich verstehe Delphi nicht mehr :(
Kann es sein das er ein Problem damit hat das ich mit einem anderen query gleichzeitig auf eine andere Datenbank zu greif?
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 16.06.09 11:52 
Ob es an den verschiedenen Datenbankverbindungen liegt kann ich Dir leider auch nicht ad hoc sagen, da ich das hier gerade nicht ausprobieren kann.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Di 16.06.09 12:21 
user profile iconKrischa hat folgendes geschrieben Zum zitierten Posting springen:
Die Abfrage liefert mir keine Datensätze zurück.

Woran merkst Du das? Geht er nicht in die Schleife? Ich habe schon erlebt, dass Abfrage-Ergebnisse mit nur einem Datensatz, trotzdem ein eof-Ergebnis haben. Es ist dann ja der letzte Datensatz und steht somit am eof.
Krischa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 118

Windows 7 64 Bit
Delphi 2007
BeitragVerfasst: Mi 17.06.09 08:00 
Zum einen merkt man das an der Schleife und zum anderen habe ich versucht ausserhalb der Schleife auf die Daten zu zugreifen was eine Exception zur Folge hatte die mir zeigt das er keine Datensätze hat.


EDIT: Problem erkannt. ExtractStrings([','], [], PChar(checklistbox1.items[i]), Items); muss eigentlich ExtractStrings([','], [' '], PChar(checklistbox1.items[i]), Items); sein da noch ein verstecktes Leerzeichen angehangen war :(. Blöde Messagebox sagt das einem aber nicht.