DelFusa Blog 総本山

プログラミングの話題とかです。

NEW | PAGE-SELECT | NEXT

≫ EDIT

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

| スポンサー広告 | --:-- | comments(-) | trackbacks(-) | TOP↑

≫ EDIT

D3でも動くStringReplaceと、パラメータクエリーを変換する関数


     ______
      |         .|
      |大人の二乗?|
      |______|  
      ∧,,∧.||__  
    /ミ,゚Д゚ Φ/\
  /| ̄∪ ̄ ̄|\/  
    |____|/    

わけあって、Delphi3を使っています。

で、D3はIDEが使いにくくって使いにくくって。厳しいものがありますな。

デバッグで監視式にいれている変数の値をコピろうとしても無理なのか。
いや、きつい。


ということで、
TQueryに代入したパラメータ付きSQL文を
パラメータ無しに加工して取得したくなったのでこんなのを作りました。

StringReplace関数がないんだもんな。自作しなきゃ・・・


{---------------------------------------
  文字列中の指定文字列を置き換える関数
機能: SQL文中のParameterを置き換えたSQLを取得するために作成
備考:
履歴:
}//(*-----------------------------------
function AnsiPosIgnoreCase(const SubStr, S: String): Integer;
begin
 Result := AnsiPos(UpperCase(SubStr), UpperCase(S));
end;

type
 TCaseCompare = (ccCaseSensitive, ccIgnoreCase);
 TReplaceOption = (roReplaceOnce, roReplaceAll);

//参考:http://www.w-frontier.com/delphi/tips.html
function StringReplace(BaseStr,OldStr,NewStr : String;
Option: TReplaceOption; CaseCompare: TCaseCompare) : String ;
type
 TPosFunc = function(const Substr, S: string): Integer;
var
 PosFunc: TPosFunc;
begin
 case CaseCompare of
  ccCaseSensitive: PosFunc := AnsiPos;
  ccIgnoreCase: PosFunc := AnsiPosIgnoreCase;
 end;

 Result := '' ;
 if (BaseStr = '') or (OldStr = '') then Result := BaseStr else
 begin
   while (PosFunc(OldStr,BaseStr) <> 0) do
   begin
    Result := Result +
         Copy(BaseStr,1,PosFunc(OldStr,BaseStr)-1) + NewStr ;
    Delete(BaseStr,1,PosFunc(OldStr,BaseStr)-1+Length(OldStr)) ;

    if Option = roReplaceOnce then Break;
   end ;
   Result := Result + BaseStr ;
 end ;
end;

function GetParamReplaceSQL(Query: TQuery): String;
var
 I: Integer;
begin
 Result := Query.SQL.Text;
 for I := 0 to Query.ParamCount - 1 do
 begin
  if VarType(Query.Params[I]) = varString then
  begin
   Result := StringReplace(Result,
    ':'+Query.Params[I].Name, '''' + Query.Params[I].AsString + '''',
    roReplaceAll, ccIgnoreCase);
  end else
  begin
   Result := StringReplace(Result,
    ':'+Query.Params[I].Name, Query.Params[I].AsString,
    roReplaceAll, ccIgnoreCase);
  end;
 end;
end;
//------------------------------------*)

WebFrontierさんとこ
http://www.w-frontier.com/delphi/tips.html
の文字列置き換え関数、Repですが
1文字でしか置き換えれないバグがありました。

修正し、大小文字、Once or All 切り替えオプションをつけておきました。

CaseCompareやReplaceOptionは、True/Falseで指定していないのは、可読性をよくするためです。

普段は、StringsReplaceとして、OldStringとNewStringを
任意個数指定できる関数を作ってますが、
オープン配列パラメータが、D3で使えるはずもないので、
この関数もこれはこれで役に立つ場面もあるでしょう。

それを利用してGetParamReplaceSQLでは
パラメータ付きSQLからパラメータ内容を置き換えてみてみました。


スポンサーサイト

| 未分類 | 10:25 | comments:0 | trackbacks(-) | TOP↑

COMMENT















非公開コメント

PREV | PAGE-SELECT | NEXT

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。