はじめに
この記事は SAP Advent Calendar 2019 の12月17日分の記事として執筆しています。

Mino Katoさんからのバトンパス

アドベントカレンダーがHANA一色の中、私は ECC 6.0について、野菊のようにささやきます。
VBScriptで、SAP ECC 6.0を動かす
タイトル通りです。VBScriptで、SAP ECC 6.0をRPAのように動かします。

ハッチインプットほと話し合い複雑なことはできませんが、自動化はできそうです。
事前設定
Uipathのサイトに完璧な事前設定のサイトがあったので、ご参照ください。ありがとうUipathさん。
スクリプト記録と再生
今回はVBScriptを実行して、SAP ECC 6.0をログインする です。
VBScriptをスラスラかける人はあまり関係ないです。ガンガン書いて、自動化しましょう。
ですが、ゼロから書き始めるのは大変です。SAP ECC 6.0はスクリプトを記録してくれる機能があります。

スクリプト記録と再生を押すと、ボタンが表示されるので、記録ボタンを押してみましょう。(画像取り忘れた。。。)

そして、実際にログインしてみます。
- クライアント 入力
- ユーザ 入力
- パスワード 入力

ログイン完了。
記録ボタンを、再度おして、記録するのもやめます。すると、指定のフォルダにVBScriptのファイルができてます。ソースコードは下記の通り。クライアントとユーザとパスワードは変更してます。
!注意!パスワードは記録されません!そのため、コードを書き換える必要があります。
If Not IsObject(application) Then
Set SapGuiAuto = GetObject("SAPGUI")
Set application = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(connection) Then
Set connection = application.Children(0)
End If
If Not IsObject(session) Then
Set session = connection.Children(0)
End If
If IsObject(WScript) Then
WScript.ConnectObject session, "on"
WScript.ConnectObject application, "on"
End If
session.findById("wnd[0]").maximize
session.findById("wnd[0]/usr/txtRSYST-MANDT").text = "クライアント"
session.findById("wnd[0]/usr/txtRSYST-BNAME").text = "ユーザ"
session.findById("wnd[0]/usr/pwdRSYST-BCODE").text = "パスワード"
session.findById("wnd[0]/usr/pwdRSYST-BCODE").setFocus
session.findById("wnd[0]/usr/pwdRSYST-BCODE").caretPosition = 7
session.findById("wnd[0]").sendVKey 0
これで、セッションを立ち上げて、VBScriptを実行すれば、クライアント、ユーザ、パスワードを入力せずにログオンできます。
以上です。
。
。
。
いや、さすがにこれで終わらないです。
ユーザ別が使用したトランザクションコードの使用回数を調べる
月に一回、ユーザが使用したトランザクションコードのログを取ってます。別になんかするわけでもなく、一年で消えちゃうので、取っておこう的な感じです。
取得方法ですが、下記の通りです。
- TCD:ST03N
- サーバーが複数ある場合、合計を選択
- ユーザプロファイルを選択
- 表示されたユーザIDをダブルクリック
- ユーザー別 トランザクションコードが表示される。

合計を選択。

ユーザプロファイル選択。表示されたら、ユーザIDをダブルクリック。

