次の方法で共有


ECMA2Host 用の SAP ECC 7.51 Web サービス コネクタ テンプレートの作成

このガイドでは、SAP ECC ユーザーを管理するための Web サービス Extensibility Connectivity Management Agent (ECMA) コネクタ用のテンプレートを作成するプロセスについて説明します。

制限事項と前提

このテンプレートでは、ユーザーを管理する方法を示します。 ECMA2Host は現在、複数値参照をサポートしていないため、Local Activity Groups、Roles、Profiles などの他のオブジェクトの種類については、このガイドでは説明しません。 パスワード操作も、このガイドの範囲外です。

このガイドでは、公開されている BAPI 関数の呼び出しに使用される SAP 内のサービス アカウントの作成については説明しません。 これは、事前に作成されたデモ アカウント Developer が、以下に示す BAPI へのアクセス許可を付与するプロファイル RFC_ALL と共に使用されることを前提としています。

Web サービス構成ツールでは、既定で SAP で公開されている WSP ポリシーとエンドポイントごとの複数のバインドの機能はサポートされていません。 SOAP 1.1 のみの WSDL と、ポリシーなしのオールインワン ドキュメント スタイル バインドが必要です。

このテンプレートで使用される SAP ECC BAPI 関数:

  • BAPI_USER_GETLIST - このシステムに接続されているすべてのユーザーの一覧を取得します。
  • BAPI_USER_GETDETAIL - 特定のユーザーの詳細を取得します。
  • BAPI_USER_CREATE1 - ユーザーを作成します。
  • BAPI_USER_DELETE - ユーザーを削除します。
  • BAPI_USER_CHANGE - ユーザーを更新します。

このガイドのすべての SAP ユーザー プロパティは、単一値のプロパティとして扱われます。

使用されるプログラミング言語は Visual Basic です。

Web サービス エンドポイントの定義とスキーマの作成

インポート ワークフローやエクスポート ワークフローを設計する前に、テンプレートを作成し、SOAP インターフェイス経由で公開される SAP BAPI 関数を使用してエンドポイントを定義する必要があります。 次に、ECMA2 オブジェクトのスキーマを作成し、そのプロパティをこのテンプレートで使用できます。

  1. "C:\Program Files\Microsoft ECMA2Host\Web Service Configuration Tool" フォルダーから Web サービス構成ツール wsconfigTool.exe を起動します
  2. [File-New] メニューの [新しい SOAP プロジェクトの作成] を選択します

SOAP プロジェクトの作成のスクリーンショット。

  1. [SOAP プロジェクト] をクリックし、[新しい Web サービスの追加] を選択します。

新しい Web サービスの追加のスクリーンショット。

  1. Web サービスに「SAPECC」という名前を付け、発行された WSDL をダウンロードするための URL を指定し、名前空間として「SAPECC」と入力します。 Web サービス名は、テンプレート内でこの Web サービスを他の Web サービスと区別するのに役立ちます。 名前空間は、クラスの生成に使用される Microsoft .NET 名前空間の名前を定義します。 SAP 管理者の指示がない限り、基本認証モードを選択します。 [次へ] をクリックします。

Web サービスの名前付けのスクリーンショット。

  1. SAP ECC エンドポイントに接続するための資格情報を指定します。 [次へ] をクリックします。
  2. [エンドポイントと操作] ページで、BAPI が表示されていることを確認し、[完了] をクリックします。

Note

複数のエンドポイントが表示される場合は、SOAP 1.2 と SOAP 1.1 の両方のバインドが有効になります。 これにより、コネクタが失敗します。 SOAMANAGER でバインド定義を変更し、1 つだけ保持します。 次に、Web サービスを追加し直します。

BAPI のスクリーンショット。

  1. プロジェクトを C:\Program Files\Microsoft ECMA2Host\Service\ECMA フォルダーに保存します。
  2. [オブジェクトの種類] タブをクリックし、[ユーザー オブジェクトの種類] を追加することを選択します。 [OK] をクリックします。
  3. [オブジェクトの種類] タブを展開し、[ユーザーの種類の定義] をクリックします。

オブジェクトの種類のスクリーンショット。

  1. スキーマに次の属性を追加し、アンカーとして userName を選択します。

属性の追加のスクリーンショット。

  1. プロジェクトを保存します。
名前 Type アンカー
city string
会社 string
department string
電子メール string
expirationTime string
firstName string
lastName string
middleName string
telephoneNumber string
jobTitle string
userName string checked

フル インポート ワークフローの作成

インポート ワークフローは、ECMA2Host では省略可能ですが、既存の SAP ユーザーを ECMA2Host メモリ内キャッシュにインポートし、プロビジョニング中に重複するユーザーが作成されないようにすることができます。

インポート ワークフローを作成しない場合、コネクタはエクスポート専用モードで動作し、ECMA2Host は既存のユーザーに対してもユーザーの作成操作を常に発行します。 これにより、エクスポート ワークフローで重複が処理されない限り、標準 SAP BAPI を使用すると、エラーや重複が発生する可能性があります。

SAP ECC には、前回の読み取り以降に行われた変更を読み取るための組み込みメカニズムは用意されていません。

そのため、フル インポート ワークフローのみを実装しています。 パフォーマンス上の理由から差分インポートを実装する必要がある場合は、SAP 管理者に BAPI の一覧を確認し、SOAP Web サービスとして公開してください。 次に、以下に説明する方法と、前回成功した実行のタイムスタンプを含む customData プロパティを使用して、差分インポート ワークフローを実装します。

