撰寫 ECMA2Host 的 SAP ECC 7.51 Web 服務連接器範本
本指南會逐步引導您建立 Web 服務擴充性連線管理代理程式 (ECMA) 連接器的範本,以管理 SAP ECC 使用者。
限制和假設
此範本示範如何管理使用者。 本指南未涵蓋其他物件類型,例如本機活動群組、角色和配置檔,因為ECMA2Host目前不支援多重值參考。 本指南的密碼作業也不足。
本指南未涵蓋在 SAP 中建立用來呼叫公開 BAPI 函式的服務帳戶。 它假設預先建立的示範帳戶 開發人員 會與配置檔 搭配使用, RFC_ALL授與下列 BAPIs 的許可權。
根據預設,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
- 從 [檔案新增] 功能表選擇 [建立新的 SOAP 專案]
- 按兩下 [SOAP 專案],然後選擇 [新增 Web 服務]。
- 將您的 Web 服務命名為 SAPECC,提供 URL 以下載已發佈的 WSDL,輸入 SAPECC 作為命名空間。 Web 服務名稱可協助您區分範本中的此 Web 服務與其他服務。 Namespace定義用來產生類別之Microsoft .NET 命名空間的名稱。 除非 SAP 系統管理員另有指示,否則請選擇 [基本身份驗證模式]。 按一下 [下一步] 。
- 提供認證以連線到SAP ECC端點。 按一下 [下一步] 。
- 在 [端點和作業] 頁面上,確定顯示 BAPIs,然後按兩下 [完成]
注意
如果您看到多個端點,則同時啟用SOAP 1.2和SOAP 1.1系結。 這會導致連接器失敗。 修改 SOAMANAGER 中的系結定義,並只保留一個。 然後重新新增 Web 服務。
- 將專案儲存到 C:\Program Files\Microsoft ECMA2Host\Service\ECMA 資料夾。
- 按兩下 [物件類型] 索引標籤,然後選擇 [新增使用者物件類型]。 按一下 [確定] 。
- 展開 [物件類型] 索引標籤,然後按兩下 [使用者類型定義]。
- 將下列屬性新增至架構,然後選擇userName作為錨點。
- 儲存您的專案。
名稱 | 類型 | 錨點 |
---|---|---|
市/鎮 | 字串 | |
公司 | 字串 | |
部門 | 字串 | |
電子郵件 | 字串 | |
expirationTime | 字串 | |
firstName | 字串 | |
lastName | 字串 | |
middleName | 字串 | |
telephoneNumber | 字串 | |
jobTitle | 字串 | |
userName | 字串 | checked |
建立完整匯入工作流程
匯入工作流程在ECMA2Host中是選擇性的,可讓您將現有的SAP用戶匯入到ECMA2Host記憶體內部快取,並避免在布建期間建立重複的使用者。
如果您未建立匯入工作流程,則連接器會以僅限匯出模式運作,並導致ECMA2Host一律發出 建立用戶 作業,即使是現有使用者也一樣。 除非匯出工作流程處理重複項目,否則使用標準 SAP BAPIS 時,這可能會導致失敗或重複。
SAP ECC 不提供自上次讀取以來所做的讀取變更的內建機制。
因此,我們只實作「完整匯入」工作流程。 如果您需要基於效能考慮實作差異匯入,請參閱 SAP 系統管理員以取得 BAPI 清單,並將其發佈為 SOAP Web 服務。 然後使用下列所述的方法,以及包含先前成功執行時間戳的 customData 屬性,實作 Delta Import 工作流程。
SAP ECC 提供數個 BAPI 函式,以取得具有其屬性的使用者清單:
- BAPI_USER_GETLIST - 取得已連線至此系統之所有用戶的清單。
- BAPI_USER_GETDETAIL - 取得特定使用者的詳細數據。
在此範本中,只有這兩個BAPI可用來從SAP ECC擷取現有的使用者。
- 流覽至 [物件類型 - 使用者 ->> 匯入 -> 完整匯入] 工作流程,並從右側的 [工具箱] 拖放 [順序] 活動拖曳至工作流程設計工具窗格。
- 在左下方尋找 [變數] 按鈕,然後按下它展開此時序內定義的變數清單。
- 加入下列變數。 若要選取從 SAP WSDL 產生的變數類型,請按兩下 [瀏覽類型],然後展開 [產生的類型],然後展開 [SAPECC 命名空間]。
名稱 | 變數類型 | 範圍 | 預設 |
---|---|---|---|
selRangeTable | SAPECC。TABLE_OF_BAPIUSSRGE | 序列 | 含有 {.item = new BAPIUSSRGE(){new BAPIUSSRGE}} 的新TABLE_OF_BAPIUSSRGE |
getListRetTable | SAPECC。TABLE_OF_BAPIRET2 | 序列 | new TABLE_OF_BAPIRET2 |
pageSize | Int32 | 序列 | 200 |
returnedSize | Int32 | 序列 | |
usersTable | SAPECC。TABLE_OF_BAPIUSNAME | 序列 | new TABLE_OF_BAPIUSNAME() |
- 從 [工具箱] 拖放四個 [排序] 活動內的 [指派活動],並設定下列值:
selRangeTable.item(0).PARAMETER = "USERNAME"
selRangeTable.item(0).SIGN = "I" selRangeTable.item(0).OPTION = "GT" selRangeTable.item(0).LOW = ""
這些參數用來呼叫BAPI_USER_GETLIST函式,以及實作分頁。
- 若要實作分頁,請從 [工具箱] 將 DoWhile 活動拖放到上一次指派作業之後的 Sequence 活動內。
- 在右窗格上,切換至 [屬性] 索引標籤,然後針對 DoWhile 輸入此條件
- 週期:
returnedSize = pageSize
- 單擊 [變數],然後在 DoWhile 迴圈中新增 int32 類型的 currentPageNumber 屬性,預設值為 0。
- 選擇性步驟:如果您打算實作 Delta Import 工作流程,請在 DoWhile 周期之後,從 [工具箱] 拖放 [指派序列活動] 內的活動。 設定此值:
customData(schemaType.Name + "_lastImportTime") = DateTimeOffset.UtcNow.Ticks.ToString()
這樣會儲存上次完整匯入執行的日期和時間,稍後可以在 Delta Import 工作流程中使用這個時間戳。
- 從 [工具箱] 拖放 DoWhile 活動內的 Sequence 活動。 在該時序活動內拖放 WebServiceCall 活動,然後選取 SAPECC 服務名稱、ZSAPCONNECTORWS 端點和BAPI_USER_GETLIST作業。
- 點選 ...用來定義 Web 服務呼叫參數的自變數按鈕,如下所示:
名稱 | 方向 | 類型 | 值 |
---|---|---|---|
MAX_ROWS | In | Int32 | pageSize |
MAX_ROWSSpecified | In | 布林值 | True |
RETURN | 輸入/輸出 | TABLE_OF_BAPIRET2 | getListRetTable |
SELECTION_EXP | 輸入/輸出 | TABLE_OF_BAPIUSSEXP | |
SELECTION_RANGE | 輸入/輸出 | TABLE_OF_BAPIUSSRGE | selRangeTable |
USERLIST | 輸入/輸出 | TABLE_OF_BAPIUSNAME | usersTable |
WITH_USERNAME | 位於 | 字串 | |
ROWS | 外 | Int32 | returnedSize |
- 按一下 [確定]。 警告符號消失。 儲存在usersTable變數中的用戶清單。 由於 SAP 不會在單一回應中傳回使用者的完整清單,因此我們需要在切換頁面時實作分頁並呼叫此函式數次。 然後,針對匯入的每個使用者,您需要透過進行個別的通話來取得該使用者的詳細數據。 這表示對於具有 1000 位使用者和 200 個頁面大小的橫向,Web 服務連接器會發出 5 個呼叫來擷取使用者清單,以及 1000 個個別呼叫來擷取使用者的詳細數據。 若要改善效能,請讓 SAP 小組開發自定義 BAPI 程式,其中列出所有用途及其屬性,以避免需要進行 1000 個個別呼叫,並透過 SOAP WS 端點公開該 BAPI 函式。
- 在 WebServiceCall 活動之後,從 [工具箱] 中拖放 DoWhile 活動內的 IF 活動。 指定此條件來檢查非空白回應與沒有錯誤:
IsNothing(getListRetTable.item) OrElse getListRetTable.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) = 0
- 從 [工具箱] 將 [擲回] 活動拖放到 IF 活動的 Else 分支,以在匯入失敗時擲回錯誤。 切換至 [屬性] 索引標籤,然後針對 Throw 活動的 Exception 屬性輸入此表示式:
New Exception(getListRetTable.item.First(Function(retItem) retItem.TYPE.Equals("E")).MESSAGE)
- 若要處理匯入的使用者清單,請將 ForEachWithBodyFactory 活動從 [工具箱] 拖放到 IF 活動的 Then 分支。 切換至 [屬性] 索引標籤,然後選取 [SAPECC]。BAPIUSNAME 作為 TypeArgument。 點選 ...按鈕並針對 values 屬性輸入此表示式:
if(usersTable.item,Enumerable.Empty(of BAPIUSNAME)())
- 從 [工具箱] 拖放 ForEach 活動內的 [順序] 活動。 讓此時序活動視窗處於作用中狀態,請按兩下 [變數] 按鈕並定義這些變數:
名稱 | 變數類型 | 範圍 | 預設 |
---|---|---|---|
公司 | SAPECC。BAPIUSCOMP | 序列 | 新 BAPIUSCOMP() |
address | SAPECC。BAPIADDR3 | 序列 | new BAPIADDR3() |
違約 | SAPECC。BAPIDEFAUL | 序列 | 新 BAPIDEFAUL() |
logondata | SAPECC。BAPILOGOND | 序列 | 新 BAPILOGOND() |
getDetailRetTable | SAPECC。TABLE_OF_BAPIRET2 | 序列 | new TABLE_OF_BAPIRET2() |
您的 IF 活動看起來像這樣:
- 拖放 Sequence 活動內的 CreateCSEntryChangeScope 活動。 在 DN 屬性中,輸入 schemaType.Name & 專案。用戶名稱。 在 [CreateAnchorAttribute AnchorValue] 字段中,輸入 item.username。
- 若要擷取每個使用者的詳細數據,請從 [工具箱] 將 WebServiceCall 活動拖放到 CreateAnchorAttribute 活動之前。 選取 [SAPECC 服務名稱]、[ZSAPCONNECTORWS 端點] 和 [BAPI_USER_GET_DETAIL作業]。 點選 ...用來定義 Web 服務呼叫參數的自變數按鈕,如下所示:
名稱 | 方向 | 類型 | 值 |
---|---|---|---|
RETURN | 輸入/輸出 | TABLE_OF_BAPIRET2 | getDetailRetTable |
USERNAME | 位於 | 字串 | item.username |
地址 | 外 | BAPIADDR3 | address |
公司 | 外 | BAPIUSCOMP | 公司 |
違約 | 外 | BAPIUSDEFAUL | 違約 |
LOGONDATA | 外 | BAPILOGOND | logonData |
WITH_USERNAME | 位於 | 字串 | |
ROWS | 外 | Int32 | returnedSize |
- 按一下 [確定]。 警告符號消失。 用戶的詳細數據會儲存在上述列出的變數中。 您的 IF 活動看起來像這樣:
- 若要檢查BAPI_USER_GET_DETAIL作業的結果,請從 [工具箱] 拖放 IF 活動,並將它放在 WebServiceCall 和 CreateAnchorAttribute 活動之間的 Sequence 活動內。 輸入此條件:
IsNothing(getDetailRetTable.item) OrElse getDetailRetTable.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) = 0
由於遺漏的使用者詳細數據不應被視為災難性事件,因此我們想要指出此錯誤並繼續處理其他使用者。 將 [順序] 活動拖放到 IF 活動的 Else 分支。 在該新的時序活動內新增記錄活動。 切換至 [屬性] 索引標籤,並將 Level 屬性變更為 [高]、[標記至追蹤]。 在 LogText 屬性中輸入下列內容: string.Join("\n", getDetailRetTable.item.Select (Function(item) item.MESSAGE ))
- 將 [順序] 活動拖放到 IF 活動的 Then 分支。 將現有的 CreateAnchorAttribute 活動拖放到 IF 活動的 Then 分支內時序活動。 您的 ForEach 活動現在看起來像這樣:
- 針對城市、公司、部門、電子郵件等使用者的每個屬性,在 CreateAnchorAttribute 活動之後新增 IF 活動,並輸入類似
Not string.IsNullOrEmpty(address.city)
和 將 CreateAttributeChange 活動新增至該 IF 活動的 Then 分支,以檢查非空白值。
例如:使用此對應數據表為所有用戶屬性新增 CreateAttributeChange 活動:
ECMA User 屬性 | SAP 屬性 |
---|---|
市/鎮 | 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 | 位址。TEL1_NUMBR |
- 最後,在最後一個 CreateAttributeChange 活動之後新增 SetImportStatusCode 活動。 將 ErrorCode 設定為 Then 分支中的 [成功]。 將另一個 SetImportStatus 程式代碼活動新增至 Else 分支,並將 ErrorCode 設定為 ImportErrorCustomContinueRun。
- 在 ForEach 活動內折疊時序活動,讓您的 DoWhile 週期看起來像這樣:
- 若要擷取下一頁的使用者,請更新
selRangeTable.item(0).LOW
屬性。 將 IF 活動拖放到 DoWhile 內的時序活動,將它放在現有的 IF 活動之後。 輸入 returnedSize>0 作為 Condition。 將 [指派活動] 新增至 IF 活動的 Then 分支,並將 設定selRangeTable.item(0).LOW
為usersTable.item(returnedSize-1).username
。
您已完成完整匯入工作流程的定義。
建立導出新增工作流程
若要在 SAP ECC 中建立使用者,您可以呼叫BAPI_USER_CREATE1程式,並提供所有參數,包括帳戶名稱和初始密碼。 如果您需要在 SAP 端產生帳戶名稱,請洽詢您的 SAP 系統管理員,並使用會傳回新建立使用者帳戶之 userName 屬性的自定義 BAPI 函式。
本指南不會示範授權、本機或全域活動群組、系統或配置檔的指派。 請洽詢您的 SAP 系統管理員,並據以修改此工作流程。
不需要在匯出工作流程中實作分頁。 工作流程內容中只有一個對象物件ToExport 可用。
- 瀏覽至物件類型 - 使用者 ->> 匯出 -> 從右側的 [工具箱] 中,將 [順序] 活動拖放到工作流程設計工具窗格。
- 在左下方尋找 [變數] 按鈕,然後按下它展開此時序內定義的變數清單。
- 加入下列變數。 若要選取從 SAP WSDL 產生的變數類型,請按兩下 [瀏覽類型],然後展開 [產生的類型],然後展開 [SAPECC 命名空間]。 這會初始化BAPI_USER_CREATE1程式所使用的數據結構。
名稱 | 變數類型 | 範圍 | 預設 |
---|---|---|---|
address | SAPECC。BAPIADDR3 | 序列 | new BAPIADDR3() |
userName | String | 序列 | |
password | SAPECC。BAPIPWD | 序列 | 新 BAPIPWD() |
公司 | SAPECC。BAPIUSCOMP | 序列 | 新 BAPIUSCOMP() |
違約 | SAPECC。BAPIDEFAUL | 序列 | 新 BAPIDEFAUL() |
logOnData | SAPECC。BAPILOGOND | 序列 | 新 BAPILOGOND() |
bapiret2Table | SAPECC。TABLE_OF_BAPIRET2 | 序列 | new TABLE_OF_BAPIRET2() |
- 當我們將userName屬性定義為固定標識符、錨點時,我們必須從導出物件的錨點集合擷取 userName 值。 將 ForEachWithBodyFactory 活動從工具箱拖放到您的時序活動。 將專案變數名稱取代為錨點,切換至屬性,然後選擇的
Microsoft.MetadirectoryServices.AnchorAttribute
TypeArgument。 在 [值] 欄位中,輸入objectToExport.AnchorAttributes
。
- 若要擷取 userName 錨點的字串值,請在 ForEach 活動內拖放 Switch 活動。 在彈出視窗中,選取
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper
參數的類型。 輸入表達式值:New AnchorAttributeNameWrapper(anchor。名稱)。 - 按兩下 [切換活動] 的 [新增案例] 區域。 將 userName 輸入為 Case Value。 將 [指派活動] 拖放到 userName 案例本文,然後指派錨點。Value.ToString() 至 userName 變數。
- 既然我們已從導出的物件錨點屬性擷取 userName 值,我們需要填入其他結構,例如公司、預設值、位址、包含其他 SAP 使用者詳細數據的登入數據。 我們會透過迴圈查看屬性變更的集合來執行此動作。
- 折疊您的 ForEach 活動,並在現有的 ForEach 活動之後,將另一個 ForEachWithBothFactory 活動拖放到您的 Sequence 活動內。 將 專案 變數名稱取代為 attributeChange、切換至屬性,然後選擇的
Microsoft.MetadirectoryServices.AttributeChange
TypeArgument。 在 [值] 欄位中,輸入objectToExport.AttributeChanges
。
- 將 Switch 活動拖放到 ForEach 活動的主體中。
- 在彈出視窗中,選取
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AttributeNameWrapper
並按兩下 [確定]。 - 輸入下列表達式:New AttributeNameWrapper(attributeChange.Name)。 您會在 Switch 活動右上角看到有關架構中定義且未指派給任何屬性之未處理屬性的警告圖示。
- 按兩下 [切換活動] 的 [新增案例] 區域,然後輸入城市案例值。
- 將 [指派活動] 拖放到此案例的主體中。 指派
attributeChange.ValueChanges(0).Value.ToString()
給 address.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 | 位址。TEL1_Numbr = attributeChange.ValueChanges(0)Value.ToString() |
jobTitle | address.function = attributeChange.ValueChanges(0)Value.ToString() |
export_password | 密碼。BAPIPWD1 = attributeChange.ValueChanges(0)Value.ToString() |
這裡export_password是一律在架構中定義的特殊虛擬屬性,可用來傳遞所建立使用者的初始密碼。
- 折疊您的 ForEach 活動,然後將 IF 活動拖放到 Sequence 活動之後的第二個 ForEach 活動之後,先驗證用戶屬性,再提交建立使用者要求。 我們至少需要3個非空白值:使用者名稱、姓氏、初始密碼。 輸入此條件:
(String.IsNullOrEmpty(address.lastname) = False ) AND (String.IsNullOrEmpty(userName) = False) AND (String.IsNullOrEmpty(password.BAPIPWD1) = False)
- 在 IF 活動的 Else 分支中,會新增一個 IF 活動,因為我們想要根據遺漏的內容擲回不同的錯誤。 輸入條件值:String.IsNullOrEmpty(userName)。 將活動
CreateCSEntryChangeResult
拖放到第二個 IF 活動的兩個分支,並設定 和ExportErrorMissingProvisioningAttribute
的ExportErrorMissingAnchorComponent
ErrorCode。
- 將 Sequence 活動拖放到第一個 IF 活動的空白 Then 分支中。 拖放 Sequence 活動內的 WebSeviceCall 活動。 選取 SAPECC 服務名稱、ZSAPCONNECTORWS 端點和BAPI_USER_CREATE1作業。 點選 ...用來定義 Web 服務呼叫參數的自變數按鈕,如下所示:
名稱 | 方向 | 類型 | 值 |
---|---|---|---|
地址 | In | BAPIADDR3 | address |
公司 | In | BAPIUSCOMP | 公司 |
違約 | In | BAPIDEFAUL | 違約 |
LOGONDATA | In | BAPILOGOND | logOnData |
PASSWORD | In | BAPIPWD | password |
RETURN | In-Out | TABLE_OF_BAPIRET2 | bapiret2Table |
SELF_REGISTER | 位於 | 字串 | “X” |
USERNAME | 位於 | 字串 | userName |
- 按一下 [確定]。 警告符號消失。
- 若要處理建立使用者要求結果,請將 IF 活動拖放到 WebServiceCall 活動之後的 Sequence 活動內。 輸入下列條件:
IsNothing (bapiret2Table.item) OrElse bapiret2Table.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) <> 0
- 如果我們沒有收到錯誤,我們假設匯出作業已順利完成,而我們想要藉由建立成功狀態的 CSEntryChangeResult 來指出成功匯出此物件。 將 CreateCSEntryChangeResult 活動拖放到 IF 活動的 Else 分支,然後選取 [成功錯誤碼]。
- 選擇性:如果 Web 服務呼叫傳回用戶產生的帳戶名稱,我們需要更新匯出物件的錨點值。 若要這樣做,請在活動內
CreateCSEntryChangeResult
拖放CreateAttrubuteChange
活動,然後選取 [新增 userName]。 然後在活動內CreateAttributeChange
拖放CreateValueChange
活動,然後輸入 Web 服務呼叫活動填入的變數名稱。 在本指南中,您會使用匯出時未更新的userName變數。
- 匯出新增工作流程的最後一個步驟是處理和記錄導出錯誤。 將 Sequence 活動拖放到 IF 活動的空白 Then 分支中。
- 將 [記錄活動] 拖放至 [順序] 活動。 切換至 [屬性] 索引標籤,然後輸入LogText值:
bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E"))
。消息。 保留高記錄層級和追蹤標籤。 這會在啟用詳細資訊追蹤時,將錯誤訊息記錄到 ConnectorsLog 或 ECMA2Host 事件記錄檔中。 - 在記錄活動之後,拖放 Sequence 活動內的 Switch 活動。 在彈出視窗中,選取參數值的 [字串類型]。 輸入下列運算式:
bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E")).NUMBER
- 單擊 [預設案例],然後將 CreateCSEntryChangeResult 活動拖放到此案例的主體中。 選擇 ExportErrorInvalidProvisioningAttributeValue 錯誤碼。
- 按兩下 [新增案例] 區域,然後輸入大小寫值為224。
CreateCSEntryChangeResult
將活動拖放到此案例的主體中。 選擇ExportErrorCustomContinueRun
錯誤碼。
您已完成匯出新增工作流程的定義。
建立匯出刪除工作流程
若要刪除 SAP ECC 中的使用者,您可以呼叫BAPI_USER_DELETE程式,並提供帳戶名稱以在連線系統中刪除。 請洽詢您的 SAP 系統管理員,此案例是否為必要案例,因為最常刪除的 SAP ECC 帳戶不會刪除,但要過期以保留歷程記錄。
本指南未涵蓋與 SAP Common User Administration 系統、取消布建連線系統的使用者、撤銷授權等相關的案例。
不需要在匯出工作流程中實作分頁。 工作流程內容中只有一個對象物件ToExport 可用。
- 瀏覽至物件類型 - 使用者 ->> 匯出 -> 從右側的 [工具箱] 中,將 [順序] 活動拖放到工作流程設計工具窗格。
- 在左下方尋找 [變數] 按鈕,然後按下它展開此時序內定義的變數清單。
- 加入下列變數。 若要選取從 SAP WSDL 產生的變數類型,請按兩下 [瀏覽類型],然後展開 [產生的類型],然後展開 [SAPECC 命名空間]。 這會初始化BAPI_USER_DELETE程式所使用的數據結構。
名稱 | 變數類型 | 範圍 | 預設 |
---|---|---|---|
userName | String | 序列 | |
bapiret2Table | SAPECC。TABLE_OF_BAPIRET2 | 序列 | new TABLE_OF_BAPIRET2() |
- 當我們將userName屬性定義為固定標識符、錨點時,我們必須從導出物件的錨點集合擷取 userName 值。 將 ForEachWithBodyFactory 活動從工具箱拖放到您的時序活動。 將專案變數名稱取代為錨點,切換至屬性,然後選擇的
Microsoft.MetadirectoryServices.AnchorAttribute
TypeArgument。 在 [值] 欄位中,輸入objectToExport.AnchorAttributes
。
- 若要擷取 userName 錨點的字串值,請在 ForEach 活動內拖放 Switch 活動。 在彈出視窗中,選取
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper
參數的類型。 輸入 [表達式] 值:[新增AnchorAttributeNameWrapper(anchor.Name)
]。 按兩下 [切換活動] 的 [新增案例] 區域。 將 userName 輸入為 Case Value。 將 [指派活動] 拖放到userName案例本文,並指派anchor.Value.ToString()
給userName變數。 - 在 ForEach 活動之後,拖放 Sequence 活動內的 WebSeviceCall 活動。 選取 [SAPECC 服務名稱]、[ZSAPCONNECTORWS 端點] 和 [BAPI_USER_DELETE作業]。 點選 ...用來定義 Web 服務呼叫參數的自變數按鈕,如下所示:
名稱 | 方向 | 類型 | 值 |
---|---|---|---|
RETURN | 輸入/輸出 | TABLE_OF_BAPIRET2 | bapiret2Table |
USERNAME | 位於 | 字串 | userName |
- 按一下 [確定]。 警告符號消失。
- 若要處理刪除使用者要求結果,請將 IF 活動拖放到 WebServiceCall 活動之後的 Sequence 活動內。 輸入下列條件:
If(bapiRet2Table.item, Enumerable.Empty(Of BAPIRET2)()).Count(Function(errItem) errItem.TYPE.Equals("E") = True) <> 0
- 如果我們沒有收到任何錯誤,我們假設刪除作業已順利完成,而我們想要藉由建立
CSEntryChangeResult
成功狀態來指出成功匯出此物件。 將活動拖放CreateCSEntryChangeResult
到 IF 活動的 Else 分支,然後選取 [成功錯誤碼]。
- 匯出刪除工作流程的最後一個步驟是處理和記錄匯出錯誤。 將 Sequence 活動拖放到 IF 活動的空白 Then 分支中。
- 將 [記錄活動] 拖放至 [順序] 活動。 切換至 [屬性] 索引標籤,然後輸入LogText值:
bapiRetTable.item.First(Function(retItem) retItem.TYPE.Equals("E")= True).MESSAGE
。 保留高記錄層級和追蹤標籤。 這會在啟用詳細資訊追蹤時,將錯誤訊息記錄到 ConnectorsLog 或 ECMA2Host 事件記錄檔中。 - 在記錄活動之後,拖放 Sequence 活動內的 Switch 活動。 在彈出視窗中,選取參數值的 [字串類型]。 輸入下列運算式:
bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E")).NUMBER
- 單擊 [預設案例],然後將 CreateCSEntryChangeResult 活動拖放到此案例的主體中。 選擇 ExportErrorSyntaxViolation 錯誤碼。
- 按兩下 [新增案例] 區域,然後輸入大小寫值為124。
CreateCSEntryChangeResult
將活動拖放到此案例的主體中。 選擇ExportErrorCustomContinueRun
錯誤碼。
您已完成匯出刪除工作流程的定義。
建立導出取代工作流程
若要更新 SAP ECC 中的使用者,您可以呼叫 BAPI_USER_CHANGE 程式,並提供所有參數,包括帳戶名稱和所有使用者詳細數據,包括未變更的參數。 當要提供所有用戶屬性時,ECMA2 導出模式稱為 Replace。 相較之下,AttributeUpdate 的匯出模式只提供您正在變更的屬性,這可能會導致某些用戶屬性被空白值覆寫。 因此,Webservice 連接器一律會使用物件取代匯出模式,並預期連接器會針對導出類型:Replace 進行設定。
匯出取代工作流程幾乎與導出新增工作流程相同。 唯一的差別在於,您必須為 BAPI_USER_CHANGE 程式指定 addressX 或 companyX 之類的額外參數,其中 addressX 結尾的 X 表示地址結構確實包含變更。
- 流覽至 [物件類型 - 使用者 ->> 匯出 -> 取代工作流程],然後從右側的 [工具箱] 拖放 [順序] 活動拖曳至工作流程設計工具窗格。
- 在左下方尋找 [變數] 按鈕,然後按下它展開此時序內定義的變數清單。
- 加入下列變數。 若要選取從 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 | 序列 | 新的 BAPIUSCOMX() |
公司 | SAPECC。BAPIUSCOMP | 序列 | 新 BAPIUSCOMP() |
defaultsX | SAPECC。BAPIDEFAX | 序列 | 新的 BAPIDEFAX() |
違約 | SAPECC。BAPIDEFAUL | 序列 | 新 BAPIDEFAUL() |
logOnDataX | SAPECC。BAPILOGONX | 序列 | new BAPILOGONX() |
logOnData | SAPECC。BAPILOGOND | 序列 | 新 BAPILOGOND() |
您的匯出取代工作流程如下所示:
- 當我們將userName屬性定義為固定標識符、錨點時,我們必須從導出物件的錨點集合擷取 userName 值。 將 ForEachWithBodyFactory 活動從工具箱拖放到您的時序活動。 將專案變數名稱取代為錨點,切換至屬性,然後選擇的
Microsoft.MetadirectoryServices.AnchorAttribute
TypeArgument。 在 [值] 欄位中,輸入objectToExport.AnchorAttributes
。
- 若要擷取 userName 錨點的字串值,請在 ForEach 活動內拖放 Switch 活動。 在彈出視窗中,選取
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper
參數的類型。 輸入 [表達式] 值:[新增AnchorAttributeNameWrapper(anchor.Name)
]。 按兩下 [切換活動] 的 [新增案例] 區域。 將 userName 輸入為 Case Value。 將 [指派活動] 拖放到userName案例本文,並指派anchor.Value.ToString()
給userName變數。 您的匯出取代工作流程如下所示:
- 既然我們已從導出的物件錨點屬性擷取 userName 值,我們需要填入其他結構,例如公司、預設值、位址、包含其他 SAP 使用者詳細數據的登入數據。 我們會迴圈查看架構中所定義之所有屬性的集合,以執行此動作。
- 折疊您的 ForEach 活動,並在現有的 ForEach 活動之後,將另一個 ForEachWithBothFactory 活動拖放到您的 Sequence 活動內。 將 專案 變數名稱取代為 schemaAttr、切換至屬性,然後選擇的
Microsoft.MetadirectoryServices.SchemaAttribute
TypeArgument。 在 [值] 欄位中,輸入schemaType.Attributes
。
- 將 Sequence 活動拖放到 ForEach 活動的主體中。 在左下方尋找 [變數] 按鈕,然後按下它展開此時序內定義的變數清單。 新增下列變數:String 類型的 xValue。 將 [指派活動] 拖放到您的時序活動。 將 表達式指派給 xValue:
If(objectToExport.AttributeChanges.Contains(schemaAttr.Name), objectToExport.AttributeChanges(schemaAttr.Name).ValueChanges(0).Value.ToString(), String.Empty)
它會擷取暫存以供這個屬性導出的變更,或使用空字串將其初始化。 您的匯出取代工作流程如下所示:
- 在 [指派活動] 之後拖放 Switch 活動。 在彈出視窗中,選取
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AttributeNameWrapper
並按兩下 [確定]。 輸入下列表示式:新增AttributeNameWrapper(schemaAttr.Name)
。 您會在 Switch 活動的右上角看到警告圖示,說明架構中定義的未處理屬性,且未指派給任何屬性。 按兩下 [切換活動] 的 [新增案例] 區域,然後輸入城市案例值。 將 Sequence 活動拖放到此案例的主體中。 將 [指派] 活動拖放到此案例的主體中。 將 「X」 值指派給 addressX.city。 將另一個 Assign 活動拖放到此案例的主體中。 將 xValue 指派給 address.city。 您的匯出取代工作流程如下所示:
10.新增其他遺漏案例和指派。 使用此對應資料表作為指南:
大小寫 | 指派 |
---|---|
市/鎮 | 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” 位址。TEL1_Numbr = xValue |
jobTitle | addressX.function = “X” address.function = xValue |
您的匯出取代工作流程如下所示:
在呼叫 BAPI_USER_CHANGE 程式之前,我們需要檢查非空白的用戶名稱。 折疊 ForEach 活動,並在第二個 ForEach 活動之後拖放 IF 活動。 輸入下列條件:
String.IsNullOrEmpty(userName ) = False
當使用者名稱是空的時,我們想要指出作業失敗。
CreateCSEntryChangeResult
將活動拖放到 IF 活動的 Else 分支,然後選取ExportErrorCustomContinueRun
錯誤碼。 您的匯出取代工作流程如下所示:將 Sequence 活動拖放到第一個 IF 活動的空白 Then 分支中。 拖放 Sequence 活動內的 WebSeviceCall 活動。 選取 SAPECC 服務名稱、ZSAPCONNECTORWS 端點和BAPI_USER_CHANGE作業。 點選 ...用來定義 Web 服務呼叫參數的自變數按鈕,如下所示:
名稱 | 方向 | 類型 | 值 |
---|---|---|---|
地址 | In | BAPIADDR3 | address |
ADDRESSX | In | BAPIADDR3X | addressX |
公司 | In | BAPIUSCOMP | 公司 |
COMPANYX | In | BAPIUSCOMX | 公司 |
違約 | In | BAPIDEFAUL | 違約 |
DEFAULTSX | In | BAPIDEFAX | defaultsX |
LOGONDATA | In | BAPILOGOND | logOnData |
LOGONDATAX | In | BAPILOGONX | logOnDataX |
RETURN | 輸入/輸出 | TABLE_OF_BAPIRET2 | bapiret2Table |
USERNAME | 位於 | 字串 | userName |
- 按一下 [確定]。 警告符號消失。 您的匯出取代工作流程如下所示:
- 若要處理變更使用者要求結果,請在 WebServiceCall 活動之後拖放 Sequence 活動內的 IF 活動。 輸入下列條件:
Not IsNothing(bapiret2Table.item) AndAlso bapiret2Table.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) <> 0
- 如果我們沒有收到任何錯誤,我們假設匯出作業已順利完成,而我們想要藉由建立
CSEntryChangeResult
成功狀態來指出成功匯出此物件。 將活動拖放CreateCSEntryChangeResult
到 IF 活動的 Else 分支,然後選取 [成功錯誤碼]。 - 將 [順序] 活動拖放到 IF 活動的 Then 分支。 新增 LogText 值為 和 Error 標籤的
string.Join("\n",bapiret2Table.item.Where(Function(retItem) retItem.TYPE.Equals("E")).Select(Function(r) r.MESSAGE))
記錄活動。 在記錄活動之後新增CreateCSEntryChangeResult
活動,錯誤碼為ExportErrorCustomContinueRun
。 您的匯出取代工作流程如下所示:
您已完成匯出取代工作流程的定義。
下一個步驟是使用此範本設定 ECMA2Host Webservice 連接器 。