おはようございますマスター(こんばんはかな)
色々見直してみました。
今までで問題なかったパターンと、今回問題になったパターンを
比べてみました。
//問題なく処理されるパターン:
function XXXX(XX:XX):TDynamicArrRecordData;
var
i:Integer;
begin
・・・(前処理)
Result := nil;//必要ないけど書かないと気がすまない。
ADODataSset1.CommandText := 'xxx';
Try
ADODataSet1.Open;
if ADODataSet1.RecordCount > 0 then
begin
SetLength(Result,ADODataSet1.RecordCount);
for i := 0 to ADODataSet1.RecordCount -1 do
begin
・・・・
Result[i].fYxxxx := ADODataSet.FieldByName('SSS').AsXxxxx;
・・・・
end;
end;
ADODataSet1.Close;
except
・・・(エラー処理)
Result := nil;
end;
end;
//Resultを条件には使う事はなかった。
//Resultに再度値を入れなおしはしていなかった。
これは、今まで問題は無かった。
//エラーを頻発した今回のパターン:
前述した処理で一旦Resultに値を入れた後
再度別のデータセットを開いて
if Result <> nil then
begin
・・・(別のデータセットを開く)
ADODataSet1.Open;
if ADODataSet1.RecordCount > 0 then
begin
for i := 0 to ADODataSet1.RecordCount -1 do
begin
for j := 0 to Length(Result) -1 do
begin
if Result[j].fXxxx = ADODataSet1.FieldByName('YYYY').AsXxxxx then
begin
Result[j].fYxxxx := ADODataSet1.FieldByName('ZZZZ').AsXxxxx;
end;
・・・・
end;
end;
ADODataSet1.Close;
end;
//今までと異なったところ
//まあ結果的にResultを使いまくり、判断、参照、値の入れ替え
//何でもござれ状態でした。
これがいけなかったのかな。
マスターの言われるとおり、ローカル変数が安心ですね。
以上、見直した結果報告のゴミレスです。
|