SAP ECC には、プロパティを持つユーザーの一覧を取得するための BAPI 関数がいくつか用意されています。

  • BAPI_USER_GETLIST - このシステムに接続されているすべてのユーザーの一覧を取得します。
  • BAPI_USER_GETDETAIL - 特定のユーザーの詳細を取得します。

このテンプレートで SAP ECC から既存のユーザーを取得するには、これら 2 つの BAPI のみが使用されます。

  1. [オブジェクトの種類] -> [ユーザー] -> [インポート] -> [フル インポート] ワークフローに移動し、右側の Sequence アクティビティを [ワークフロー デザイナー] ウィンドウにドラッグ アンド ドロップします。
  2. 左下にある [変数] ボタンを見つけてクリックし、この Sequence 内で定義されている変数の一覧を展開します。
  3. 次の変数を追加します。 SAP WSDL から生成された変数の型を選択するには、[型の参照] をクリックし、[生成済] を展開し、SAPECC 名前空間を展開します。
Name 変数の種類 範囲 既定値
selRangeTable SAPECC.TABLE_OF_BAPIUSSRGE シークエンス new TABLE_OF_BAPIUSSRGE with {.item = new BAPIUSSRGE(){new BAPIUSSRGE}}
getListRetTable SAPECC.TABLE_OF_BAPIRET2 シークエンス new TABLE_OF_BAPIRET2
PageSize Int32 シークエンス 200
returnedSize Int32 シークエンス
usersTable SAPECC.TABLE_OF_BAPIUSNAME シークエンス new TABLE_OF_BAPIUSNAME()

フル インポート操作ワークフローのスクリーンショット。

  1. ツールボックスから、Sequence アクティビティ内の 4 つの Assign アクティビティをドラッグ アンド ドロップし、次の値を設定します。
selRangeTable.item(0).PARAMETER = "USERNAME" 
selRangeTable.item(0).SIGN = "I" selRangeTable.item(0).OPTION = "GT" selRangeTable.item(0).LOW = ""   

これらのパラメーターは、BAPI_USER_GETLIST 関数の呼び出しと改ページ位置の自動修正の実装に使用されます。

フル インポート ワークフローのスクリーンショット。

  1. 改ページ位置の自動修正を実装するには、最後の Assign 操作の後に、ツールボックスから、Sequence アクティビティ内の DoWhile アクティビティをドラッグ アンド ドロップします。
  2. 右側のウィンドウで [プロパティ] タブに切り替え、DoWhile にこの条件を入力します
  • サイクル: returnedSize = pageSize

[returnedsize] 画面のスクリーンショット。

  1. [変数] をクリックし、既定値が 0 の DoWhile サイクル内に int32 型の currentPageNumber プロパティを追加します。

dowhile 画面のスクリーンショット。

  1. 省略可能な手順: Delta インポート ワークフローを実装する予定の場合は、DoWhile サイクルの後に、ツールボックスから Assign アクティビティを Sequence アクティビティにドラッグ アンド ドロップします。 次の値を設定します:
  • customData(schemaType.Name + "_lastImportTime") = DateTimeOffset.UtcNow.Ticks.ToString() これにより、最後の完全インポートが実行された日付と時刻が保存され、このタイムスタンプは後で Delta Import ワークフローで使用できます。

customdata 画面のスクリーンショット。

  1. ツールボックスから、Sequence アクティビティを DoWhile アクティビティにドラッグ アンド ドロップします。 その Sequence アクティビティに WebServiceCall アクティビティをドラッグ アンド ドロップし、SAPECC サービス名、ZSAPCONNECTORWS エンドポイント、BAPI_USER_GETLIST 操作を選択します。

dowhile シーケンスのスクリーンショット。

  1. ... Arguments ボタンをクリックし、Web サービス呼び出しのパラメーターを次のように定義します。
Name 方向 Type
MAX_ROWS In Int32 PageSize
MAX_ROWSSpecified In Boolean True
RETURN /アウトの選択 TABLE_OF_BAPIRET2 getListRetTable
SELECTION_EXP /アウトの選択 TABLE_OF_BAPIUSSEXP
SELECTION_RANGE /アウトの選択 TABLE_OF_BAPIUSSRGE selRangeTable
USERLIST /アウトの選択 TABLE_OF_BAPIUSNAME usersTable
WITH_USERNAME 場所 String
ROWS Out Int32 returnedSize
  1. OK をクリックします。 警告記号が表示されなくなります。 usersTable 変数に格納されているユーザーの一覧。 SAP は 1 回の応答でユーザーの完全なリストを返さないため、ページの切り替え中に改ページ位置の自動修正を実装し、この関数を複数回呼び出す必要があります。 その後、インポートされたすべてのユーザーについて、別の呼び出しを行って、そのユーザーの詳細を取得する必要があります。 つまり、ユーザー数が 1,000 人で、ページ サイズが 200 の横長の場合、Web サービス コネクタは 5 回の呼び出しを行ってユーザーのリストを取得し、1,000 回の個別呼び出しでユーザーの詳細を取得します。 パフォーマンスを向上させるには、1,000 回の個別呼び出しを行う必要をなくし、SOAP WS エンドポイント経由での BAPI 関数の公開を回避するために、すべてのユーザーをそのプロパティと共に一覧表示するカスタム BAPI プログラムの開発を SAP チームに求めます。
  2. WebServiceCall アクティビティの後に、ツールボックスから、IF アクティビティを DoWhile アクティビティにドラッグ アンド ドロップします。 空ではない応答とエラーがないことを確認するには、次の条件を指定します: IsNothing(getListRetTable.item) OrElse getListRetTable.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) = 0
  3. ツールボックスから、Throw アクティビティを IF アクティビティの Else ブランチにドラッグ アンド ドロップして、インポートに失敗した場合にエラーをスローします。 [プロパティ] タブに切り替え、Throw アクティビティの Exception プロパティに次の式を入力します: New Exception(getListRetTable.item.First(Function(retItem) retItem.TYPE.Equals("E")).MESSAGE)

