Entwickler-Ecke

Datenbanken - SQL Datenbank-Abfrage funktioniert nicht mehr seit DELPHI 09


M. Raab - Mi 31.12.08 16:29
Titel: SQL Datenbank-Abfrage funktioniert nicht mehr seit DELPHI 09
Hallo NG,

ich habe ein altes Programm, welches ich unter Delphi 2009 zum Laufen bringen möchte. Nun bin ich auf ein Problem gestoßen, welches ich nicht lösen kann.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
    form1.Query2.SQL.Clear;
    form1.Query2.SQL.ADD('Select SUM(menge) as ladungsmenge,bez FROM "LADUNG.DBF" group by bez');
    form1.Query2.ExecSQL;
    form1.Query2.active:=true;

    setlength(LadungMenge,form1.Query2.RecordCount+1);
    setlength(LadungBez,form1.Query2.RecordCount+1);

    Ladung:=0;
    for lauf1:=1 to form1.Query2.RecordCount do
      begin
        LadungMenge[lauf1]:=form1.Query2.FieldByName('ladungsmenge').asfloat;
        LadungBez[lauf1]:=form1.Query2.FieldByName('bez').asstring;
        form1.Query2.Next;
        Ladung:=Ladung+LadungMenge[lauf1];
      end;


Ich bekomme ständig die Exception, das Feld ladungsmenge in Query2 wird nicht gefunden. Das Programm wird zwar compiliert, sobald aber die Abfrage gestartet wird, kommt die Exception.

Bis Delphi 2007 hatte ich keine Probleme.

Vielleicht kann mir jemand nen Tipp geben.


Gruss

Markus


Delete - Mi 31.12.08 16:48

DBF = DBase? Dann ist vermutlich auch noch die BDE im Spiel? Ob das unter D2009 noch klappt, wage ich fast zu bezweifeln. Ansonsten frage ich mich, wozu das ExecSQL gut sein soll, schließlich handelt es sich ja um eine Abfrage. Hast Du schon einmal versucht, per ShowMessage o.ä. das Abfrageergebnis einzusehen (z.B. RecordCount)?


mkinzler - Mi 31.12.08 18:24

Zitat:
DBF = DBase? Dann ist vermutlich auch noch die BDE im Spiel? Ob das unter D2009 noch klappt, wage ich fast zu bezweifeln.
Doch CodeGear hat sich wider besseres Wissens dazu entschieden, anstatt wie angekündigt diese abzulösen.
Wie Detlef schon schrieb ist es wenig wahrscheinlich, das der Code unter D2007 lief; der Fehler kamm vielleicht nicht, aber das was du willst hat er bestimmt nicht. den .ExecSQL dient zum Ausführen von DML-Statements, welche keine Datenmenge zurückgeben.
Für Select-Abfragen immer .Open verwenden.
Statt .Clear/.Add besser die Eigenschaft .Text verwenden


haentschman - Mi 31.12.08 20:15

Hallo...

das

Delphi-Quelltext
1:
form1.Query2.active:=true;                    

kannst du dir auch schenken. Durch Query2.Open wird automatisch die Query Active:= True gesetzt.

:wave:


M. Raab - Do 01.01.09 13:05

Hallo NG,

also ein SHOWMESSAGE liefert den gleichen Fehler: ladungsmenge nicht gefunden. Ich hatte das so gemacht:


Delphi-Quelltext
1:
showmessage(Query2['ladungsmenge'])                    



Nun gut, offenbar ist unter 2007 der Fehler im Ergebnis nie aufgefallen, aber das Programm lief formal korrekt. Ich muss also Teile umschreiben. Der Sinn dieses Codes ist, Summen der Ladungsmenge (Feld menge) je nach Ladungsart (Feld: bez) zu berechnen. Habt ihr da nen einfachen TIPP auf Lager ? Von Datenbankprogrammierung unter DELPHI habe ich sehr (!) wenig Ahnung - ich benutze das auch kaum.


Gruss


Markus


mkinzler - Fr 02.01.09 10:33

Versuch esd mal so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
    Query2.SQL.Text := 'Select SUM(menge) as ladungsmenge,bez FROM "LADUNG.DBF" group by bez';
    Query2.Open;
    Query2.Last;
    Query2.First;
    setlength(LadungMenge,Query2.RecordCount);
    setlength(LadungBez,Query2.RecordCount);

    Ladung:=0;
    lauf1 := 0;
    while not Query2.Eof() do
    begin
        LadungMenge[lauf1]:=Query2.FieldByName('ladungsmenge').asfloat;
        LadungBez[lauf1]:=Query2.FieldByName('bez').asstring;
        Ladung:=Ladung+LadungMenge[lauf1];
        inc( lauf1);
        Query2.Next;
    end;


M. Raab - Do 08.01.09 14:48

Hallo Markus


-->> NAMENSKOLLEGE :D :D :D :D :D :D :D


Meine Antwort hat leider etwas gedauert - aber ich bin zur Zeit krank und heute wieder zum Teil aufn Damm.

Ich hab das mal ausprobiert - der Fehler bleibt identisch. In Deinem Code ist aber ein Fehler: die beiden Klammern vom EOF() müssen weg: EOf ist korrekt.

Der Fehler kommt in Zeile 12 - obiger Programmcode.
Jetzt bräuchte ich noch ne gute Idee !!!!!


Vielen Dank und Gruss



Gruss


Markus


M. Raab - Do 08.01.09 15:29

Hallo NG,


ich habe die Lösung gefunden - ist IRRE !!! :P :P :P :P


Das Problem ist die Länge des Namens:


LADUNGSMENGE ist zu lange !!

Man nehme einfach

LADUNGSMEN --- dann klappt es.


Ich habe das raus gefunden, als ich mir mal die _QSQL000.DBF (also die QUERY2) Datei angesehen habe. Ich habe das Programm abgebrochen und dann die Datei geöffnet. Offenbar hat sich da was von 2007 auf die Version 2009 verändert oder 2007 hat es einfach ignoriert.

Gruss


Markus