【SAP ECC 6.0】VBScriptで RPAっぽいこと実現させる

スポンサーリンク

はじめに

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

SAP Advent Calendar 2019 - Adventar
今年もSAPアドベントカレンダーをやります! SAPに関する話題なら何でもOK。 ハッシュタグは #SAPアドベントカレンダー 参加者向け 投稿ルール ・担当日よりも前に記事を完成 ・予約投稿機能で担当日に公開 ・記事の冒頭には SAPアドベントカレンダーページへのリンクをはり参加記事であることを明記  例「この記...

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

蜜蜂ハチ
蜜蜂ハチ

アドベントカレンダーがHANA一色の中、私は ECC 6.0について、野菊のようにささやきます

スポンサーリンク

VBScriptで、SAP ECC 6.0を動かす

タイトル通りです。VBScriptで、SAP ECC 6.0をRPAのように動かします。

ハッチインプットほと話し合い複雑なことはできませんが、自動化はできそうです。

事前設定

Uipathのサイトに完璧な事前設定のサイトがあったので、ご参照ください。ありがとうUipathさん。

SAP GUI Scripting を有効にする
The SAP GUI Scripting API automation interface is used for increasing capabilities of SAP GUI for Windows. SAP GUI Scripting is required for enabling UI element...

スクリプト記録と再生

今回はVBScriptを実行して、SAP ECC 6.0をログインする です。

VBScriptをスラスラかける人はあまり関係ないです。ガンガン書いて、自動化しましょう。

ですが、ゼロから書き始めるのは大変です。SAP ECC 6.0はスクリプトを記録してくれる機能があります。

これがenjoyだ!

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

そして、実際にログインしてみます。

  1. クライアント 入力
  2. ユーザ    入力 
  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]/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を実行すれば、クライアント、ユーザ、パスワードを入力せずにログオンできます。

以上です。

いや、さすがにこれで終わらないです。

ユーザ別が使用したトランザクションコードの使用回数を調べる

月に一回、ユーザが使用したトランザクションコードのログを取ってます。別になんかするわけでもなく、一年で消えちゃうので、取っておこう的な感じです。

取得方法ですが、下記の通りです。

  1. TCD:ST03N
  2. サーバーが複数ある場合、合計を選択
  3. ユーザプロファイルを選択
  4. 表示されたユーザIDをダブルクリック
  5. ユーザー別 トランザクションコードが表示される。

合計を選択。

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

すると、上記のように、とあるユーザーが使用したトランザクションコードが表示されます。

この画面を見たことある人は気づいていると思いますが、一人ずつしか、表示されないんです。一括で取得できないんです。一人ずつ紹介して、ログを取ってくるのは現実的ではありません。

(もしかしたら、標準機能で存在してるのかもしれないけど、私は知らない。)

そしたら、どうすればよいかというと、実は汎用モジュール「SWNC_COLLECTOR_GET_AGGREGATES」で一括でとることができます。

なので、スクリプト記録と再生で下記の手順を実行します。

  1. セッション立ち上げ
  2. TCD:/nSE37
  3. SWNC_COLLECTOR_GET_AGGREGATES を入力
  4. テスト実行
  5. component に ”TOTAL” 入力
  6. periodtype に”M” 入力
  7. periodstrt に ”2019/11/01″ 入力(ログを取りたい月の初日)
  8. 実行
  9. usertcode を選択
  10. すべて表示
  11. ダウンロードボタンをクリック
  12. 保存先入力
  13. ファイルの保存
  14. 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から、エラーになり呼び出せず。。。断念。なので、スクリプトに変更。

汎用モジュール「SWNC_COLLECTOR_GET_AGGREGATES」がExcelから呼び出せない。
蜜蜂ハチ
蜜蜂ハチ

ご愛読、ありがとうございました。

すみっこ様、アドベントカレンダーに誘っていただき、ありがとうございました。

編集後期を書こうと思います。

明日(2019/12/18)のSAP Advent Calendar 2019は、Mona Lisacoさん

@monamonaのマイページ - Qiita
ドリフ大爆笑が好きというわけではないです。JavaScriptやSAPUI5やSwiftだけでなく、ABAPも大好き。投稿や発言は個人の見解であり、所属組織を代表するものではありません。
イベント参加
スポンサーリンク
スポンサーリンク
シェアお願い致します!
蜜蜂ハチをフォローする
スポンサーリンク
社内SEと次期基幹系システム
タイトルとURLをコピーしました