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=受注管理