次の方法で共有


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

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

制限事項と前提

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

このガイドでは、公開されている BAPI 関数の呼び出しに使用される SAP 内のサービス アカウントの作成については説明しません。 開発者 事前に作成されたデモ アカウントが、この記事で説明する 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 サービス構成ツール" フォルダーから、Web サービス構成ツールを起動 wsconfigTool.exe
  2. File-New メニューの [Create new SOAP Project]\(新しい 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. 左下にある [変数] ボタンを見つけて選択し、このシーケンス内で定義されている変数の一覧を展開します。
  3. 次の変数を追加します。 SAP WSDL から生成された変数型を選択するには、[Browse for Types] を選択し、生成された を展開してから、SAPECC 名前空間を展開します。
名前 変数の種類 範囲 既定値
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. ツールボックスから、シーケンス アクティビティ内の 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. ツールボックスから、DoWhile アクティビティ内の Sequence アクティビティをドラッグ アンド ドロップします。 その Sequence アクティビティに WebServiceCall アクティビティをドラッグ アンド ドロップし、SAPECC サービス名、ZSAPCONNECTORWS エンドポイント、BAPI_USER_GETLIST 操作を選択します。

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

  1. [引数] ボタンを選択して、次のように Web サービス呼び出しのパラメーターを定義します。
名前 方向 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 In String
ROWS Out Int32 returnedSize
  1. [OK] を選択します。 警告記号が表示されなくなります。 usersTable 変数に格納されているユーザーの一覧。 SAP は 1 回の応答でユーザーの完全なリストを返さないため、ページの切り替え中に改ページ位置の自動修正を実装し、この関数を複数回呼び出す必要があります。 その後、インポートされたすべてのユーザーについて、別の呼び出しを行って、そのユーザーの詳細を取得する必要があります。 つまり、ユーザー数が 1,000 人でページ サイズが 200 のランドスケープの場合、Web サービス コネクタは 5 回の呼び出しを行ってユーザーのリストを取得し、1,000 回の個別呼び出しを行ってユーザーの詳細を取得します。 パフォーマンスを向上させるには、SAP チームに、すべての用途とそのプロパティを一覧表示するカスタム BAPI プログラムを開発するよう依頼します。 これにより、1,000 個の個別の呼び出しを行う必要が回避され、その BAPI 関数が SOAP WS エンドポイント経由で公開されます。
  2. ツールボックスから、WebServiceCall アクティビティの後に DoWhile アクティビティ内の IF アクティビティをドラッグ アンド ドロップします。 空ではない応答とエラーがないことを確認するには、次の条件を指定します: 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. ツールボックスから、ForEach アクティビティ内の Sequence アクティビティをドラッグ アンド ドロップします。 このシーケンス アクティビティ ウィンドウをアクティブにして、[変数] ボタンを選択し、次の変数を定義します。
名前 変数の種類 範囲 既定値
会社 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 & の項目を入力します。USERNAME。 [CreateAnchorAttribute AnchorValue] フィールドに、item.username と入力します。

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

  1. 各ユーザーの詳細を取得するには、ツールボックスから、CreateAnchorAttribute アクティビティの直前の Sequence アクティビティに WebServiceCall アクティビティをドラッグ アンド ドロップします。 SAPECC サービス名、ZSAPCONNECTORWS エンドポイント、BAPI_USER_GET_DETAIL 操作を選択します。 [引数] ボタンを選択して、次のように Web サービス呼び出しのパラメータを定義してください。
名前 方向 Type
RETURN /アウトの選択 TABLE_OF_BAPIRET2 getDetailRetTable
USERNAME In String item.username
住所 Out BAPIADDR3 address
COMPANY Out BAPIUSCOMP 会社
DEFAULTS Out BAPIUSDEFAUL defaults
LOGONDATA Out BAPILOGOND logonData
WITH_USERNAME In 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
department 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 プロパティを更新します。 IF アクティビティを DoWhile 内の Sequence アクティビティにドラッグ アンド ドロップします。 既存の 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. 左下にある [変数] ボタンを見つけて選択し、このシーケンス内で定義されている変数の一覧を展開します。
  3. 次の変数を追加します。 SAP WSDL から生成された変数の型を選択するには、[型の参照] を選択し、[生成済み] を展開し、SAPECC 名前空間を展開します。 これにより、BAPI_USER_CREATE1 プログラムで使用されるデータ構造が初期化されます。
名前 変数の種類 範囲 既定値
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 であるアンカーとして定義したので、エクスポート オブジェクトのアンカーのコレクションから 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. [スイッチ] アクティビティの [新しいケース領域の追加] を選択します。 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 を選択します。 [値] フィールドに「objectToExport.AttributeChanges」と入力します。

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

  1. ForEach アクティビティの Body に Switch アクティビティをドラッグ アンド ドロップします。
  2. ポップアップ メニューで[Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AttributeNameWrapper]を選択し、[OK]を選択します。
  3. 次の式を入力します: New AttributeNameWrapper(attributeChange.Name) Switch アクティビティの右上隅に、スキーマで定義され、プロパティに割り当てられていない未処理の属性に関する警告アイコンが表示されます。
  4. [切り替え] アクティビティの [新しいケース領域の追加] を選択し、ケース値として を入力し、市区町村を指定します。
  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()
department 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 操作を選択します。 [引数] ボタンを選択して、次のようにWebサービス呼び出しのパラメーターを定義します。
名前 方向 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 In String "X"
USERNAME In 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 サービス呼び出しが、ユーザーの生成されたアカウント名を返す場合は、エクスポートされたオブジェクトのアンカー値を更新する必要があります。 これを行うには、CreateAttrubuteChange アクティビティ内の CreateCSEntryChangeResult アクティビティをドラッグ アンド ドロップし、[ユーザー名の追加] を選択します。 次に、CreateValueChange アクティビティ内の CreateAttributeChange アクティビティをドラッグ アンド ドロップし、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 管理者に問い合わせてください。 ほとんどの場合、SAP ECC アカウントは削除されませんが、履歴レコードを保持するために期限切れに設定されます。

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

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

  1. [オブジェクトの種類] -> [ユーザー] -> [エクスポート] -> [ワークフローの削除] に移動し、右側の Sequence アクティビティをワークフロー デザイナー ウィンドウにドラッグ アンド ドロップします。
  2. 左下にある [変数] ボタンを見つけて選択し、このシーケンス内で定義されている変数の一覧を展開します。
  3. 次の変数を追加します。 SAP WSDL から生成された変数型を選択するには、「型の参照」を選択し、生成された を展開してから、SAPECC 名前空間を展開します。 これにより、BAPI_USER_DELETE プログラムで使用されるデータ構造を初期化されます。
名前 変数の種類 範囲 既定値
userName String シークエンス
bapiret2Table SAPECC.TABLE_OF_BAPIRET2 シークエンス new TABLE_OF_BAPIRET2()
  1. userName プロパティを不変 ID であるアンカーとして定義したので、エクスポート オブジェクトのアンカーのコレクションから 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)。 [スイッチ] アクティビティの [新しいケース領域の追加] を選択します。 Case の値として userName を入力します。 Assign アクティビティを userName ケース本文にドラッグ アンド ドロップし、 anchor.Value.ToString() を userName 変数に割り当てます。
  2. ForEach アクティビティの後の Sequence アクティビティ内で WebSeviceCall アクティビティをドラッグ アンド ドロップします。 SAPECC サービス名、ZSAPCONNECTORWS エンドポイント、およびBAPI_USER_DELETE操作を選択します。 次のように Web サービス呼び出しのパラメーターを定義するには、[引数] ボタンを選択します。
