5. カラムの追加(1)
SAPトランザクションでデータを表示したり、テーブルにデータを入力するために、テーブルコントロールを使用しています。インプットアシスタントはテーブルコントロールにカラムを追加して、そのカラムにデータを表示させることができます。更に、ユーザーが追加データを入力した後に、InputScriptで処理させることもできます。
データ表示のテクニックは特別複雑というわけではありませんが、データ入力処理には細部に多少注意を要します。このチュートリアルでは、読み取り専用を扱います。
このチュートリアルのアプリケーションの作成手順は以下の通りです。
① トランザクションVA01(受注伝票登録)で“以前の受注情報を表示”というボタンを作成します。ユーザーがこのボタンをクリックすると、今までに入力された受注情報を品目ごとに表示します。
② 同じ顧客からの以前の受注情報を表示するためには、SAP BAPIを使って品目の各受注項目を読み込みます。受注数量、受注伝票日付、品目の受注番号を表示するためテーブルカラムを3つ追加します。
VA01受注入力: 3つの新規カラムを挿入するための”以前の受注情報を表示” ボタンを追加。
完成後のスクリーンは以下の通りです。
品目ごとに以前の受注数量、以前の日付、以前の受注番号が3つのカラムに表示された。
上記の機能を2ステップに分けて実装します。
初めに、手順①の、3つの追加のテーブルカラムを表示するボタンを実装します。
// GuiXT Script SAPMV45A.J4001.TXT
// VA01、受注管理タブのみに適用
if Q[Transaction=VA01] and Q[Page=Sales]
// VA01、受注管理タブのみに適用
if Q[Transaction=VA01] and Q[Page=受注管理]
// テーブル下のアイコンボタン”明細詳細: 設定”の右側にボタンを表示
if not V[VA_show_cols]
Pushbutton P[明細詳細: 設定]+(0,23) “@3S@過去の受注情報を表示” process=“VA_show_cols.txt”
else
Pushbutton P[明細詳細: 設定]+(0,23) “@3T@過去の受注情報を非表示” process=“VA_hide_cols.txt”
//新規の3つのテーブルカラムを追加して、各項目の過去の受注数量を表示
Column “以前の受注数量” size=10 name=“VA_pq” position=4 -readonly -alignright
Column “以前の伝票日付” size=10 name=“VA_pd” position=5 -readonly -alignright
Column “以前の受注番号” size=10 name=“VA_po” position=6 -readonly -alignright
endif
endif
VA01の第一画面のフラグ V[VA_show_cols]はリセットできます。リセットしないと、ユーザーが選択した設定(追加情報の表示や非表示)が次のVA01トランザクションでも有効なままになってしまいます。
下記の2つのInputScriptは非常にシンプルです。
// InputScript VA_show_cols
Set V[VA_show_cols] “X”
Return
// InputScript VA_hide_cols
Set V[VA_show_cols] “”
Return
ユーザーがボタンをクリックすると、表示/非表示できる3つの空のカラムを作成された。
カラムのヘッダに適切なアイコンを表示することも可能です。
追加したアイコンがカラムタイトルに表示された。
アイコンは、”@XX@テキスト…”という表記により表示されます。XXの部分にはSAPのアイコンIDを入れます。今回の例では、アイコンIDに @OX@ を使用しました。
// 各項目の過去の受注数量を表示するために3つのテーブルカラムにアイコンを付けて追加
Column “@OX@以前の受注数量” size=10 name=“VA_pq” position=4 -readonly -alignright
Column “@OX@以前の伝票日付” size=10 name=“VA_pd” position=5 -readonly -alignright
Column “@OX@以前の受注番号” size=10 name=“VA_po” position=6 -readonly -alignright
最後に新規のカラムに必要なデータを入れます。カラムの裏にある変数は、カラムコマンドのパラメータ “name=..” に従って命名され、行番号が追加されます。
例:
row1: V[VA_pq.1] V[VA_pd.1] V[VA_po.1]
row2: V[VA_pq.2] V[VA_pd.2] V[VA_po.2]
row3: V[VA_pq.3] V[VA_pd.3] V[VA_po.3]
row4: V[VA_pq.4] V[VA_pd.4] V[VA_po.4]
row5: V[VA_pq.5] V[VA_pd.5] V[VA_po.5]
row6: V[VA_pq.6] V[VA_pd.6] V[VA_po.6]
row7: V[VA_pq.7] V[VA_pd.7] V[VA_po.7]
row8: V[VA_pq.8] V[VA_pd.8] V[VA_po.8]
row9: V[VA_pq.9] V[VA_pd.9] V[VA_po.9]
row10: V[VA_pq.10] V[VA_pd.10] V[VA_po.10]
row11: V[VA_pq.11] V[VA_pd.11 V[VA_po.11]
行インデックスは目視可能な部分だけではなく、テーブルコントロール全体に有効です。例えばユーザーがテーブルコントロールをrow4にスクロールすると、上記の表の青い文字の行だけがスクリーンに表示されるようになります。
カラムの変数V[VA_pq.1]に値をセットする時、2つのアプローチが可能です。まずは、トランザクションの最初にすべての変数を埋めてしまって、スクロールについては気にしないという方法があります。この場合、テーブル全体が読み取り専用モードの場合は有効ですが、ユーザーが各フィールドの品目番号を変更したり、行を追加・削除するような場合は適切な方法とはいえません。
こういった場合には、画面を表示するたびに、目視可能な部分(上記の青色の部分)のみに、カラムの変数を設定する方法が適切と思います。後者の方法を行うには、基本的に以下のようなコードが必要です。
// 表示されている全ての行をループ
GetTableAttribute T[全明細] firstvisiblerow=“fvr”
Set V[i] 1 // スクリーン行番号(表示されている部分のみ)
Set V[k] &V[fvr] // 絶対行番号; 上記表の例では、k=4となる
label prev_order_beg
//残っている行は?
Set V[item] “&cell[全明細,明細,&V[i]]”
if not V[item]
goto prev_order_end
endif
//可視行iの処理、 絶対行番号はk
… Set V[colvar.&V[k]] “some value”
// 次の行
Set V[i] &V[i] + 1
Set V[k] &V[k] + 1
goto prev_order_beg
label prev_order_end
この後、このフレーム内に正しいデータを読み込みます。読み込みには”BAPI_SALESORDER_GETLIST” を呼び出します。BAPI用の入力パラメータは顧客番号、品目番号、販売エリアです。その後BAPIは特定の顧客・品目・販売エリア用の受注項目のテーブルを返します。 受注項目は日付でソートされて、最新の日付が一番上になりますので、このテーブルの最初の行には最新の受注情報が表示されるようになります。
受注数量はパック形式で返されるため、”Set”コマンドの ”-unpack” オプションを適用します。また、受注番号の数値の前に付いているゼロを消して、DD.MM.YYYYの形式で日付を表示します。
スクリプト全体は以下の通りです。
// GuiXT Script SAPMV45A.J4001.TXT
// VA01、受注管理タブのみに適用
if Q[Transaction=VA01] and Q[Page=受注管理]
// テーブル下のアイコンボタン “明細詳細: 設定” の右側にボタンを表示
if not V[VA_show_cols]
Pushbutton P[明細詳細: 設定]+(0,15) “@3S@以前の受注情報を表示” process=“VA_show_cols.txt”
else
Pushbutton P[明細詳細: 設定]+(0,15) “@3T@以前の受注情報を非表示” process=“VA_hide_cols.txt”
//新規に3つのテーブルカラムを追加して、各項目用の以前の受注数量を表示
Column “以前の数量” size=10 name=“VA_pq” position=4 -readonly -alignright
Column “以前の伝票日付” size=10 name=“VA_pd” position=5 -readonly -alignright
Column “以前の受注番号” size=10 name=“VA_po” position=6 -readonly -alignright
// 表示されている全ての行をループ
GetTableAttribute T[全明細] firstvisiblerow=“fvr”
Set V[i] 1
Set V[k] &V[fvr]
// 以前の値を削除
Set V[VA_pq.*] “”
Set V[VA_pd.*] “”
Set V[VA_po.*] “”
Set V[customer] “&F[受注先]”
Set V[customer] 10000000000 + &V[customer]
Set V[customer] &V[customer](2-11)
label prev_order_beg
// 残っている行は?
Set V[item] “&cell[全明細,明細,&V[i]]”
if not V[item]
goto prev_order_end
endif
Set V[matnr] “&cell[全明細,品目,&V[i]]”
if not V[matnr]
goto prev_order_end
endif
// 品目番号を内部書式に変換する >> /GUIXT/EXT2INTについてはチュートリアル7を参照
Call “/GUIXT/EXT2INT” cache=“session” in.EXTVALUE=“&V[matnr]” in.DOMNAME=“MATNR” out.INTVALUE=“matnr_int”
// SAP BAPIを使って受注情報を読む –*
Call “BAPI_SALESORDER_GETLIST” cache=“transaction” in.CUSTOMER_NUMBER=“&V[customer]” in.MATERIAL=“&V[matnr_int]” table.SALES_ORDERS=so
// 一行目を読む。以前で最も最近の品目受注情報が入っている
CopyText fromText=“so” toString=“sowa” line=1
if Q[ok] // それ以外の場合は、この品目の以前の受注情報はない
// 返されたBAPIのテーブルから、作成したカラムにフィールドを移動させる
// 受注数量: BAPIは小数点以下3桁を含む “パック10進数” で返す
Set V[quantity] “&V[sowa](BAPIORDERS-REQ_QTY)” -unpack
Set V[quantity] “&V[quantity]” / 1000 decimals=0
Set V[VA_pq.&V[k]] “&V[quantity]”
// 伝票日付: 元の形式はYYYYMM、 ここではDD.MM.YYYY を使用する
Set V[date] “&V[sowa](BAPIORDERS-DOC_DATE)”
Set V[VA_pd.&V[k]] “&V[date](7-8).&V[date](5-6).&V[date](1-4)”
// 受注番号: 先頭に0が付いているので計算して取り除く
Set V[ordno] “&V[sowa](BAPIORDERS-SD_DOC)”
Set V[ordno] &V[ordno] + 0
Set V[VA_po.&V[k]] “&V[ordno]”
endif
Set V[i] &V[i] + 1
Set V[k] &V[k] + 1
goto prev_order_beg
label prev_order_end
endif // V[VA_show_cols]
endif // VA01 + page=受注管理