Symfoware Server WebDBtoolsユーザーズガイド - FUJITSU - |
目次
索引
![]() ![]() |
第3章 データベース連携 |
WebScriptは、フォーマットファイルに記述されるHTMLタグとHTML拡張タグのうち、拡張タグ部分を、サーバサイドの処理で動的なHTMLに変換します。拡張タグの基本要素および主なタグの利用方法の概要について説明します。構文の詳細は、“WebScript拡張タグ”を参照してください。
WebScriptは、フォーマットファイル中のHTMLおよびHTML拡張タグを処理します。タグは以下の形式をしています。
<タグ名 [パラメタ1[パラメタ2] ・・・] ] >
パラメタは、“パラメタ値”、“パラメタ名=パラメタ値”、“パラメタ名”のどれかの形式をとります。パラメタ名は、決められた文字列(キーワード)から構成されます。パラメタ値は任意の値です。
拡張タグは、タグ名の先頭に、「!」が付きます。
HTMLタグ例:<INPUT TYPE="txt" NAME="var" VALUE="value1"> |
拡張タグ例:<!DO "SELECT COL1,COL2 FROM SCM.TBL1 WHERE COL1=\'KEY01\'" RESULT=rslt> |
拡張タグには、定数や変数の基本項目と変数を処理する機能があります。拡張タグの変数には、型がなく、動的に文字列か数値が設定されます。
<!SETVAR>は、拡張タグの変数に値を代入する拡張タグです。例では2つのパラメタを指定しています。
<!SETVAR a 10> ―――― 拡張タグ変数aに数値定数10を代入 <!SETVAR b 20> ―――― 拡張タグ変数bに数値定数20を代入 <!SETVAR str "My Dog"> ― 拡張タグ変数strに文字列定数"My Dog"を代入 <!SETVAR v1 a> ―――― 拡張タグ変数v1に変数aの内容を代入 <!SETVAR v2 str> ――― 拡張タグ変数v2に変数strの内容を代入 |
拡張タグには、変数、演算、関数、制御構造などの要素があります。すべての要素で、以下の規則が適用されます。
拡張タグのパラメタが単純な英数字の連続でない場合は、引用符で囲むことにより1つのパラメタと解釈させることができます。
二重引用符で囲むと内部が評価(演算や型の変換)されず、1つの文字列(パラメタ)と解釈されます。
変数v3にMy Dogを代入
<!SETVAR v3 My Dog> ――(構文誤り) <!SETVAR v3 "My Dog"> ― (正) <!SETVAR v3 'My Dog'> ――(構文誤り:My Dogを変数と解釈する) <!SETVAR v3 '"My Dog"'> ―(正:引用符は1つのパラメタという意味で利用される) |
変数v3に、変数aと変数bの値を加えた値を代入
<!SETVAR v3 a + b> ―――(構文誤り) <!SETVAR v3 "a + b"> ――(変数v3には文字列"a + b"が代入される) <!SETVAR v3 'a + b'> ―――(正) |
変数strに入っている文字列の4文字目から4文字がDogsなら、outstrに値を設定
<!SETVAR str "My Dogs"> <!IF 'substr(str,3,4) eq "Dogs"'> <!SETVAR outstr str> <!/IF> |
WebScriptの拡張タグは、以下に示す言語要素をもっています。
大分類 |
小分類 |
機能 |
|
---|---|---|---|
変数 |
ユーザ |
グローバル変数 |
フォーマットファイル間でも有効な変数 |
ローカル変数 |
フォーマットファイル内の変数 |
||
システム変数 |
WebScriptであらかじめ与えられている変数 |
||
定数 |
文字列 |
文字の処理(結合、比較など)が可能 |
|
数値 |
数値の処理(比較、四則演算)が可能 |
||
変数の変換 |
置換 |
タグ内にWebScript変数の値を埋め込む |
|
REPLACE,HREPLACE |
タグとタグの間にWebScript変数の値を埋め込む |
||
値の種類 |
単値 |
アトミックな値(これ以上分解できない値) |
|
リスト |
複数の値(配列と同様に要素に値を複数もつ) |
||
代入 |
|
変数への値の設定 |
|
演算、参照 |
|
変数参照、四則演算、論理式、 |
|
関数 |
文字列 |
文字列の変換、部分取出しなど |
|
数学 |
三角関数、べき乗、指数、対数、ルート、絶対値 |
||
リスト |
結合、分解、ソート、リスト要素処理 |
||
時間 |
GMT、LOCAL時間取得 |
||
変数 |
変数定義判定 |
||
HTML |
文字のHTML表現のサポート |
||
制御構造 |
IF,ELSE,ELSEIF |
判定 |
|
FOR |
条件ループ |
||
FOREACH |
リスト処理条件ループ |
||
WHILE |
条件ループ |
||
BREAK |
FOR、FOREACH、WHILE 抜出し |
||
CONTINUE |
FOR、FOREACH、WHILE 現処理スキップ |
||
THROW |
例外通知 |
||
CATCH |
例外取出し |
||
ABORT |
処理中止 |
||
データベース |
DO |
データベースのデータ操作や定義などの操作 |
|
TRANSACTION |
トランザクションのコミットとロールバック |
||
エラー処理 |
ERRORHANDLE |
エラー処理モード変更 |
|
Cookie |
SETCOOKIE |
COOKIEパッケージ変数設定 |
WebScriptの定数には、数値定数および文字列定数があります。文字列定数は、二重引用符(")または引用符(')で囲んで表現します。数値定数には、10進、8進、16進があります。WebScript内部では、数値を、実数の倍精度の浮動小数点で表現しています。
例:数値定数
100
例:文字列定数
"WebScript"
変数には、ユーザ変数(グローバル変数、ローカル変数)とシステム変数があります。
グローバル変数は、フォーマットファイル間のWebScriptセションで、利用できます。ローカル変数は、対象フォーマットファイル内だけで有効です。システム変数は、WebScriptにより既定の形式の変数で、QUERY、COOKIEおよびSYSTEMの各パッケージ変数があります。
QUERYパッケージ変数は、WebクライアントからGETのURL、POSTのFORMで送信された値です。COOKIEパッケージ変数は、Webクライアントから送られてきたCOOKIEの値です。SYSTEMパッケージ変数は、WebScriptで定められている変数です。
QUERYパッケージ変数の例:QUERY::var(<INPUT TYPE="text" NAME="var" VALUE="value1">という要素の例) COOKIEパッケージ変数の例: COOKIE::name (nameという名前のCOOKIEの例) SYSTEMパッケージ変数の例: SYSTEM::DB_ERRORCODE(エラーメッセージの変数の例) |
グローバル変数とローカル変数は、重複しない任意の名前を利用できます。
変数は以下の利用ができます。
WebDBtoolsの拡張タグで、その引数として利用できます。(拡張タグのパラメータ、拡張タグパラメータ中の演算のオペレータ、組込み関数の引数)
ほかの拡張タグやHTMLタグの中に、変数を埋め込み、その値を埋め込む(変数の置換と値の解釈の項を参照)
変数への値の代入は、<!SETVAR>拡張タグにより行います。
<!SETVAR outVar inName>
outVar変数にinNameの定数や変数の内容を設定します。
例:
<!SETVAR city '"tokyo"'> cityに"tokyo"が設定されます。 <!SETVAR city '1'> cityに1が設定されます。 |
WebScriptは、“パラメタ値”に、拡張タグの変数を記述し、タグ内に記述した変数を置換する機能があります。パラメタ値に拡張タグの変数を記述する場合には、先頭に“$”を付け、変数名を括弧で囲みます。以下の2つの条件を満たしている場合に、括弧は省略できます。
変数名が単純な英字数字またはアンダースコアだけで、記述している場合
") "の直後の文字が英数字でないか、またはアンダースコアでない場合
例:animalを"Dog"、numberを100に指定した場合
括弧の省略不可:$(animal)#100 = $animal#100 →(展開結果:Dog#100)
括弧の省略:$(animal)$(number) = $animal$number →(展開結果:Dog100)
括弧の省略不可:$(animal)100 →(展開結果:Dog100)
括弧の省略不可:$(animal)_100 →(展開結果:Dog_100)
フォーマットファイルの変数の置換は、以下のような3段階の過程で処理されます。
パラメタの分解
タグのパラメタを空白を区切りとして分解します。
<!SETVAR v1 '$a + $b'>
↓
タグ:!SETVAR、第1パラメタ:v1, 第2パラメタ: '$a + $b'
変数の置換
先頭に$のついた変数を実際の値に置き換えます。二重引用符内であっても置換が行われます。
aの値が20、bの値が30とします。
'$a + $b'
↓
'20 + 30'
WebScriptの言語による値の解釈
変数の置き換えが済んだ結果を解釈し,拡張タグを処理します。
'20 + 30'
↓
50
拡張タグの実行で、v1には50が代入されます。
ただし、共通の規則により、二重引用符で囲まれた、パラメタは、解釈はされず1つの文字列となります。以下に例を示します。
<!SETVAR v1 "$a + $b"> ↓(拡張タグ変数の展開) <!SETVAR v1 "20 + 30"> ―― 変数aの値と変数bの値が展開される ↓ <!SETVAR v1 "20 + 30"> ――"20 + 30"は、二重引用符で囲んでいるため v1には、"20 + 30"という文字列が入ります。 |
変数の置換は、フォーマットファイル中に記述したHTML構文中も同様に行われます。
例:
<INPUT TYPE=text NAME="$varname" value="$val"> (varnameがitem, valueが10の場合) ↓ <INPUT TYPE=text NAME="item" value="10"> |
フォーマットファイル中に記述したHTML構文中に、WebScriptの変数を埋め込むことができます。変数を、HTMLタグ内に記述する場合は、変数の先頭にドル記号“$”を付加します。
例:
<INPUT TYPE="text" NAME="$varname" VALUE="$val"> (varnameがitem, valが10の場合) ↓ <INPUT TYPE="text" NAME="item" VALUE="10"> |
WebScriptの変数を、HTMLのタグとタグの間に展開するための拡張タグとして、<!REPLACE>拡張タグと<!HREPLACE>拡張タグがあります。
例:
<!SETVAR var001 '"Hello"'> <B><!REPLACE var001></B> |
WebScriptの変数に型は存在しません。変数の書かれている場所の文脈により、型が動的に決まります。これをコンテキストと呼びます。コンテキストは、数値、文字などの単値またはリストのどれかになります。
アトミックな値(これ以上分解できない値)で、数値の単値と文字列の単値があります。
単値生成の例:数値
<!SETVER ATM01 100> |
単値生成の例:文字列
<!SETVER ATM02 "WebScript"> |
配列同様に複数の値を保持するデータで、リストの要素は、単値またはリストです。リストは、要素の番号または要素に付けたキーで参照できます。
リスト生成の例:
<!SETVAR LIST01 '("red", "blue", "green")'> |
リスト生成の例:
<!SETVAR 'EXAMJOHN{mathematics}' 100> <!SETVAR 'EXAMJOHN{geometory}' 50> <!SETVAR 'EXAMMARRY{mathematics}' 80> <!SETVAR 'EXAMMARRY{geometory}' 90> <!SETVAR 'EXAMALL[0]' EXAMJOHN> <!SETVAR 'EXAMALL[1]' EXAMMARRY> |
リスト参照の例:
LIST01[1] (blueが参照される) |
リスト参照の例:
EXAMJOHN[1] (50が参照される) EXAMALL[1][1] (90が参照される) EXAMALL[1]{geometory} (90が参照される) |
以下の演算があります。演算の意味については、“演算子”を参照してください。
!:否定、-:符号変更、*:積、/:商、%:剰余、+:和、-:差
<,>,<=,>=,==,!=:数値比較記号、
lt,gt,le,ge,eq,ne:文字列比較記号
.:文字列結合
&&:and条件, ||:or条件, ( ):演算順序変更
例:
<!SETVAR animal '"dog"'> <!SETVAR count '010'> <!SETVAR count 'count+100'> <INPUT TYPE="text" NAME="$animal$count" VALUE="snoppy"> ↓ <INPUT TYPE="text" NAME="dog110" VALUE="snoppy"> |
文字列、数学、リスト、時間、変数の定義判定、HTML表現などの関数があります。詳細は、“関数”を参照してください。
例:
<!SETVAR start '3'> <!SETVAR len '2'> <!SETVAR str '"abcdefghi"'> <!SETVAR sstr 'substr( str, start, len )'> <!REPLACE sstr> |
制御構造として以下のものがあります。詳細は、“WebScript拡張タグ”を参照してください。
<!IF>、<!ELSE>、<!ELSEIF>:条件判定文 <!FOR>、<!WHILE>、<!FOREACH>:条件ループ <!BREAK>、<!CONTINUE>、<!THROW>、<!CATCH>、<!ABORT>:制御移動 |
<!DO>拡張タグは、データベースをSQL文およびRDBコマンドで処理し、結果を得る拡張タグです。検索時は実行結果と結果データが、そのほかは実行結果が出力されます。
検索結果は、表イメージを2次元のリストに格納します。リストのキーには、列名が付けられています。
例:伝票表から「伝票番号」と「商品」を検索します。
<!DO "SELECT 伝票番号,商品 FROM STOCKS.伝票表" RESULT=r> <TABLE> <!FOREACH r t> <TR> <TD><!REPLACE t{伝票番号}</TD> <TD><!REPLACE t{商品}</TD> </TR> <!/FOREACH> </TABLE> |
データベースのSQL文は、トランザクションにより実行されます。トランザクションには以下の機能があります。
SQL実行時に、自動的にアクセスした範囲に排他制御(ロック)を行います。WebScript実行時は、Symfoware/RDBのデフォルトのモードで排他制御が行われます。
データベースの処理範囲に行われた排他制御は、トランザクションのCOMMIT、ROLLBACKのどちらかの命令により解放されます。
データベースの更新を伴う処理を行った結果は、COMMITかROLLBACKを実行した時点で決まります。COMMITを実行した場合は、すべての更新結果が反映されます。ROLLBACKを行った場合は、すべての更新結果が反映されません。
排他制御については、“アプリケーション開発ガイド(埋込みSQL編)”の“排他制御”を参照してください。
WebScriptを利用してデータベースの処理を実行する場合は、以下のように処理を行う必要があります。
<!DO>タグで、データベースの処理を行う命令を実行した場合は、フォーマットファイルの処理の終了までに、必ず<!DO "COMMIT">, <!DO "ROLLBACK">によりトランザクションを終了させる必要があります。
トランザクションを終了させる命令には、以下のタグもあります。
<!TRANSACTION "COMMIT"> ――― <!DO "COMMIT">と同じ
<!TRANSACTION "ROLLBACK"> ――― <!DO "ROLLBACK">と同じ
<!ABORT> ――― 本タグで、内部的に<!DO "ROLLBACK">が実行されます。
個別セションの場合は、複数のフォーマットファイルで一連の処理(トランザクション)を実行する場合があります。この場合は、少なくとも、一連のフォーマットファイルの最後のフォーマットファイルで、必ず<!DO "COMMIT">, <!DO "ROLLBACK">によりトランザクションを終了させる必要があります。
<!TRANSACTION>拡張タグは、トランザクションのCOMMITやROLLBACKを実行する拡張タグです。<!TRANSACTION>拡張タグは、トランザクション処理の拡張用機能であり、現在はそれぞれ、<!DO "COMMIT">、<!DO "ROLLBACK">タグと同様に機能します。
<!TRANSACTION>拡張タグは、トランザクションをデータベースの操作用のSQLと分けて、トランザクションの範囲を明示するような場合(トランザクションの範囲のコメント性の強調)に利用できます。それ以外は、<!DO "COMMIT">、<!DO "ROLLBACK">タグを利用してください。
エラーが発生しても異常終了せず、エラー解析処理することができます。環境パラメタファイルに、エラー処理が指定されていない場合に実行します。
例:
<!ERROHANDLE ON TYPE=DB> <!DO "SELECT 伝票番号,商品 FROM STOCKS.伝票表" RESULT=r> <!IF 'SYSTEM::DB_ERRORCODE ne "00000"'> <!SETVAR ans "failure"> <!SETVAR errormsg SYSTEM::DB_ERRORMSG> <!DO "ROLLBACK"> <!ELSE> <!SETVAR ans "success"> <!/IF> <!ERRORHANDLE DEFAULT> |
HTTPヘッダのSet-Cookie:に値を設定します。
目次
索引
![]() ![]() |