Autor Beitrag
Bronstein
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 578
Erhaltene Danke: 1

WIN XP
Delphi 6 / Delphi 2006 / Delphi XE
BeitragVerfasst: Sa 15.11.08 15:04 
Hallo,

ich bekmme immer beim zweiten mal wo ich AdoQuery1 auf true setzte eine Exception:
CommandText liefert keine Ergebnismenge zurück

Woran kann das liegen, und warum funktioniert die erste Abfage, das einzige was sich ändert ist die ID
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
  for i:=0 to 4 do
  begin
    AdoQuery1.SQL.CLear;
    AdoQuery1.SQL.Add('SELECT Ü FROM TABELLE WHERE ID='+IntToStr(i));
    AdoQuery1.Active := true;

    while not AdoQuery1.Eof do
    begin
      [...] //mache was
      AdoQuery1.Next;
    end;

  end;

_________________
Es gibt keine dummen Fragen nur dumme Antworten!!!
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 15.11.08 15:09 
Setzt Du Active auch wieder auf false?
Bronstein Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 578
Erhaltene Danke: 1

WIN XP
Delphi 6 / Delphi 2006 / Delphi XE
BeitragVerfasst: Sa 15.11.08 15:38 
Ja, setzte ich auf active false. Ich sollte vielleicht noch dazu sagen, dass ich die AdoQuery-Komponente zur laufzeit erstellt habe

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
  AdoQuery1 := TAdoQuery.Create(nil);
  AdoQuery1.ConnectionString := tmpStr;
  for i:=0 to 4 do
  begin
    AdoQuery1.SQL.CLear;
    AdoQuery1.SQL.Add('SELECT * FROM TABELLE WHERE ID='+IntToStr(i));
    AdoQuery1.Active := true;

    while not AdoQuery1.Eof do
    begin
      [...] //mache was
      AdoQuery1.Next;
    end;
    AdoQuery1.Active :=false
  end;
  AdoQuery.free

_________________
Es gibt keine dummen Fragen nur dumme Antworten!!!
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Sa 15.11.08 15:42 
user profile iconBronstein hat folgendes geschrieben Zum zitierten Posting springen:
Ja, setzte ich auf active false. Ich sollte vielleicht noch dazu sagen, dass ich die AdoQuery-Komponente zur laufzeit erstellt habe

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
  AdoQuery1 := TAdoQuery.Create(nil);
  AdoQuery1.ConnectionString := tmpStr;
  for i:=0 to 4 do
  begin
    AdoQuery1.SQL.CLear;

Connecten wäre mal noch ne Idee ;)

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Bronstein Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 578
Erhaltene Danke: 1

WIN XP
Delphi 6 / Delphi 2006 / Delphi XE
BeitragVerfasst: Sa 15.11.08 16:06 
Macht es doch automatisch, wenn ich Active auf true setzte, ansonsten würde die abfrage ja auch nicht beim ersten schleifen durchgang funktionieren!

_________________
Es gibt keine dummen Fragen nur dumme Antworten!!!
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 15.11.08 16:29 
Spricht eigentlich etwas dagegen, die komplette Ergebnismenge in einem Rutsch zu ermitteln?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
  AdoQuery1 := TAdoQuery.Create(nil);
  try
    AdoQuery1.ConnectionString := tmpStr;
    AdoQuery1.SQL.Clear;
    AdoQuery1.SQL.Add('SELECT * FROM TABELLE WHERE ID BETWEEN 0 AND 4 ORDER BY ID');
    AdoQuery1.Active := true;
    while not AdoQuery1.Eof do
    begin
      [...] //mache was
      AdoQuery1.Next;
    end;
    AdoQuery1.Active :=false;
  finally
    AdoQuery1.free;
  end;
Bronstein Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 578
Erhaltene Danke: 1

WIN XP
Delphi 6 / Delphi 2006 / Delphi XE
BeitragVerfasst: Sa 15.11.08 17:24 
Hallo,
nein, das geht nicht. Ich habe hier nur eine vereinfachte SQL-Anweisung geschickt. Hier mal meine bisherige Funktion, wo ich den Fehler bekomme:
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:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
procedure TForm1.Get_SMD_Daten();
var
  AdoQuery: TAdoQuery;
  ini: TIniFile;
  tmpStr, SQL, LastSerNr: String;
  aDatum: TDate;
  SerNrPass, SerNrFail, SerNrPseudoFehler: Integer;
  tmpFloat: Extended;
  Anzahl, i, StringGridZeile: Integer;
