XPpro,DL6pro,BDEでデータベース作成中です。
User0、User3いずれもparadoxテーブルがあり、それぞれに同じ項目名[Memo03]があり、データ数としてはそれぞれ3000行程度です。
ListBoxをクリックするとEdit1にクリックした値が入り、この値をEdit2に入力した値と置換するために、以下のコードを作成しました。実行してみると時間が非常にかかります(xpで3分程度、98になると5分程度)。置換速度を上げたいのですが、どこをいじればよいのか判りません。どなたか、ご教示下さい。
procedure TFormSub.Button1Click(Sender: TObject);
var S1,S2,S3,S4 : String; //User0,User3のテーブルのmemo03項目を同時に変換
//i : Integer;
begin
S1 := Edit1.Text;
S2 := Edit2.Text;
begin
try
begin //User1Table1の更新開始
//画面のちらつきをなくす目的。
DMSyaken.User0Table.DisableControls;
DMSyaken.User0Table.Open;
while not DMSyaken.User0Table.Eof do
begin
DMSyaken.User0Table.Edit;
if DMSyaken.User0Table.FieldByName('Memo03').IsNull then
DMSyaken.User0Table.next
else
S3 := DMSyaken.User0Table.FieldByName('Memo03').AsString;
S4 := StringReplace(S3,S1,S2,[rfReplaceAll]);
DMSyaken.User0Table.Edit;
DMSyaken.User0Table.FieldByName('Memo03').Value := S4;
DMSyaken.User0Table.Post;
DMSyaken.User0Table.next;
end;
DMSyaken.User0Table.ApplyUpdates;
DMSyaken.User0Table.Close;
end;
finally
DMSyaken.User0Table.EnableControls;
end;
end;//User0Tableの更新修了
begin //User3Tableの更新開始
try
begin
//画面のちらつきをなくす目的。
DMSyaken.User3Table.DisableControls;
DMSyaken.User3Table.Open;
while not DMSyaken.User3Table.Eof do
begin
DMSyaken.User3Table.Edit;
if DMSyaken.User3Table.FieldByName('Memo03').IsNull then
DMSyaken.User3Table.next
else
S3 := DMSyaken.User3Table.FieldByName('Memo03').AsString;
S4 := StringReplace(S3,S1,S2,[rfReplaceAll]);
DMSyaken.User3Table.Edit;
DMSyaken.User3Table.FieldByName('Memo03').Value := S4;
DMSyaken.User3Table.Post;
DMSyaken.User3Table.next;
end;
DMSyaken.User3Table.ApplyUpdates;
ShowMessage('変換が終わりました');
DMSyaken.User3Table.Close;
end;
finally
DMSyaken.User3Table.EnableControls;
end;
end;//User0Tableの更新修了
end;
REPLACE関数を使用したUpDate文を発行されてはどうでしょうか?
パラドックスは使った事ないので、使えるかどうかは不明ですが。
調べた限りReplaceは使えないような感じですね。
SQL エクスプローラーのデモDBでReplaceを使ってみましたが
「この機能は使用できません」と怒られてしまいました。
> DMSyaken.User3Table.Edit;
> DMSyaken.User3Table.FieldByName('Memo03').Value := S4;
> DMSyaken.User3Table.Post;
ここを、UPDATE SQLで流せば、なんぼか速くなりそうです。
UPDATE テーブル名(ファイル名?) SET Memo03 = 'S4の文字列'
WHERE 置換したい1行を識別できる条件式
Syakeさん,本蛇摩蚊さんありがとうございます。早速やってみようと思います。
何とか出来そうな気がしますが、チェックマークはもう少し待って下さい。
QueryのSQLを使って、Update文を作成し、ExecSQLでやって思い通りの結果が出来ました。Syakeさん,本蛇摩蚊さんありがとうございました。
ツイート | ![]() |