Entwickler-Ecke

Datenbanken - Abfrage liefert keine Wert zurück


Krischa - Di 16.06.09 10:44
Titel: Abfrage liefert keine Wert zurück
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.

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?


Delete - Di 16.06.09 11:00

Hast Du Dir das SQL mal ausgeben lassen?


Krischa - 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.


Delete - 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 - 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?


Delete - 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 - 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 - 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.