ECMA2Host용 SAP ECC 7.51 웹 서비스 커넥터 템플릿 작성
이 가이드에서는 SAP ECC 사용자를 관리하기 위해 ECMA(웹 서비스 확장성 연결 관리 에이전트) 커넥터에 대한 템플릿을 만드는 프로세스를 안내합니다.
제한 사항 및 가정
이 템플릿은 사용자를 관리하는 방법을 보여 줍니다. ECMA2Host는 현재 다중값 참조를 지원하지 않으므로 로컬 활동 그룹, 역할 및 프로필과 같은 다른 개체 형식은 이 가이드에서 다루지 않습니다. 암호 작업도 이 가이드의 범위를 벗어납니다.
이 가이드에서는 노출된 BAPI 함수를 호출하는 데 사용되는 SAP 내에서 서비스 계정을 만드는 방법을 다루지 않습니다. 미리 만든 데모 계정 개발자 가 아래에 언급된 BAPI에 권한을 부여하는 프로필 RFC_ALL 사용된다고 가정합니다.
웹 서비스 구성 도구는 기본적으로 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입니다.
웹 서비스 엔드포인트 정의 및 스키마 만들기
가져오기 및 내보내기 워크플로를 디자인하려면 템플릿을 만들고 SOAP 인터페이스를 통해 노출된 SAP BAPI 함수를 사용하여 엔드포인트를 정의해야 합니다. 그런 다음 ECMA2 개체의 스키마를 만들고 해당 속성을 이 템플릿에서 사용할 수 있습니다.
- "C:\Program Files\Microsoft ECMA2Host\Web Service Configuration Tool" 폴더에서 웹 서비스 구성 도구 wsconfigTool.exe 시작합니다.
- [파일-새로 만들기] 메뉴에서 [새 SOAP 프로젝트 만들기]를 선택합니다.
- SOAP 프로젝트를 클릭하고 새 웹 서비스 추가를 선택합니다.
- 웹 서비스 이름을 SAPECC로 지정하고, 게시된 WSDL을 다운로드하는 URL을 제공하고, SAPECC를 네임스페이스로 입력합니다. 웹 서비스 이름을 사용하면 템플릿에서 이 웹 서비스를 다른 사용자와 구분할 수 있습니다. 네임스페이스는 클래스를 생성하는 데 사용되는 Microsoft .NET 네임스페이스의 이름을 정의합니다. SAP 관리자가 달리 지시하지 않는 한 기본 인증 모드를 선택합니다. 다음을 클릭합니다.
- SAP ECC 엔드포인트에 연결할 자격 증명을 제공합니다. 다음을 클릭합니다.
- 엔드포인트 및 작업 페이지에서 BAPI가 표시되는지 확인하고 마침을 클릭합니다.
참고 항목
둘 이상의 엔드포인트가 표시되면 SOAP 1.2 및 SOAP 1.1 바인딩을 모두 사용할 수 있습니다. 이로 인해 커넥터가 실패합니다. SOAMANAGER에서 바인딩 정의를 수정하고 하나만 유지합니다. 그런 다음 웹 서비스를 다시 추가합니다.
- 프로젝트를 C:\Program Files\Microsoft ECMA2Host\Service\ECMA 폴더에 저장합니다.
- 개체 유형 탭을 클릭하고 사용자 개체 형식을 추가하도록 선택합니다. Ok를 클릭합니다.
- 개체 유형 탭을 확장하고 사용자 유형 정의를 클릭합니다.
- 스키마에 다음 특성을 추가하고 userName을 앵커로 선택합니다.
- 프로젝트를 저장합니다.
속성 | Type | 기준 위치 |
---|---|---|
city | string | |
company | 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 웹 서비스로 게시하도록 합니다. 그런 다음, 앞에서 설명한 접근 방식과 이전에 성공한 실행의 타임스탬프를 포함하는 customData 속성을 사용하여 Delta Import 워크플로를 구현합니다.
SAP ECC는 여러 BAPI 함수를 제공하여 해당 속성이 있는 사용자 목록을 가져옵니다.
- BAPI_USER_GETLIST - 이 시스템에 연결된 모든 사용자 목록을 가져옵니다.
- BAPI_USER_GETDETAIL - 특정 사용자의 세부 정보를 가져옵니다.
이러한 두 개의 BAPI만 이 템플릿의 SAP ECC에서 기존 사용자를 검색하는 데 사용됩니다.
- 개체 유형 - 사용자 -> 가져오기 ->> 전체 가져오기 워크플로로 이동하고 오른쪽의 도구 상자에서 시퀀스 작업을 워크플로 디자이너 창으로 끌어서 놓습니다.
- 왼쪽 아래에서 변수 단추를 찾아 클릭하여 이 시퀀스 내에 정의된 변수 목록을 확장합니다.
- 다음 변수를 추가합니다. SAP WSDL에서 생성된 변수 형식을 선택하려면 형식 찾아보기를 클릭하고 생성된 항목을 확장 한 다음 SAPECC 네임스페이스를 확장합니다.
속성 | 변수 유형 | 범위 | 기본값 |
---|---|---|---|
selRangeTable | SAPECC. TABLE_OF_BAPIUSSRGE | Sequence | 새 TABLE_OF_BAPIUSSRGE {.item = new BAPIUSSRGE(){new BAPIUSSRGE}} |
getListRetTable | SAPECC. TABLE_OF_BAPIRET2 | Sequence | 새 TABLE_OF_BAPIRET2 |
pageSize | Int32 | Sequence | 200 |
returnedSize | Int32 | Sequence | |
usersTable | SAPECC. TABLE_OF_BAPIUSNAME | Sequence | 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 작업을 끌어서 놓습니다.
- 오른쪽 창에서 속성 탭으로 전환하고 DoWhile에 대해 이 조건을 입력합니다.
- 주기:
returnedSize = pageSize
- 변수를 클릭하고 기본값이 0인 DoWhile 주기 내에 int32 형식의 currentPageNumber 속성을 추가합니다.
- 선택적 단계: 델타 가져오기 워크플로를 구현하려는 경우 도구 상자에서 DoWhile 주기 후 시퀀스 작업 내에서 작업 할당을 끌어서 놓습니다. 다음 값을 설정합니다.
customData(schemaType.Name + "_lastImportTime") = DateTimeOffset.UtcNow.Ticks.ToString()
이렇게 하면 마지막 전체 가져오기 실행의 날짜와 시간이 저장되고 이 타임스탬프는 나중에 Delta Import 워크플로에서 사용할 수 있습니다.
- 도구 상자에서 DoWhile 작업 내에 시퀀스 작업을 끌어서 놓습니다. 해당 시퀀스 작업 내에서 WebServiceCall 작업을 끌어서 놓고 SAPECC 서비스 이름, ZSAPCONNECTORWS 엔드포인트 및 BAPI_USER_GETLIST 작업을 선택합니다.
- ...를 클릭합니다. 다음과 같이 웹 서비스 호출에 대한 매개 변수를 정의하는 인수 단추입니다.
속성 | Direction | 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 | 문자열 | |
ROWS | Out | Int32 | returnedSize |
- 확인을 클릭합니다. 경고 표시가 사라집니다. usersTable 변수에 저장된 사용자 목록입니다. SAP는 단일 응답에서 전체 사용자 목록을 반환하지 않으므로 페이지를 전환하는 동안 페이지 매김을 구현하고 이 함수를 여러 번 호출해야 합니다. 그런 다음 가져온 모든 사용자에 대해 별도의 호출을 통해 해당 사용자의 세부 정보를 가져와야 합니다. 즉, 사용자가 1,000명이고 페이지 크기가 200인 환경의 경우 웹 서비스 커넥터는 사용자 목록을 검색하기 위해 5번의 호출과 1,000개의 개별 호출을 실행하여 사용자의 세부 정보를 검색합니다. 성능을 향상시키려면 SAP 팀이 1000개의 개별 호출을 수행하고 SOAP WS 엔드포인트를 통해 해당 BAPI 함수를 노출할 필요가 없도록 모든 용도를 속성과 함께 나열하는 사용자 지정 BAPI 프로그램을 개발하도록 요청합니다.
- 도구 상자에서 WebServiceCall 활동 후 DoWhile 활동 내에서 IF 활동을 끌어서 놓습니다. 비어있지 않은 응답과 오류가 없는지 확인하려면 다음 조건을 지정합니다.
IsNothing(getListRetTable.item) OrElse getListRetTable.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) = 0
- 도구 상자에서 THROW 작업을 IF 활동의 Else 분기로 끌어서 놓아 가져오기 실패에 대한 오류를 throw합니다. 속성 탭으로 전환하고 Throw 작업의 Exception 속성에 대해 다음 식을 입력합니다.
New Exception(getListRetTable.item.First(Function(retItem) retItem.TYPE.Equals("E")).MESSAGE)
- 가져온 사용자 목록을 처리하려면 ForEachWithBodyFactory 작업을 도구 상자에서 IF 활동의 Then 분기로 끌어서 놓습니다. 속성 탭으로 전환하고 SAPECC를 선택합니다. TYPEArgument인 BAPIUSNAME입니다. ...를 클릭합니다. 단추 및 값 속성에 대해 다음 식을 입력합니다.
if(usersTable.item,Enumerable.Empty(of BAPIUSNAME)())
- 도구 상자에서 ForEach 작업 내에 시퀀스 작업을 끌어서 놓습니다. 이 시퀀스 작업 창이 활성화된 상태에서 변수 단추를 클릭하고 다음 변수를 정의합니다.
속성 | 변수 유형 | 범위 | 기본값 |
---|---|---|---|
company | SAPECC. BAPIUSCOMP | Sequence | new BAPIUSCOMP() |
address | SAPECC. BAPIADDR3 | Sequence | new BAPIADDR3() |
기본값 | SAPECC. BAPIDEFAUL | Sequence | new BAPIDEFAUL() |
logondata | SAPECC. BAPILOGOND | Sequence | new BAPILOGOND() |
getDetailRetTable | SAPECC. TABLE_OF_BAPIRET2 | Sequence | new TABLE_OF_BAPIRET2() |
IF 활동은 다음과 같습니다.
- CreateCSEntryChangeScope 작업을 시퀀스 작업 내에서 끌어서 놓습니다. DN 속성에서 schemaType.Name 및 항목을 입력합니다. USERNAME. CreateAnchorAttribute AnchorValue 필드에 item.username을 입력합니다.
- 각 사용자의 세부 정보를 검색하려면 도구 상자에서 CreateAnchorAttribute 작업 바로 전에 시퀀스 작업 내에 WebServiceCall 작업을 끌어서 놓습니다. SAPECC 서비스 이름, ZSAPCONNECTORWS 엔드포인트 및 BAPI_USER_GET_DETAIL 작업을 선택합니다. ...를 클릭합니다. 다음과 같이 웹 서비스 호출에 대한 매개 변수를 정의하는 인수 단추입니다.
속성 | Direction | Type | 값 |
---|---|---|---|
RETURN | 입/출력 | TABLE_OF_BAPIRET2 | getDetailRetTable |
USERNAME | In | 문자열 | item.username |
주소 | Out | BAPIADDR3 | address |
회사 | Out | BAPIUSCOMP | company |
기본값 | Out | BAPIUSDEFAUL | 기본값 |
LOGONDATA | Out | BAPILOGOND | logonData |
WITH_USERNAME | In | 문자열 | |
ROWS | Out | Int32 | returnedSize |
- 확인을 클릭합니다. 경고 표시가 사라집니다. 사용자의 세부 정보는 위에 나열된 변수에 저장됩니다. IF 활동은 다음과 같습니다.
- BAPI_USER_GET_DETAIL 작업의 결과를 확인하려면 도구 상자에서 IF 활동을 끌어서 놓고 WebServiceCall과 CreateAnchorAttribute 작업 간에 시퀀스 작업 내에 배치합니다. 다음 조건을 입력합니다.
IsNothing(getDetailRetTable.item) OrElse getDetailRetTable.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) = 0
누락된 사용자 세부 정보는 치명적인 이벤트로 취급해서는 안 하므로 이 오류를 나타내고 다른 사용자의 처리를 계속하려고 합니다. 시퀀스 작업을 IF 활동의 Else 분기로 끌어다 놓습니다. 새 시퀀스 작업 내에 로그 작업을 추가합니다. 속성 탭으로 전환하고 Level 속성을 High, Tag to Trace로 변경합니다. LogText 속성에 다음을 입력합니다. string.Join("\n", getDetailRetTable.item.Select (Function(item) item.MESSAGE ))
- 시퀀스 작업을 IF 활동의 Then 분기로 끌어서 놓습니다. 기존 CreateAnchorAttribute 작업을 IF 활동의 Then 분기 내에서 시퀀스 작업으로 끌어다 놓습니다. 이제 ForEach 작업은 다음과 같습니다.
- 도시, 회사, 부서와 같은 사용자의 각 속성에 대해 전자 메일은 CreateAnchorAttribute 작업 후에 IF 활동을 추가하고 해당 IF 활동의 Then 분기에 CreateAttributeChange 활동과 같은
Not string.IsNullOrEmpty(address.city)
조건을 입력하고 추가하여 비어있지 않은 값을 확인합니다.
예: 이 매핑 테이블을 사용하여 모든 사용자 속성에 대해 CreateAttributeChange 작업을 추가합니다.
ECMA 사용자 속성 | SAP 속성 |
---|---|
city | address.city |
department | address.department |
company | 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 작업을 추가합니다. Then 분기에서 ErrorCode를 성공으로 설정합니다. 다른 SetImportStatus 코드 작업을 Else 분기에 추가하고 ErrorCode를 ImportErrorCustomContinueRun으로 설정합니다.
- ForEach 작업 내에서 시퀀스 작업을 축소하여 DoWhile 주기가 다음과 같이 표시됩니다.
- 사용자의 다음 페이지를 검색하려면 속성을 업데이트
selRangeTable.item(0).LOW
합니다. IF 활동을 DoWhile 내의 시퀀스 작업으로 끌어서 놓고 기존 IF 활동 뒤를 옵니다. returnedSize>0을 조건으로 입력합니다. IF 활동의 Then 분기에 작업 할당을 추가하고 로 설정합니다selRangeTable.item(0).LOW
usersTable.item(returnedSize-1).username
.
전체 가져오기 워크플로의 정의를 완료했습니다.
내보내기 추가 워크플로 만들기
SAP ECC에서 사용자를 만들려면 BAPI_USER_CREATE1 프로그램을 호출하고 계정 이름 및 초기 암호를 포함한 모든 매개 변수를 제공할 수 있습니다. SAP 쪽에서 계정 이름을 생성해야 하는 경우 SAP 관리자에게 문의하고 새로 만든 사용자 계정의 userName 속성을 반환하는 사용자 지정 BAPI 함수를 사용합니다.
이 가이드에서는 라이선스, 로컬 또는 전역 활동 그룹, 시스템 또는 프로필 할당을 보여 주지 않습니다. SAP 관리자에게 문의하고 이에 따라 이 워크플로를 수정합니다.
내보내기 워크플로에서 페이지 매김을 구현할 필요가 없습니다. 워크플로 컨텍스트 내에서 사용할 수 있는 개체는 하나뿐입니다.
- 개체 유형 - 사용자 -> 내보내기 -> 워크플로 추가로> 이동하고 오른쪽의 도구 상자에서 시퀀스 작업을 워크플로 디자이너 창으로 끌어서 놓습니다.
- 왼쪽 아래에서 변수 단추를 찾아 클릭하여 이 시퀀스 내에 정의된 변수 목록을 확장합니다.
- 다음 변수를 추가합니다. SAP WSDL에서 생성된 변수 형식을 선택하려면 형식 찾아보기를 클릭하고 생성된 항목을 확장 한 다음 SAPECC 네임스페이스를 확장합니다. 그러면 BAPI_USER_CREATE1 프로그램에서 사용하는 데이터 구조가 초기화됩니다.
속성 | 변수 유형 | 범위 | 기본값 |
---|---|---|---|
address | SAPECC. BAPIADDR3 | Sequence | new BAPIADDR3() |
userName | 문자열 | Sequence | |
password | SAPECC. BAPIPWD | Sequence | new BAPIPWD() |
company | SAPECC. BAPIUSCOMP | Sequence | new BAPIUSCOMP() |
기본값 | SAPECC. BAPIDEFAUL | Sequence | new BAPIDEFAUL() |
logOnData | SAPECC. BAPILOGOND | Sequence | new BAPILOGOND() |
bapiret2Table | SAPECC. TABLE_OF_BAPIRET2 | Sequence | new TABLE_OF_BAPIRET2() |
- userName 속성을 변경할 수 없는 ID, 앵커로 정의했으므로 내보내기 개체의 앵커 컬렉션에서 userName 값을 추출해야 합니다. ForEachWithBodyFactory 작업을 도구 상자에서 시퀀스 작업으로 끌어서 놓습니다. 항목 변수 이름을 앵커로 바꾸고, 속성으로 전환하고, TypeArgument를
Microsoft.MetadirectoryServices.AnchorAttribute
선택합니다. 값 필드에 .를 입력합니다objectToExport.AnchorAttributes
.
- userName 앵커의 문자열 값을 추출하려면 ForEach 작업 내에서 Switch 작업을 끌어서 놓습니다. 팝업 창에서 스위치 유형을 선택합니다
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper
. 다음의 식 값을 입력합니다. New AnchorAttributeNameWrapper(anchor. 이름). - 스위치 작업의 새 사례 영역 추가를 클릭합니다. userName을 사례 값으로 입력합니다. 할당 작업을 userName 케이스 본문으로 끌어서 놓고 앵커를 할당합니다. Value.ToString()에서 userName 변수로
- 내보낸 개체 앵커 속성에서 userName 값을 추출했으므로 다른 SAP 사용자 세부 정보가 포함된 회사, 기본값, 주소, 로그온 데이터와 같은 다른 구조를 채워야 합니다. 이 작업은 특성 변경의 컬렉션을 순환하여 수행합니다.
- ForEach 작업을 축소하고 기존 ForEach 작업 이후 시퀀스 작업 내에 다른 ForEachWithBothFactory 작업을 끌어서 놓습니다. 항목 변수 이름을 attributeChange로 바꾸고, 속성으로 전환하고, TypeArgument를
Microsoft.MetadirectoryServices.AttributeChange
선택합니다. 값 필드에 .를 입력합니다objectToExport.AttributeChanges
.
- Switch 작업을 ForEach 활동의 본문으로 끌어서 놓습니다.
- 팝업 메뉴에서 [확인]을 선택하고
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AttributeNameWrapper
클릭합니다. - 새 AttributeNameWrapper(attributeChange.Name) 식을 입력합니다. 스키마에 정의되고 속성에 할당되지 않은 처리되지 않은 특성에 대한 Switch 작업의 오른쪽 위 모서리에 경고 아이콘이 표시됩니다.
- Switch 활동의 새 사례 영역 추가를 클릭하고 도시의 사례 값을 입력합니다.
- 할당 작업을 이 사례의 본문으로 끌어서 놓습니다. address.city에 할당
attributeChange.ValueChanges(0).Value.ToString()
합니다.
- 누락된 다른 사례 및 할당을 추가합니다. 이 매핑 테이블을 가이드로 사용합니다.
케이스 | 양도 |
---|---|
city | address.city = attributeChange.ValueChanges(0)Value.ToString() |
company | 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 | 주소. 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 활동을 두 번째 ForEach 작업 이후 시퀀스 작업으로 끌어서 놓아 사용자 속성의 유효성을 검사한 후 사용자 만들기 요청을 제출합니다. 사용자 이름, 성, 초기 암호 등 비어있지 않은 값이 3개 이상 필요합니다. 다음 조건을 입력합니다.
(String.IsNullOrEmpty(address.lastname) = False ) AND (String.IsNullOrEmpty(userName) = False) AND (String.IsNullOrEmpty(password.BAPIPWD1) = False)
- IF 활동의 Else 분기에서 누락된 항목에 따라 다른 오류를 throw하려는 경우 IF 활동을 하나 더 추가합니다. 조건 값인 String.IsNullOrEmpty(userName)를 입력합니다. 두 번째 IF 활동의 두 분기로 활동을 끌어서 놓
CreateCSEntryChangeResult
고 ErrorCode ofExportErrorMissingAnchorComponent
andExportErrorMissingProvisioningAttribute
.
- 첫 번째 IF 활동의 빈 Then 분기에서 시퀀스 작업을 끌어서 놓습니다. 시퀀스 작업 내에서 WebSeviceCall 작업을 끌어서 놓습니다. SAPECC 서비스 이름, ZSAPCONNECTORWS 엔드포인트 및 BAPI_USER_CREATE1 작업을 선택합니다. ...를 클릭합니다. 다음과 같이 웹 서비스 호출에 대한 매개 변수를 정의하는 인수 단추입니다.
속성 | Direction | Type | 값 |
---|---|---|---|
주소 | In | BAPIADDR3 | address |
회사 | In | BAPIUSCOMP | company |
기본값 | In | BAPIDEFAUL | 기본값 |
LOGONDATA | In | BAPILOGOND | logOnData |
PASSWORD | In | BAPIPWD | password |
RETURN | In-Out | TABLE_OF_BAPIRET2 | bapiret2Table |
SELF_REGISTER | In | 문자열 | "X" |
USERNAME | In | 문자열 | userName |
- 확인을 클릭합니다. 경고 표시가 사라집니다.
- 사용자 요청 만들기 결과를 처리하려면 WebServiceCall 작업 이후 시퀀스 작업 내에서 IF 작업을 끌어서 놓습니다. 다음 조건을 입력합니다.
IsNothing (bapiret2Table.item) OrElse bapiret2Table.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) <> 0
- 오류가 발생하지 않으면 내보내기 작업이 성공적으로 완료된 것으로 가정하고 성공 상태의 CSEntryChangeResult를 만들어 이 개체의 성공적인 내보내기를 나타내려고 합니다. CreateCSEntryChangeResult 작업을 IF 활동의 Else 분기로 끌어서 놓고 성공 오류 코드를 선택합니다.
- 선택 사항: 웹 서비스 호출에서 생성된 사용자 계정 이름을 반환하는 경우 내보낸 개체의 앵커 값을 업데이트해야 합니다. 이렇게 하려면 활동 내에서
CreateCSEntryChangeResult
작업을 끌어서 놓CreateAttrubuteChange
고 userName 추가를 선택합니다. 그런 다음 활동 내에서CreateAttributeChange
활동을 끌어서 놓CreateValueChange
고 웹 서비스 호출 활동으로 채워진 변수 이름을 입력합니다. 이 가이드에서는 내보내기 시 업데이트되지 않은 userName 변수를 사용합니다.
- 내보내기 추가 워크플로의 마지막 단계는 내보내기 오류를 처리하고 기록하는 것입니다. 시퀀스 작업을 IF 활동의 빈 Then 분기로 끌어다 놓습니다.
- 로그 작업을 시퀀스 작업으로 끌어서 놓습니다. 속성 탭으로 전환하고 다음의
bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E"))
LogText 값을 입력합니다. 메시지. 높은 로깅 수준 및 추적 태그를 유지합니다. 자세한 정보 추적을 사용하도록 설정하면 오류 메시지가 ConnectorsLog 또는 ECMA2Host 이벤트 로그에 기록됩니다. - 로그 작업 후 시퀀스 작업 내에서 스위치 작업을 끌어서 놓습니다. 팝업 창에서 스위치 값의 문자열 형식을 선택합니다. 다음 식을 입력합니다.
bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E")).NUMBER
- 기본 대/소문자를 클릭하고 CreateCSEntryChangeResult 작업을 이 사례의 본문으로 끌어서 놓습니다. ExportErrorInvalidProvisioningAttributeValue 오류 코드를 선택합니다.
- 새 사례 추가 영역을 클릭하고 사례 값 224를 입력합니다. 이 사례의 본문으로 활동을 끌어서 놓
CreateCSEntryChangeResult
습니다. 오류 코드를 선택합니다ExportErrorCustomContinueRun
.
내보내기 추가 워크플로의 정의를 완료했습니다.
삭제 내보내기 워크플로 만들기
SAP ECC에서 사용자를 삭제하려면 BAPI_USER_DELETE 프로그램을 호출하고 연결된 시스템에서 삭제할 계정 이름을 제공할 수 있습니다. SAP ECC 계정이 삭제되지 않고 기록 레코드를 유지하기 위해 만료되는 경우가 가장 많기 때문에 이 시나리오가 필수인지는 SAP 관리자에게 문의하세요.
이 가이드에서는 SAP 공통 사용자 관리 시스템, 연결된 시스템에서 사용자 프로비전 해제, 라이선스 해지 등과 관련된 시나리오를 다루지 않습니다.
내보내기 워크플로에서 페이지 매김을 구현할 필요가 없습니다. 워크플로 컨텍스트 내에서 사용할 수 있는 개체는 하나뿐입니다.
- 개체 유형 -> 사용자 - 내보내기 -> 워크플로 삭제로> 이동하고 오른쪽의 도구 상자에서 시퀀스 작업을 워크플로 디자이너 창으로 끌어서 놓습니다.
- 왼쪽 아래에서 변수 단추를 찾아 클릭하여 이 시퀀스 내에 정의된 변수 목록을 확장합니다.
- 다음 변수를 추가합니다. SAP WSDL에서 생성된 변수 형식을 선택하려면 형식 찾아보기를 클릭하고 생성된 항목을 확장 한 다음 SAPECC 네임스페이스를 확장합니다. 그러면 BAPI_USER_DELETE 프로그램에서 사용하는 데이터 구조가 초기화됩니다.
속성 | 변수 유형 | 범위 | 기본값 |
---|---|---|---|
userName | 문자열 | Sequence | |
bapiret2Table | SAPECC. TABLE_OF_BAPIRET2 | Sequence | new TABLE_OF_BAPIRET2() |
- userName 속성을 변경할 수 없는 ID, 앵커로 정의했으므로 내보내기 개체의 앵커 컬렉션에서 userName 값을 추출해야 합니다. ForEachWithBodyFactory 작업을 도구 상자에서 시퀀스 작업으로 끌어서 놓습니다. 항목 변수 이름을 앵커로 바꾸고, 속성으로 전환하고, TypeArgument를
Microsoft.MetadirectoryServices.AnchorAttribute
선택합니다. 값 필드에 .를 입력합니다objectToExport.AnchorAttributes
.
- userName 앵커의 문자열 값을 추출하려면 ForEach 작업 내에서 Switch 작업을 끌어서 놓습니다. 팝업 창에서 스위치 유형을 선택합니다
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper
. 다음의 식 값을 입력합니다. 새로 만들기AnchorAttributeNameWrapper(anchor.Name)
. 스위치 작업의 새 사례 영역 추가를 클릭합니다. userName을 사례 값으로 입력합니다. 할당 작업을 userName 케이스 본문으로 끌어서 놓고 userName 변수에 할당anchor.Value.ToString()
합니다. - ForEach 작업 후 시퀀스 작업 내에서 WebSeviceCall 작업을 끌어서 놓습니다. SAPECC 서비스 이름, ZSAPCONNECTORWS 엔드포인트 및 BAPI_USER_DELETE 작업을 선택합니다. ...를 클릭합니다. 다음과 같이 웹 서비스 호출에 대한 매개 변수를 정의하는 인수 단추입니다.
속성 | Direction | Type | 값 |
---|---|---|---|
RETURN | 입/출력 | TABLE_OF_BAPIRET2 | bapiret2Table |
USERNAME | In | 문자열 | userName |
- 확인을 클릭합니다. 경고 표시가 사라집니다.
- 사용자 요청 삭제 결과를 처리하려면 WebServiceCall 작업 이후 시퀀스 작업 내에서 IF 작업을 끌어서 놓습니다. 다음 조건을 입력합니다.
If(bapiRet2Table.item, Enumerable.Empty(Of BAPIRET2)()).Count(Function(errItem) errItem.TYPE.Equals("E") = True) <> 0
- 오류가 없으면 삭제 작업이 성공적으로 완료된 것으로 가정하고 성공 상태로 만들어
CSEntryChangeResult
이 개체의 내보내기를 성공적으로 나타내려고 합니다. 활동을 IF 활동의 Else 분기로 끌어서 놓CreateCSEntryChangeResult
고 성공 오류 코드를 선택합니다.
- 삭제 내보내기 워크플로의 마지막 단계는 내보내기 오류를 처리하고 기록하는 것입니다. 시퀀스 작업을 IF 활동의 빈 Then 분기로 끌어다 놓습니다.
- 로그 작업을 시퀀스 작업으로 끌어서 놓습니다. 속성 탭으로 전환하고 다음의
bapiRetTable.item.First(Function(retItem) retItem.TYPE.Equals("E")= True).MESSAGE
LogText 값을 입력합니다. 높은 로깅 수준 및 추적 태그를 유지합니다. 자세한 정보 추적을 사용하도록 설정하면 오류 메시지가 ConnectorsLog 또는 ECMA2Host 이벤트 로그에 기록됩니다. - 로그 작업 후 시퀀스 작업 내에서 스위치 작업을 끌어서 놓습니다. 팝업 창에서 스위치 값의 문자열 형식을 선택합니다. 다음 식을 입력합니다.
bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E")).NUMBER
- 기본 대/소문자를 클릭하고 CreateCSEntryChangeResult 작업을 이 사례의 본문으로 끌어서 놓습니다. ExportErrorSyntaxViolation 오류 코드를 선택합니다.
- 새 사례 추가 영역을 클릭하고 사례 값 124를 입력합니다. 이 사례의 본문으로 활동을 끌어서 놓
CreateCSEntryChangeResult
습니다. 오류 코드를 선택합니다ExportErrorCustomContinueRun
.
삭제 내보내기 워크플로의 정의를 완료했습니다.
바꾸기 내보내기 워크플로 만들기
SAP ECC에서 사용자를 업데이트하려면 BAPI_USER_CHANGE 프로그램을 호출하고 변경되지 않는 매개 변수를 포함하여 계정 이름 및 모든 사용자 세부 정보를 포함한 모든 매개 변수를 제공할 수 있습니다. 모든 사용자 속성을 제공할 때 ECMA2 내보내기 모드를 Replace라고 합니다. 반면 AttributeUpdate의 내보내기 모드는 변경 중인 특성만 제공하므로 일부 사용자 속성을 빈 값으로 덮어쓸 수 있습니다. 따라서 Webservice 커넥터는 항상 개체 바꾸기 내보내기 모드를 사용하며 내보내기 유형: 바꾸기에 대해 커넥터가 구성되어야 합니다.
바꾸기 내보내기 워크플로는 내보내기 추가 워크플로와 거의 동일합니다. 유일한 차이점은 BAPI_USER_CHANGE 프로그램의 addressX 또는 companyX와 같은 추가 매개 변수를 지정해야 한다는 것입니다. 여기서 addressX로 끝나는 X는 주소 구조에 변경 내용이 포함되어 있음을 나타냅니다.
- 개체 유형 -> 사용자 - 내보내기 -> 워크플로 바꾸기로> 이동하고 오른쪽의 도구 상자에서 시퀀스 작업을 워크플로 디자이너 창으로 끌어서 놓습니다.
- 왼쪽 아래에서 변수 단추를 찾아 클릭하여 이 시퀀스 내에 정의된 변수 목록을 확장합니다.
- 다음 변수를 추가합니다. SAP WSDL에서 생성된 변수 형식을 선택하려면 형식 찾아보기를 클릭하고 생성된 항목을 확장 한 다음 SAPECC 네임스페이스를 확장합니다. 그러면 BAPI_USER_CHANGE 프로그램에서 사용하는 데이터 구조가 초기화됩니다.
속성 | 변수 유형 | 범위 | 기본값 |
---|---|---|---|
userName | 문자열 | Sequence | |
bapiret2Table | SAPECC. TABLE_OF_BAPIRET2 | Sequence | new TABLE_OF_BAPIRET2() |
addressX | SAPECC. BAPIADDR3X | Sequence | new BAPIADDR3X() |
address | SAPECC. BAPIADDR3 | Sequence | new BAPIADDR3() |
companyX | SAPECC. BAPIUSCOMX | Sequence | new BAPIUSCOMX() |
company | SAPECC. BAPIUSCOMP | Sequence | new BAPIUSCOMP() |
defaultsX | SAPECC. BAPIDEFAX | Sequence | new BAPIDEFAX() |
기본값 | SAPECC. BAPIDEFAUL | Sequence | new BAPIDEFAUL() |
logOnDataX | SAPECC. BAPILOGONX | Sequence | new BAPILOGONX() |
logOnData | SAPECC. BAPILOGOND | Sequence | new BAPILOGOND() |
바꾸기 내보내기 워크플로는 다음과 같습니다.
- userName 속성을 변경할 수 없는 ID, 앵커로 정의했으므로 내보내기 개체의 앵커 컬렉션에서 userName 값을 추출해야 합니다. ForEachWithBodyFactory 작업을 도구 상자에서 시퀀스 작업으로 끌어서 놓습니다. 항목 변수 이름을 앵커로 바꾸고, 속성으로 전환하고, TypeArgument를
Microsoft.MetadirectoryServices.AnchorAttribute
선택합니다. 값 필드에 .를 입력합니다objectToExport.AnchorAttributes
.
- userName 앵커의 문자열 값을 추출하려면 ForEach 작업 내에서 Switch 작업을 끌어서 놓습니다. 팝업 창에서 스위치 유형을 선택합니다
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper
. 다음의 식 값을 입력합니다. 새로 만들기AnchorAttributeNameWrapper(anchor.Name)
. 스위치 작업의 새 사례 영역 추가를 클릭합니다. userName을 사례 값으로 입력합니다. 할당 작업을 userName 케이스 본문으로 끌어서 놓고 userName 변수에 할당anchor.Value.ToString()
합니다. 바꾸기 내보내기 워크플로는 다음과 같습니다.
- 내보낸 개체 앵커 속성에서 userName 값을 추출했으므로 다른 SAP 사용자 세부 정보가 포함된 회사, 기본값, 주소, 로그온 데이터와 같은 다른 구조를 채워야 합니다. 스키마에 정의된 모든 특성의 컬렉션을 순환하여 이 작업을 수행합니다.
- ForEach 작업을 축소하고 기존 ForEach 작업 이후 시퀀스 작업 내에 다른 ForEachWithBothFactory 작업을 끌어서 놓습니다. 항목 변수 이름을 schemaAttr로 바꾸고, 속성으로 전환하고, TypeArgument를
Microsoft.MetadirectoryServices.SchemaAttribute
선택합니다. 값 필드에 .를 입력합니다schemaType.Attributes
.
- 시퀀스 작업을 ForEach 작업의 본문으로 끌어서 놓습니다. 왼쪽 아래에서 변수 단추를 찾아 클릭하여 이 시퀀스 내에 정의된 변수 목록을 확장합니다. 문자열 형식의 xValue 변수를 추가합니다. 할당 작업을 시퀀스 작업으로 끌어서 놓습니다. xValue 식 할당:
If(objectToExport.AttributeChanges.Contains(schemaAttr.Name), objectToExport.AttributeChanges(schemaAttr.Name).ValueChanges(0).Value.ToString(), String.Empty)
이 특성에 대해 내보내기 위해 준비된 변경 내용을 추출하거나 빈 문자열로 초기화합니다. 바꾸기 내보내기 워크플로는 다음과 같습니다.
- 작업 할당 후 스위치 작업을 끌어서 놓습니다. 팝업 메뉴에서 [확인]을 선택하고
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AttributeNameWrapper
클릭합니다. 다음 식을 입력합니다. 새로 만들기AttributeNameWrapper(schemaAttr.Name)
. 스키마에 정의되고 속성에 할당되지 않은 처리되지 않은 특성에 대한 Switch 작업의 오른쪽 위 모서리에 경고 아이콘이 표시됩니다. Switch 활동의 새 사례 영역 추가를 클릭하고 도시의 사례 값을 입력합니다. 시퀀스 작업을 이 사례의 본문으로 끌어서 놓습니다. 할당 작업을 이 사례의 본문으로 끌어서 놓습니다. addressX.city에 "X" 값을 할당합니다. 다른 할당 작업을 이 사례의 본문으로 끌어서 놓습니다. address.city에 xValue를 할당합니다. 바꾸기 내보내기 워크플로는 다음과 같습니다.
10. 누락된 다른 사례 및 할당을 추가합니다. 이 매핑 테이블을 가이드로 사용합니다.
케이스 | 양도 |
---|---|
city | addressX.city = "X" address.city = xValue |
company | 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" 주소입니다. TEL1_Numbr = xValue |
jobTitle | addressX.function = "X" address.function = xValue |
바꾸기 내보내기 워크플로는 다음과 같습니다.
BAPI_USER_CHANGE 프로그램을 호출하기 전에 비어있지 않은 사용자 이름을 확인해야 합니다. ForEach 작업을 모두 축소하고 두 번째 ForEach 작업 후에 IF 활동을 끌어서 놓습니다. 다음 조건을 입력합니다.
String.IsNullOrEmpty(userName ) = False
사용자 이름이 비어 있으면 작업이 실패했음을 나타내려고 합니다. 활동을 IF 활동의 Else 분기로 끌어서 놓
CreateCSEntryChangeResult
고 오류 코드를 선택합니다ExportErrorCustomContinueRun
. 바꾸기 내보내기 워크플로는 다음과 같습니다.첫 번째 IF 활동의 빈 Then 분기에서 시퀀스 작업을 끌어서 놓습니다. 시퀀스 작업 내에서 WebSeviceCall 작업을 끌어서 놓습니다. SAPECC 서비스 이름, ZSAPCONNECTORWS 엔드포인트 및 BAPI_USER_CHANGE 작업을 선택합니다. ...를 클릭합니다. 다음과 같이 웹 서비스 호출에 대한 매개 변수를 정의하는 인수 단추입니다.
속성 | Direction | Type | 값 |
---|---|---|---|
주소 | In | BAPIADDR3 | address |
ADDRESSX | In | BAPIADDR3X | addressX |
회사 | In | BAPIUSCOMP | company |
COMPANYX | In | BAPIUSCOMX | company |
기본값 | In | BAPIDEFAUL | 기본값 |
DEFAULTSX | In | BAPIDEFAX | defaultsX |
LOGONDATA | In | BAPILOGOND | logOnData |
LOGONDATAX | In | BAPILOGONX | logOnDataX |
RETURN | 입/출력 | TABLE_OF_BAPIRET2 | bapiret2Table |
USERNAME | In | 문자열 | userName |
- 확인을 클릭합니다. 경고 표시가 사라집니다. 바꾸기 내보내기 워크플로는 다음과 같습니다.
- 변경 사용자 요청 결과를 처리하려면 WebServiceCall 작업 후 시퀀스 작업 내에서 IF 작업을 끌어서 놓습니다. 다음 조건을 입력합니다.
Not IsNothing(bapiret2Table.item) AndAlso bapiret2Table.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) <> 0
- 오류가 없으면 내보내기 작업이 성공적으로 완료된 것으로 가정하고 성공 상태로 만들어
CSEntryChangeResult
이 개체의 내보내기를 성공적으로 표시하려고 합니다. 활동을 IF 활동의 Else 분기로 끌어서 놓CreateCSEntryChangeResult
고 성공 오류 코드를 선택합니다. - 시퀀스 작업을 IF 활동의 Then 분기로 끌어다 놓습니다. LogText 값과 오류 태그를
string.Join("\n",bapiret2Table.item.Where(Function(retItem) retItem.TYPE.Equals("E")).Select(Function(r) r.MESSAGE))
사용하여 로그 작업을 추가합니다. 오류 코드가 있는 로그 작업 후 활동을 추가CreateCSEntryChangeResult
합니다ExportErrorCustomContinueRun
. 바꾸기 내보내기 워크플로는 다음과 같습니다.
바꾸기 내보내기 워크플로의 정의를 완료했습니다.
다음 단계는 이 템플릿을 사용하여 ECMA2Host Webservice 커넥터를 구성하는 것입니다.