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 オブジェクトのスキーマを作成し、そのプロパティをこのテンプレートで使用できます。
- "C:\Program Files\Microsoft ECMA2Host\Web Service Configuration Tool" フォルダーから Web サービス構成ツール wsconfigTool.exe を起動します
- [File-New] メニューの [新しい SOAP プロジェクトの作成] を選択します
- [SOAP プロジェクト] をクリックし、[新しい Web サービスの追加] を選択します。
- Web サービスに「SAPECC」という名前を付け、発行された WSDL をダウンロードするための URL を指定し、名前空間として「SAPECC」と入力します。 Web サービス名は、テンプレート内でこの Web サービスを他の Web サービスと区別するのに役立ちます。 名前空間は、クラスの生成に使用される Microsoft .NET 名前空間の名前を定義します。 SAP 管理者の指示がない限り、基本認証モードを選択します。 [次へ] をクリックします。
- SAP ECC エンドポイントに接続するための資格情報を指定します。 [次へ] をクリックします。
- [エンドポイントと操作] ページで、BAPI が表示されていることを確認し、[完了] をクリックします。
Note
複数のエンドポイントが表示される場合は、SOAP 1.2 と SOAP 1.1 の両方のバインドが有効になります。 これにより、コネクタが失敗します。 SOAMANAGER でバインド定義を変更し、1 つだけ保持します。 次に、Web サービスを追加し直します。
- プロジェクトを C:\Program Files\Microsoft ECMA2Host\Service\ECMA フォルダーに保存します。
- [オブジェクトの種類] タブをクリックし、[ユーザー オブジェクトの種類] を追加することを選択します。 [OK] をクリックします。
- [オブジェクトの種類] タブを展開し、[ユーザーの種類の定義] をクリックします。
- スキーマに次の属性を追加し、アンカーとして userName を選択します。
- プロジェクトを保存します。
名前 | 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 のみが使用されます。
- [オブジェクトの種類] -> [ユーザー] -> [インポート] -> [フル インポート] ワークフローに移動し、右側の Sequence アクティビティを [ワークフロー デザイナー] ウィンドウにドラッグ アンド ドロップします。
- 左下にある [変数] ボタンを見つけてクリックし、この Sequence 内で定義されている変数の一覧を展開します。
- 次の変数を追加します。 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() |
- ツールボックスから、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 関数の呼び出しと改ページ位置の自動修正の実装に使用されます。
- 改ページ位置の自動修正を実装するには、最後の Assign 操作の後に、ツールボックスから、Sequence アクティビティ内の DoWhile アクティビティをドラッグ アンド ドロップします。
- 右側のウィンドウで [プロパティ] タブに切り替え、DoWhile にこの条件を入力します
- サイクル:
returnedSize = pageSize
- [変数] をクリックし、既定値が 0 の DoWhile サイクル内に int32 型の currentPageNumber プロパティを追加します。
- 省略可能な手順: Delta インポート ワークフローを実装する予定の場合は、DoWhile サイクルの後に、ツールボックスから Assign アクティビティを Sequence アクティビティにドラッグ アンド ドロップします。 次の値を設定します:
customData(schemaType.Name + "_lastImportTime") = DateTimeOffset.UtcNow.Ticks.ToString()
これにより、最後の完全インポートが実行された日付と時刻が保存され、このタイムスタンプは後で Delta Import ワークフローで使用できます。
- ツールボックスから、Sequence アクティビティを DoWhile アクティビティにドラッグ アンド ドロップします。 その Sequence アクティビティに WebServiceCall アクティビティをドラッグ アンド ドロップし、SAPECC サービス名、ZSAPCONNECTORWS エンドポイント、BAPI_USER_GETLIST 操作を選択します。
- ... 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 |
- OK をクリックします。 警告記号が表示されなくなります。 usersTable 変数に格納されているユーザーの一覧。 SAP は 1 回の応答でユーザーの完全なリストを返さないため、ページの切り替え中に改ページ位置の自動修正を実装し、この関数を複数回呼び出す必要があります。 その後、インポートされたすべてのユーザーについて、別の呼び出しを行って、そのユーザーの詳細を取得する必要があります。 つまり、ユーザー数が 1,000 人で、ページ サイズが 200 の横長の場合、Web サービス コネクタは 5 回の呼び出しを行ってユーザーのリストを取得し、1,000 回の個別呼び出しでユーザーの詳細を取得します。 パフォーマンスを向上させるには、1,000 回の個別呼び出しを行う必要をなくし、SOAP WS エンドポイント経由での BAPI 関数の公開を回避するために、すべてのユーザーをそのプロパティと共に一覧表示するカスタム BAPI プログラムの開発を SAP チームに求めます。
- WebServiceCall アクティビティの後に、ツールボックスから、IF アクティビティを DoWhile アクティビティにドラッグ アンド ドロップします。 空ではない応答とエラーがないことを確認するには、次の条件を指定します:
IsNothing(getListRetTable.item) OrElse getListRetTable.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) = 0
- ツールボックスから、Throw アクティビティを IF アクティビティの Else ブランチにドラッグ アンド ドロップして、インポートに失敗した場合にエラーをスローします。 [プロパティ] タブに切り替え、Throw アクティビティの Exception プロパティに次の式を入力します:
New Exception(getListRetTable.item.First(Function(retItem) retItem.TYPE.Equals("E")).MESSAGE)
- インポートされたユーザーのリストを処理するには、ForEachWithBodyFactory アクティビティをツールボックスから IF アクティビティの Then ブランチにドラッグ アンド ドロップします。 [プロパティ] タブに切り替えて、TypeArgument として SAPECC.BAPIUSNAME を選択します。 ... ボタンをクリックし、values プロパティに次の式を入力します:
if(usersTable.item,Enumerable.Empty(of BAPIUSNAME)())
- ツールボックスから、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 アクティビティは次のように表示されます。
- CreateCSEntryChangeScope アクティビティを Sequence アクティビティにドラッグ アンド ドロップします。 DN プロパティに、schemaType.Name & item.USERNAME と入力します。 [CreateAnchorAttribute AnchorValue] フィールドに、item.username と入力します。
- 各ユーザーの詳細を取得するには、ツールボックスから、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 |
- OK をクリックします。 警告記号が表示されなくなります。 ユーザーの詳細は、上記に一覧表示された変数に格納されます。 IF アクティビティは次のように表示されます。
- 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 ))
- Sequence アクティビティを IF アクティビティの Then ブランチにドラッグ アンド ドロップします。 既存の CreateAnchorAttribute アクティビティを、IF アクティビティの Then ブランチ内の Sequence アクティビティにドラッグ アンド ドロップします。 ForEach アクティビティは次のように表示されます。
- city、company、department、email などのユーザーの各プロパティについては、CreateAnchorAttribute アクティビティの後に IF アクティビティを追加し、
Not string.IsNullOrEmpty(address.city)
などの条件を入力し、その IF アクティビティの Then ブランチに 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 |
- 最後に、SetImportStatusCode アクティビティを最後の CreateAttributeChange アクティビティの後に追加します。 Then ブランチで ErrorCode を Success に設定します。 もう 1 つの SetImportStatus コード アクティビティを Else ブランチに追加し、ErrorCode を ImportErrorCustomContinueRun に設定します。
- DoWhile サイクルが次のようになるように、ForEach アクティビティ内の Sequence アクティビティを折りたたみます。
- ユーザーの次のページを取得するには、
selRangeTable.item(0).LOW
プロパティを更新します。 DoWhile 内の Sequence アクティビティに IF アクティビティをドラッグ アンド ドロップし、既存の IF アクティビティの後に配置します。 条件として、returnedSize>0 と入力します。 IF アクティビティの Then ブランチに Assign アクティビティを追加し、selRangeTable.item(0).LOW
をusersTable.item(returnedSize-1).username
に設定します。
Full Import ワークフローの定義を完了しました。
Export Add ワークフローの作成
SAP ECC でユーザーを作成するには、BAPI_USER_CREATE1 プログラムを呼び出し、アカウント名と初期パスワードを含むすべてのパラメーターを指定します。 SAP 側でアカウント名を生成する必要がある場合は、SAP 管理者に相談し、新しく作成されたユーザー アカウントの userName プロパティを返すカスタム BAPI 関数を使用します。
このガイドでは、ライセンス、ローカルまたはグローバルのアクティビティ グループ、システム、またはプロファイルの割り当てについては説明していません。 SAP 管理者に相談し、必要に応じてこのワークフローを変更してください。
Exprt ワークフローに改ページ位置の自動修正を実装する必要はありません。 ワークフロー コンテキスト内で使用できる objectToExport オブジェクトは 1 つのみです。
- [オブジェクトの種類] -> [ユーザー] -> [エクスポート] -> [追加] ワークフローに移動し、右側のツールボックスから、Sequence アクティビティをワークフロー デザイナー ウィンドウにドラッグ アンド ドロップします。
- 左下にある [変数] ボタンを見つけてクリックし、この Sequence 内で定義されている変数の一覧を展開します。
- 次の変数を追加します。 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() |
- userName プロパティを不変 ID であるアンカーとして定義したため、export オブジェクトのアンカーのコレクションから userName 値を抽出する必要があります。 ForEachWithBodyFactory アクティビティを、ツールボックスから Sequence アクティビティにドラッグ アンド ドロップします。 item の変数名を anchor に置き換え、[プロパティ] に切り替えて、
Microsoft.MetadirectoryServices.AnchorAttribute
の TypeArgument を選択します。 [値] フィールドにobjectToExport.AnchorAttributes
と入力します。
- userName アンカーの文字列の値を抽出するには、ForEach アクティビティに Switch アクティビティをドラッグ アンド ドロップします。 ポップアップ ウィンドウで、スイッチの
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper
タイプを選択します。 次の式の値を入力します: New AnchorAttributeNameWrapper(anchor.Name) - Switch アクティビティの [新しいケースの追加] 領域をクリックします。 Case の値として userName を入力します。 Assign アクティビティを userName ケースの本文にドラッグ アンド ドロップし、userName 変数に anchor.Value.ToString() を割り当てます。
- これで、エクスポートされたオブジェクト アンカー プロパティから userName 値を抽出したので、他の SAP ユーザーの詳細を含む company、defaults、address、logon data など、他の構造を入力する必要があります。 これを行うには、属性の変更のコレクションを循環させます。
- ForEach アクティビティを折りたたみ、既存の ForEach アクティビティの後の Sequence アクティビティに、別の ForEachWithBothFactory アクティビティをドラッグ アンド ドロップします。 item 変数名を attributeChange に置き換え、[プロパティ] に切り替えて、
Microsoft.MetadirectoryServices.AttributeChange
の TypeArgument を選択します。 [Value] フィールドにobjectToExport.AttributeChanges
と入力します。
- ForEach アクティビティの Body に Switch アクティビティをドラッグ アンド ドロップします。
- ポップアップ メニューで
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AttributeNameWrapper
を選択し、[OK] をクリックします。 - 次の式を入力します: New AttributeNameWrapper(attributeChange.Name) Switch アクティビティの右上隅に、スキーマで定義され、プロパティに割り当てられていない未処理の属性に関する警告アイコンが表示されます。
- Switch アクティビティの [新しいケースの追加] 領域をクリックし、ケースの値として city を入力します。
- このケースの Body に、Assign アクティビティをドラッグ アンド ドロップします。 address.city に
attributeChange.ValueChanges(0).Value.ToString()
を割り当てます。
- その他の不足しているケースと割り当てを追加します。 このマッピング テーブルをガイドとして使用してください。
ケース | 譲渡 |
---|---|
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 は、スキーマで常に定義され、作成されるユーザーの初期パスワードを渡すために使用できる特殊な仮想属性です。
- ForEach アクティビティを折りたたみ、2 番目の ForEach アクティビティの後のシーケンス アクティビティに IF アクティビティをドラッグ アンド ドロップして、「ユーザー要求の作成」を送信する前に、ユーザーのプロパティを検証します。 空でない値は、ユーザー名、姓、初期パスワードの 3 つ以上必要です。 次の条件を入力します:
(String.IsNullOrEmpty(address.lastname) = False ) AND (String.IsNullOrEmpty(userName) = False) AND (String.IsNullOrEmpty(password.BAPIPWD1) = False)
- IF アクティビティの Else ブランチで、不足している内容に応じて異なるエラーをスローするため、もう 1 つの IF アクティビティを追加します。 条件値 String.IsNullOrEmpty(userName) を入力します。
CreateCSEntryChangeResult
アクティビティを 2 番目の IF アクティビティの両方のブランチにドラッグ アンド ドロップし、ExportErrorMissingAnchorComponent
とExportErrorMissingProvisioningAttribute
の ErrorCode を設定します。
- 最初の 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 |
- OK をクリックします。 警告記号が表示されなくなります。
- ユーザー要求の作成結果を処理するには、WebServiceCall アクティビティの後の Sequence アクティビティ内で IF アクティビティをドラッグ アンド ドロップします。 次の条件を入力します:
IsNothing (bapiret2Table.item) OrElse bapiret2Table.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) <> 0
- エラーが発生しない場合は、エクスポート操作が正常に完了したと想定し、成功状態の CSEntryChangeResult を作成して、このオブジェクトのエクスポートが成功したことを示します。 CreateCSEntryChangeResult アクティビティを IF アクティビティの Else ブランチにドラッグ アンド ドロップし、成功エラー コード を選択します。
- 省略可能: Web サービス呼び出しが、ユーザーの生成されたアカウント名を返す場合は、エクスポートされたオブジェクトのアンカー値を更新する必要があります。 これを行うには、
CreateCSEntryChangeResult
アクティビティ内のCreateAttrubuteChange
アクティビティをドラッグ アンド ドロップし、[ユーザー名の追加] を選択します。 次に、CreateAttributeChange
アクティビティ内のCreateValueChange
アクティビティをドラッグ アンド ドロップし、Web サービス呼び出しアクティビティによって設定された変数名を入力します。 このガイドでは、エクスポート時に更新されない userName 変数を使用します。
- エクスポートの追加ワークフローの最後の手順は、エクスポート エラーを処理してログに記録することです。 シーケンス アクティビティを IF アクティビティの空の Then ブランチにドラッグ アンド ドロップします。
- ログ アクティビティをシーケンス アクティビティにドラッグ アンド ドロップします。 [プロパティ] タブに切り替え、LogText の値として
bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E"))
.MESSAGE を入力します。 高いログレベルとトレース タグを維持します。 これにより、詳細トレースが有効になっているときに、エラー メッセージが ConnectorsLog または ECMA2Host イベント ログに記録されます。 - Log アクティビティの後の Sequence アクティビティ内に、Switch アクティビティをドラッグ アンド ドロップします。 ポップアップ ウィンドウで、スイッチ値の文字列型を選択します。 式
bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E")).NUMBER
を入力します。 - 既定のケースをクリックし、CreateCSEntryChangeResult アクティビティをこのケースの本文にドラッグ アンド ドロップします。 ExportErrorInvalidProvisioningAttributeValue エラー コードを選択します。
- [新しいケースの追加] 領域をクリックし、ケース値として 224 を入力します。
CreateCSEntryChangeResult
アクティビティをこのケースの本文にドラッグ アンド ドロップします。ExportErrorCustomContinueRun
エラーコードを選択します。
エクスポート追加ワークフローの定義が完了しました。
エクスポート削除ワークフローの作成
SAP ECC でユーザーを削除するには、BAPI_USER_DELETE プログラムを呼び出し、接続されたシステムで削除するアカウント名を指定します。 ほとんどの場合、SAP ECC アカウントは削除されるのではなく、履歴レコードを保持するために期限切れにされるため、このシナリオが必須であるかどうかは SAP 管理者に問い合わせてください。
このガイドでは、SAP の一般ユーザー管理システム、接続されたシステムからのユーザーのプロビジョニング解除、ライセンスの失効などに関連するシナリオについては説明しません。
Exprt ワークフローに改ページ位置の自動修正を実装する必要はありません。 ワークフロー コンテキスト内で使用できる objectToExport オブジェクトは 1 つのみです。
- [オブジェクトの種類] -> [ユーザー] -> [エクスポート] -> [ワークフローの削除] に移動し、右側の Sequence アクティビティをワークフロー デザイナー ウィンドウにドラッグ アンド ドロップします。
- 左下にある [変数] ボタンを見つけてクリックし、この Sequence 内で定義されている変数の一覧を展開します。
- 次の変数を追加します。 SAP WSDL から生成された変数の型を選択するには、[型の参照] をクリックし、[生成済] を展開し、SAPECC 名前空間を展開します。 これにより、BAPI_USER_DELETE プログラムで使用されるデータ構造を初期化されます。
Name | 変数の種類 | 範囲 | 既定値 |
---|---|---|---|
userName | String | シークエンス | |
bapiret2Table | SAPECC.TABLE_OF_BAPIRET2 | シークエンス | new TABLE_OF_BAPIRET2() |
- userName プロパティを不変 ID であるアンカーとして定義したため、export オブジェクトのアンカーのコレクションから userName 値を抽出する必要があります。 ForEachWithBodyFactory アクティビティを、ツールボックスから Sequence アクティビティにドラッグ アンド ドロップします。 item の変数名を anchor に置き換え、[プロパティ] に切り替えて、
Microsoft.MetadirectoryServices.AnchorAttribute
の TypeArgument を選択します。 [値] フィールドにobjectToExport.AnchorAttributes
と入力します。
- userName アンカーの文字列の値を抽出するには、ForEach アクティビティに Switch アクティビティをドラッグ アンド ドロップします。 ポップアップ ウィンドウで、スイッチの
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper
タイプを選択します。 式の値を入力します: NewAnchorAttributeNameWrapper(anchor.Name)
。 Switch アクティビティの [新しいケースの追加] 領域をクリックします。 Case の値として userName を入力します。 Assign アクティビティを userName ケース本文にドラッグ アンド ドロップし、anchor.Value.ToString()
を userName 変数に割り当てます。 - ForEach アクティビティの後の Sequence アクティビティ内で WebSeviceCall アクティビティをドラッグ アンド ドロップします。 SAPECC サービス名、ZSAPCONNECTORWS エンドポイント、およびBAPI_USER_DELETE操作を選択します。 ... Arguments ボタンをクリックし、Web サービス呼び出しのパラメーターを次のように定義します。
Name | 方向 | Type | 値 |
---|---|---|---|
RETURN | /アウトの選択 | TABLE_OF_BAPIRET2 | bapiret2Table |
USERNAME | 場所 | String | userName |
- OK をクリックします。 警告記号が表示されなくなります。
- ユーザー削除のリクエストの結果を処理するには、WebServiceCall アクティビティの後の Sequence アクティビティ内に IF アクティビティをドラッグ アンド ドロップします。 次の条件を入力します:
If(bapiRet2Table.item, Enumerable.Empty(Of BAPIRET2)()).Count(Function(errItem) errItem.TYPE.Equals("E") = True) <> 0
- エラーが発生しない場合は、削除操作が正常に完了したと見なし、成功ステータスの
CSEntryChangeResult
を作成して、このオブジェクトのエクスポートが成功したことを示します。CreateCSEntryChangeResult
アクティビティを IF アクティビティの Else ブランチにドラッグ アンド ドロップし、成功エラー コードを選択します。
- エクスポート削除ワークフローの最後の手順は、エクスポート エラーを処理してログに記録することです。 シーケンス アクティビティを IF アクティビティの空の Then ブランチにドラッグ アンド ドロップします。
- ログ アクティビティをシーケンス アクティビティにドラッグ アンド ドロップします。 [Properties] タブに切り替えて、LogText 値として
bapiRetTable.item.First(Function(retItem) retItem.TYPE.Equals("E")= True).MESSAGE
を入力します。 高いログレベルとトレース タグを維持します。 これにより、詳細トレースが有効な場合に、エラー メッセージが ConnectorsLog または ECMA2Host イベント ログに記録されます。 - Log アクティビティの後の Sequence アクティビティ内に、Switch アクティビティをドラッグ アンド ドロップします。 ポップアップ ウィンドウで、スイッチ値の文字列型を選択します。 式
bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E")).NUMBER
を入力します。 - 既定のケースをクリックし、CreateCSEntryChangeResult アクティビティをこのケースの本文にドラッグ アンド ドロップします。 ExportErrorSyntaxViolation エラー コードを選択します。
- [新しいケースの追加] 領域をクリックし、ケース値として 124 を入力します。
CreateCSEntryChangeResult
アクティビティをこのケースの本文にドラッグ アンド ドロップします。ExportErrorCustomContinueRun
エラーコードを選択します。
エクスポート削除ワークフローの定義が完了しました。
エクスポート置換ワークフローの作成
SAP ECC でユーザーを更新するには、BAPI_USER_CHANGE プログラムを呼び出し、アカウント名と、変更されていないユーザーの詳細を含むすべてのユーザーの詳細を含むすべてのパラメーターを指定します。 「Replace]すべてのユーザー プロパティが提供される場合の ECMA2 エクスポート モードは、「Replace]と呼ばれます。 これに対し、AttributeUpdate のエクスポート モードでは、変更される属性のみが提供されるため、一部のユーザー プロパティが空の値で上書きされる可能性があります。 したがって、Webservice コネクタでは常にオブジェクト置換エクスポート モードが使用され、コネクタがエクスポート タイプ: 置換に構成されていることを想定しています。
エクスポート置換ワークフローは、エクスポートの追加ワークフローとほぼ同じです。 唯一の違いは、BAPI_USER_CHANGEプログラムに addressX や companyX などの追加パラメーターを指定する必要がある点です。addressX で終わる X は、アドレスの構造に変更が含まれていることを示します。
- [オブジェクトの種類] -> [ユーザー] -> [エクスポート] -> [ワークフローの置換] に移動し、右側のツールボックスから Sequence アクティビティをワークフロー デザイナー ウィンドウにドラッグ アンド ドロップします。
- 左下にある [変数] ボタンを見つけてクリックし、この Sequence 内で定義されている変数の一覧を展開します。
- 次の変数を追加します。 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() |
エクスポート置換ワークフローは次のようになります。
- userName プロパティを不変 ID であるアンカーとして定義したため、export オブジェクトのアンカーのコレクションから userName 値を抽出する必要があります。 ForEachWithBodyFactory アクティビティを、ツールボックスから Sequence アクティビティにドラッグ アンド ドロップします。 item の変数名を anchor に置き換え、[プロパティ] に切り替えて、
Microsoft.MetadirectoryServices.AnchorAttribute
の TypeArgument を選択します。 [値] フィールドにobjectToExport.AnchorAttributes
と入力します。
- userName アンカーの文字列の値を抽出するには、ForEach アクティビティに Switch アクティビティをドラッグ アンド ドロップします。 ポップアップ ウィンドウで、スイッチの
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper
タイプを選択します。 式の値を入力します: NewAnchorAttributeNameWrapper(anchor.Name)
。 Switch アクティビティの [新しいケースの追加] 領域をクリックします。 Case の値として userName を入力します。 Assign アクティビティを userName ケース本文にドラッグ アンド ドロップし、anchor.Value.ToString()
を userName 変数に割り当てます。 エクスポート置換ワークフローは次のようになります。
- これで、エクスポートされたオブジェクト アンカー プロパティから userName 値を抽出したので、他の SAP ユーザーの詳細を含む company、defaults、address、logon data など、他の構造を入力する必要があります。 これを行うには、スキーマで定義されているすべての属性のコレクションを循環します。
- ForEach アクティビティを折りたたみ、既存の ForEach アクティビティの後の Sequence アクティビティに、別の ForEachWithBothFactory アクティビティをドラッグ アンド ドロップします。 item変数名を schemaAttr に置き換え、プロパティに切り替えて、
Microsoft.MetadirectoryServices.SchemaAttribute
の TypeArgument を選択します。 [Value] フィールドにschemaType.Attributes
と入力します。
- シーケンス アクティビティを ForEach アクティビティの本文にドラッグ アンド ドロップします。 左下にある [変数] ボタンを見つけてクリックし、この Sequence 内で定義されている変数の一覧を展開します。 次の変数を追加します: 文字列型の xValue。 Assign アクティビティを Sequence アクティビティにドラッグ アンド ドロップします。 xValue を
If(objectToExport.AttributeChanges.Contains(schemaAttr.Name), objectToExport.AttributeChanges(schemaAttr.Name).ValueChanges(0).Value.ToString(), String.Empty)
の式に割り当てます。この属性のエクスポート用にステージングされた変更を抽出するか、その値を空の文字列で初期化します。 エクスポート置換ワークフローは次のようになります。
- Assign アクティビティの後に Switch アクティビティをドラッグ アンド ドロップします。 ポップアップ メニューで
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AttributeNameWrapper
を選択し、[OK] をクリックします。 次の式を入力します: NewAttributeNameWrapper(schemaAttr.Name)
。 Switch アクティビティの右上隅に、スキーマで定義され、プロパティに割り当てられていない未処理の属性に関する警告アイコンが表示されます。 Switch アクティビティの [新しいケースの追加] 領域をクリックし、ケースの値として city を入力します。 Sequence アクティビティをこのケースの本文にドラッグ アンド ドロップします。 Assign アクティビティをケースの本文にドラッグ アンド ドロップします。 addressX.city に "X" 値を割り当てます。 Assign アクティビティをこのケースの本文にドラッグ アンド ドロップします。 address.city に xValue を割り当てます。 エクスポート置換ワークフローは次のようになります。
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 |
エクスポート置換ワークフローは次のようになります。
BAPI_USER_CHANGEプログラムを呼び出す前に、空でないユーザー名を確認する必要があります。 ForEach アクティビティの両方を折りたたみ、2 番目の ForEach アクティビティの後に IF アクティビティをドラッグ アンド ドロップします。 次の条件を入力します:
String.IsNullOrEmpty(userName ) = False
ユーザー名が空の場合は、操作が失敗したことを示します。
CreateCSEntryChangeResult
アクティビティを IF アクティビティの Else ブランチにドラッグ アンド ドロップし、ExportErrorCustomContinueRun
エラー コードを選択します。 エクスポート置換ワークフローは次のようになります。シーケンス アクティビティを、最初の 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 |
- OK をクリックします。 警告記号が表示されなくなります。 エクスポート置換ワークフローは次のようになります。
- ユーザー要求の変更結果を処理するには、WebServiceCall アクティビティの後の Sequence アクティビティに IF アクティビティをドラッグ アンド ドロップします。 次の条件を入力します:
Not IsNothing(bapiret2Table.item) AndAlso bapiret2Table.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) <> 0
- エラーが発生しない場合は、エクスポート操作が正常に完了したと見なし、Success ステータスの
CSEntryChangeResult
を作成して、このオブジェクトのエクスポートが成功したことを示します。CreateCSEntryChangeResult
アクティビティを IF アクティビティの Else ブランチにドラッグ アンド ドロップし、成功エラー コードを選択します。 - 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 ワークフローの定義を完了しました。
次の手順では、このテンプレートを使用して、ECMA2Host Webservice コネクタを構成します。