3. パラメータと入力フィールド
ユーザーインターフェイスの項目を追加すると、チュートリアル1から応用してInputScriptsの様々な使い方ができるようになります。
最初の例題では、プッシュボタンを2つ置いて、ユーザーが異なる2つのプラント用の品目リストを表示できるようにします。これらを1つのInputScriptで対応したいので、”PLANT” というパラメータを定義します。最初のプッシュボタンを押すと、プラント”1000” (ハンブルグ)用のInputScriptを開始し、2番目のプッシュボタンを押すとプラント”3000” (ウィーン)を開始します。InputScript内の”&U[PLANT]” は、パラメータの値を参照します。
// GuiXT Script
Box (0,1) (5,26) “品目”
Image (0.7,1) (4.4,15) “materials.jpg”
Pushbutton (1,16) “ハンブルグ” “/NSA38” process=“HinmokuList.txt” size=(2,10) using PLANT = “1000”
Pushbutton (3,16) “ウィーン” “/NSA38” process=“HinmokuList.txt” size=(2,10) using PLANT = “3000”
//InputScript “HinmokuList.txt”
Parameter PLANT
// ABAP: プログラム実行
Screen SAPMS38M.0101
Set F[プログラム] “RMMVRZ00”
Enter “/8” // 実行
// 品目一覧
Screen RMMVRZ00.1000
Set F[品目] “M-*”
Set F[プラント] “&U[PLANT]”
Enter “/8” // 実行
チュートリアル 1のInputScriptと比べると、シンプルになったことがお分かりになるかと思います。
最初のファンクションコード “/NSA38”はプッシュボタン定義の中にすでに定義づけられています。そのためスクリプト内の最初の”Screen”コマンドを取り除きます。これでスクリプトが実行されたときにScreen-Enterサイクルを1つ省くことができます。
複数のプッシュボタンを定義せずに、ラジオボタンと1つのプッシュボタンの組み合わせでも対応できます。
以下の例題は、トランザクションVA01(受注入力)で異なる受注タイプを表示しています。
// GuiXT Script
del X[IMAGE_CONTAINER] // X[IMAGE_CONTAINER]
Box (0,0) (8,36) “受注管理”
Image (0.7,0.3) (7.2,14.6) “order.png” “-plain”
// 受注タイプのデフォルト値をセット
if not V[VA01_Ordertype]
Set V[VA01_Ordertype] “BV”
endif
// 受注タイプの選択
RadioButton (1,16) “現金販売” Name=“VA01_Ordertype” value=“BV”
RadioButton (2,16) “緊急発注” Name=“VA01_Ordertype” value=“SO”
RadioButton (3,16) “インターネット受注” Name=“VA01_Ordertype” value=“ZA”
RadioButton (4,16) “返品” Name=“VA01_Ordertype” value=“RE”
Pushbutton (6,19) “受注登録” “/OVA01” Process=“startva01.txt” “size=2”
// InputScript “startva01.txt”
Screen SAPMV45A.0101
// パラメータ U[ORDERTYPE] を F[受注タイプ]フィールドにセット
Set F[受注タイプ] “&V[VA01_Ordertype]”
Set F[販売組織] “1000”
Set F[流通チャネル] “10”
Set F[営業所] “1000”
Enter
上記の場合、グローバル変数 V[VA01_Ordertype]を使用して作業しました。この場合、”/OVA01”コマンドを使用して、オルタナティブモードでトランザクションVA01を開始することはできません。理由は、各SAPセッションにはInputScriptの一連の変数があるためです。
”/OVA01”コマンドで開始するには、下記の様に、受注タイプをパラメータとして渡す必要があります。
//受注タイプのデフォルトの値をセット
if not V[VA01_Ordertype]
Set V[VA01_Ordertype] “BV”
endif
//受注タイプの選択
RadioButton (1,16) “現金販売” Name=“VA01_Ordertype” value=“BV”
RadioButton (2,16) “緊急発注” Name=“VA01_Ordertype” value=“SO”
RadioButton (3,16) “インターネット受注” Name=“VA01_Ordertype” value=“ZA”
RadioButton (4,16) “返品” Name=“VA01_Ordertype” value=“RE”
Pushbutton (6,19) “受注登録” “/OVA01” Process=“startva01.txt” “size=2”
using ORDERTYPE = [VA01_Ordertype]
// InputScript “startva01.txt”
Parameter ORDERTYPE
Screen SAPMV45A.0101
// パラメータ U[ORDERTYPE] を F[受注タイプ]フィールドにセット
Set F[受注タイプ] “&U[ORDERTYPE]”
Set F[販売組織] “1000”
Set F[流通チャネル] “10”
Set F[営業所] “1000”
Enter
入力フィールドも同様にラジオボタンとして定義することができます。各入力フィールド(コマンド “Inputfield”)はGuiXT変数を正確に参照します。変数の値は入力フィールドに表示され、ユーザーが入力フィールドに入力した値は変数の値を更新します。
2つ目の例題では、ユーザーは3プラントにおける品目の利用可能在庫を表示します。SAPのBAPIを利用して数を計算します。
品目番号は直接入力することも、あるいは、検索ヘルプから入力することもできます。
各項目に3つの数が表示された。
品目番号が間違っている場合、エラーメッセージを表示します。
// GuiXT Script
pos A[IMAGE_CONTAINER] (0,50) // A[IMAGE_CONTAINER]
Box (0,0) (8,36) “利用可能在庫”
InputField (1,1) “品目” (1,16) name=“AV_Material” size=18 techname=“MARA-MATNR” -uppercase
Text (2,1) “&V[AV_Materialtext](1-34)” -proportional -intensified
Text (3,2) “ハンブルグ”
Text (3,12) “&V[AV_Materialquantity1]” -border size=8
Text (3,22) “&V[AV_Materialunit]”
Text (4,2) “ベルリン”
Text (4,12) “&V[AV_Materialquantity2]” -border size=8
Text (4,22) “&V[AV_Materialunit]”
Text (5,2) “ウィーン”
Text (5,12) “&V[AV_Materialquantity3]” -border size=8
Text (5,22) “&V[AV_Materialunit]”
Pushbutton (7,2) “利用可能数を表示” Process=“availability.txt” size=(1,32)
using MATNR = [AV_Material]
// InputScript “availability.txt”
// 変数をリセット
Set V[AV_Materialtext]
Set V[AV_Materialunit]
Set V[AV_Materialquantity*]
// テキストと単位を読む
Call “BAPI_MATERIAL_GET_DETAIL” in.MATERIAL=“&V[AV_Material]” out.MATERIAL_GENERAL_DATA=“AV_materialdata”
// オフセットを使用
Set V[AV_Materialtext] “&V[AV_materialdata](1-41)”
Set V[AV_Materialunit] “&V[AV_materialdata](156-158)”
// 品目は存在する?
if not V[AV_Materialtext]
return “E: 品目 &V[AV_Material] は存在しません。” -statusline
endif
// 利用可能在庫を読む
Call “BAPI_MATERIAL_AVAILABILITY” in.MATERIAL=“&V[AV_Material]” in.PLANT=“1000” in.UNIT=“&V[AV_Materialunit]” out.AV_QTY_PLT=“AV_Materialquantity1”
Call “BAPI_MATERIAL_AVAILABILITY” in.MATERIAL=“&V[AV_Material]” in.PLANT=“1200” in.UNIT=“&V[AV_Materialunit]” out.AV_QTY_PLT=“AV_Materialquantity2”
Call “BAPI_MATERIAL_AVAILABILITY” in.MATERIAL=“&V[AV_Material]” in.PLANT=“3000” in.UNIT=“&V[AV_Materialunit]” out.AV_QTY_PLT=“AV_Materialquantity3”
// 小数第4位で表示
Set V[AV_Materialquantity1] &V[AV_Materialquantity1] / 1000
Set V[AV_Materialquantity2] &V[AV_Materialquantity2] / 1000
Set V[AV_Materialquantity3] &V[AV_Materialquantity3] / 1000
// メッセージ + スクリーン再表示
Return “S: 利用可能在庫が計算されました。” -statusline