Exception プロパティのスクリーンショット。

  1. インポートされたユーザーのリストを処理するには、ForEachWithBodyFactory アクティビティをツールボックスから IF アクティビティの Then ブランチにドラッグ アンド ドロップします。 [プロパティ] タブに切り替えて、TypeArgument として SAPECC.BAPIUSNAME を選択します。 ... ボタンをクリックし、values プロパティに次の式を入力します: if(usersTable.item,Enumerable.Empty(of BAPIUSNAME)())

IF アクティビティのスクリーンショット。

  1. ツールボックスから、Sequence アクティビティを ForEach アクティビティにドラッグ アンド ドロップします。 この Sequence アクティビティ ウィンドウをアクティブにして、[変数] ボタンをクリックし、次の変数を定義します。
Name 変数の種類 範囲 既定値
会社 SAPECC.BAPIUSCOMP シークエンス new BAPIUSCOMP()
address SAPECC.BAPIADDR3 シークエンス new BAPIADDR3()
defaults SAPECC.BAPIDEFAUL シークエンス new BAPIDEFAUL()
logondata SAPECC.BAPILOGOND シークエンス new BAPILOGOND()
getDetailRetTable SAPECC.TABLE_OF_BAPIRET2 シークエンス new TABLE_OF_BAPIRET2()

IF アクティビティは次のように表示されます。

Foreach を含む IF アクティビティのスクリーンショット。

  1. CreateCSEntryChangeScope アクティビティを Sequence アクティビティにドラッグ アンド ドロップします。 DN プロパティに、schemaType.Name & item.USERNAME と入力します。 [CreateAnchorAttribute AnchorValue] フィールドに、item.username と入力します。

CreateCSEntryChangeScope のスクリーンショット。

  1. 各ユーザーの詳細を取得するには、ツールボックスから、CreateAnchorAttribute アクティビティの直前の Sequence アクティビティに WebServiceCall アクティビティをドラッグ アンド ドロップします。 SAPECC サービス名、ZSAPCONNECTORWS エンドポイント、BAPI_USER_GET_DETAIL 操作を選択します。 ... Arguments ボタンをクリックし、Web サービス呼び出しのパラメーターを次のように定義します。
Name 方向 Type
RETURN /アウトの選択 TABLE_OF_BAPIRET2 getDetailRetTable
USERNAME 場所 String item.username
住所 Out BAPIADDR3 address
COMPANY Out BAPIUSCOMP 会社
DEFAULTS Out BAPIUSDEFAUL defaults
LOGONDATA Out BAPILOGOND logonData
WITH_USERNAME 場所 String
ROWS Out Int32 returnedSize
  1. OK をクリックします。 警告記号が表示されなくなります。 ユーザーの詳細は、上記に一覧表示された変数に格納されます。 IF アクティビティは次のように表示されます。

パラメーターのスクリーンショット。

  1. BAPI_USER_GET_DETAIL 操作の結果を確認するには、ツールボックスから、IF アクティビティをドラッグ アンド ドロップし、WebServiceCall アクティビティと CreateAnchorAttribute アクティビティの間にある Sequence アクティビティに配置します。 次の条件を入力します: IsNothing(getDetailRetTable.item) OrElse getDetailRetTable.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) = 0

見つからないユーザーの詳細は致命的なイベントとして扱われる必要はないため、このエラーを表示し、他のユーザーの処理を続行できます。 Sequence アクティビティを IF アクティビティの Else ブランチにドラッグ アンド ドロップします。 新しい Sequence アクティビティに Log アクティビティを追加します。 [プロパティ] タブに切り替え、レベル プロパティを [高] に、[タグ] を [追跡] に変更します。 LogText プロパティに次を入力します: string.Join("\n", getDetailRetTable.item.Select (Function(item) item.MESSAGE ))

  1. Sequence アクティビティを IF アクティビティの Then ブランチにドラッグ アンド ドロップします。 既存の CreateAnchorAttribute アクティビティを、IF アクティビティの Then ブランチ内の Sequence アクティビティにドラッグ アンド ドロップします。 ForEach アクティビティは次のように表示されます。

ForEach のスクリーンショット。

  1. city、company、department、email などのユーザーの各プロパティについては、CreateAnchorAttribute アクティビティの後に IF アクティビティを追加し、Not string.IsNullOrEmpty(address.city) などの条件を入力し、その IF アクティビティの Then ブランチに CreateAttributeChange アクティビティを追加して、空ではない値を確認します。

CreateAttributeChange のスクリーンショット。

たとえば、次のマッピング テーブルを使用して、すべてのユーザー プロパティに CreateAttributeChange アクティビティを追加します。

ECMA User プロパティ SAP プロパティ
city address.city
部署 address.department
会社 company.company
メール address.e_mail
firstName address.firstName
lastName address.lastName
middleName address.middleName
jobTitle address.function
expirationTime logonData.GLTGB
telephoneNumber address.TEL1_NUMBR
  1. 最後に、SetImportStatusCode アクティビティを最後の CreateAttributeChange アクティビティの後に追加します。 Then ブランチで ErrorCode を Success に設定します。 もう 1 つの SetImportStatus コード アクティビティを Else ブランチに追加し、ErrorCode を ImportErrorCustomContinueRun に設定します。

