置換速度を早くするには?

解決


サンプー  2006-02-01 07:16:31  No: 19882

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;


Syake  2006-02-01 17:38:53  No: 19883

REPLACE関数を使用したUpDate文を発行されてはどうでしょうか?
パラドックスは使った事ないので、使えるかどうかは不明ですが。


本蛇摩蚊  2006-02-01 18:07:06  No: 19884

調べた限りReplaceは使えないような感じですね。
SQL エクスプローラーのデモDBでReplaceを使ってみましたが
「この機能は使用できません」と怒られてしまいました。

>       DMSyaken.User3Table.Edit;
>       DMSyaken.User3Table.FieldByName('Memo03').Value := S4;
>       DMSyaken.User3Table.Post;
ここを、UPDATE SQLで流せば、なんぼか速くなりそうです。

UPDATE テーブル名(ファイル名?) SET Memo03 = 'S4の文字列'
WHERE 置換したい1行を識別できる条件式


サンプー  2006-02-02 16:22:58  No: 19885

Syakeさん,本蛇摩蚊さんありがとうございます。早速やってみようと思います。
何とか出来そうな気がしますが、チェックマークはもう少し待って下さい。


サンプー  2006-02-13 07:10:32  No: 19886

QueryのSQLを使って、Update文を作成し、ExecSQLでやって思い通りの結果が出来ました。Syakeさん,本蛇摩蚊さんありがとうございました。


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

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






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