[PowerBuilder] Datawindow式でよく見る引用符について

PowerBuilderの引用符について

の記事でも少し触れたが、Modifyメソッドに渡すパラメータ文字列を作成する際、チルダを用いた引用符の扱いが非常に面倒くさい。

ls_modify = "r_" + String(ll_i) + ".visible='1~tIF(結果" + String(ll_i) +" = ~~'~~', 1, 0)'"
dw_4.Modify(ls_modify)

↑こういうやたら~が多いやつ

 

理解するにはなかなか難しいのだが、一つ例を出してこの引用符について説明したい。

 

 

例題

①データウィンドウ「dw_1」に下記2つのオブジェクトがあるとする。

  1. カラム「テキスト1」
  2. 四角形「r_1」

②前ウィンドウから遷移したときに受け取ったパラメータが"1"の場合は、四角形を常に表示、

パラメータが"1"以外の場合は、

カラム「テキスト1」がブランクであれば表示、何か入力されていれば非表示とする。

 

正解(の一例)

下記は、Modify関数を使って「r_1」のプロパティ値をコーディング内で変更した例。

IF is_parm = "1" THEN
ls_modify = "r_1.visible=1"
dw_1.Modify(ls_modify)
ELSE
ls_modify = "r_1.visible='1~tIF(テキスト1 = ~~'~~', 1, 0)'"
dw_1.Modify(ls_modify)
END IF

 

解説

PowerScriptで「文字列である」ことを表すための引用符 "" と、

Datawindow式の中で文字列の引用符として使用される '' の関係に注意。

そして、チルダがつくとその記号は引用符としてではなく文字として扱われる。

なお、~はエスケープシーケンスとして使用される。引用符 "" '' に囲われた~' は、""に囲われた'と同じ意味になる。

例)
Messagebox("","This is a 'text'.")

メッセージボックスには「This a 'text'.」と表示される。

例)
Messagebox("",'This is a ~'text~'.')

この場合も、メッセージボックスには「This a 'text'.」と表示される。'' も文字列の引用符として使用できるが、 "" とは区別される。

例)
Messagebox("",'This is a 'text'.')

これは構文エラーになる。単純に

例)
Messagebox("","This is a "text".")

と書いていることと同じになるからだ。

※詳細はPowerScriptリファレンス「リテラルの使い方」を参照。

 

例題で書いたコードも、

ls_modify = "r_1.visible='1~tIF(テキスト1 = ~~'~~', 1, 0)'"
dw_1.Modify(ls_modify)

引数の

"r_1.visible='1~tIF(テキスト1 = ~~'~~', 1, 0)'"

がDWに渡され、そのうちのvisible=に渡される文字列は

'1~tIF(テキスト1 = ~'~', 1, 0)'

として解釈され、

IF(テキスト1 = '', 1, 0)

↑というDatawindow式として解釈されてVisibleプロパティにセットされる。

"" に囲われたうえで '' にも囲われているため、エスケープシーケンスであるチルダが二重に付与されているのである。

~tはタブを意味する。

 

この構造がなかなか理解しづらく、うっかりチルダを抜かしてしまって1時間ぐらい構文エラーに悩まされた記憶がある。

 

戻り値をチェックしよう

Modify関数はエラーがあった際に戻り値としてエラーメッセージ文字列を返してくれるため、

ls_ErrText = dw_1.Modify(ls_modify)

上記のように書いておけばデバッグが楽になる。

エラーメッセージは「1 行 カラム 17: 不適切な構文です。」といったように問題部分の桁数を出してくれるので、「Modifyしたはずなのに反映されないな?」と思ったら即デバッグして戻り値を見たほうがいい。

コメントする