SetImportStatusCode のスクリーンショット。

  1. DoWhile サイクルが次のようになるように、ForEach アクティビティ内の Sequence アクティビティを折りたたみます。

DoWhile サイクルのスクリーンショット。

  1. ユーザーの次のページを取得するには、selRangeTable.item(0).LOW プロパティを更新します。 DoWhile 内の Sequence アクティビティに IF アクティビティをドラッグ アンド ドロップし、既存の IF アクティビティの後に配置します。 条件として、returnedSize>0 と入力します。 IF アクティビティの Then ブランチに Assign アクティビティを追加し、selRangeTable.item(0).LOWusersTable.item(returnedSize-1).username に設定します。

DoWhile final のスクリーンショット。

Full Import ワークフローの定義を完了しました。

Export Add ワークフローの作成

SAP ECC でユーザーを作成するには、BAPI_USER_CREATE1 プログラムを呼び出し、アカウント名と初期パスワードを含むすべてのパラメーターを指定します。 SAP 側でアカウント名を生成する必要がある場合は、SAP 管理者に相談し、新しく作成されたユーザー アカウントの userName プロパティを返すカスタム BAPI 関数を使用します。

このガイドでは、ライセンス、ローカルまたはグローバルのアクティビティ グループ、システム、またはプロファイルの割り当てについては説明していません。 SAP 管理者に相談し、必要に応じてこのワークフローを変更してください。

Exprt ワークフローに改ページ位置の自動修正を実装する必要はありません。 ワークフロー コンテキスト内で使用できる objectToExport オブジェクトは 1 つのみです。

  1. [オブジェクトの種類] -> [ユーザー] -> [エクスポート] -> [追加] ワークフローに移動し、右側のツールボックスから、Sequence アクティビティをワークフロー デザイナー ウィンドウにドラッグ アンド ドロップします。
  2. 左下にある [変数] ボタンを見つけてクリックし、この Sequence 内で定義されている変数の一覧を展開します。
  3. 次の変数を追加します。 SAP WSDL から生成された変数の型を選択するには、[型の参照] をクリックし、[生成済] を展開し、SAPECC 名前空間を展開します。 これにより、BAPI_USER_CREATE1 プログラムで使用されるデータ構造が初期化されます。
Name 変数の種類 範囲 既定値
address SAPECC.BAPIADDR3 シークエンス new BAPIADDR3()
userName String シークエンス
password SAPECC.BAPIPWD シークエンス new BAPIPWD()
会社 SAPECC.BAPIUSCOMP シークエンス new BAPIUSCOMP()
defaults SAPECC.BAPIDEFAUL シークエンス new BAPIDEFAUL()
logOnData SAPECC.BAPILOGOND シークエンス new BAPILOGOND()
bapiret2Table SAPECC.TABLE_OF_BAPIRET2 シークエンス new TABLE_OF_BAPIRET2()

Export Add ワークフローのスクリーンショット。

  1. userName プロパティを不変 ID であるアンカーとして定義したため、export オブジェクトのアンカーのコレクションから userName 値を抽出する必要があります。 ForEachWithBodyFactory アクティビティを、ツールボックスから Sequence アクティビティにドラッグ アンド ドロップします。 item の変数名を anchor に置き換え、[プロパティ] に切り替えて、Microsoft.MetadirectoryServices.AnchorAttribute の TypeArgument を選択します。 [値] フィールドに objectToExport.AnchorAttributes と入力します。

Export add シーケンスのスクリーンショット。

  1. userName アンカーの文字列の値を抽出するには、ForEach アクティビティに Switch アクティビティをドラッグ アンド ドロップします。 ポップアップ ウィンドウで、スイッチの Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper タイプを選択します。 次の式の値を入力します: New AnchorAttributeNameWrapper(anchor.Name)
  2. Switch アクティビティの [新しいケースの追加] 領域をクリックします。 Case の値として userName を入力します。 Assign アクティビティを userName ケースの本文にドラッグ アンド ドロップし、userName 変数に anchor.Value.ToString() を割り当てます。

new case のスクリーンショット。

  1. これで、エクスポートされたオブジェクト アンカー プロパティから userName 値を抽出したので、他の SAP ユーザーの詳細を含む company、defaults、address、logon data など、他の構造を入力する必要があります。 これを行うには、属性の変更のコレクションを循環させます。
  2. ForEach アクティビティを折りたたみ、既存の ForEach アクティビティの後の Sequence アクティビティに、別の ForEachWithBothFactory アクティビティをドラッグ アンド ドロップします。 item 変数名を attributeChange に置き換え、[プロパティ] に切り替えて、Microsoft.MetadirectoryServices.AttributeChange の TypeArgument を選択します。 [Value] フィールドに objectToExport.AttributeChanges と入力します。

新しい Sequence のスクリーンショット。

  1. ForEach アクティビティの Body に Switch アクティビティをドラッグ アンド ドロップします。
  2. ポップアップ メニューで Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AttributeNameWrapper を選択し、[OK] をクリックします。
  3. 次の式を入力します: New AttributeNameWrapper(attributeChange.Name) Switch アクティビティの右上隅に、スキーマで定義され、プロパティに割り当てられていない未処理の属性に関する警告アイコンが表示されます。
  4. Switch アクティビティの [新しいケースの追加] 領域をクリックし、ケースの値として city を入力します。
  5. このケースの Body に、Assign アクティビティをドラッグ アンド ドロップします。 address.city に attributeChange.ValueChanges(0).Value.ToString() を割り当てます。

New export とワークフローのスクリーンショット。

  1. その他の不足しているケースと割り当てを追加します。 このマッピング テーブルをガイドとして使用してください。
