2.6.3 ルールスクリプトの記述

ルールスクリプトは,アプリケーション開発に使用するプログラミング言語(COBOL言語やC言語など)の文法に従って記述します。これに加えて, ソースプログラムへの展開位置を指定する文や,業務ルールやデータ項目の情報を取り出せる予約キーワードなど,ルールスクリプトを記述するための独自の文法が用意されています。さらに,SEWB+/CONSTRUCTIONのテンプレート記述言語をルールスクリプトの記述に使用することもできます。

業務ルールの内容に応じた書き方については「2.6.5 システムで共用する業務ルールを登録する」および「2.6.6 特定業務で扱う業務ルールを登録する」を参照してください。

<この項の構成>
(1) キーワードでデータ項目の名称を記述する
(2) 記述形式
(3) 記述方法
(4) 作業領域を記述する
(5) ルールスクリプトを分割して展開する
(6) 作業領域のデータ項目名の重複を回避する
(7) 作業領域を1回だけ展開する
(8) データ項目の定義情報を取り出す
(9) チェック処理を記述する場合には
(10) 予約キーワードの留意事項

(1) キーワードでデータ項目の名称を記述する

業務ルールで使用するデータ項目名は,必ずキーワードで記述します。キーワードは,SEWB+/CONSTRUCTIONでソースプログラムが生成されるときに,データ項目に定義されている言語別の名前に置換されます。

[図データ]

なお,言語別の名前を定義していない場合には,キーワードはデータ項目名に置換されます。また,ソースプログラムに生成されるとき,テンプレートに記述した@@rule文の指定に従って,言語別の名前に接頭語または接尾語が付加される場合があります。@@rule文の詳細は,マニュアル「SEWB+/CONSTRUCTION アプリケーション開発ガイド」を参照してください。

(2) 記述形式

COBOL言語でルールスクリプトを記述するときの規則について説明します。SEWB+/CONSTRUCTIONで作成するアプリケーションのコーディング形式に固定形式(正書法)を採用している場合でも,ルールスクリプト中に一連番号(正書法1~6カラム目)を記述する必要はありません。7カラム目の標識領域から記述してください。一連番号は,SEWB+/CONSTRUCTIONでソースプログラムを生成したときに自動的に付加されます。

(3) 記述方法

ルールスクリプトの記述には,ルールスクリプト独自の文法とプログラミング言語で記述する方法と,これにテンプレート記述言語を併用して記述する方法の2通りがあります。

前者の記述方法は,データ項目と業務ルールが一対一に対応する業務ルール,またはデータ項目の属性や性質がそのまま下位のデータ項目に継承するドメインの業務ルールの記述に適しています。

これに対して,後者のテンプレート記述言語の展開制御文(可変記号に値を代入する@@set文や,可変記号の値によって条件判定する@@if文など)を併用する方法は,異なる複数のドメインやデータ項目に対応させる業務ルールの記述に適しています。汎用性が高い業務ルールを作成できるため,業務ルールの再利用性を向上できます。ただし,この場合は,辞書を設計する知識に加えて,テンプレートを作成する知識が必要になります。また,業務ルールとテンプレートの関係も複雑になります。

どちらの方法でルールスクリプトを記述すればよいかは,プロジェクトの状況や,どれだけ業務ルールに汎用性を持たせるかなどによって異なります。テンプレート作成者と十分検討したうえで,最適な記述方法を採用するようにしてください。

(4) 作業領域を記述する

ルールスクリプトには,手続きだけではなく,処理内容に応じてデータの作業領域(データ項目の内部構造を分割または統合するための領域,処理に使う一時領域,外部サブルーチンとのインタフェース領域など)を記述できます。作業領域の記述については,「(5) ルールスクリプトを分割して展開する」,「(6) 作業領域のデータ項目名の重複を回避する」および「(7) 作業領域を1回だけ展開する」を参考にしてください。

(5) ルールスクリプトを分割して展開する

