Announcement

Collapse
No announcement yet.

Zugriffsverletzung mit TADOQuery

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Zugriffsverletzung mit TADOQuery

    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.

    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;
    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. ?!?

    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;
    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:

    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;
    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.
    Zuletzt editiert von Archeotecher; 26.09.2008, 08:47. Reason: neue Ergebnisse

  • #2
    Hallo zusammen,

    es hat sich nun anscheinend herausgestellt, dass die uralt Prozedur DelphiDateToLongInt daran Schuld ist. Wenn ich diese Prozedur einfach auskommentiere läuft das Programm ohne Probleme. Selbst wenn ich der par_BegDat einen festen Wert zuweise und die Prozedur einfach aufgerufen wird, ohne, dass ich das Ergebnis benutze, kommt die Fehlermeldung. Somit kann ich zwar leider keinen Zusammenhang hierzwischen finden, aber hauptsache es geht jetzt.
    Torzdem Danke für den verbratenen Hirnschmalz aller User die das gelesen haben.

    Comment

    Working...
    X