ケース 譲渡
city address.city = attributeChange.ValueChanges(0)Value.ToString()
会社 company.company = attributeChange.ValueChanges(0)Value.ToString()
部署 address.department = attributeChange.ValueChanges(0)Value.ToString()
メール address.e_mail = attributeChange.ValueChanges(0)Value.ToString()
expirationTime logOnData.GLTGB = attributeChange.ValueChanges(0)Value.ToString()
firstname address.firstname = attributeChange.ValueChanges(0)Value.ToString()
lastName address.lastname = attributeChange.ValueChanges(0)Value.ToString()
middleName address.middlename = attributeChange.ValueChanges(0)Value.ToString()
telephoneNumber address.TEL1_Numbr = attributeChange.ValueChanges(0)Value.ToString()
jobTitle address.function = attributeChange.ValueChanges(0)Value.ToString()
export_password password.BAPIPWD1 = attributeChange.ValueChanges(0)Value.ToString()

ここでの export_password は、スキーマで常に定義され、作成されるユーザーの初期パスワードを渡すために使用できる特殊な仮想属性です。

ケースのスクリーンショット。

  1. ForEach アクティビティを折りたたみ、2 番目の ForEach アクティビティの後のシーケンス アクティビティに IF アクティビティをドラッグ アンド ドロップして、「ユーザー要求の作成」を送信する前に、ユーザーのプロパティを検証します。 空でない値は、ユーザー名、姓、初期パスワードの 3 つ以上必要です。 次の条件を入力します: (String.IsNullOrEmpty(address.lastname) = False ) AND (String.IsNullOrEmpty(userName) = False) AND (String.IsNullOrEmpty(password.BAPIPWD1) = False)
  2. IF アクティビティの Else ブランチで、不足している内容に応じて異なるエラーをスローするため、もう 1 つの IF アクティビティを追加します。 条件値 String.IsNullOrEmpty(userName) を入力します。 CreateCSEntryChangeResult アクティビティを 2 番目の IF アクティビティの両方のブランチにドラッグ アンド ドロップし、ExportErrorMissingAnchorComponentExportErrorMissingProvisioningAttribute の ErrorCode を設定します。

2 番目の IF アクティビティのスクリーンショット。

  1. 最初の IF アクティビティの空の Then ブランチに Sequence アクティビティをドラッグ アンド ドロップします。 Sequence アクティビティ内で WebSeviceCall アクティビティをドラッグ アンド ドロップします。 SAPECC サービス名、ZSAPCONNECTORWS エンドポイント、およびBAPI_USER_CREATE1 操作を選択します。 ... Arguments ボタンをクリックし、Web サービス呼び出しのパラメーターを次のように定義します。
Name 方向 Type
住所 In BAPIADDR3 address
COMPANY In BAPIUSCOMP 会社
DEFAULTS In BAPIDEFAUL defaults
LOGONDATA In BAPILOGOND logOnData
PASSWORD In BAPIPWD password
RETURN In-Out TABLE_OF_BAPIRET2 bapiret2Table
SELF_REGISTER 場所 String "X"
USERNAME 場所 String userName
  1. OK をクリックします。 警告記号が表示されなくなります。

パラメーターの後のワークフローのスクリーンショット。

  1. ユーザー要求の作成結果を処理するには、WebServiceCall アクティビティの後の Sequence アクティビティ内で IF アクティビティをドラッグ アンド ドロップします。 次の条件を入力します: IsNothing (bapiret2Table.item) OrElse bapiret2Table.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) <> 0
  2. エラーが発生しない場合は、エクスポート操作が正常に完了したと想定し、成功状態の CSEntryChangeResult を作成して、このオブジェクトのエクスポートが成功したことを示します。 CreateCSEntryChangeResult アクティビティを IF アクティビティの Else ブランチにドラッグ アンド ドロップし、成功エラー コード を選択します。
  3. 省略可能: Web サービス呼び出しが、ユーザーの生成されたアカウント名を返す場合は、エクスポートされたオブジェクトのアンカー値を更新する必要があります。 これを行うには、CreateCSEntryChangeResult アクティビティ内の CreateAttrubuteChange アクティビティをドラッグ アンド ドロップし、[ユーザー名の追加] を選択します。 次に、CreateAttributeChange アクティビティ内の CreateValueChange アクティビティをドラッグ アンド ドロップし、Web サービス呼び出しアクティビティによって設定された変数名を入力します。 このガイドでは、エクスポート時に更新されない userName 変数を使用します。

更新されたシーケンス フローのスクリーンショット。

  1. エクスポートの追加ワークフローの最後の手順は、エクスポート エラーを処理してログに記録することです。 シーケンス アクティビティを IF アクティビティの空の Then ブランチにドラッグ アンド ドロップします。
  2. ログ アクティビティをシーケンス アクティビティにドラッグ アンド ドロップします。 [プロパティ] タブに切り替え、LogText の値として bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E")).MESSAGE を入力します。 高いログレベルとトレース タグを維持します。 これにより、詳細トレースが有効になっているときに、エラー メッセージが ConnectorsLog または ECMA2Host イベント ログに記録されます。
  3. Log アクティビティの後の Sequence アクティビティ内に、Switch アクティビティをドラッグ アンド ドロップします。 ポップアップ ウィンドウで、スイッチ値の文字列型を選択します。 式 bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E")).NUMBER を入力します。
  4. 既定のケースをクリックし、CreateCSEntryChangeResult アクティビティをこのケースの本文にドラッグ アンド ドロップします。 ExportErrorInvalidProvisioningAttributeValue エラー コードを選択します。