begin
  //Spaltenüberschriften
  StringGridZeile := 0;
  StringGrid1.ColCount := 6;
  StringGrid1.Cells[0, StringGridZeile] := 'Linie';
  StringGrid1.Cells[1, StringGridZeile] := 'FPY';
  StringGrid1.Cells[2, StringGridZeile] := 'Gesamt';
  StringGrid1.Cells[3, StringGridZeile] := 'Pass';
  StringGrid1.Cells[4, StringGridZeile] := 'Fail';
  StringGrid1.Cells[5, StringGridZeile] := 'Pseudo';
  StringGrid1.ColWidths[0] := 80;
  StringGrid1.ColWidths[1] := 50;
  StringGrid1.ColWidths[2] := 50;
  StringGrid1.ColWidths[3] := 50;
  StringGrid1.ColWidths[4] := 50;
  StringGrid1.ColWidths[5] := 50;

  ini:=TIniFile.Create( ExtractFilePath(ParamStr(0)) + '\LiveFirma.ini');
  tmpStr := ini.ReadString('SMD''DBPfad''');
  AdoQuery := TAdoQuery.Create(nil);
  AdoQuery.ConnectionString := tmpStr;
  Anzahl := ini.ReadInteger('SMD''AnzahlLinien'0);

  for i := 1 to Anzahl do
  begin
    tmpStr := ini.ReadString('SMD''DBPfad''');
  AdoQuery := TAdoQuery.Create(nil);
  AdoQuery.ConnectionString := tmpStr;

    inc(StringGridZeile);
    AdoQuery.SQL.Clear;
    AdoQuery.SQL.Add('SELECT BN.BN, HISTORY.SERIAL_NUM, Min(HISTORY.RESULT) AS RESULT, EVENTS.EVENT_TYPE');
    AdoQuery.SQL.Add(' FROM (HISTORY INNER JOIN BN ON HISTORY.KEYBN = BN.KEYBN) LEFT JOIN EVENTS ON HISTORY.KEYHIST = EVENTS.KEYHIST');


    aDatum := StrToDate('08.10.2008');

    AdoQuery.SQL.Add(' WHERE ');
    tmpStr := FormatDateTime('YYYYMMDD', aDatum-1);
    SQL := SQL + '(HISTORY.TEST_BEGIN Like '+QuotedStr(tmpStr + ' 223%') + ' OR';
    SQL := SQL + ' HISTORY.TEST_BEGIN Like '+QuotedStr(tmpStr + ' 224%') + ' OR';
    SQL := SQL + ' HISTORY.TEST_BEGIN Like '+QuotedStr(tmpStr + ' 225%') + ' OR';
    SQL := SQL + ' HISTORY.TEST_BEGIN Like '+QuotedStr(tmpStr + ' 23%') + ' OR';
    tmpStr := FormatDateTime('YYYYMMDD', aDatum);
    SQL := SQL + ' HISTORY.TEST_BEGIN Like '+QuotedStr(tmpStr + ' 00%') + ' OR';
    SQL := SQL + ' HISTORY.TEST_BEGIN Like '+QuotedStr(tmpStr + ' 01%') + ' OR';
    SQL := SQL + ' HISTORY.TEST_BEGIN Like '+QuotedStr(tmpStr + ' 02%') + ' OR';
    SQL := SQL + ' HISTORY.TEST_BEGIN Like '+QuotedStr(tmpStr + ' 03%') + ' OR';
    SQL := SQL + ' HISTORY.TEST_BEGIN Like '+QuotedStr(tmpStr + ' 04%') + ' OR';
    SQL := SQL + ' HISTORY.TEST_BEGIN Like '+QuotedStr(tmpStr + ' 050%') + ' OR';
    SQL := SQL + ' HISTORY.TEST_BEGIN Like '+QuotedStr(tmpStr + ' 051%') + ' OR';
    SQL := SQL + ' HISTORY.TEST_BEGIN Like '+QuotedStr(tmpStr + ' 052%') + ')';

    AdoQuery.SQL.Add(SQL);
    AdoQuery.SQL.Add(' GROUP BY HISTORY.ATE_NUM, BN.BN, HISTORY.SERIAL_NUM, EVENTS.EVENT_TYPE');
    tmpStr := ini.ReadString('SMD''ATE_NUM_' + IntToStr(i), '0');
    AdoQuery.SQL.Add(' HAVING (HISTORY.ATE_NUM='+tmpStr+') AND BN.BN='+QuotedStr('75.464.880')+' AND (EVENTS.EVENT_TYPE<>'+QuotedStr('r')+' Or EVENTS.EVENT_TYPE Is Null)');
    AdoQuery.SQL.Add(' ORDER BY HISTORY.SERIAL_NUM, EVENTS.EVENT_TYPE;');

   // ShowMessage(adoquery.SQL.Text);
    AdoQuery.Active := true;
    SerNrPass := 0;
    SerNrFail := 0;
    SerNrPseudoFehler := 0;
    While not AdoQuery.Eof do
    begin
      if LastSerNr <> AdoQuery.FieldByName('SERIAL_NUM').AsString  then
      begin
        LastSerNr := AdoQuery.FieldByName('SERIAL_NUM').AsString;
        if (AdoQuery.FieldByName('RESULT').AsString = 'P'AND (AdoQuery.FieldByName('EVENT_TYPE').AsString = '' )  then
          inc(SerNrPass)
        else if AdoQuery.FieldByName('EVENT_TYPE').AsString = 'x' then
          inc(SerNrFail)
        else
          inc(SerNrPseudoFehler);
      end;
      AdoQuery.Next;
    end;
    tmpStr := ini.ReadString('SMD''Linie' + IntToStr(i), '');
    //FPY berrechnen
    tmpFloat := SerNrPass + SerNrFail + SerNrPseudoFehler;
    tmpFloat := 100 - ((SerNrFail + SerNrPseudoFehler) / (tmpFloat / 100));
    StringGrid1.Cells[0, StringGridZeile] := tmpStr;
    StringGrid1.Cells[1, StringGridZeile] := FloatToStr(RundeAufStellen(tmpFloat, 2));
    StringGrid1.Cells[2, StringGridZeile] := IntToStr(SerNrPass + SerNrFail + SerNrPseudoFehler);
    StringGrid1.Cells[3, StringGridZeile] := IntToStr(SerNrPass);
    StringGrid1.Cells[4, StringGridZeile] := IntToStr(SerNrFail);
    StringGrid1.Cells[5, StringGridZeile] := IntToStr(SerNrPseudoFehler);
    AdoQuery.Active := false;
    AdoQuery.Free;
    break;
  end;
  ini.Free;
end;

_________________
Es gibt keine dummen Fragen nur dumme Antworten!!!
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 15.11.08 17:36 
Wenn ich das richtig überblicke, gibst Du die Query innerhalb der Schleife frei, kein Wunder, dass das kracht.
Morpheus1572
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 157

Win XP
Delphi 7
BeitragVerfasst: Sa 15.11.08 17:47 
jo, das sehe ich genauso.

du gibst das ADOQuery frei, damit löscht du es und steht nicht mehr zur verfügung...

das kann nicht klappen.
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 15.11.08 17:50 
Nach etwas genauerer Betrachtung fällt mir auf, dass die Query einmal vor und einmal innerhalb der Schleife erzeugt wird. Und wozu das break am Schleifenende? Sry, ich habe Deine Logik noch nicht ganz verstanden.
Bronstein Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 578
Erhaltene Danke: 1

WIN XP
Delphi 6 / Delphi 2006 / Delphi XE
BeitragVerfasst: Sa 15.11.08 18:00 
Die Query Erstellung und Freigabe habe ich nur zu Testzwecken in die Schleife, bzgl. des Fehlers wie oben beschrieben.
Das Break habe ich drin, damit ich weiterprogrammieren kann, da ja der erste Schleifendurchlauf funktioniert und es erst beim Zweiten zu der Exception kommt.
Das ist ein ganz seltsamer Fehler, wenn es einmal geht und beim zweitenmal nicht. Trotz dasselbe gemacht wird!

_________________
Es gibt keine dummen Fragen nur dumme Antworten!!!
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 15.11.08 18:55 
Setz mal als erste Zeile in der Schleife die Variable SQL wieder auf leer.
Bronstein Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 578
Erhaltene Danke: 1

WIN XP
Delphi 6 / Delphi 2006 / Delphi XE
BeitragVerfasst: Sa 15.11.08 19:06 
Das wars. So ein blöder Fehler!
Danke

_________________
Es gibt keine dummen Fragen nur dumme Antworten!!!
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 15.11.08 19:09 
Das hätte ich auch nicht gesehen, wenn ich mir den Source nicht in Notepad kopiert und im Ganzen angesehen hätte ;)

[edit] Allerdings würde ich an Deiner Stelle parametrisierte Abfragen verwenden. [/edit]