Autor Beitrag
Rupert
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 47
Erhaltene Danke: 1

Netware, Linux, WIN A-Z, DOS
Delphi 2005- Delphi 2009
BeitragVerfasst: Do 23.05.13 17:32 
EAccessViolation bei ExecSQL
Verwende Absolute Database.

Ich finden den Fehler nicht, wahrscheinlich habe ich schon einen Tunnelblick ;)
Den SQL-Table habe ich schon umbenannt und dann neu erstellt.

Der Fehler tritt in Zeile 14 auf und ich habe keinen Schimmer, was ich hier falsch gemacht haben soll.

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:
  Data.ABSQuery1.open;
  with Data.ABSQuery1 do begin
  repeat
    Data.ABSQuery1.first;

    FName:=Data.Teilnehmer.FieldByName('Name').asstring;
    VName:=Data.Teilnehmer.FieldByName('Vorname').asstring;
    Gruppe:=Data.Teilnehmer.FieldByName('Gruppe').asstring;
    inc(Reczaehler,1);
    // Tabelle schließen und filtern berechnen
    if Fname<>'' then begin
        SQLString:='select * from Ergebnisse where extract (year from datum)='+inttostr(aktjahrwert)+' and Name='''+FName+''' AND Vorname='''+VName+''' AND Gruppe='''+Gruppe+'''order by PunkteNe desc';
      Data.ABSQuery1.SQL.Text:=SQLString;
      Data.ABSQuery1.ExecSQL;
      Data.ABSQuery1.Active:=true;

    // Punktesumme berechnen
      Data.ABSQuery1.first;
      DBGrid7.Refresh;
    // Nullsetzen aller Temporärwerte
      PktGes:=0;
      SumNetto:=0;
      PktSNe:=0;
      PktS5:=0;
      SumPunkte:=0;
      PunkteSchnitt:=0;
      PunkteGes:=0;
      PktGesNe:=0;
      PunkteS5Br:=0;
      PunkteS5N:=0;

      Anzahl_Ergebnisse:=Data.ABSQuery1.RecordCount;
      if Anzahl_Ergebnisse <> 0 then begin

        for i:=1 to Anzahl_Ergebnisse do begin
          PktGesNe:=PktGesNe+Data.ABSQuery1.FieldByName('PunkteNe').asinteger;
          PunkteGes:=PunkteGes+Data.ABSQuery1.FieldByName('PunkteBr').asinteger;

          Data.ABSQuery1.next;
        end;
      // Schnitt gesamt
        PktSNe:=int(PktGesNe/Anzahl_Ergebnisse*1000)/1000;
        PunkteSchnitt:=int(PunkteGes/Anzahl_Ergebnisse*1000)/1000;

        Data.ABSQuery1.first;
      // nur die besten 5 Ergebnisse
        if Anzahl_Ergebnisse >= 5 then zaehler:=5 else zaehler:=Anzahl_Ergebnisse;
        for i:=1 to zaehler do begin
          SumNetto:=SumNetto+Data.ABSQuery1.FieldByName('PunkteNe').asinteger;
          SumPunkte:=SumPunkte+Data.ABSQuery1.FieldByName('PunkteBr').asinteger;
          Data.ABSQuery1.next;
        end;
      //Schnitt der besten 5 Turniere
      // Gruppe A und Brutto
        PunkteS5Br:=int(SumPunkte*1000/zaehler)/1000;
        PunkteS5N:=int(SumNetto*1000/zaehler)/1000;

      // Punktesumme eintragen
        Data.ABSQuery1.first;
        for i:=1 to Anzahl_Ergebnisse do begin
          Data.ABSQuery1.edit;
          Data.ABSQuery1.FieldByName('SumTur').asinteger:=Anzahl_Ergebnisse;
          begin
            Data.ABSQuery1.FieldByName('SumBr').asinteger:=SumPunkte;
            Data.ABSQuery1.FieldByName('SumNe').asinteger:=SumNetto;
            Data.ABSQuery1.FieldByName('PktGes').asinteger:=PktGesNe;
            Data.ABSQuery1.FieldByName('PktS').asfloat:=PunkteSchnitt;
            Data.ABSQuery1.FieldByName('PktS5B').AsFloat:=PunkteS5Br;
            Data.ABSQuery1.FieldByName('PktS5').AsFloat:=PunkteS5N;
          end;
          if Anzahl_Ergebnisse >=5 then Data.ABSQuery1.FieldByName('Tur5').asinteger:=1
                                   else Data.ABSQuery1.FieldByName('Tur5').asinteger:=0;
          Data.ABSQuery1.post;
          Data.ABSQuery1.next;
        end;
      end//if anzahl der Ergebnisse
    end//of if Fname<>''
    Data.Teilnehmer.next;
  until Data.Teilnehmer.eof;
  end//with ABSQuery1

  Data.ABSQuery1.Active:=false;
  SQLString:='select * from Ergebnisse where extract (year from datum)='+inttostr(aktjahrwert)+' order by SumNe desc, PunkteNe desc';
  Data.ABSQuery1.SQL.Text:=SQLString;
  Data.ABSQuery1.ExecSQL;
  Data.ABSQuery1.Active:=true;
  DBGrid7.Refresh;
  Screen.Cursor:=crDefault;

_________________
Grüße Rupert
Lemmy
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 792
Erhaltene Danke: 49

Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
BeitragVerfasst: Do 23.05.13 17:35 
nur ne ganz wilde Vermutung: Hast Du schon mal .Open; anstelle von .Execute; verwendet? Execute verwendet man i.A. bei DDL oder AUfrufen die kein Ergebnis zurück liefern, open dagegen bei Select-Anweisungen.... Das Anschließende .ACtive; würde zumindest darauf hindeuten, das Du dir im übrigen auch sparen kannst...

Grüße
Rupert Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 47
Erhaltene Danke: 1

Netware, Linux, WIN A-Z, DOS
Delphi 2005- Delphi 2009
BeitragVerfasst: Fr 24.05.13 11:13 
Ich habe die Routine nun auf die Fehlererfassung "abgespeckt"

'select * from Ergebnisse where extract (year from datum)=2013 and Gruppe='A''
generell Fehlerfrei

1. Durchlauf:
'select * from Ergebnisse where extract (year from datum)=2013 and Gruppe='A' and Name='BUCHBERGER''
fehlerfrei
2. Durchlauf:
Exeption bei "Data.ABSQuery1.close"

Das ließ den Schluss zu, dass es sich nur mehr um das Feld Name handeln kann.

Die Lösung:
Änderen der Variable Name in FamName

Manchmal sind die Dinge plausibel - aber bis man es behirnt vergehen viele Stunden :idea:


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
  repeat
    Data.ABSQuery1.open;
    FName:=Data.Teilnehmer.FieldByName('Name').asstring;
    VName:=Data.Teilnehmer.FieldByName('Vorname').asstring;
    Group:=Data.Teilnehmer.FieldByName('Gruppe').asstring;
    inc(Reczaehler,1);
    Data.ABSQuery1.close;
    Data.ABSQuery1.RequestLive:=true;
    Data.ABSQuery1.SQL.Clear;

    if Fname<>'' then begin
      SQLString:='select * from Ergebnisse where extract (year from datum)='+inttostr(aktjahrwert)+' and Gruppe='''+Group+''' and Name='''+FName+'''';
      Data.ABSQuery1.SQL.Add(SQLString);
      Data.ABSQuery1.open;
    end//of if Fname<>''
    Data.Teilnehmer.next;
  until Data.Teilnehmer.eof;

_________________
Grüße Rupert