ワークフローの新しい更新のスクリーンショット。

  1. [新しいケースの追加] 領域をクリックし、ケース値として 224 を入力します。 CreateCSEntryChangeResult アクティビティをこのケースの本文にドラッグ アンド ドロップします。 ExportErrorCustomContinueRun エラーコードを選択します。

ワークフローの最終更新のスクリーンショット。

エクスポート追加ワークフローの定義が完了しました。

エクスポート削除ワークフローの作成

SAP ECC でユーザーを削除するには、BAPI_USER_DELETE プログラムを呼び出し、接続されたシステムで削除するアカウント名を指定します。 ほとんどの場合、SAP ECC アカウントは削除されるのではなく、履歴レコードを保持するために期限切れにされるため、このシナリオが必須であるかどうかは SAP 管理者に問い合わせてください。

このガイドでは、SAP の一般ユーザー管理システム、接続されたシステムからのユーザーのプロビジョニング解除、ライセンスの失効などに関連するシナリオについては説明しません。

Exprt ワークフローに改ページ位置の自動修正を実装する必要はありません。 ワークフロー コンテキスト内で使用できる objectToExport オブジェクトは 1 つのみです。

  1. [オブジェクトの種類] -> [ユーザー] -> [エクスポート] -> [ワークフローの削除] に移動し、右側の Sequence アクティビティをワークフロー デザイナー ウィンドウにドラッグ アンド ドロップします。
  2. 左下にある [変数] ボタンを見つけてクリックし、この Sequence 内で定義されている変数の一覧を展開します。
  3. 次の変数を追加します。 SAP WSDL から生成された変数の型を選択するには、[型の参照] をクリックし、[生成済] を展開し、SAPECC 名前空間を展開します。 これにより、BAPI_USER_DELETE プログラムで使用されるデータ構造を初期化されます。
Name 変数の種類 範囲 既定値
userName String シークエンス
bapiret2Table SAPECC.TABLE_OF_BAPIRET2 シークエンス new TABLE_OF_BAPIRET2()
  1. userName プロパティを不変 ID であるアンカーとして定義したため、export オブジェクトのアンカーのコレクションから userName 値を抽出する必要があります。 ForEachWithBodyFactory アクティビティを、ツールボックスから Sequence アクティビティにドラッグ アンド ドロップします。 item の変数名を anchor に置き換え、[プロパティ] に切り替えて、Microsoft.MetadirectoryServices.AnchorAttribute の TypeArgument を選択します。 [値] フィールドに objectToExport.AnchorAttributes と入力します。

エクスポート削除操作ワークフローのスクリーンショット。

  1. userName アンカーの文字列の値を抽出するには、ForEach アクティビティに Switch アクティビティをドラッグ アンド ドロップします。 ポップアップ ウィンドウで、スイッチの Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper タイプを選択します。 式の値を入力します: New AnchorAttributeNameWrapper(anchor.Name)。 Switch アクティビティの [新しいケースの追加] 領域をクリックします。 Case の値として userName を入力します。 Assign アクティビティを userName ケース本文にドラッグ アンド ドロップし、 anchor.Value.ToString() を userName 変数に割り当てます。
  2. ForEach アクティビティの後の Sequence アクティビティ内で WebSeviceCall アクティビティをドラッグ アンド ドロップします。 SAPECC サービス名、ZSAPCONNECTORWS エンドポイント、およびBAPI_USER_DELETE操作を選択します。 ... Arguments ボタンをクリックし、Web サービス呼び出しのパラメーターを次のように定義します。
Name 方向 Type
RETURN /アウトの選択 TABLE_OF_BAPIRET2 bapiret2Table
USERNAME 場所 String userName
  1. OK をクリックします。 警告記号が表示されなくなります。

更新された削除操作ワークフローのスクリーンショット。

  1. ユーザー削除のリクエストの結果を処理するには、WebServiceCall アクティビティの後の Sequence アクティビティ内に IF アクティビティをドラッグ アンド ドロップします。 次の条件を入力します:  If(bapiRet2Table.item, Enumerable.Empty(Of BAPIRET2)()).Count(Function(errItem) errItem.TYPE.Equals("E") = True) <> 0
  2. エラーが発生しない場合は、削除操作が正常に完了したと見なし、成功ステータスのCSEntryChangeResult を作成して、このオブジェクトのエクスポートが成功したことを示します。 CreateCSEntryChangeResult アクティビティを IF アクティビティの Else ブランチにドラッグ アンド ドロップし、成功エラー コードを選択します。

エクスポート削除ワークフローのスクリーンショット。

  1. エクスポート削除ワークフローの最後の手順は、エクスポート エラーを処理してログに記録することです。 シーケンス アクティビティを IF アクティビティの空の Then ブランチにドラッグ アンド ドロップします。
  2. ログ アクティビティをシーケンス アクティビティにドラッグ アンド ドロップします。 [Properties] タブに切り替えて、LogText 値として bapiRetTable.item.First(Function(retItem) retItem.TYPE.Equals("E")= True).MESSAGEを入力します。 高いログレベルとトレース タグを維持します。 これにより、詳細トレースが有効な場合に、エラー メッセージが ConnectorsLog または ECMA2Host イベント ログに記録されます。
  3. Log アクティビティの後の Sequence アクティビティ内に、Switch アクティビティをドラッグ アンド ドロップします。 ポップアップ ウィンドウで、スイッチ値の文字列型を選択します。 式 bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E")).NUMBER を入力します。
  4. 既定のケースをクリックし、CreateCSEntryChangeResult アクティビティをこのケースの本文にドラッグ アンド ドロップします。 ExportErrorSyntaxViolation エラー コードを選択します。