ルールスクリプトは通常,SEWB+/CONSTRUCTIONのテンプレートの@@rule文で,業務ルールが挿入指示された位置にソースコードが展開されます。しかし,@@section文を利用すれば,ルールスクリプト中のコードの一部分を,指定した別の位置に展開できます。例えば,COBOL言語で記述する場合には,ルールスクリプト中の作業領域を,手続きとは別の位置(WORKING-STORAGE SECTIONやLINKAGE SECTIONなど)へ展開しなければなりません。このようなときに「@@section文」を使用します。

なお,分割展開の必要がないときには@@section文を記述しなくてもかまいません。ルールスクリプト中に@@section文がない場合,テンプレートの@@rule文でその業務ルールが引き当てられた位置に展開されます。

(a) @@section文
形 式
@@section {MAIN | コード名}
{ }内のどちらかを選んで記述します。
規 則
  • @@sectionに続く文には,テンプレート記述言語以外の任意のテキストを記述できます。
  • 次のどちらかの方法でソースプログラムへの展開先を指定します。
    MAIN: SEWB+/CONSTRUCTIONのテンプレートの@@rule文で,その業務ルールが挿入指示された位置に展開されます。
    コード名: 29文字以内の文字列を指定します。テンプレート中の,コード名の先頭に@を付加した可変記号が指定された@@merge文の位置に展開されます。この関係については「(b) テンプレートに記述する@@merge文との関係」を参照してください。
  • @@section文の指定は,次の@@section文が同じルールスクリプト上に記述されるまで有効になります。
  • @@section文のコード名と一致するものが@@merge文の可変記号に指定されていない場合には,展開されません。
(b) テンプレートに記述する@@merge文との関係

@@section文で@@rule文以外の場所に展開先を指定されたルールスクリプトは,テンプレートの@@merge文の位置に展開されます。この関係を次の例で見てみましょう。

[図データ]

ルールスクリプトの作業領域「W-事業所コード」は,同一のコード名を持つ可変記号「@WORK」が指定された@@merge文の位置に展開されています。

このように,適切に分割展開するには,ルールスクリプトの「@@section コード名」とテンプレートの「@@merge文 可変記号」のコード名が一致していなければなりません。したがって,辞書の作成者はテンプレート作成者の協力を得て,ルールスクリプトとテンプレートで,どのように分割展開し,どのようなコード名を使うかをあらかじめ決めておく必要があります。

@@merge文の詳細は,マニュアル「SEWB+/CONSTRUCTION アプリケーション開発ガイド」を参照してください。

(6) 作業領域のデータ項目名の重複を回避する

作業領域を記述するときに予約キーワード「@rulecount」を使用すれば,ソースプログラム中に同じルールスクリプトが複数個展開されても,データ項目名の重複を回避できます。@rulecountは,ソースプログラムの生成時に,その業務ルールが展開された回数と置換されます。

(a) @rulecount

作業領域のデータ項目名に記述します。回数は,通し番号(4けたの整数)で生成されます。

[図データ]

@rulecountを使った作業領域の展開例を次に示します。

[図データ]

(7) 作業領域を1回だけ展開する

ルールスクリプトにテンプレート記述言語の展開制御文を使用すれば,@@section文と同様の分割展開ができます。さらに,ソースプログラム中に同じルールスクリプトが複数個展開されるときに,作業領域を1回だけ展開するように記述できます。ただし,この記述では,テンプレートに,最初の業務ルールの展開かどうかを判断するための可変記号を定義する必要があります。

[図データ]

この例では,展開制御文の一つである@@put文を使用して分割展開しています。ソースプログラム中に最初に業務ルールが展開されたとき,@@put文で指定された作業領域が,テンプレート上の同じ可変記号「@WORK」が指定された@@merge文の位置に展開されます。同時に,可変記号@RULE_FLAG[時刻編集]に文字列「Y」がセットされます。以降にこの業務ルールが展開されても,@@if文の判定によって作業領域の展開が抑止されます。なお,ルールスクリプトに記述されている@@if文,@@put文,@@set文は,すべてテンプレート記述言語の展開制御文です。詳細は,マニュアル「SEWB+/CONSTRUCTION アプリケーション開発ガイド」を参照してください。

(8) データ項目の定義情報を取り出す

