Tivoli Service Desk 6.0 Developer's Toolkit Script プログラミングの手引き
TSD Script は記述 (リソース) ファイルからウィンドウ作成するために使用されるフォーム・システムを提供します。
フォームはデータ入力フォームのタイプが入っているウィンドウです。GUI 環境では、フォームは、ユーザーとアプリケーションとの間で対話するための主要な手段です。開発者は、ツールバーからコントロールを選択して、それをブランク・フォームに入れます。 フォーム・コントロールには次があります。
フォーム・コントロールは、ユーザーから情報を得るため、またはユーザーに情報を送るために使用される要素です。たとえば、データ入力フォームには通常は 1 つまたは複数のテキスト・ボックス・コントロール、「了解」ボタン、および「取消」ボタンがあります。 Developer's Toolkit Interface Designer は、フォームにコントロールを追加するために使用することができます (詳細説明については、 Tivoli Service Desk 6.0 Developer's Toolkit Interface Designer の手引き を参照してください) 。
次のリストには、 TSD Script によってサポートされるすべてのフォーム・コントロールが入っています。
コントロール名 | 説明 |
サブフォーム | 他のいくつかのコントロールを含む複雑なコントロール |
テキスト・ボックス | ユーザーが 1 行の情報を入力することができる長方形の領域。 ユーザーが 1 行に適するテキストよりも長く入力すると、ボックスは自動的にスクロールします。 |
複数行テキスト・ボックス | 複数行のテキストを入力するために使用される長方形の領域。オプションでテキストをボックス内部でワード・ラップすることができます。 |
リスト・ボックス | 選択可能項目のリストが入った方形のボックス。 ユーザーはリスト・ボックスで選択を入力することはできません。 |
コンボ・ボックス | リスト・ボックスが付加されたテキスト・ボックス。ユーザーはテキスト・ボックスに値を入力するか、またはドロップダウン・リストで値を選択できます。 選択された値はテキスト・ボックスに表示されて、リスト・ボックスは消えます。 |
ツリー | 階層データを表示するコントロール。 |
オプション・ボタン | 相互排他的な選択項目のセットの 1 つを選択するために使用されるボタン。 ユーザーがボタンを選択すると、そのボタンは埋め込みされます。 |
チェック・ボックス | オプションをオンまたはオフにするために選択またはクリアできるオプションが入った正方形のボックス。 複数のチェック・ボックスを 1 度に選択することができます。 |
スライダー | 対話式に移動するバー。 |
ボタン | アクションを開始する長方形のボタン。 |
テキスト | テキストを表示するフィールド。ユーザーはテキストを変更できません。 |
クロック | 実行時刻クロックまたは経過時間カウンター機構。 |
テーブル | 行および列で構造化されたデータ。 |
ハイパーテキスト | ハイパーテキスト・フォーマットでテキストを表示する領域。 |
グループ・ボックス | いくつかのコントロールを意味または機能別にグループ化した長方形フレーム。 |
イメージ | ファイルからのイメージを表示するフィールド。 |
フォームは別個のアプリケーション・リソースとして保守されます。 Developer's Toolkit によってフォーム仕様のコレクションを作成し、それを .df の拡張子を付けたファイルに保管することができます。知識ベース・ファイルと同様に、そのような仕様に対してソース・フォームおよびオブジェクト・フォームの両方があります。 .df ファイルにはメニュー、ツールバー、およびストリングが使用できます。
インターフェース生成プログラムは、ソース .df ファイルを使用してオブジェクト .dfc ファイルを作成する TSD Script プログラムです。 .dfc ファイルは Developer's Toolkit によって実行時にロードおよび表示されます。
次の TSD Script コード断片化の例はフォームを使用します。
TYPES EmployeeRecord IS RECORD first, last, ssn : STRING; salary : REAL; department : STRING; END; VARIABLES employee: EmployeeRecord; ACTIONS IF DlgBox($Desktop,'EMPLOYEE.DFC[ADDFORM]', $NullHandler,employee) > 0 THEN SQLInsert('EMPLOYEES',employee); END;
この例では、新規 EmployeeRecord タイプはタイプ・セクションで宣言されています。 また、変数セクションにもこのタイプの変数があります。 レコード・フィールド名はフォーム・コントロール名と同じです。
アクションのセクションにある DlgBox ステートメントは、次を実行します。
また、フォームには一般的に「了解」ボタンおよび「取消」ボタンがあります。
DlgBox ステートメントは次の 4 つの引き数を使用します。
引き数のタイトル | 説明 |
親ウィンドウ | 新規フォームの親であるウィンドウに対するハンドル。 |
フォーム・ファイル | コンパイルされたフォーム仕様ファイルの名前。ファイルに複数のフォーム仕様が入っている場合には、 必要なフォームの名前をファイル名の次に大括弧で囲む必要があります。 |
イベント・ハンドラー | 前に説明した一般ウィンドウと同様に、すべてのフォームにはそれと関連したイベント・ハンドラーがあります。 時には、ハンドラーに各イベントのデフォルト・アクションを実行させたい場合があります。その場合には、 ユーザーが「受諾」プロパティーをもつボタンを選択すると、 TSD Script はフォーム・コントロールの内容を結果変数にある対応するフィールドに、 |
結果変数 | フォームのコントロールに対応するフィールドをもつレコード変数。 ユーザーが「受諾」プロパティーをもつボタンを押してフォームを終了すると、フォームのすべてのコントロールの内容が、 |
別の例を考えてみます。
TYPES EmployeeRecord IS RECORD first, last, ssn : STRING; salary : REAL; department : STRING; END; VARIABLES employee: EmployeeRecord; ACTIONS SQLSelectInto('SELECT * FROM EMPLOYEES WHERE SSN=305-33-4111',employee); IF DlgBox($Desktop,'EMPLOYEE.DFC[EDITFORM]', $NullHandler{employee},employee) >> 0 THEN SQLUpdate('EMPLOYEES','WHERE SSN=''' & employee.snn & '''',employee); END;
この例では次のコードを表示します。
この DlgBox ステートメントに対して 2 つの変更を行いました。
この例では、ユーザーはフォームの EMPLOYEES テーブルから検索された情報を参照し、フォームに移動して情報を変更できます。
拡張機能 (ユーザーがボタンを選択すると従業員の写真を表示したり、社会保障番号のフォーマットを妥当性検査するなど) を操作するには、イベント・ハンドラーを使用しなければなりません。 これを行うには、フォーム・イベント・ハンドラーを作成する必要があります。
このセクションでは、イベント・ハンドラーをもつフォームを説明します。この例では、従業員と呼ばれる知識ベース全体を表示します。従業員は AddEmployee と呼ばれる単一の共通機能を設定します。 AddEmployee の本文は前の例と類似していますが、 $NullHandler を使用する代わりに、 EmployeeEvent と呼ばれるイベント・ハンドラーを参照します。
KNOWLEDGEBASE Employees; USES Globals; TYPES EmployeeRecord IS RECORD first, last, ssn : STRING; salary : REAL; department : STRING; END; ROUTINES FUNCTION AddEmployee: BOOLEAN; PRIVATE ROUTINES EVENT EmployeeEvent(REF employee: EmployeeRecord) IS ROUTINES
FUNCTION ValidSSN(VAL ssn: STRING): BOOLEAN IS VARIABLES i: INTEGER; ACTIONS IF StrLength(ssn) <> 11 THEN EXIT(FALSE); END; FOR i:=1 TO 11 DO IF (i = 4 OR i = 7) AND (ssn[i] <> '-') THEN EXIT(FALSE); ELSIF StrPos('0123456789',ssn[i]) = 0 THEN EXIT(FALSE); END; END; EXIT(TRUE); END (* Valid SSN *);
ACTIONS WHEN $Event IS $MsgSelect THEN WHEN $FieldName IS 'SSN' THEN IF NOT ValidSSN(employee.ssn) THEN Exit(0); END; ELSWHEN 'PICTURE_BUTTON' THEN ShowPicture(employee.last_name & '.BMP'); END; END; END (* Employee Event *);
FUNCTION AddEmployee: BOOLEAN IS VARIABLES employee: EmployeeRecord; ACTIONS IF DlgBox(mainWindow, 'EMPLOYEE.DFC[ADDFORM]', EmployeeEvent{employee},employee) > 0 THEN SQLInsert('EMPLOYEES',employee); EXIT(TRUE); ELSE EXIT(FALSE); END; END (* Add Employee *);
EmployeeEvent は、DlgBox で渡された戻り変数と同じタイプの参照による単一パス・パラメーターを使用するイベント・ハンドラーです。
イベント・ハンドラーがテストするのはイベント $MsgSelect 1 つだけであり、フォームがカーソルを現行コントロールの外側に移動しようとする時に生成されます。
ユーザーが値をテキスト・コントロールに入力して TAB キーを押すと、 $MsgSelect イベントが生成されます。 ユーザーが離れようとしているコントロールの名前は、このイベントと一緒に $FieldName と呼ばれる「不可視の」パラメーター中に入ります。
次の例は EmployeeEvent の本文でさらに詳しく説明します。
WHEN $Event IS $MsgSelect THEN WHEN $FieldName IS 'SSN' THEN IF NOT ValidSSN(employee.ssn) THEN Exit(0); END; ELSWHEN 'PICTURE_BUTTON' THEN ShowPicture(employee.last_name & '.BMP'); END; END;
この例は次を図示します。
デフォルトの結果は "1," であり、これは正常に実行されたことを示します。ただし、異なる値を戻す必要がある場合があります。
TSD Script が自動的に生成する特定のイベントは、イベント・ハンドラーが値 0 で終了すると拒否されます。 $MsgSelect はそのようなイベントです。
EmployeeEvent が SSN フィールドの $MsgSelect イベントを処理中に無効な社会保障番号が指定されたことを検出すると、値 0 で終了されます。
このオカレンスはイベントの拒否として知られます。この拒否の結果は、次の 2 つになります。
通常は、 $MsgSelect イベントはフォームの一部が変更されたことを通知します。 $MsgSelect は次の 3 つの方法の 1 つで生成できます。
注: $MsgSelect が生成されるのは、新しい値が古い値とは異なる時だけです。
注: ENTER を押すことは、デフォルト・コマンド・ボタン (定義されている場合) を選択することと同じです。 これは $MsgAccept イベントを生成します。 デフォルト・コマンド・ボタンがない場合には、 $MsgSelect イベントが生成されます。
イベント・ハンドラーが $MsgSelect イベントを受け取ると、ウィンドウ・インスタンス・データ (イベント・ハンドラーがそのレコード引き数で参照する) が更新されて変更を反映します。たとえば、ユーザーが値を SSN テキスト・ボックスに入力して TAB キーを押すと、値はウィンドウ・インスタンス変数の SSN フィールドにコピーされて $MsgSelect イベントが生成されます。 前のフィールド値は最初の名前なしイベント・パラメーターで使用可能です。
コントロールの値は選択メッセージが完了するまで未定義であり、そのためにコントロール値は照会できません。
フォームは次のような多数の追加イベントを生成できます。
フォーム・イベント | 説明 |
$MsgInitialize | フォームの作成段階中にだけ起こる $MsgSelect の特殊バージョン。 |
$MsgCreate | フォームが表示される直前に受け取ります。この時点は、選択可能項目のリストをリスト・ボックスに追加するなど、 初期化の実行に適しています。 |
$MsgDestroy | フォームがクローズされる直前に受け取ります。 |
$MsgAccept | ユーザーがフォームを受け入れる時 (通常は ENTER を押すか「了解」を選択する) に受け取ります。 |
$MsgCancel | ユーザーがフォームを取り消す時 (通常は ESCAPE を押すか「取消」を選択する) に受け取ります。 |
$MsgEnterField | カーソルが新しいコントロールを指定しようとする時に受け取ります。 $FieldName には 新しいコントロールの名前が入っています。 |
$MsgExitField | カーソルがコントロールを離れようとする時に受け取ります。 $FieldName にはそのコントロールの名前が入っています。 |
$MsgHelp | ユーザーが HELP または F1 キーを選択する時に受け取ります。 |
$MsgMandField | 1 つまたは複数の必須テキスト入力ボックスが埋まっていない状態で、ユーザーがフォームを受け入れようとする時に受け取ります。 $FieldName には、ブランクになっている最初の必須テキスト入力ボックスの名前が入っています。デフォルトでは、システムにより |
フォームの各コントロールには名前があります。前の例では、フォームはタイプ EmployeeRecord の変数を埋めるために必要な情報を得るために使用されました。レコードに FIRST_NAME と呼ばれるフィールドがあるために、 FIRST_NAME と呼ばれるフォーム・コントロールも必要です。 ユーザーが値を FIRST_NAME フォーム・コントロールに入力すると、情報は FIRST_NAME レコード・フィールドにコピーされます。
注: 一部のコントロールはデータを運びません。たとえば、コマンド・ボタンは値をもたず、イベントを生成します。 そのために、フォームのボタンにはレコード・フィールドをもたせる必要はありません。
次のフォーム・コントロールの追加の属性を指定できます。
属性 | 説明 |
読み取り専用 | コントロールのデータは、ウィンドウ・インスタンス・レコードによって初期化され、ユーザーによって変更できません。 |
必須 | すべての必須コントロールに値が指定されるまで、ユーザーはフォームを受け入れることができません。 |
入力長 | ユーザーがテキスト・フィールドでコントロールに入力できる文字数を指定します。 |
特定のコントロールだけに影響するその他の属性があります。たとえば、複数行テキスト・ボックスのワード・ラップをオンまたはオフにすることができます。
テーブルは SQL 結果テーブルを表示するために使用されるウィンドウです。 SQL 結果テーブルは行と列のセットです。
テーブルはフォーム・コントロールとして使用され、次を行うことができます。
テーブル内部の列はサイズ変更可能です。細い垂直バーが隣接する列を分離し、ユーザーはこのバーを位置変更して列の幅を変更できます。
選択ステートメントは .df ファイルまたは方針に基づいて指定される場合があります。
ステートメント | 説明 |
DlgSQLSelect | このステートメントによって、 TSD Script は指示された SQL 照会を出し、指示されたテーブル・コントロールの内容を照会の結果で最新表示することができます。 このステートメントは次の 3 つの引き数を使用します。
これはデータベースからテーブル・コントロールにデータを得るための最も有効な方法です。 |
DlgFieldValue | このステートメントは選択された行を検索するために使用できます。 このステートメントは次の 3 つの引き数を使用します。
その行からの列が同じ名前のレコード・フィールドにコピーされます (たとえば、 "FIRST_NAME" 列は r.FIRST_NAME にコピーされます) 。 |
DlgListBoxInsert | このステートメントは新しい行をテーブルに挿入します。 このコマンドは SQLInsert ステートメントを実行しませんが、新しい行を指示されたフォーム・コントロールに追加します。 このステートメントは次の 3 つの引き数を使用します。
突き合わせ値は該当する列にコピーされ、列が一致しないレコード・フィールドは無視されます。 |
DlgListBoxUpdate | このステートメントはテーブルで選択された行を更新します。このコマンドは SQLUpdate ステートメントを実行しませんが、フォームの情報を更新します。 このステートメントは次の 3 つの引き数を使用します。
突き合わせ値は該当する列にコピーされます。列が一致しないレコード・フィールドは無視されます。 |
DlgListBoxDelete | このステートメントはテーブル・コントロールで選択された行を削除します。このコマンドは SQLDelete 操作を実行しませんが、フォーム・ウィンドウの指示されたコントロールから行を消去します。 このステートメントには、次の 2 つの引き数があります。
|
この例は WorkWithUsers と呼ばれる単一の共通プロシージャーをもつ Users と呼ばれる知識ベースを作成します。
KNOWLEDGEBASE Users; TYPES UserRecord IS RECORD $Select : String; user_ID : String; user_name : String; user_rights : Integer; END; ROUTINES PROCEDURE WorkWithUsers; PRIVATE ROUTINES EVENT UserEvent(REF user: UserRecord) IS; VARIABLES i: Integer; ROUTINES PROCEDURE AddUser IS; VARIABLES newUser: UserRecord; ACTIONS IF DlgBox($Desktop,'USERS.DFC[ADDFORM]',$NullEvent, newUser) > 0 AND SQLInsert('USERS',newUser) > 0 THEN DlgListBoxInsert($Handle,'USERLIST',newUser); END; END (* Add User *);
PROCEDURE EditUser IS; ACTIONS IF DlgFieldValue($Handle,'USERLIST',user) > 0 AND DlgBox($Desktop,'USERS.DFC[ADDFORM]',$NullEvent {user},user) > 0 AND SQLUpdate('USERS','USER_ID=''' user.user_ID & '''',user) > 0 THEN DlgListBoxUpdate($Handle,'USERLIST',user); END; END (* Edit User *);
PROCEDURE DeleteUser IS; ACTIONS IF DlgFieldValue($Handle,'USERLIST',user) > 0 AND SQLDelete('USERS','USER_ID='''&user.user_ID&'''') > 0 THEN DlgListBoxDelete($Handle,'USERLIST',user); END; END (* Delete User *);
ACTIONS WHEN $Event IS $MsgCreate THEN DlgSQLSelect($Handle,'USERLIST',user.$select); ELSWHEN $MsgSelect THEN WHEN $FieldName IS 'ADD_BUTTON' THEN AddUser; ELSWHEN 'EDIT_BUTTON' THEN EditUser; ELSWHEN 'DELETE_BUTTON' THEN DeleteUser; END; END; END (* User Event *);
PROCEDURE WorkWithUsers IS; VARIABLES UserWindow: WINDOW; user: UserRecord; ACTIONS user.$select = 'SELECT * FROM USERS'; DlgCreate($Desktop,userWindow, 'USERS.DFC [WORKWITHUSERS]', UserEvent{user}); END (* Work With Users *);
WorkWithUsers の役割は、次のコントロールでフォームを作成することです。
フォームの UserEvent イベント・ハンドラーは次のイベントを処理します。
~ $MsgSelect メッセージが、 $FieldName で渡されたコマンド・ボタンの名前 EDIT_BUTTON で生成されます。
~ イベント・ハンドラーは EditUser プロシージャーを呼び出して、このイベントを操作します。 EditUser は、最初に DlgFieldValue ステートメントを使用して選択された行の値を検索します。
~ 次に USERS.DFC から EDITFORM フォームを使用してユーザーが必要な変更を行うことができるフォームを作成します。
~ ユーザーがこのフォームを受け入れると、 SQLUpdate ステートメントを使用して USERS テーブルの行を更新し、DlgListBoxUpdate
を使用して USERLIST テーブル・コントロールの対応する行を更新します。
テーブルが保持するのは、その列記述によって指定された情報だけです。
これは SQL 結果テーブルに入っている列のサブセットである可能性があります。 DlgFieldValue コマンドを使用してテーブル・コントロールから行を検索する時には、そのコントロールの列に対応するフィールドだけが戻されます。 残りのレコードを完了するには、 SQLSelectInto または SQLSelect を実行する必要がある場合があります。
TSD Script は、次のいくつかのステップを行う処理で新しいフォームを作成します。
注: レコード・インスタンス変数のデータは、フォーム・ファイルで指定された初期値を上書きします。
モーダル・フォームは、先に進む前にユーザーがフォームを受け入れるか取り消すのをプログラムが待つフォームです。 モーダル・ダイアログ・ボックスが表示され、その他のウィンドウは選択できません。
モーダル・フォームは DlgBox で作成されます。 DlgBox の次のステートメントは、ユーザーが作成するフォームを完了するまで実行されません。 ユーザーによって指定される情報は、 DlgBox に対する 4 番目の引き数に戻されます。 これは出力レコード変数です。
モーダル・フォームは、重要なエラー・メッセージまたはユーザーが照会を応答しなければ続行できないクリティカル・ダイアログ・ボックス用に最初に予約される必要があります。 フォームのこのタイプの例は、ファイル削除に関連するメッセージである場合があります。
モードレス (非モーダル) ・フォームは、先に進む前にアプリケーションがユーザーを待たないフォームです。 これは、フォームを表示中に他のウィンドウに切り替えできることを意味します。
モードレス・フォームは DlgCreate で作成されます。 DlgCreate に呼び出しを行う時には、フォームの作成の処理がモーションに設定されます。 ただし、次のステートメントの実行は同時に起こります。
新しいフォームには、それ固有のユーザー・インターフェースとプログラム (イベント・ ハンドラー) があります。これは、ユーザーがフォームを受け入れるか取り消すまで、あるいはアプリケーションの別のパーツがクローズ・メッセージ ($MsgClose) を送るまで存在します。
注: イベント・ドリブン・プログラミングでは、モードレス・フォーム好まれます。
TSD Script は、タブ操作された「ページ」をもつ特殊なフォームを提供します。ページからページに移動するには、ユーザーはタブを選択します。
1 つまたは複数のフォームを結合して指定することにより、 Developer's Toolkit Interface Designer でタブ操作されたフォームを作成します。 実行時には、これらのフォームを使用できるのはフォームの他のタイプを実行する時だけです。 DlgBox または DlgCreate で作成することができます。 そのイベントを管理するために、イベント・ハンドラーを作成することができます。
タブ操作されたフォームを処理する時には、次に気を付けてください。
Tivoli Service Desk 6.0 Developer's Toolkit Script プログラミングの手引き