すると、上記のように、とあるユーザーが使用したトランザクションコードが表示されます。
この画面を見たことある人は気づいていると思いますが、一人ずつしか、表示されないんです。一括で取得できないんです。一人ずつ紹介して、ログを取ってくるのは現実的ではありません。
(もしかしたら、標準機能で存在してるのかもしれないけど、私は知らない。)
そしたら、どうすればよいかというと、実は汎用モジュール「SWNC_COLLECTOR_GET_AGGREGATES」で一括でとることができます。
なので、スクリプト記録と再生で下記の手順を実行します。
- セッション立ち上げ
- TCD:/nSE37
- SWNC_COLLECTOR_GET_AGGREGATES を入力
- テスト実行
- component に ”TOTAL” 入力
- periodtype に”M” 入力
- periodstrt に ”2019/11/01″ 入力(ログを取りたい月の初日)
- 実行
- usertcode を選択
- すべて表示
- ダウンロードボタンをクリック
- 保存先入力
- ファイルの保存
- F3×3で最初の画面に戻る
そうすると、下記の VBScript が作成されます。次回からは、日付を変えれば取得可能です。
If Not IsObject(application) Then Set SapGuiAuto = GetObject(“SAPGUI”) Set application = SapGuiAuto.GetScriptingEngine End If If Not IsObject(connection) Then Set connection = application.Children(0) End If If Not IsObject(session) Then Set session = connection.Children(0) End If If IsObject(WScript) Then WScript.ConnectObject session, “on” WScript.ConnectObject application, “on” End If session.findById(“wnd[0]”).maximize session.findById(“wnd[0]/tbar[0]/okcd”).text = “/nse37” session.findById(“wnd[0]”).sendVKey 0 session.findById(“wnd[0]/usr/ctxtRS38L-NAME”).text = “SWNC_COLLECTOR_GET_AGGREGATES” session.findById(“wnd[0]/usr/ctxtRS38L-NAME”).caretPosition = 29 session.findById(“wnd[0]/tbar[1]/btn[8]”).press ‘”TOTAL”固定 session.findById(“wnd[0]/usr/txt[34,9]”).text = “TOTAL” ‘月別で取得するので”M”固定 session.findById(“wnd[0]/usr/txt[34,11]”).text = “M” ‘取得したい月の月初を入力”YYYY/MM/DD” session.findById(“wnd[0]/usr/txt[34,12]”).text = “2019/11/01” session.findById(“wnd[0]/usr/txt[34,12]”).setFocus session.findById(“wnd[0]/usr/txt[34,12]”).caretPosition = 4 session.findById(“wnd[0]/tbar[1]/btn[8]”).press session.findById(“wnd[0]/usr”).verticalScrollbar.position = 1 session.findById(“wnd[0]/usr”).verticalScrollbar.position = 2 session.findById(“wnd[0]/usr”).verticalScrollbar.position = 3 session.findById(“wnd[0]/usr”).verticalScrollbar.position = 4 session.findById(“wnd[0]/usr”).verticalScrollbar.position = 5 session.findById(“wnd[0]/usr/lbl[34,37]”).setFocus session.findById(“wnd[0]/usr/lbl[34,37]”).caretPosition = 0 session.findById(“wnd[0]”).sendVKey 2 session.findById(“wnd[0]/mbar/menu[0]/menu[0]”).select session.findById(“wnd[0]/mbar/menu[3]/menu[5]/menu[2]/menu[2]”).select session.findById(“wnd[1]/usr/subSUBSCREEN_STEPLOOP:SAPLSPO5:0150/sub:SAPLSPO5:0150/radSPOPLI-SELFLAG[1,0]”).select session.findById(“wnd[1]/usr/subSUBSCREEN_STEPLOOP:SAPLSPO5:0150/sub:SAPLSPO5:0150/radSPOPLI-SELFLAG[1,0]”).setFocus session.findById(“wnd[1]/tbar[0]/btn[0]”).press ‘ファイルの保存先” session.findById(“wnd[1]/usr/ctxtDY_PATH”).text = “C:\ 保存先” ‘ファイル名” session.findById(“wnd[1]/usr/ctxtDY_FILENAME”).text = “USERTCODE201911.txt” session.findById(“wnd[1]/usr/ctxtDY_PATH”).setFocus session.findById(“wnd[1]/usr/ctxtDY_PATH”).caretPosition = 28 session.findById(“wnd[1]/tbar[0]/btn[0]”).press session.findById(“wnd[0]/usr/lbl[17,17]”).setFocus session.findById(“wnd[0]/usr/lbl[17,17]”).caretPosition = 35 session.findById(“wnd[0]”).sendVKey 3 session.findById(“wnd[0]”).sendVKey 3 session.findById(“wnd[0]”).sendVKey 3 session.findById(“wnd[0]”).sendVKey 3
どんな時、こんなの使うの?
今回の VBScript はいつ使うの?って話ですが、発送次第です。いろいろ可能です。
- 繰り返しの作業の自動化
- VBScript が書ける人はエクセルと組み合わせで処理の自動化
- RPAでSAPECCも処理可能ですが、SAPECCを知らない人は開発が少々難しいです。RPAを依頼してる事業部の人に VBScript を記録してもらい、その VBScript をRPAをキックする。(RPAの部品として使用)
- RPAですべてやりたい場合は、記録した VBScript と同等の動きをしているかテストに使用する。
当初、やりたかったこと。
Excelから汎用モジュール「SWNC_COLLECTOR_GET_AGGREGATES」を呼び出して、Excelに落としてきて、自動でユーザ別使用一覧を作りたかった。しかし、 SWNC_COLLECTOR_GET_AGGREGATESがどうやってもExcelから、エラーになり呼び出せず。。。断念。なので、スクリプトに変更。


ご愛読、ありがとうございました。
すみっこ様、アドベントカレンダーに誘っていただき、ありがとうございました。
編集後期を書こうと思います。
明日(2019/12/18)のSAP Advent Calendar 2019は、Mona Lisacoさん