エクスポート削除操作ワークフローの更新のスクリーンショット。

  1. [新しいケースの追加] 領域をクリックし、ケース値として 124 を入力します。 CreateCSEntryChangeResult アクティビティをこのケースの本文にドラッグ アンド ドロップします。 ExportErrorCustomContinueRun エラーコードを選択します。

最終的なエクスポート削除操作ワークフローのスクリーンショット。

エクスポート削除ワークフローの定義が完了しました。

エクスポート置換ワークフローの作成

SAP ECC でユーザーを更新するには、BAPI_USER_CHANGE プログラムを呼び出し、アカウント名と、変更されていないユーザーの詳細を含むすべてのユーザーの詳細を含むすべてのパラメーターを指定します。 「Replace]すべてのユーザー プロパティが提供される場合の ECMA2 エクスポート モードは、「Replace]と呼ばれます。 これに対し、AttributeUpdate のエクスポート モードでは、変更される属性のみが提供されるため、一部のユーザー プロパティが空の値で上書きされる可能性があります。 したがって、Webservice コネクタでは常にオブジェクト置換エクスポート モードが使用され、コネクタがエクスポート タイプ: 置換に構成されていることを想定しています。

エクスポート置換ワークフローは、エクスポートの追加ワークフローとほぼ同じです。 唯一の違いは、BAPI_USER_CHANGEプログラムに addressX や companyX などの追加パラメーターを指定する必要がある点です。addressX で終わる X は、アドレスの構造に変更が含まれていることを示します。

  1. [オブジェクトの種類] -> [ユーザー] -> [エクスポート] -> [ワークフローの置換] に移動し、右側のツールボックスから Sequence アクティビティをワークフロー デザイナー ウィンドウにドラッグ アンド ドロップします。
  2. 左下にある [変数] ボタンを見つけてクリックし、この Sequence 内で定義されている変数の一覧を展開します。
  3. 次の変数を追加します。 SAP WSDL から生成された変数の型を選択するには、[型の参照] をクリックし、[生成済] を展開し、SAPECC 名前空間を展開します。 これにより、BAPI_USER_CHANGE プログラムで使用されるデータ構造が初期化されます。
Name 変数の種類 範囲 既定値
userName String シークエンス
bapiret2Table SAPECC.TABLE_OF_BAPIRET2 シークエンス new TABLE_OF_BAPIRET2()
addressX SAPECC.BAPIADDR3X シークエンス new BAPIADDR3X()
address SAPECC.BAPIADDR3 シークエンス new BAPIADDR3()
companyX SAPECC. BAPIUSCOMX シークエンス new BAPIUSCOMX()
会社 SAPECC.BAPIUSCOMP シークエンス new BAPIUSCOMP()
defaultsX SAPECC.BAPIDEFAX シークエンス new BAPIDEFAX()
defaults SAPECC.BAPIDEFAUL シークエンス new BAPIDEFAUL()
logOnDataX SAPECC.BAPILOGONX シークエンス new BAPILOGONX()
logOnData SAPECC.BAPILOGOND シークエンス new BAPILOGOND()

エクスポート置換ワークフローは次のようになります。

置換操作ワークフローの開始のスクリーンショット。

  1. userName プロパティを不変 ID であるアンカーとして定義したため、export オブジェクトのアンカーのコレクションから userName 値を抽出する必要があります。 ForEachWithBodyFactory アクティビティを、ツールボックスから Sequence アクティビティにドラッグ アンド ドロップします。 item の変数名を anchor に置き換え、[プロパティ] に切り替えて、Microsoft.MetadirectoryServices.AnchorAttribute の TypeArgument を選択します。 [値] フィールドに objectToExport.AnchorAttributes と入力します。

操作ワークフローを置き換える更新のスクリーンショット。

  1. userName アンカーの文字列の値を抽出するには、ForEach アクティビティに Switch アクティビティをドラッグ アンド ドロップします。 ポップアップ ウィンドウで、スイッチの Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper タイプを選択します。 式の値を入力します: New AnchorAttributeNameWrapper(anchor.Name)。 Switch アクティビティの [新しいケースの追加] 領域をクリックします。 Case の値として userName を入力します。 Assign アクティビティを userName ケース本文にドラッグ アンド ドロップし、 anchor.Value.ToString() を userName 変数に割り当てます。 エクスポート置換ワークフローは次のようになります。

操作ワークフローを置き換える別の更新のスクリーンショット。

  1. これで、エクスポートされたオブジェクト アンカー プロパティから userName 値を抽出したので、他の SAP ユーザーの詳細を含む company、defaults、address、logon data など、他の構造を入力する必要があります。 これを行うには、スキーマで定義されているすべての属性のコレクションを循環します。
  2. ForEach アクティビティを折りたたみ、既存の ForEach アクティビティの後の Sequence アクティビティに、別の ForEachWithBothFactory アクティビティをドラッグ アンド ドロップします。 item変数名を schemaAttr に置き換え、プロパティに切り替えて、Microsoft.MetadirectoryServices.SchemaAttributeの TypeArgument を選択します。 [Value] フィールドに schemaType.Attributes と入力します。

置換操作シーケンス アクティビティのスクリーンショット。

  1. シーケンス アクティビティを ForEach アクティビティの本文にドラッグ アンド ドロップします。 左下にある [変数] ボタンを見つけてクリックし、この Sequence 内で定義されている変数の一覧を展開します。 次の変数を追加します: 文字列型の xValue。 Assign アクティビティを Sequence アクティビティにドラッグ アンド ドロップします。 xValue をIf(objectToExport.AttributeChanges.Contains(schemaAttr.Name), objectToExport.AttributeChanges(schemaAttr.Name).ValueChanges(0).Value.ToString(), String.Empty)の式に割り当てます。この属性のエクスポート用にステージングされた変更を抽出するか、その値を空の文字列で初期化します。 エクスポート置換ワークフローは次のようになります。