名前 方向 Type
RETURN /アウトの選択 TABLE_OF_BAPIRET2 bapiret2Table
USERNAME In 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. 左下にある [変数] ボタンを見つけて選択し、このシーケンス内で定義されている変数の一覧を展開します。
  3. 次の変数を追加します。 SAP WSDL から生成された変数の型を選択するには、[型の参照] を選択し、[生成済み] を展開し、SAPECC 名前空間を展開します。 これにより、BAPI_USER_CHANGE プログラムで使用されるデータ構造が初期化されます。
名前 変数の種類 範囲 既定値
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 であるアンカーとして定義したので、エクスポート オブジェクトのアンカーのコレクションから 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)。 [スイッチ] アクティビティの [新しいケース領域の追加] を選択します。 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 を選択します。 [値] フィールドに「schemaType.Attributes」と入力します。

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

  1. シーケンス アクティビティを ForEach アクティビティの本文にドラッグ アンド ドロップします。 左下にある [変数] ボタンを見つけて選択し、このシーケンス内で定義されている変数の一覧を展開します。 次の変数を追加します: 文字列型の 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 アクティビティの右上隅に、スキーマで定義され、プロパティに割り当てられていない未処理の属性に関する警告アイコンが表示されます。 [切り替え] アクティビティの [新しいケース領域の追加] を選択し、ケースの値として と市区町村を入力します。 Sequence アクティビティをこのケースの本文にドラッグ アンド ドロップします。 Assign アクティビティをケースの本文にドラッグ アンド ドロップします。 addressX.city に "X" 値を割り当てます。 Assign アクティビティをこのケースの本文にドラッグ アンド ドロップします。 address.city に xValue を割り当てます。 エクスポート置換ワークフローは次のようになります。

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

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

ケース 譲渡
city addressX.city = "X" address.city = xValue
会社 companyX.company = "X" company.company = xValue
department 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 操作を選択します。 [...] を選択して、次のように Web サービス呼び出しのパラメーターを定義するには [引数] ボタンをクリックします。

名前 方向 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 In 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 アクティビティを追加します。 CreateCSEntryChangeResult のエラー コードを使用して、Log アクティビティの後に ExportErrorCustomContinueRun アクティビティを追加します。 エクスポート置換ワークフローは次のようになります。

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

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

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

次のステップ