トップ > 技術コラムNews > SAP技術情報 > 「SAP Basis概要の教科書」NO.15 外部プログラムからのSAP BAPIの使い方(PowerShell)

更新日 

「SAP Basis概要の教科書」NO.15 外部プログラムからのSAP BAPIの使い方(PowerShell)

はじめに

前回は、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の基本的な記述方法も含めてお話したいと思います。

LINEで送る
Pocket

SAP案件紹介や独立前相談

ほとんどのSAPコンサルタントの方は、独立すると、まずは当社へご登録いただいております。

60秒で無料登録

案件情報やSAP技術情報を
気軽に受け取る

メルマガ登録

つの情報を送るだけで案件紹介へ

    御氏名
    メールアドレス
    電話番号
    生年月日

    つの情報を送るだけで案件紹介へ

      御氏名
      メールアドレス
      電話番号
      生年月日