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
Krischa hat folgendes geschrieben : |
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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!