「SAP Basis概要の教科書」NO.15 外部プログラムからのSAP BAPIの使い方(PowerShell)
INDEX LINK
はじめに
前回は、SAPのBAPI(汎用モジュール)について簡単にご説明しました。今回は、そのBAPIの活用事例についてお話いたします。BAPIを活用することでベーシス運用業務が大幅に効率できる利点がありますので、是非ご参考の上、BAPIを活用頂ければ幸いです。
1.前提条件
- PowerShellなどの外部プログラムからBAPIを利用(コール)するためには、まずSAP CONNECTOR FOR MICROSOFT .NET(.NetConnectorまたはNcoと言われます)のインストールが必要になります。SAPサービスマーケットプレイスにアクセスし、ダウンロード・インストールして下さい。
- この仕組みでは.NetConnectorを導入した端末のSAP GUI for Winodws(通称GUI)の接続情報を参照してBAPIをコールします。そのため事前にGUIをインストールしSAPシステムへのログオン情報を登録しておいて下さい。
2.補足情報(SAP CONNECTORについて)
SAP以外の外部システムや各種クラウドサービスとSAPデータを連携する場合、
SAPが公式に公開しいているConnectorを使う必要があります。2つの種類があり、「SAP Java Connector(通称JCo)」と「SAP .Net Connector(通称Nco)」を使います。前者は、JAVAベースのプログラムを使うシステム、ソフトウェアと連携するために使われ、JAVARuntimeと併せて主にシステム間連携に使用されます。後者は、Windows端末やサーバで使用されます。こちらは.Netframeworkと併せて使用されます。主にMicrosoftクラウドサービスとの連携や、今回ご説明するローカルPCからSAPデータの自動収集などのケースで活用されます。
PowerShellソースサンプル
サンプルソースコードを以下に記します。そしてそれぞれのステップ毎に処理内容を説明していきます。このサンプルは、SAPシステム内に蓄積されている日々の性能情報(トランザクション毎の応答時間)を抽出しEXCELへ出力する処理になります。
$Path=”C:\Program Files\SAP\SAP_DotNetConnector3_x86\”
[Reflection.Assembly]::LoadFile($Path + “sapnco.dll”) > $Null
[Reflection.Assembly]::LoadFile($Path + “sapnco_utils.dll”) > $Null
$cfgParams = New-Object SAP.Middleware.Connector.RfcConfigParameters
$cfgParams.Add(“NAME”, “TEST_TEXT”)
$cfgParams.Add(“ASHOST”, “TESTHOST01”)
$cfgParams.Add(“SYSNR”, “00”)
$cfgParams.Add(“CLIENT”, “100”)
$cfgParams.Add(“USER”, “testaccount”)
$SecPasswd = ConvertTo-SecureString “testpass99” -AsPlainText -Force
$ptrPasswd = [Runtime.InteropServices.Marshal]::SecureStringToBStr($SecPasswd)
$Passwd = [Runtime.InteropServices.Marshal]::PtrToStringBStr($ptrPasswd)
$cfgParams.Add(“PASSWD”, $Passwd)
$destination =[SAP.Middleware.Connector.RfcDestinationManager]::GetDestination($cfgParams)
[SAP.Middleware.Connector.IRfcFunction]$rfcFunction =
$destination.Repository.CreateFunction(“SWNC_COLLECTOR_GET_AGGREGATES”)
$GetDate = Get-Date(Get-Date).addDays(-1) -Format “yyyy-MM-dd”
$rfcFunction.SetValue(“COMPONENT”,”TOTAL”)
$rfcFunction.SetValue(“ASSIGNDSYS”,”SID”)
$rfcFunction.SetValue(“PERIODTYPE”,”D”)
$rfcFunction.SetValue(“PERIODSTRT”,”$GetDate”)
$rfcFunction.Invoke($destination)
[SAP.Middleware.Connector.IRfcTable]$Export = $rfcFunction.GetTable(“TIMES”)
foreach ($item in $Export) {
#データ抽出年月日加工処理
$a=$item.GetValue(“TIME”)
$a1=$a.Substring(0, 2)
$a2=$GetDate+” “+$a1+”:00:00″
#出力情報加工処理
$b=$item.GetValue(“ENTRY_ID”) -ireplace(” *R$”,””)
$b1=$b -ireplace(” *T$”,””)
$c=$item.GetValue(“COUNT”)
$d=$item.GetValue(“RESPTI”)
$Obj = New-Object psobject
$Obj | Add-Member -MemberType NoteProperty -Name TIME -Value $a2
$Obj | Add-Member -MemberType NoteProperty -Name ENTRY_ID -Value $b1
$Obj | Add-Member -MemberType NoteProperty -Name COUNT -Value $c
$Obj | Add-Member -MemberType NoteProperty -Name RESPTI-Value $d
$Obj | export-csv c:\temp\TCODE_TIME_LIST.txt -Encoding Default -Append -NoTypeInformation}
まず最初に、インストールした.NetConnectorのパスを指定します。必要となるファイルは「sapnco.dll」と「sapnco_uils.dll」になります。
↓
$Path=”C:\Program Files\SAP\SAP_DotNetConnector3_x86\”
[Reflection.Assembly]::LoadFile($Path + “sapnco.dll”) > $Null
[Reflection.Assembly]::LoadFile($Path + “sapnco_utils.dll”) > $Null
次に各種入力パラメータを用意します。外部からSAPシステムへ接続するため、「GUIのログオンテキスト名」、「サーバ名」、「インスタンス番号」、「クライアント番号」、「ユーザID」、「パスワード」の情報をセットして下さい。
↓
$cfgParams = New-Object SAP.Middleware.Connector.RfcConfigParameters
$cfgParams.Add(“NAME”, “TEST_TEXT”)
$cfgParams.Add(“ASHOST”, “TESTHOST01”)
$cfgParams.Add(“SYSNR”, “00”)
$cfgParams.Add(“CLIENT”, “100”)
$cfgParams.Add(“USER”, “testaccount”)
$SecPasswd = ConvertTo-SecureString “testpass99” -AsPlainText -Force
上記接続先情報を元にSAPシステム上のBAPIをコールします。このサンプルでは、「SWNC_COLLECTOR_GET_AGGREGATES」をコールしています。
↓
$destination =[SAP.Middleware.Connector.RfcDestinationManager]::GetDestination($cfgParams)
[SAP.Middleware.Connector.IRfcFunction]$rfcFunction =
$destination.Repository.CreateFunction(“SWNC_COLLECTOR_GET_AGGREGATES”)
BAPIコールした後、そのBAPIに必要な入力パラメータを指定します。
↓
Tcd:SE37
※上記「任意」にチェックが入っていない項目は必須パラメータになります。このサンプルでは全てのインスタンス(“TOTAL”)の1日(“D”)のパフォーマンスデータの前日分(“$GetDate”で指定)を取得しようとしています。
$rfcFunction.SetValue(“COMPONENT”,”TOTAL”)
$rfcFunction.SetValue(“ASSIGNDSYS”,”SID”)
$rfcFunction.SetValue(“PERIODTYPE”,”D”)
$rfcFunction.SetValue(“PERIODSTRT”,”$GetDate”)
入力パラメータをセットした後、出力パラメータをセットします。汎用モジュールの出力パラメータは単純な変数出力(「エクスポート」タブ)とテーブル構造として出力されるケース(「テーブル」タブ)と2パターン存在します。
このサンプルの場合はテーブル構造として出力されますので、GetTableメソッドでテーブルデータを取得してPowerShellのループ文の中で、その取得したテーブルデータからGetItemメソッドにて値を1つずつ取り出しています。
↓
Tcd:37
Tcd:SE11
[SAP.Middleware.Connector.IRfcTable]$Export = $rfcFunction.GetTable(“TIMES”)
foreach ($item in $Export) {
:
:
$c=$item.GetValue(“COUNT”)
$d=$item.GetValue(“RESPTI”)
$Obj = New-Object psobject
$Obj | Add-Member -MemberType NoteProperty -Name TIME -Value $c
:
これにより、このサンプルでは日別時間帯別トランザクション応答時間データが取得できます。
あとはEXCELやCSVの形式に出力して完成です。
基本的にはどのBAPIも同じ仕組みでコールできますので、EXCELに事前登録したデータを元にユーザを一括登録したり、タスクスケジューラにPowershellを登録し、毎日決められた時刻にユーザをロック・アンロックさせることも可能になります。
プログラム開発の進め方
はじめてBAPIをコールするプログラムを作り、実際に動かしてみるとエラーになり、原因の究明に時間を要することがあります。そもそも接続できていない、コールできていない、入力パラメータが誤っているなどなど。そのため、最初にBAPIコールプログラムを作る際は、パラメータの指定の必要のないものを選ぶとよいでしょう。例えば「RFC_PING」というプログラムがあります。こちらは、パラメータを使わず、システムへのPING応答の有無を確認するもので、これをコールしてエラーにならなければ、正しくBAPIはコールされていると判断できます。この確認が取れてから別の複雑なBAPIに差し替えて開発を進めるのが効率的な進め方になります。
おわりに
いかがでしたでしょうか。今回は、BAPIを外部プログラム(PowerShell)からコールするサンプルを紹介しました。使用したいBAPI名、入出力パラメータがわかれば、簡単に外部から操作できることがおわかり頂けたかと思います。次回は、ABAPのアドオンプログラムからBAPIを活用する事例を、ABAPの基本的な記述方法も含めてお話したいと思います。