データ項目に定義されているけた数,タイプ,反復回数または修飾情報付データ項目名を,それぞれに対応した予約キーワードで取り出せます。取得した値を比較条件に利用したり,処理に渡したりすることで,汎用性の高い業務ルールを作成できます。例えば,同じドメインを継承するデータ項目であっても,けた数,タイプなどが異なる場合があります。このようなとき,定義情報が異なる部分を予約キーワードを使って記述すれば,ドメインに関連する共通の業務ルールを作成できます。

(a) @len

データ項目に定義されているけた数を取り出します。

形 式
@len(キーワード)
規 則
  • キーワードに対応するデータ項目が結合項目の場合,またはけた数が定義されていない場合には,取得されません。
  • ルールスクリプトを記述している言語が「C又はC++」で,分類に日本語文字列データを定義したデータ項目のけた数では,けた数の2倍の値が取得されます。
(例)
キーワード「@コード」に対応するデータ項目のけた数を取り出し,外部サブルーチンに引き渡すインタフェース領域にセットします。
[図データ]
(b) @type

データ項目に定義されているタイプを取り出します。

形 式
@type(キーワード)
規 則
  • キーワードに対応するデータ項目が結合項目の場合は,取得されません。
  • @typeで取得される値とタイプの対応を次に示します。@typeで取得される値は,SEWB+/CONSTRUCTIONのテンプレート@@lang文のFOR_REPOSITORY句に指定された言語区分に対応した値となります。
    また,追加したユーザ定義のタイプで取得される@typeの値は,そのタイプの英字識別子となります。例えば,「B 符号付き2進項目」の場合は「B」が取得されます。

    表2-19 タイプと@typeの値の対応(COBOL又はOOCOBOL)

    タイプ@typeの値
    X 英数字項目X
    Z 数字編集項目Z
    N 漢字項目N
    9 符号なし外部10進項目9
    S 符号付き外部10進項目S
    U 符号なし内部10進項目U
    P 符号付き内部10進項目P
    BU 符号なし2進項目BU
    B 符号付き2進項目B
    E 外部浮動小数点項目E
    D 内部浮動小数点項目D
    1 内部ブール項目1
    8 外部ブール項目8
    T アドレスデータ項目T
    フリー定義フリー定義の内容

    表2-20 タイプと@typeの値の対応(C又はC++)

    タイプ@typeの値
    char 文字型char
    char* 文字型(ポインタ)char*
    short 符号付き短整数型short
    unsigned short 符号なし短整数型unsigned short
    int 符号付き整数型int
    unsigned int 符号なし整数型unsigned int
    long 符号付き長整数型long
    unsigned long 符号なし長整数型unsigned long
    float 単精度浮動小数点型float
    double 倍精度浮動小数点型double
    long double 拡張精度浮動小数点型long double
    フリー定義フリー定義の内容

    表2-21 タイプと@typeの値の対応(SQL)

    タイプ@typeの値
    CHAR 固定長文字列CHAR
    VARCHAR2 可変長文字列VARCHAR2
    LONG 可変長長文字列LONG
    NUMBER 固定小数点数NUMBER
    NUMBERf 浮動小数点数NUMBERf
    DATE 日付DATE
    VARCHAR 可変長文字列VARCHAR
    NCHAR 固定長各国文字列NCHAR
    NVARCHAR 可変長各国文字列NVARCHAR
    MCHAR 固定長混在文字列MCHAR
    MVARCHAR 可変長混在文字列MVARCHAR
    SMALLINT 短整数SMALLINT
    INT 整数INT
    DEC 固定小数点数DEC
    SMALLFLT 単精度浮動小数点数SMALLFLT
    FLOAT 倍精度浮動小数点数FLOAT
    TIME 時刻TIME
    フリー定義フリー定義の内容

    表2-22 タイプと@typeの値の対応(IDL(CORBA))

    タイプ@typeの値
    char 文字型char
    string バウンディッド文字列型string
    unbounded string アンバウンディッド文字列型unbounded string
    unsigned short 符号なし短整数型unsigned short
    short 符号付き短整数型short
    unsigned long 符号なし長整数型unsigned long
    long 符号付き長整数型long
    float 単精度浮動小数点型float
    double 倍精度浮動小数点型double
    boolean 論理型boolean
    octet オクテット型octet
    any 任意データ型any
    long long 符号付き長々整数型long long
    unsigned long long 符号なし長々整数型unsigned long long
    long double 拡張倍精度浮動小数点型long double
    wchar ワイド文字型wchar
    wstring ワイド文字列型wstring
    fixed 符号付き固定小数点型fixed
    フリー定義フリー定義の内容

    表2-23 タイプと@typeの値の対応(帳票定義)

    タイプ@typeの値
    C 文字データC
    I 数値データI
    B 集計対象外数値データB
    CY 年次データCY
    MO 月次データMO
    DA 日次データDA
    HS 日付・時刻データHS
    M 画像データM
    SP 特殊編集レベルデータSP
    フリー定義フリー定義の内容

    表2-24 タイプと@typeの値の対応(Java)

    タイプ@typeの値
    char 文字型char
    short 符号付き単整数型short
    int 符号付き整数型int
    long 符号付き長整数型long
    float 単精度浮動小数点型float
    double 倍精度浮動小数点型double
    byte バイト型byte
    boolean 論理型boolean
    フリー定義フリー定義の内容
