Hallo zusammen,
ich komme einfach nichtmehr weiter. Im unten dargestellten Code habe ich nun schon den ganzen Tag mit EAcessViolations/Zugriffsverletzungen zu tun. Immer an einer Stelle, an der die Q_AufTabFind geöffnet wird, oder wie jetzt momentan bei der Zuweisung eines Parameters. Heute morgen hatte ich dieses Problem durch einfaches Entfernen der Komponente und Neuerstellen gelöst. Als ich dann aber die zweite Query in den Text eingebunden hab, gings wieder los. Diese Art von Problem habe ich schon öfters gehabt und bis jetzt immer mehr durch Zufall durch silly Codekombinationen zur Auflösung des Querybezeichners hingebogen. Aber nun weiss ich nichtmehr weiter. Um Hilfe wäre ich so dankbar wie noch nie.
Ob die zweite Query innen später auch schief läuft weiss ich nicht, da ich garnicht soweit zum testen komme. Das Problem taucht direkt beim ersten mal auf, da die Query eigentlich nru einmal verwendet wird. Um die Paramter zuzuweisen hab ich auch schon alles probiert (ParamValue, ParamByName, Paramters[x]). Auch bei den Typangaben in den Paramtern hab ich schon einiges durchprobiert was auch nur im entferntesten passen könnte.
EDIT:
Wenn ich die ganze Prozedur neu schreibe funktioniert es auch nicht. Wenn ich jedoch zu Testzwecken nur den Anfang stehen lasse, funktionierts. Bei hinzukopieren des Rests der Prozedur schlägt es schon wieder bei der ersten Paramterzuweisung fehl. ?!?
Okay, die Zugriffsverletzung tritt erst wieder auf, wenn ich in der Schleife mit FieldByName lesend auf da Ergebnis der Query zugreife. Aber wieder bei der ersten Paramterzuweisung.... vielleicht hier mal die Query:
SELECT "Kkey0", "Erf_Dat", "RechNr", "ATEXT", "Wert", "Paare", "Gespert",
"Sperrursache", "Pack"
FROM "Aufkopf", "Auftxt"
WHERE "PLZ_Part" = : par_PLZ AND "LFD_Part" = : par_LFD
AND "Erf_Dat" >= : par_BegDat AND "Kkey0" = "ATKEY"
ORDER BY "Kkey0"
So, jetzt nochmal:
So funktionierts:
Wenn die Zeile "SG_AufInf.Cells[0, nextRow] := IntToStr(nextRow);"
auskommentiert ist wird direkt wieder ne Zugriffsverletzung geworfen. Was vielleicht noch interessant ist, das in beiden Fällen im Debugfenster in der Liste der geladen Module als leztztes immer "Unknown_Modul_X" (X ist eine wechselnde Zahl) steht. Keine Ahnung was das zu bedeuten hat.
ich komme einfach nichtmehr weiter. Im unten dargestellten Code habe ich nun schon den ganzen Tag mit EAcessViolations/Zugriffsverletzungen zu tun. Immer an einer Stelle, an der die Q_AufTabFind geöffnet wird, oder wie jetzt momentan bei der Zuweisung eines Parameters. Heute morgen hatte ich dieses Problem durch einfaches Entfernen der Komponente und Neuerstellen gelöst. Als ich dann aber die zweite Query in den Text eingebunden hab, gings wieder los. Diese Art von Problem habe ich schon öfters gehabt und bis jetzt immer mehr durch Zufall durch silly Codekombinationen zur Auflösung des Querybezeichners hingebogen. Aber nun weiss ich nichtmehr weiter. Um Hilfe wäre ich so dankbar wie noch nie.
Code:
procedure fillAufInfGrid; VAR nextRow, custPLZ, custLFD : integer; begDat : integer; begin nextRow := 1; custPLZ := Kundennummer div 1000; custLFD := Kundennummer mod 1000; With F_AufInf do begin if F_AufInf.RG_BegDat.ItemIndex = 0 then begDat := DelphiDateToLongint(IncMonth(date, -12)) else begDat := DelphiDateToLongint(IncMonth(date, -6)); Q_AufTabFind.Parameters[0].Value := custPLZ; Q_AufTabFind.Parameters[1].Value := custLFD; Q_AufTabFind.Parameters.ParamByName('par_BegDat').Value := begDat; Q_AufTabFind.Open; while (not Q_AufTabFind.Eof) do begin SG_AufInf.Cells[0, nextRow] := Q_AufTabFind.FieldByName('Kkey0').AsString; SG_AufInf.Cells[1, nextRow] := FormatDateTime('dd.mm.yyyy', LongIntToDelphiDate(Q_AufTabFind.FieldByName('Erf_Dat').AsInteger)); SG_AufInf.Cells[2, nextRow] := Q_AufTabFind.FieldByName('RechNr').AsString; SG_AufInf.Cells[3, nextRow] := Q_AufTabFind.FieldByName('ATEXT').AsString; SG_AufInf.Cells[4, nextRow] := Q_AufTabFind.FieldByName('Paare').AsString; //Find Offene Paar Q_PaarOffenFind.Parameters.ParamByName('par_KopfNr').Value := Q_AufTabFind.FieldByName('Kkey0').AsInteger; Q_PaarOffenFind.Open; SG_AufInf.Cells[5, nextRow] := IntToStr(Q_PaarOffenFind.FieldByName('Offen').AsInteger); Q_PaarOffenFind.Close; SG_AufInf.Cells[6, nextRow] := Format('%m', [Q_AufTabFind.FieldByName('Wert').AsFloat]); if Q_AufTabFind.FieldByName('Pack').AsBoolean then SG_AufInf.Cells[7, nextRow] := 'Pack' else if (Q_AufTabFind.FieldByName('Gespert').AsBoolean) then begin case Q_AufTabFind.FieldByName('Sperrursache').AsInteger of 1 : SG_AufInf.Cells[7, nextRow] := 'GS'; 2 : SG_AufInf.Cells[7, nextRow] := 'EF'; 3 : SG_AufInf.Cells[7, nextRow] := 'VK'; 4 : SG_AufInf.Cells[7, nextRow] := 'Komp'; 5 : SG_AufInf.Cells[7, nextRow] := 'LT'; end; end else begin case Q_AufTabFind.FieldByName('Sperrursache').AsInteger of 6 : SG_AufInf.Cells[7, nextRow] := 'Limit'; 100 : SG_AufInf.Cells[7, nextRow] := 'Hauch'; 101 : SG_AufInf.Cells[7, nextRow] := 'Hueb'; end; end; nextRow := nextRow + 1; SG_AufInf.RowCount := SG_AufInf.RowCount + 1; Q_AufTabFind.Next; end; Q_AufTabFind.Close; end; if F_AufInf.SG_AufInf.RowCount > 2 then F_AufInf.SG_AufInf.RowCount := F_AufInf.SG_AufInf.RowCount - 1; F_AufInf.SG_AufInf.Row := F_AufInf.SG_AufInf.RowCount - 2; end;
EDIT:
Wenn ich die ganze Prozedur neu schreibe funktioniert es auch nicht. Wenn ich jedoch zu Testzwecken nur den Anfang stehen lasse, funktionierts. Bei hinzukopieren des Rests der Prozedur schlägt es schon wieder bei der ersten Paramterzuweisung fehl. ?!?
Code:
procedure fillAufInfGrid; VAR nextRow, custPLZ, custLFD, begDat : integer; begin nextRow := 1; custPLZ := Kundennummer div 1000; custLFD := Kundennummer mod 1000; With F_AufInf do begin if RG_BegDat.ItemIndex = 0 then begDat := DelphiDateToLongint(IncMonth(date, -12)) else begDat := DelphiDateToLongint(IncMonth(date, -6)); Q_AufAllFind.Parameters.ParamByName('par_PLZ').Value := custPLZ; Q_AufAllFind.Parameters.ParamByName('par_LFD').Value := custLFD; Q_AufAllFind.Parameters.ParamByName('par_BegDat').Value := begDat; Q_AufAllFind.Open; Q_AufAllFind.Close; end; end;
SELECT "Kkey0", "Erf_Dat", "RechNr", "ATEXT", "Wert", "Paare", "Gespert",
"Sperrursache", "Pack"
FROM "Aufkopf", "Auftxt"
WHERE "PLZ_Part" = : par_PLZ AND "LFD_Part" = : par_LFD
AND "Erf_Dat" >= : par_BegDat AND "Kkey0" = "ATKEY"
ORDER BY "Kkey0"
So, jetzt nochmal:
So funktionierts:
Code:
procedure fillAufInfGrid; VAR nextRow, custPLZ, custLFD, begDat : integer; begin nextRow := 1; custPLZ := Kundennummer div 1000; custLFD := Kundennummer mod 1000; With F_AufInf do begin if RG_BegDat.ItemIndex = 0 then begDat := DelphiDateToLongint(IncMonth(date, -12)) else begDat := DelphiDateToLongint(IncMonth(date, -6)); Q_AufAllFind.Parameters.ParamByName('par_PLZ').Value := custPLZ; Q_AufAllFind.Parameters.ParamByName('par_LFD').Value := custLFD; Q_AufAllFind.Parameters.ParamByName('par_BegDat').Value := begDat; Q_AufAllFind.Open; while (not Q_AufAllFind.Eof) do begin Inc(nextRow); SG_AufInf.Cells[0, nextRow] := IntToStr(nextRow); <------ Q_AufAllFind.Next; SG_AufInf.RowCount := SG_AufInf.RowCount + 1; end; Q_AufAllFind.Close; end; ShowMessage(IntToStr(nextRow)); end;
auskommentiert ist wird direkt wieder ne Zugriffsverletzung geworfen. Was vielleicht noch interessant ist, das in beiden Fällen im Debugfenster in der Liste der geladen Module als leztztes immer "Unknown_Modul_X" (X ist eine wechselnde Zahl) steht. Keine Ahnung was das zu bedeuten hat.
Comment