7.31.4 PTYROUTINEで使用するDEFINE_MAP

コンポーネントのプロパティを定義する場合は、オプションとしてPTYROUTINコマンドを使用すると、プロパティ値を設定するルーチンを指定したりプロパティの値を返すことができます。プロパティのルーチンは、値を派生させたりフォーマットするなど、何らかの方法で値を操作する場合にのみ使用できます。

値を設定するプロパティ・ルーチンには、DEFINE_MAPステートメントが含まれていて、これによってルーチンに入力する値のタイプ(*INPUT)を指定します。プロパティの値を返すプロパティ・ルーチンには、ルーチンが返す値の種類(*OUTPUT)を定義するDEFINE_MAPステートメントが含まれています。

例として、Form Bを使用してみましょう。このフォームには、ユーザー定義のプロパティである、EMP_NAMEが含まれています。このプロパティは、Form Bに記載されている社員名の値を設定するために、Form Bのオーナー・フォームで使用することができます。プロパティは、Form Bに記載されている社員名の現在値を取得する目的でも、Form Bのオーナー・フォームで使用することができます。Form Bの社員名は、#GIVENAMEと#SURNAMEという2種類の個別のフィールドとして処理されます。

以下のコードでは、Form Bでプロパティを定義し、その値をSET_EMP_NAMEという名前のプロパティ値を使用して設定し、GET_EMP_NAMEというプロパティ・ルーチンによって値を返します。

define_pty name(EMP_NAME) set(SET_EMP_NAME) get(GET_EMP_NAME)
 

入力パラメータの定義

Form Bには、以下のように、このSET_EMP_NAMEルーチンが含まれています。

ptyroutine name(SET_EMP_NAME) 
  define_map *input class(#fullname) name(#this_emp)
*  <<logic to split #this_emp to #GIVENAME and #SURNAME>>
endroutine 
 

このルーチンのDEFINE_MAPステートメントでは、EMP_NAMEプロパティによって、#FULLNAMEフィールドに対して有効な値を取り出すことができ、その値は、このルーチン内の#this_empという名前を使用して識別されることが指定されます。

これで、オーナー・フォームはForm BのEMP_NAMEプロパティの値を設定することができます。以下にその例を示します。

set #FORMB EMP_NAME(#fullname)
 

または

set #FORMB EMP_NAME('John Smith')
 

出力パラメータの定義

Form Bには、以下のように、EMP_NAMEプロパティの値を返すGET_EMP_NAMEルーチンも含まれています。

ptyroutine name(GET_EMP_NAME) 
   define_map *output class(#fullname) name(#this_emp)
*  <<logic to concatenate #GIVENAME and #SURNAME to form #this_emp>>
endroutine 
 

このルーチン内のDEFINE_MAPステートメントでは、#FULLNAMEに対して有効な値をEMP_NAMEプロパティが返すように指定されています。出力値は、名前を表す#this_empを参照した値です。その後、このルーチンは#GIVENAMEと#SURNAMEの値を連結して、値#this_empを作成し、これがEMP_NAMEプロパティの値として返されます。

これで、オーナー・フォームは以下のように、EMP_NAMEの値に対するクエリーを実行することができます。

IF COND(#FormB.Emp_Name *eq 'John Smith')