(例)
キーワード「@氏名」に対応するデータ項目のタイプを取り出し,「X 英数字項目」,「N 漢字項目」のタイプ別に処理を分岐します。
[図データ]
(c) @occurs

データ項目に定義されている反復回数を取り出します。

形 式
@occurs(キーワード)
規 則
  • キーワードに対応するデータ項目に反復回数が定義されていない場合には,取得されません。
(例)
キーワード「@金額」に対応するデータ項目の反復回数を取り出し,反復回数分,処理をループします。
[図データ]
(d) @occurs_dimension

結合関係の最も上位に位置するデータ項目から,キーワードに対応するデータ項目までの,配列の次元数を取り出します。結合関係の最も上位にある結合項目からそのデータ項目までに反復回数が定義されていない場合は,0が展開されます。

形 式
@occurs_dimension(キーワード)
(例)
データ項目が次のような結合関係にあるときを例に,次元数がどのように取り出されるかについて考えてみましょう。キーワード「@データ項目d」には「データ項目D」が対応するとします。例えば,ルールスクリプトに「@occurs_dimension(@データ項目d)」を記述すると,「データ項目D」の次元数として「2」が取り出されます。
[図データ]
規 則
  • SEWB+/RECORD DEFINERのレコード定義に取り込まれたデータ項目の場合,レコード定義で定義された上位項目の配列は,次元数に反映されません。
(e) @occurs1~@occurs9

キーワードに対応するデータ項目の反復回数,または結合関係の上位にあるデータ項目の反復回数を取り出します。主に@occurs_dimensionで取り出した次元数と組み合わせて使用します。

