EAccessViolationエラーを解消するには?


naoto  2005-11-21 21:02:38  No: 18835

以下の関数を実行すると、2つ目のループの
0  :dbd.GetTLV('YEAR_TOTAL_1',0,tmpdbd);
のところでEAccessViolationエラーになってしまいます。

ループをどちらかひとつ消すとエラーが出ないのですが、
2つ書くと出てしまいます。

このソースの元ソース(若干変数が違うだけ)ではエラーが出ないので
原因がわかりません。

気になる点があったら教えてください。

ちなみにやっている内容はデータベースから取得した残高(1つ目ループ)
と、年度累計残高(2つ目ループ)をセットするというものです。

function TSupplierBSReferenceFrame.SetUpBalanceData(var dbd: THttpDBData): boolean;
var
    tmpdbd :THttpData;
    i,ii,idx,cnt :Integer;
    ttl,ttlfin:Int64;
    ItemList :TStringList;
begin
    // 初期処理
    ItemList := TStringList.Create;
    Try
        For i := 0 To m_TableInfo.RowCount - 1 Do Begin
            ItemList.Add(m_TableInfo.Data['SUPPLIER_CODE',i]);
        End;

        For i := 0 To 13 Do Begin
            tmpdbd := THttpData.Create;
            Try
                Case i Of
                    0 :dbd.GetTLV('NORMAL_BALANCE',0,tmpdbd);       // 当期残高の取得s
                    1 :dbd.GetTLV('PRE_TERM_BALANCE',0,tmpdbd);     // 前期残高の取得
                    2 :dbd.GetTLV('PRE_YEAR_BALANCE',0,tmpdbd);     // 前年同期残高
                    3 :dbd.GetTLV('PRE_YEAR2_BALANCE',0,tmpdbd);    // 前々年同期残高
                    Else Continue;
                End;
                If Not Assigned(tmpdbd) Then Continue;
                If Not GetTTLData(tmpdbd,cnt,ttl,ttlfin) Then Continue;

                For ii := 0 to cnt - 1 Do Begin
                    idx := SearchRowByItem(ItemList,tmpdbd.GetString('SUPPLIER_CODE',ii));
                    If idx = -1 Then Continue;
                    SetData(m_TableInfo,tmpdbd,idx,ii,i,ttl,ttlfin);
                End;
            Finally
                tmpdbd.Free;
            End;
        End;         
        For i := 0 To 12 Do Begin
            tmpdbd := THttpData.Create;
            Try
                Case i Of
                    0  :dbd.GetTLV('YEAR_TOTAL_1',0,tmpdbd);      // 前年累計
                    1  :dbd.GetTLV('YEAR_TOTAL_2',0,tmpdbd);      // 前々年累計
                    Else Continue;
                End;
                If Not Assigned(tmpdbd) Then Continue;

                If Not GetTTLData(tmpdbd,cnt,ttl,ttlfin) Then Continue;

                For ii := 0 to cnt - 1 Do Begin
                    idx := SearchRowByItem(ItemList,tmpdbd.GetString('SUPPLIER_CODE',ii));
                    If idx = -1 Then Continue;
                    SetFinalData(m_TableInfo,tmpdbd,idx,ii,i,ttl,ttlfin);
                End;
            Finally
                tmpdbd.Free;
            End;
        End;        
    Finally
        ItemList.Free;
    End;
    Result := True;

end;


naoto  2005-11-21 21:13:31  No: 18836

ちなみに1つ目のループの中の
idx := SearchRowByItem(ItemList,tmpdbd.GetString('SUPPLIER_CODE',ii));

の行を無くすとエラーは出ません


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加