以下の関数を実行すると、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;
ちなみに1つ目のループの中の
idx := SearchRowByItem(ItemList,tmpdbd.GetString('SUPPLIER_CODE',ii));
の行を無くすとエラーは出ません
ツイート | ![]() |