形 式
@occurs1(キーワード)~@occurs9(キーワード)
規 則
  • @occurs1は,キーワードに対応するデータ項目が属する結合関係の中で,反復回数が定義されたデータ項目のうち,最も上位にある結合項目の反復回数を取り出します。反復回数が定義されたデータ項目が,結合関係の下位になるに従って,@occurs2,@occurs3,…@occurs9が対応します。
  • 予約キーワードに指定した次元数(@occursNの,Nに記述した数字が,データ項目の配列の次元数(@occurs_dimensionで取り出した次元数を超える場合は,何も展開されません。
  • SEWB+/RECORD DEFINERのレコード定義に取り込まれたデータ項目の場合,レコード定義で定義された上位項目の反復回数は展開されません。
(例1)
「データ項目D」の次元数として「2」が取り出された場合を考えてみましょう。キーワード「@データ項目d」は「データ項目D」に対応するとします。ルールスクリプトに「@occurs1(@データ項目d)」と記述すると,反復回数が定義されたデータ項目のうち,結合関係の最も上位にある「データ項目B」の反復回数が取り出されます。また,「@occurs2(@データ項目d)」と記述すると,一つ下位の反復回数が定義されたデータ項目,つまり「データ項目D」の反復回数が取り出されます。なお,「データ項目D」の配列の次元数は「2」となっているため,@occurs3を使用しても何も展開されません。
[図データ]
(例2)
@occurs_dimensionと@occurs1~@occurs9を組み合わせたルールスクリプトの記述例を示します。まず,@occurs_dimensionを使って,キーワード「@コード」に対応するデータ項目の,結合関係の最も上位にあるデータ項目からの配列の次元数を取り出します。各次元の結合項目に定義された反復回数分,処理をループして,配列に含まれるすべてのコードの数字チェックを行います。
[図データ]
(f) @modify

キーワードに対応するデータ項目名を修飾情報(全パスの項目名)付きで取り出します。

形式
@modify(キーワード)
規則
  • 取得するデータ項目名の修飾順序は,SEWB+/CONSTRUCTIONのテンプレート @@lang文のMODIFY_ORDER句の指定に従います。MODIFY_ORDER句の指定がなく,ルールスクリプトを記述している言語が「C又はC++」,「COBOL又はOOCOBOL」以外の場合,修飾順序はDESCEND(上位レベル項目から下位レベル項目の順に修飾)になります。
  • 取得するデータ項目の言語区分はSEWB+/CONSTRUCTIONのテンプレート @@lang文のFOR_REPOSITORY句の指定に従います。指定された言語別の名前が定義されていない場合,共通のデータ項目名となります。指定された言語区分がSEWB+/REPOSITORYの辞書に登録されているものと一致しない場合,ソースプログラムの生成時にエラーとなります。
  • 修飾情報の連結文字はSEWB+/CONSTRUCTIONのテンプレート @@lang文のMODIFY_CONNECT句の指定に従います。MODIFY_CONNECT句の指定がなく,ルールスクリプトを記述している言語が「C又はC++」,「COBOL又はOOCOBOL」以外の場合,修飾情報(データ項目名)がそのまま連結されて置換されます。
  • 最上位結合項目名はSEWB+/CONSTRUCTIONのテンプレート @@rule文のTOP句で指定した文字列に変更して取得できます。
  • 取得するデータ項目名には,SEWB+/CONSTRUCTIONのテンプレート @@rule文で指定した接頭語および接尾語を付けられます。
  • 取得するデータ項目の上位項目に繰り返しがある場合,ソースプログラムの生成時にエラーとなります。
  • SEWB+/RECORD DEFINERのレコード定義に取り込まれたデータ項目の場合,レコード定義で定義された上位項目についての修飾は展開されません。
(例)
キーワード「@受注日」および「@手配日」に対応するデータ項目名を修飾情報付きの項目名に置き換えて,代入文を生成します。
[図データ]

(9) チェック処理を記述する場合には

データの妥当性をチェックする処理での,チェック結果を受けたエラー処理の記述について説明します。エラー処理は一般に,アプリケーション間で共通化することが望ましいと考えられます。したがって,エラー処理の内容や,エラー処理に使うデータ項目は,SEWB+/CONSTRUCTIONのテンプレート上に記述することをお勧めします(さらに,エラー処理部分は複数のテンプレートから汎用的に使えるよう,部品テンプレートにしておくことをお勧めします)。

業務ルールのチェック処理とテンプレートのエラー処理を適切に連携するには,データ項目名や相互でやり取りする値を正しく記述することが重要です。このため,業務ルールやテンプレートを作成する前に,あらかじめエラー処理の仕様を検討して,そのインタフェース(エラー処理に使用するデータ項目,やり取りする値など)を決めておきます。辞書の作成者およびテンプレート作成者は,この仕様に基づいて,業務ルールやテンプレートを作成するようにしてください。

(例)
業務ルールAおよびBでは共通に,「RTN-CODE」に処理結果を,「ERR-FLG」にエラーの有無を,「ERR-VALUE」にチェックしたデータの種類を設定しています。これらのデータ項目の定義とチェック結果に従って実行するエラー処理「ERR-DATA-EDIT-PROC」と「ERR-LIST-WRITE-PROC」は,テンプレート上に記述しています。
[図データ]

(10) 予約キーワードの留意事項

予約キーワード(「@type」,「@len」など)を記述する場合は,次の点に留意してください。