RPA初心者による無料でRPA

RPAやIOTに関するブログ …時々富士山

4.SAPシステムを動かす

SAPとはSAP社が作成したERPパッケージです。世界的に導入している企業がたくさんあります。
このSAPを使用して、原料購入から製造、検査、出荷まで管理しています。
また、予算作成も行われており、企業にとってはなくてはならないものです。

SAPはVBScriptと呼ばれるコンピュータ言語で動いています。

VBScriptとは?
powershellと同様にwindows標準の言語です。windowsには、コマンドプロンプト(windows3~)、VBScript(windows98~)、powershell(windows7~)の言語があります。powershellは最も新しいですが、それぞれ特徴があり兄弟みたいな感じです。兄弟なのでpowershellでもSAPを動かすことができます。

●SAPを立ち上げ、ログイン
以下のスクリプトでサーバを指定して立ち上げ、ログインできます。

以下のスクリプト

echo "-----------SAP処理開始----------------"
#-Begin-----------------------------------------------------------------
#■自分のid、pass
$SAPID = ■
$SAPPASS = ■

$Sig = @'
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
'@

  #-Add FindWindow function---------------------------------------------
    $Win32 = Add-Type -Namespace Win32 -Name Funcs -MemberDefinition $Sig -PassThru

  #-Set the path to the SAP GUI directory-------------------------------
    $SAPGUIPath = "C:\Program Files (x86)\SAP\FrontEnd\SAPgui\"

  #-Set the SAP system ID or the IP address-----------------------------
  #★サーバを指定(下記の画像参照)
    $SID = "★"

  #-Set the instance number of the SAP system---------------------------
    $InstanceNo = "00"

  #-Starts the SAP GUI--------------------------------------------------
    $SAPGUI = $SAPGUIPath + "sapgui.exe"
    & $SAPGUI $SID $InstanceNo

  While ($Win32::FindWindow("SAP_FRONTEND_SESSION", "SAP") -eq 0) {
    Start-Sleep -Milliseconds 250
  }

#-Begin-----------------------------------------------------------------

  #-Get-Property--------------------------------------------------------
    function Get-Property {
      param([__ComObject] $object, [String] $propertyName)
      $objectType = [System.Type]::GetType($object)
      $objectType.InvokeMember($propertyName,
        "GetProperty", $NULL, $object, $NULL)
    }

  #-Set-Property--------------------------------------------------------
    function Set-Property {
      param([__ComObject] $object, [String] $propertyName,
        $propertyValue)
      $objectType = [System.Type]::GetType($object)
      [Void] $objectType.InvokeMember($propertyName,
        "SetProperty", $NULL, $object, $propertyValue)
    }

  #-Invoke-Method-------------------------------------------------------
    function Invoke-Method {
      param([__ComObject] $object, [String] $methodName,
        $methodParameters)
      $objectType = [System.Type]::GetType($object)
      $output = $objectType.InvokeMember($methodName,
        "InvokeMethod", $NULL, $object, $methodParameters)
      if ( $output ) { $output }
    }

  #-Main----------------------------------------------------------------
    $SapGuiAuto = [microsoft.visualbasic.Interaction]::GetObject("SAPGUI")
    $application = Invoke-Method $SapGuiAuto "GetScriptingEngine"
    $connection = Get-Property $application "Children" @(0)
    $session = Get-Property $connection "Children" @(0)

    $ID = Invoke-Method $session "findById" @("wnd[0]/usr/txtRSYST-MANDT")
    Set-Property $ID "Text" @("010")
    $ID = Invoke-Method $session "findById" @("wnd[0]/usr/txtRSYST-BNAME")
    Set-Property $ID "Text" @("$SAPID")
    $ID = Invoke-Method $session "findById" @("wnd[0]/usr/pwdRSYST-BCODE")
    Set-Property $ID "Text" @("$SAPPASS")
    $ID = Invoke-Method $session "findById" @("wnd[0]/usr/txtRSYST-LANGU")
    Set-Property $ID "Text" @("JA")
    $ID = Invoke-Method $session "findById" @("wnd[0]")
    Invoke-Method $ID "sendVKey" @(0)

以上スクリプト

★サーバは各社で異なるため、
以下画像のメッセージサーバ(赤枠内)を参照してください。
f:id:hero32:20200218071712p:plain


SAPコードの解説

①座標指定
$ID = Invoke-Method $session "findById" @("wnd[0]/usr/txtRSYST-BNAME")
②アクション(テキスト入力)
Set-Property $ID "Text" @("$SAPID")

SAPコードは上記のように①座標指定、②テキスト入力で1セットになっており、これの繰り返しです。

①座標指定
"wnd[0]/usr/txtRSYST-BNAME"が座標になります。前後のコードは変更せず、この座標部分のみ変更して、作成していきます。尚、この座標の調べ方は5章で説明します。

f:id:hero32:20200219073758j:plain

②アクション
Set-Propertyは直訳すると、特性を決める。つまり、①で指定した座標$IDに"$SAPID"をテキスト形式でセットするとなります。