5.カラムの追加(2)
このチュートリアルでは、新規のカラムにデータを入力するシナリオを扱います。トランザクションME51N(購買依頼登録)で、追加のテーブルカラムを使ったデータ入力を扱います。このトランザクションでは、大体の明細情報は明細概要のテーブルカラムに直接入力することができるのですが、中には、明細詳細ビューを開き、明細詳細ビューにある適切なタブをクリックして、そのタブにあるフィールドに情報を入力する必要があるフィールドも存在します。
注:SAP ERP2004以上の比較的新しいSAPシステムでは、ME51Nのデータ入力で、”グリッドコントロール” と”テーブルコントロール”(ツールバーのボタン ”Personal setting”)のどちらかを選択することが可能です。ここに記載したテクニックはテーブルコントロールのみに適用され、グリッドコントロールには適用されません。
標準画面:ユーザーは、各項目の明細詳細ビューを開き、”供給元”タブにある”購買組織”を入力する。
テーブルコントロール内に新規のカラムを作成して、”供給元”タブにある”購買組織”フィールドの明細詳細ビューを開かなくても、ユーザーが各項目の”購買組織”を直接入力することができるようにしてみたいと思います。
拡張テーブル:ユーザーは、テーブルコントロールに新規に作成された”購買組織”カラムに情報を入力する
他のSAPトランザクションと比較した場合、ME51Nにはある種の特殊性があります:
- 初期画面がないので、変数をリセットする便利な方法を見つける必要がある。
- 色々なスクリーンエレメント(テキストエリア、明細概要テーブル、明細詳細ビュー)を表示/非表示できるようになっている。
当トランザクションやその他の多くのトランザクションでも経験する可能性のあるもう一つの難点は、ユーザーがトランザクションでF3、F12、F15(戻る、中止、Leave)を押したときに表示されるポップアップでユーザーが「保存」できることです。 このような場合でも、更新用InputScriptを開始する方法が必要です。
まず、GuiXT Scriptを見ていきます:
if Q[Transaction=ME51N]
// if table is visible (can be hidden by user)
if T[Table]
// no entries in table? then clear all ME51N_ variables
GetTableAttribute T[Table] FirstVisibleRow=fvr
if V[fvr=1]
Set V[matnr] “&cell[Table,Material,1]”
if not V[matnr]
Set V[ME51N_*] “”
endif
endif
// create new column
Column “POrg” position=8 size=4 name=“ME51N_EKORG” keycolumn=“Requisn. item” techname=“MEREQ3322-EKORG”
// Additional column is active
Set V[ME51N_active] “X”
endif
// Additional column is active? else stop of script processing
if not V[ME51N_active=X]
Stop
endif
// no entry field in detail screen to avoid synchronization with table column
if F[Purch. organization]
del F[Purch. organization]
endif
// when saving call own script
on “/11” process=“ME51N_save.txt”
// when checking call own script
on “/39” process=“ME51N_save.txt”
using MODE = “C”
// when the user leaves the transaction, handle the “do you want to save” popup
on “/3” process=“ME51N_leave.txt”
on “/12” process=“ME51N_leave.txt”
on “/15” process=“ME51N_leave.txt”
Endif
スクリプトについてのコメント:
- 明細テーブルが空のときに変数をリセットします。
- 新規カラム “POrg”は、項目番号をキーカラムとして使用します。これは、ユーザーがアイテムを削除できるようにするために必要です。削除されたアイテムの上にあるアイテムごとに絶対行番号が変更されます。GuiXTは、利用可能になるとすぐにキーカラムの値をインデックスとして使用します。
- 新規カラムの検索ヘルプ(techname = …)も定義します。
- 購買組織の標準データ入力項目が画面から削除されます。もしこのフィールドにデータ入力を許可してしまったら、フィールドをカラムのデータ入力と同期させるのが困難になってしまいます。
- ユーザーが「チェック」ボタンを押すと、追加されたカラムに入力された”POrg” 項目も標準SAP項目にまず移送され、このフィールドについてもチェックが行われます。同じスクリプト “ME51N_save.txt”を使用しますが、追加のパラメータMODE = “C”を指定します。
- 終了ファンクション “/3″、 “/12″、 “/15″については、別のInputScript “ME51N_leave.txt”を開始します。
- バージョン2007 Q1以前のGuiXTバージョンでは、”/11”、”/2”、”/12”に対応するメニューのクリックを処理するためにOn “/Menu=x,y”ステートメントを追加する必要もありましたが、現在ではこのステートメントは必要なく、On “/11” が自動的に処理されます。
“ME51N_leave.txt”スクリプトは、ユーザーがトランザクションを終了したときに表示されるポップアップを処理します。
// InputScript “ME51N_leave.txt”
// popup screen “do you want to save the document first”
Screen SAPLSPO1.0100
On “=YES” process=“ME51N_save.txt”
using POPUP = “X”
using MODE = “S”
また、POPUP = “X”を設定して、 “save” InputScriptを開始します。 “save” InputScriptはまず初めにポップアップをキャンセルし、通常の “save”プロシージャを実行します。 また、明細詳細ビューがまだ展開されていない場合も処理します(InputScriptが明細詳細ビューを展開し、最後にもう一度閉じる)。
// InputScript “ME51N_save.txt”
Parameter POPUP “N” // “X” means: started form leave–popup
Parameter MODE “S” // S= Save C = Check
// No return on error, otherwise entered data could be lost
ProcessingOption ReturnOnError=Off
// A variablle indicates whether the InputScript had to open the “detail view”
Set V[ME51N_detail] “”
// started from “do you want to save?” popup?
if U[POPUP=X]
Enter “=CANC” // cancel popup, save at end of InputScript
else
Enter
endif
// Set correct title to be displayed during InputScript processing
if U[Mode=S]
Set V[ME51N_Title] “Saving the Purchase Requisition… Please wait”
else
Set V[ME51N_Title] “Checking the Purchase Requisition… Please wait”
endif
Screen saplmegui.0014
Title “&V[ME51N_Title]”
// Item table opened?
if T[Table]
goto item_table_open
endif
// open item table
Enter “=MEV4001BUTTON”
Screen saplmegui.0014
Title “&V[ME51N_Title]”
label item_table_open
// Row index variables
Set V[absrow] 1 // Absolute row number
Set V[relrow] 1 // Relative row number
// Position details opened?
if S[REQ_ITEM_DETAIL]
goto position_details_open
endif
// open position details
Enter “=MEV4002BUTTON”
Set V[ME51N_detail] “X”
Screen saplmegui.0014
Title “&V[ME51N_Title]”
label position_details_open
GetTableAttribute T[Table] FirstVisibleRow=FVisRow
if V[FVisRow=1]
goto scroll_beg_done
endif
// scroll to first line
Enter “/ScrollToLine=1” Table=“T[Table]”
label new_screen
Screen saplmegui.0014
Title “&V[ME51N_Title]”
label scroll_beg_done
GetTableAttribute T[Table] FirstVisibleRow=FVisRow LastVisibleRow=LVisRow LastRow=LastRow
Set V[relrow] 1
label new_row
// end of table?
if V[absrow>&V[LastRow]]
goto end_of_table
endif
// end of screen?
if V[absrow>&V[LVisRow]]
Enter “/ScrollToLine=&V[absrow]” Table=“T[Table]”
goto new_screen
endif
Set V[item] “&cell[Table,Requisn. item,&V[relrow]]”
if not V[item]
goto end_of_table
endif
Set V[ME51N_EKORG] “&V[ME51N_EKORG.&V[item]]”
Set V[ME51N_EKORG_previous] “&V[ME51N_EKORG.&V[item]_previous]”
// no new input?
if V[ME51N_EKORG=&V[ME51N_EKORG_previous]]
Set V[absrow] &V[absrow] + 1
Set V[relrow] &V[relrow] + 1
goto new_row
endif
// Save input
Set V[ME51N_EKORG.&V[item]_previous] “&V[ME51N_EKORG]”
// Set cursor into row and choose detail view
SetCursor cell[Table,Requisn. item,&V[relrow]]
Enter “/2”
Screen SAPLMEGUI.0014
Title “&V[ME51N_Title]”
if F[Purch. organization]
goto screen_EKORG
endif
// To TAB “Source of Supply”
Enter “=TABREQDT7”
Screen SAPLMEGUI.0014
Title “&V[ME51N_Title]”
label screen_EKORG
Set F[Purch. organization] “&V[ME51N_EKORG]”
Set V[absrow] &V[absrow] + 1
Set V[relrow] &V[relrow] + 1
goto new_row
label end_of_table
// detail view opened?
if not V[ME51N_detail=X]
goto screen_collapse_done
endif
// collapse detail view again
Enter “=MEV4002BUTTON”
Screen SAPLMEGUI.0014
Title “&V[ME51N_Title]”
label screen_collapse_done
// Save or check
if U[MODE=S]
Enter “/11”
else
Enter “/39”
endif
// started from popup? else end of script
if not U[POPUP=X]
Leave
endif
// back to main screen after popup + save procedure
Screen SAPLMEGUI.0014
Enter “/3”
// popup is displayed again (but nothing to save now) -> press “No” to leave the transaction
Screen SAPLSPO1.0100
Enter “=NO”
***************
- スクリプトで “goto”と “label”を使用する場合注意する点として、以下に正しいものと間違っているものを掲載しましたので、比較してみてください。
(a)
Screen saplmegui.0014
//明細概要テーブルは展開している?
if T[Table]
goto item_table_open
endif
// 明細概要テーブルを展開する
Enter “=MEV4001BUTTON”
Screen saplmegui.0014
label item_table_open
(b)
Screen saplmegui.0014
//明細概要テーブルは展開している?
if T[Table]
goto item_table_open
endif
// 明細概要テーブルを展開する
Enter “=MEV4001BUTTON”
label item_table_open
Screen saplmegui.0014
(b)は、” Screenコマンドの前のlabel” が間違っています:最初の Screenコマンドは “Enter“が実行されないため、InputScriptは画面を表示したあと続行せずにユーザーが入力するのを待つことになってしまいます。
2.想定されるもう1つのエラーはif…endif節にScreenコマンドを含めることです。
Screen saplmegui.0014
//明細概要テーブルは展開している?
if not T[Table]
// 明細概要テーブルを展開する
Enter “=MEV4001BUTTON”
Screen saplmegui.0014
endif
GuiXTは構文エラーメッセージを出します。なぜなら、 if…endif句は1つの静的なScreenブロック内で閉じなければならないからです。
上記は間違った記述例で、下記は正しく動作するスクリプトになります。適切なファンクションコードを入力して、テーブルや詳細ビューを開いた後、gotoを使用して同じScreenコマンドに戻ります。
…
label main_screen
Screen saplmegui.0014
Title “&V[ME51N_Title]”
//明細概要テーブルは展開している?
if not T[Table]
/// 明細概要テーブルを展開する
Enter “=MEV4001BUTTON”
goto main_screen
endif
// 明細詳細ビューは展開している?
if not S[REQ_ITEM_DETAIL]
// 明細詳細ビューを展開する
Enter “=MEV4002BUTTON”
goto main_screen
endif
GetTableAttribute T[Table] FirstVisibleRow=FVisRow
if V[FVisRow=1]
goto scroll_beg_done
endif
// 一行目にスクロール
Enter “/ScrollToLine=1” Table=“T[Table]”
label new_screen
Screen saplmegui.0014
Title “&V[ME51N_Title]”
label scroll_beg_done
…
この場合、Screenコマンドの前に “main_screen“というラベルを付けることが重要です。 Screenコマンドの後に置いてしまうと、GuiXTはEnterの後にスクリプトを実行し続けます。 1画面に複数のEnterキーが表示されたことになり意味がなく、GuiXT構文エラーメッセージが表示され、最初の「Enter」が失われます。 ですから、複雑なInputScriptを書くときは、それぞれのScreenに対して1つのEnterを実行するということを忘れないようにしてください。
Enterを使わずにScreenコマンドを使用することが理にかなっているのは次の2つの場合のみです:
スクリーンを表示してそのままInputScript内に留まる場合は、ポップアップを処理するために上記InputScript “ME51N_leave.txt”に使用する場合。 もう1つは、(非常に特別なケースですが)VBScriptの呼び出しのため “ApplyGUIScript”ステートメントを使用し、VBScriptプログラムが プッシュボタンを押す等の “Enter”