置換シーケンスへの更新のスクリーンショット。

  1. Assign アクティビティの後に Switch アクティビティをドラッグ アンド ドロップします。 ポップアップ メニューで Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AttributeNameWrapper を選択し、[OK] をクリックします。 次の式を入力します: New AttributeNameWrapper(schemaAttr.Name)。 Switch アクティビティの右上隅に、スキーマで定義され、プロパティに割り当てられていない未処理の属性に関する警告アイコンが表示されます。 Switch アクティビティの [新しいケースの追加] 領域をクリックし、ケースの値として city を入力します。 Sequence アクティビティをこのケースの本文にドラッグ アンド ドロップします。 Assign アクティビティをケースの本文にドラッグ アンド ドロップします。 addressX.city に "X" 値を割り当てます。 Assign アクティビティをこのケースの本文にドラッグ アンド ドロップします。 address.city に xValue を割り当てます。 エクスポート置換ワークフローは次のようになります。

Switch アクティビティのドラッグ アンド ドロップのスクリーンショット。

10. その他の不足しているケースと割り当てを追加します。 このマッピング テーブルをガイドとして使用してください。

ケース 譲渡
city addressX.city = "X" address.city = xValue
会社 companyX.company = "X" company.company = xValue
部署 address.departmentX = "X" address.department = xValue
メール addressX.e_mail = "X" address.e_mail = xValue
expirationTime logOnDataX.GLTGB = "X" logOnData.GLTGB = xValue
firstname addressX.firstname = "X" address.firstname = xValue
lastName addressX.lastname = "X" address.lastname = xValue
middleName addressX.middlename = "X" address.middlename = xValue
telephoneNumber addressX.TEL1_Numbr = "X" address.TEL1_Numbr = xValue
jobTitle addressX.function = "X" address.function = xValue

エクスポート置換ワークフローは次のようになります。

2 番目のドラッグ アンド ドロップ スイッチ アクティビティのスクリーンショット。

  1. BAPI_USER_CHANGEプログラムを呼び出す前に、空でないユーザー名を確認する必要があります。 ForEach アクティビティの両方を折りたたみ、2 番目の ForEach アクティビティの後に IF アクティビティをドラッグ アンド ドロップします。 次の条件を入力します: String.IsNullOrEmpty(userName ) = False

  2. ユーザー名が空の場合は、操作が失敗したことを示します。 CreateCSEntryChangeResult アクティビティを IF アクティビティの Else ブランチにドラッグ アンド ドロップし、ExportErrorCustomContinueRun エラー コードを選択します。 エクスポート置換ワークフローは次のようになります。 CreateCSEntryChangeResult アクティビティのスクリーンショット。

  3. シーケンス アクティビティを、最初の IF アクティビティの空の Then ブランチにドラッグ アンド ドロップします。 Sequence アクティビティ内で WebSeviceCall アクティビティをドラッグ アンド ドロップします。 SAPECC サービス名、ZSAPCONNECTORWS エンドポイント、およびBAPI_USER_CHANGE 操作を選択します。 ... Arguments ボタンをクリックし、Web サービス呼び出しのパラメーターを次のように定義します。

Name 方向 Type
住所 In BAPIADDR3 address
ADDRESSX In BAPIADDR3X addressX
COMPANY In BAPIUSCOMP 会社
COMPANYX In BAPIUSCOMX 会社
DEFAULTS In BAPIDEFAUL defaults
DEFAULTSX In BAPIDEFAX defaultsX
LOGONDATA In BAPILOGOND logOnData
LOGONDATAX In BAPILOGONX logOnDataX
RETURN /アウトの選択 TABLE_OF_BAPIRET2 bapiret2Table
USERNAME 場所 String userName
  1. OK をクリックします。 警告記号が表示されなくなります。 エクスポート置換ワークフローは次のようになります。

BAPI_USER_CHANGE 操作のスクリーンショット。

  1. ユーザー要求の変更結果を処理するには、WebServiceCall アクティビティの後の Sequence アクティビティに IF アクティビティをドラッグ アンド ドロップします。 次の条件を入力します: Not IsNothing(bapiret2Table.item) AndAlso bapiret2Table.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) <> 0
  2. エラーが発生しない場合は、エクスポート操作が正常に完了したと見なし、Success ステータスの CSEntryChangeResult を作成して、このオブジェクトのエクスポートが成功したことを示します。 CreateCSEntryChangeResult アクティビティを IF アクティビティの Else ブランチにドラッグ アンド ドロップし、成功エラー コードを選択します。
  3. Sequence アクティビティを IF アクティビティの Then ブランチにドラッグ アンド ドロップします。 string.Join("\n",bapiret2Table.item.Where(Function(retItem) retItem.TYPE.Equals("E")).Select(Function(r) r.MESSAGE)) および Error タグの LogText 値を使用して Log アクティビティを追加します。 ExportErrorCustomContinueRun のエラー コードを使用して、Log アクティビティの後に CreateCSEntryChangeResult アクティビティを追加します。 エクスポート置換ワークフローは次のようになります。

最終的な Export Replace ワークフローのスクリーンショット。

Export Replace ワークフローの定義を完了しました。

次の手順では、このテンプレートを使用して、ECMA2Host Webservice コネクタを構成します。

次のステップ