Создание шаблона соединителя веб-службы SAP ECC 7.51 для ECMA2Host
В этом руководстве описывается процесс создания шаблона для соединителя агента управления подключением веб-службы (ECMA) для управления пользователями SAP ECC.
Допущения и ограничения
В этом шаблоне показано, как управлять пользователями. Другие типы объектов, такие как локальные группы действий, роли и профили, не рассматриваются в этом руководстве, так как ECMA2Host в настоящее время не поддерживает многозначные ссылки. Операции с паролями также не входят в рамки этого руководства.
В этом руководстве не рассматривается создание учетной записи службы в SAP, которая используется для вызова предоставляемых функций BAPI. Предполагается, что предварительно созданная демонстрационная учетная запись разработчика используется с профилем RFC_ALL, который предоставляет разрешения для BAPIs, упомянутых в этой статье.
Средство настройки веб-службы не поддерживает следующие функции, предоставляемые в SAP по умолчанию: политики WSP и несколько привязок для каждой конечной точки. Он поддерживает только WSDL с протоколом SOAP 1.1, единая привязка в стиле документ без политик.
Функции BAPI SAP ECC, используемые в этом шаблоне:
- BAPI_USER_GETLIST — получите список всех пользователей, подключенных к этой системе.
- BAPI_USER_GETDETAIL — получение сведений о конкретном пользователе.
- BAPI_USER_CREATE1 — создает пользователя.
- BAPI_USER_DELETE — удаляет пользователя.
- BAPI_USER_CHANGE — обновляет пользователя.
Все свойства пользователя SAP в этом руководстве рассматриваются как однозначные свойства.
Используемый язык программирования — Visual Basic.
Определение конечной точки веб-службы и создание схемы
Прежде чем создавать рабочие процессы импорта и экспорта, необходимо создать шаблон и определить конечную точку с функциями SAP BAPI, предоставляемыми через интерфейс SOAP. Затем создайте схему объектов ECMA2, а их свойства доступны в этом шаблоне.
- В папке C:\Program Files\Microsoft ECMA2Host\Web Service Configuration Tool запустите средство настройки веб-службы wsconfigTool.exe
- В меню File-New выберите "Создать проект SOAP"
- Выберите проект SOAP и нажмите кнопку "Добавить новую веб-службу".
- Назовите веб-службу SAPECC, укажите URL-адрес для загрузки опубликованного WSDL, введите SAPECC в качестве пространства имен. Имя веб-службы помогает различать эту веб-службу в шаблоне от других пользователей. Пространство имен определяет имя пространства имен Microsoft .NET, используемого для создания классов. Выберите режим базовой проверки подлинности, если SAP администратор не указал иное. Нажмите кнопку "Далее".
- Укажите учетные данные для подключения к конечной точке SAP ECC. Нажмите кнопку "Далее".
- На странице конечных точек и операций убедитесь, что отображаются BAPIs и нажмите кнопку "Готово"
Примечание.
Если отображается несколько конечных точек, у вас есть привязки SOAP 1.2 и SOAP 1.1. Это приводит к сбою соединителя. Измените определение привязки в SOAMANAGER и сохраните только одно. Затем повторно добавьте веб-службу.
- Сохраните проект в папку C:\Program Files\Microsoft ECMA2Host\Service\ECMA.
- Выберите вкладку "Типы объектов" и добавьте тип объекта "Пользователь". Нажмите кнопку "ОК".
- Разверните вкладку "Типы объектов" и выберите определение типа пользователя.
- Добавьте следующие атрибуты в схему и выберите userName в качестве привязки.
- Сохраните проект.
Имя. | Тип | Привязка |
---|---|---|
город | строка | |
компания | строка | |
отдел | строка | |
эл. почта | строка | |
время истечения срока | строка | |
имя | строка | |
lastName | строка | |
второе имя | строка | |
номер телефона | string | |
должность | строка | |
userName | строка | отмечен |
Создание рабочего процесса полного импорта
Рабочий процесс импорта, будучи необязательным в ECMA2Host, позволяет импортировать существующих пользователей SAP в кэш в памяти ECMA2Host и избежать создания повторяющихся пользователей во время подготовки.
Если вы не создаете рабочий процесс импорта, то ваш соединитель работает в режиме "Только для экспорта" и приводит к тому, что ECMA2Host всегда создает операции Создать пользователя, даже для существующих пользователей. Это может привести к сбоям или дубликатам, если стандартные SAP BAPIs используются, если дубликаты не обрабатываются рабочим процессом экспорта.
SAP ECC не предлагает встроенный механизм для чтения изменений, внесенных с момента последнего чтения.
Поэтому мы реализуем только рабочий процесс полного импорта. Если необходимо реализовать Delta Import по соображениям производительности, обратитесь к администратору SAP по списку BAPIs и опубликуйте их как веб-службу SOAP. Затем реализуйте рабочий процесс Delta Import, используя следующий подход, как описано и свойство customData, содержащее метку времени предыдущего успешного выполнения.
SAP ECC предлагает несколько функций BAPI для получения списка пользователей со своими свойствами:
- BAPI_USER_GETLIST — получите список всех пользователей, подключенных к этой системе.
- BAPI_USER_GETDETAIL — получение сведений о конкретном пользователе.
Только эти два BAPIs используются для извлечения существующих пользователей из SAP ECC в этом шаблоне.
- Перейдите в раздел Типы объектов -> Пользователь -> Импорт -> Полный импорт рабочего процесса, и из Панели инструментов в правой части экрана перетащите элемент "Последовательность" в область конструктора рабочего процесса.
- В левом нижнем углу найдите кнопку "Переменные" и выберите ее, чтобы развернуть список переменных, определенных в этой последовательности.
- Добавьте следующие переменные. Чтобы выбрать тип переменной, созданный из SAP WSDL, выберите "Просмотр типов", разверните generated и затем разверните пространство имен SAPECC.
Имя. | Тип переменной | Область | По умолчанию. |
---|---|---|---|
selRangeTable | SAPECC. TABLE_OF_BAPIUSSRGE | Последовательность | new TABLE_OF_BAPIUSSRGE with {.item = new BAPIUSSRGE(){new BAPIUSSRGE}} |
getListRetTable | SAPECC. TABLE_OF_BAPIRET2 | Последовательность | новый TABLE_OF_BAPIRET2 |
размер страницы | Int32 | Последовательность | 200 |
возвращаемый_размер | Int32 | Последовательность | |
таблица пользователей | 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 в активность Последовательности после последней операции "Назначить".
- На правой панели перейдите на вкладку "Свойства" и введите это условие для цикла DoWhile.
- цикл:
returnedSize = pageSize
- Выберите переменные и добавьте свойство currentPageNumber типа int32 в цикле DoTime со значением по умолчанию 0.
- Необязательный шаг. Если вы планируете реализовать рабочий процесс разностного импорта, перетащите действие "Назначить" в вашу активность "Последовательность" после цикла DoWhile. Задайте это значение:
-
customData(schemaType.Name + "_lastImportTime") = DateTimeOffset.UtcNow.Ticks.ToString()
При этом сохраняется дата и время последнего полного выполнения импорта, и эта метка времени позже может использоваться в рабочем процессе разностного импорта.
- На панели инструментов перетащите активность последовательности в активность DoWhile. Перетащите действие WebServiceCall внутри этого действия последовательности и выберите имя службы SAPECC, конечную точку ZSAPCONNECTORWS и операцию BAPI_USER_GETLIST.
- Щелкните по кнопке "Аргументы", чтобы задать параметры для вызова веб-службы следующим образом:
Имя. | Направление | Тип | значение |
---|---|---|---|
MAX_ROWS | В | Int32 | размер страницы |
MAX_ROWSУказано | В | Логический | Истина |
ВОЗВРАТ | Вход и выход | TABLE_OF_BAPIRET2 | getListRetTable |
SELECTION_EXP | Вход и выход | TABLE_OF_BAPIUSSEXP | |
Диапазон выбора | Вход и выход | TABLE_OF_BAPIUSSRGE | selRangeTable |
СПИСОК ПОЛЬЗОВАТЕЛЕЙ | Вход и выход | ТАБЛИЦА TABLE_OF_BAPIUSNAME | Таблица пользователей |
С_ИМЕНЕМ_ПОЛЬЗОВАТЕЛЯ | В | Строка | |
СТРОКИ | выход | Int32 | returnedSize |
- Нажмите кнопку "ОК". Знак предупреждения исчезает. Список пользователей, хранящихся в переменной usersTable. Так как SAP не возвращает полный список пользователей в одном ответе, необходимо реализовать разбиение на страницы и вызвать эту функцию несколько раз при переключении страниц. Затем для каждого импортированного пользователя необходимо получить сведения об этом пользователе, выполнив отдельный вызов. Это означает, что для системы с тысячей пользователей и размером страницы в 200 пользователей коннектор веб-сервиса осуществляет пять вызовов для получения списка пользователей и тысячу отдельных вызовов для получения сведений пользователей. Чтобы повысить производительность, попросите команду SAP разработать пользовательскую программу BAPI, которая перечисляет все их свойства. Это позволяет избежать необходимости выполнения 1000 отдельных вызовов и предоставления функции BAPI через конечную точку SOAP WS.
- На панели инструментов перетащите действие IF внутрь действия DoWhile, находящегося после действия WebServiceCall. Укажите это условие, чтобы проверить наличие непустого ответа и отсутствия ошибок:
IsNothing(getListRetTable.item) OrElse getListRetTable.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) = 0
- Из панели элементов перетащите действие Throw в ветку Else действия IF, чтобы выдать ошибку при неудачном импорте. Перейдите на вкладку "Свойства" и введите это выражение для свойства Exception действия Throw:
New Exception(getListRetTable.item.First(Function(retItem) retItem.TYPE.Equals("E")).MESSAGE)
- Чтобы обработать список импортированных пользователей, перетащите действие ForEachWithBodyFactory из панели элементов в ветвь действия IF. Перейдите на вкладку "Свойства" и выберите SAPECC. BAPIUSNAME в качестве TypeArgument. Нажмите на ... кнопку и введите это выражение для свойства «Значения»:
if(usersTable.item,Enumerable.Empty(of BAPIUSNAME)())
- В пакете инструментов перетащите активность "Последовательность" внутрь активности "ForEach". При активном окне действия последовательности нажмите кнопку "Переменные" и определите следующие переменные:
Имя. | Тип переменной | Область | По умолчанию. |
---|---|---|---|
компания | SAPECC. BAPIUSCOMP | Последовательность | new BAPIUSCOMP() |
адрес | SAPECC. BAPIADDR3 | Последовательность | new BAPIADDR3() |
значения по умолчанию | SAPECC. BAPIDEFAUL | Последовательность | new BAPIDEFAUL() |
вход в систему | SAPECC.BAPILOGOND | Последовательность | new BAPILOGOND() |
получитьТаблицуДеталейВозврата | SAPECC. TABLE_OF_BAPIRET2 | последовательность | new TABLE_OF_BAPIRET2() |
Ваша активность IF выглядит следующим образом:
- Перетащите действие CreateCSEntryChangeScope внутри действия Последовательности. В свойстве DN введите schemaType.Name и item.USERNAME. В поле CreateAnchorAttribute AnchorValue введите item.username.
- Чтобы получить сведения о каждом пользователе, из панели элементов перетащите действие WebServiceCall внутри действия Sequence прямо перед действием CreateAnchorAttribute. Выберите имя службы SAPECC, конечную точку ZSAPCONNECTORWS и операцию BAPI_USER_GET_DETAIL. Щелкните по кнопке "Аргументы", чтобы задать параметры для вызова веб-службы следующим образом:
Имя. | Направление | Тип | значение |
---|---|---|---|
ВОЗВРАТ | Вход и выход | TABLE_OF_BAPIRET2 | getDetailRetTable |
USERNAME | В | Строка | item.имя_пользователя |
АДРЕС | выход | BAPIADDR3 | адрес |
КОМПАНИЯ | выход | BAPIUSCOMP | компания |
ПО УМОЛЧАНИЮ | выход | BAPIUSDEFAUL | значения по умолчанию |
LOGONDATA | выход | BAPILOGOND | данные для входа |
WITH_USERNAME | В | Строка | |
СТРОКИ | выход | Int32 | возвращённый размер |
- Нажмите кнопку "ОК". Знак предупреждения исчезает. Сведения о пользователе хранятся в перечисленных выше переменных. Действие IF выглядит следующим образом:
- Чтобы проверить результаты операции BAPI_USER_GET_DETAIL, на панели инструментов перетащите действие IF и поместите его внутрь действия Последовательности между действиями WebServiceCall и CreateAnchorAttribute. Введите это условие:
IsNothing(getDetailRetTable.item) OrElse getDetailRetTable.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) = 0
Так как отсутствующие сведения о пользователе не должны рассматриваться как катастрофическое событие, мы хотим указать эту ошибку и продолжить обработку других пользователей. Перетащите действие последовательности в ветвь «иначе» вашего действия IF. Добавьте активность лога в новую активность последовательности. Перейдите на вкладку "Свойства" и измените свойство Level на High, Tag to Trace. Введите следующее в свойство LogText: string.Join("\n", getDetailRetTable.item.Select (Function(item) item.MESSAGE ))
- Перетащите действие последовательности в ветвь действия IF. Перетащите существующее действие CreateAnchorAttribute в действие Sequence внутри ветви действия IF. Теперь действие ForEach выглядит следующим образом:
- Для каждого свойства пользователя, например города, компании, отдела, электронной почты добавьте действие IF после действия CreateAnchorAttribute и проверьте наличие непустых значений, введя такие условия, как
Not string.IsNullOrEmpty(address.city)
и добавив действия CreateAttributeChange в ветвь этого действия IF.
Например: добавление действий CreateAttributeChange для всех свойств пользователя с помощью этой таблицы сопоставления:
Свойство пользователя ECMA | Свойство SAP |
---|---|
город | адрес.город |
отдел | адрес.отдел |
компания | компания.компания |
эл. почта | address.электронная_почта |
имя | address.firstName |
lastName | address.lastName |
второе имя | адрес.middleName |
должность | address.function |
время истечения срока | logonData.GLTGB |
номер телефона | адрес. TEL1_NUMBR |
- Наконец, добавьте действие SetImportStatusCode после последнего действия CreateAttributeChange. Задайте значение ErrorCode для успешного выполнения в ветви Then. Добавьте еще одну операцию SetImportStatus в ветвь Else и установите значение ErrorCode на ImportErrorCustomContinueRun.
- Свернуть действие последовательности внутри действия ForEach, чтобы цикл DoTime выглядел следующим образом:
- Чтобы получить следующую страницу пользователей, обновите свойство
selRangeTable.item(0).LOW
. Перетащите действие IF в действие Последовательности, которое находится внутри DoWhile. Поместите его после существующего действия IF. Введите returnedSize>0 в качестве условия. Добавьте действие "Назначить" в ветвь "Тогда" действия IF и установитеselRangeTable.item(0).LOW
наusersTable.item(returnedSize-1).username
.
Вы завершили определение рабочего процесса полного импорта.
Создание рабочего процесса добавления экспорта
Чтобы создать пользователя в SAP ECC, можно вызвать программу BAPI_USER_CREATE1 и предоставить все параметры, включая имя учетной записи и начальный пароль. Если вам нужно создать имя учетной записи на стороне SAP, обратитесь к администратору SAP и используйте пользовательскую функцию BAPI, которая возвращает свойство userName только что созданной учетной записи пользователя.
В этом руководстве не демонстрируется назначение лицензий, локальных или глобальных групп действий, систем или профилей. Обратитесь к администратору SAP и измените этот рабочий процесс соответствующим образом.
Нет необходимости реализовать разбиение на страницы в рабочих процессах экспорта. В контексте рабочего процесса доступно только один объект objectToExport.
- Перейдите к типам объектов —> пользователь —> экспорт —> добавление рабочего процесса, а затем из панели инструментов справа перетащите действие «Последовательность» в область конструктора рабочих процессов.
- В левом нижнем углу найдите кнопку "Переменные" и выберите ее, чтобы развернуть список переменных, определенных в этой последовательности.
- Добавьте следующие переменные. Чтобы выбрать тип переменной, созданный из SAP WSDL, выберите "Просмотр типов", разверните generated, а затем разверните пространство имен SAPECC. Это инициализирует структуры данных, используемые программой BAPI_USER_CREATE1.
Имя. | Тип переменной | Область | По умолчанию. |
---|---|---|---|
адрес | SAPECC. BAPIADDR3 | Последовательность | new BAPIADDR3() |
userName | Строка | Последовательность | |
пароль | SAPECC.BAPIPWD | Последовательность | new BAPIPWD() |
компания | SAPECC.BAPIUSCOMP | Последовательность | new BAPIUSCOMP() |
значения по умолчанию | SAPECC. BAPIDEFAUL | Последовательность | новый BAPIDEFAUL() |
logOnData | SAPECC. BAPILOGOND | Последовательность | new BAPILOGOND() |
bapiret2Table | SAPECC. TABLE_OF_BAPIRET2 | Последовательность | новый TABLE_OF_BAPIRET2() |
- Так как мы определили свойство userName как неизменяемый идентификатор, привязку, необходимо извлечь значение userName из коллекции привязок объекта экспорта. Перетащите действие ForEachWithBodyFactory из панели инструментов в действие Sequence. Замените имя переменной item на anchor, перейдите к свойствам и выберите
Microsoft.MetadirectoryServices.AnchorAttribute
TypeArgument. В поле "Значение" введитеobjectToExport.AnchorAttributes
.
- Чтобы извлечь строковое значение привязки userName, перетащите действие switch внутри действия ForEach. В всплывающем окне выберите
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper
тип переключателя. Введите значение выражения: New AnchorAttributeNameWrapper(anchor.Name). - Выберите область "Добавить новый случай" действия Switch. Введите имя пользователя как значение условия. Перетащите действие "Assign" в корпус случая userName и назначьте anchor.Value.ToString() переменной userName.
- Теперь, когда мы извлекли значение userName из экспортированного свойства привязки объекта, необходимо заполнить другие структуры, такие как компания, значения по умолчанию, адрес, данные входа, содержащие другие сведения о пользователе SAP. Мы делаем это, перебирая коллекцию изменений атрибутов.
- Сверните действие ForEach и перетащите другое действие ForEachWithBothFactory внутрь действия Sequence после существующего действия ForEach. Замените название переменной item на attributeChange, переключитесь на свойства и выберите TypeArgument
Microsoft.MetadirectoryServices.AttributeChange
. В поле "Значение" введитеobjectToExport.AttributeChanges
.
- Перетащите действие Switch в тело активности ForEach.
- В всплывающем меню выберите
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AttributeNameWrapper
и нажмите кнопку "ОК". - Введите следующее выражение: New AttributeNameWrapper(attributeChange.Name). Вы увидите значок предупреждения в правом верхнем углу активности Switch о необработанных атрибутах, определённых в схеме и не назначенных какому-либо свойству.
- Выберите в области активности 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() |
срок истечения | logOnData.GLTGB = attributeChange.ValueChanges(0)Value.ToString() |
имя | address.firstname = attributeChange.ValueChanges(0)Value.ToString() |
lastName | address.lastname = attributeChange.ValueChanges(0)Value.ToString() |
второе имя | address.middlename = attributeChange.ValueChanges(0)Value.ToString() |
Номер телефона | адрес.TEL1_Numbr = attributeChange.ValueChanges(0).Value.ToString() |
должность | address.function = attributeChange.ValueChanges(0)Value.ToString() |
экспорт_пароль | пароль. 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)
- В ветви Else IF добавьте еще одно действие IF, так как мы хотим выдать различные ошибки в зависимости от того, что отсутствует. Введите значение условия: String.IsNullOrEmpty(userName). Перетащите действия
CreateCSEntryChangeResult
в обе ветви второго действия IF и установите коды ошибок дляExportErrorMissingAnchorComponent
иExportErrorMissingProvisioningAttribute
.
- Перетащите действие "Sequence" в пустую ветвь "Тогда" первого действия IF. Перетащите активность WebServiceCall внутрь активности Sequence. Выберите имя службы SAPECC, конечную точку ZSAPCONNECTORWS и операцию BAPI_USER_CREATE1. Щелкните по кнопке "Аргументы", чтобы задать параметры для вызова веб-службы следующим образом:
Имя. | Направление | Тип | значение |
---|---|---|---|
АДРЕС | В | BAPIADDR3 | адрес |
КОМПАНИЯ | В | BAPIUSCOMP | компания |
ПО УМОЛЧАНИЮ | В | BAPIDEFAUL | значения по умолчанию |
LOGONDATA | В | BAPILOGOND | logOnData |
ПАРОЛЬ | В | BAPIPWD | пароль |
ВЕРНУТЬСЯ | Вход-Выход | TABLE_OF_BAPIRET2 | bapiret2Table |
Самостоятельная регистрация | В | Строка | "X" |
USERNAME | В | Строка | userName |
- Нажмите кнопку "ОК". Знак предупреждения исчезает.
- Чтобы обработать результаты запроса пользователя, перетащите действие IF внутри действия Sequence после действия WebServiceCall. Введите следующее условие:
IsNothing (bapiret2Table.item) OrElse bapiret2Table.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) <> 0
- Если ошибка не возникает, предполагается, что операция экспорта выполнена успешно, и мы хотим указать успешный экспорт этого объекта, создав CSEntryChangeResult с состоянием Success. Перетащите действие CreateCSEntryChangeResult в ветвь Else действия IF и выберите код ошибки Success.
- Необязательно. Если вызов веб-службы возвращает имя созданной учетной записи пользователя, необходимо обновить значение привязки экспортированного объекта. Для этого перетащите
CreateAttrubuteChange
действие внутриCreateCSEntryChangeResult
действия и выберите "Добавить имя пользователя". Затем перетащитеCreateValueChange
действие внутрьCreateAttributeChange
действия и введите имя переменной, заданное вызовом веб-службы. В этом руководстве используется переменная userName, которая не обновляется при экспорте.
- Последний шаг в рабочем процессе "Добавить экспорт" — обработка и регистрация ошибок экспорта. Перетащите действие последовательности в пустую ветвь Then вашего действия IF.
- Переместите действие "Лог" в действие "Последовательность". Перейдите на вкладку "Свойства" и введите значение LogText:
bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E"))
.MESSAGE. Сохраняйте высокий уровень логирования и тег трассировки. Это регистрирует сообщение об ошибке в ConnectorsLog или журнале событий ECMA2Host, когда включена подробная трассировка. - Перетащите действие 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, удалением пользователей из подключенных систем, отзывом лицензий и т. д.
Нет необходимости реализовать разбиение на страницы в рабочих процессах экспорта. В контексте рабочего процесса доступно только один объект objectToExport.
- Перейдите к типам объектов —> пользователь —> экспорт —> удаление рабочего процесса, и из панели инструментов справа перетащите активность 'Последовательность' на панель конструктора.
- В левом нижнем углу найдите кнопку "Переменные" и выберите ее, чтобы развернуть список переменных, определенных в этой последовательности.
- Добавьте следующие переменные. Чтобы выбрать тип переменной, созданный из SAP WSDL, выберите "Просмотр типов", разверните сгенерированные и затем разверните пространство имен SAPECC. Это инициализирует структуры данных, используемые программой BAPI_USER_DELETE.
Имя. | Тип переменной | Область | По умолчанию. |
---|---|---|---|
userName | Строка | Последовательность | |
bapiret2Table | SAPECC. TABLE_OF_BAPIRET2 | Последовательность | новый TABLE_OF_BAPIRET2() |
- Так как мы определили свойство userName как неизменяемый идентификатор, привязку, необходимо извлечь значение userName из коллекции привязок объекта экспорта. Перетащите действие ForEachWithBodyFactory из панели элементов в действие Последовательности. Замените имя переменной item на anchor, переключитесь на свойства и выберите TypeArgument
Microsoft.MetadirectoryServices.AnchorAttribute
. В поле "Значение" введитеobjectToExport.AnchorAttributes
.
- Чтобы извлечь строковое значение привязки userName, перетащите действие Switch внутри действия ForEach. В всплывающем окне выберите
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper
тип переключателя. Введите значение выражения: NewAnchorAttributeNameWrapper(anchor.Name)
. Выберите область действия 'Switch' с названием 'Добавить новый случай'. Введите userName как значение Case. Перетащите действие "Assign" в тело кейса userName и присвойте переменной userName значениеanchor.Value.ToString()
. - Перетащите действие WebSeviceCall внутри действия Sequence после действия ForEach. Выберите имя службы SAPECC, конечную точку ZSAPCONNECTORWS и операцию BAPI_USER_DELETE. Щелкните по кнопке "Аргументы", чтобы задать параметры для вызова веб-службы следующим образом:
Имя. | Направление | Тип | значение |
---|---|---|---|
возврат | Вход и выход | TABLE_OF_BAPIRET2 | bapiret2Table |
USERNAME | В | Строка | userName |
- Нажмите кнопку "ОК". Знак предупреждения исчезает.
- Чтобы обработать результаты запроса на удаление пользователя, разместите действие IF внутри действия Sequence после действия WebServiceCall. Введите следующее условие:
If(bapiRet2Table.item, Enumerable.Empty(Of BAPIRET2)()).Count(Function(errItem) errItem.TYPE.Equals("E") = True) <> 0
- Если ошибки не возникает, предполагается, что операция удаления завершена успешно, и мы хотим указать на успешный экспорт этого объекта, создав
CSEntryChangeResult
со статусом Успех.CreateCSEntryChangeResult
Перетащите действие в ветвь else действия IF и выберите код ошибки success.
- Последним шагом в рабочем процессе экспорта с удалением является обработка ошибок экспорта и их регистрация. Перетащите действие «Последовательность» в пустую ветвь «Тогда» действия IF.
- Перетащите активность журнала в активность последовательности. Перейдите на вкладку "Свойства" и введите значение LogText:
bapiRetTable.item.First(Function(retItem) retItem.TYPE.Equals("E")= True).MESSAGE
Сохраняйте высокий уровень ведения журнала и тег трассировки. Это регистрирует сообщение об ошибке в журнал событий ConnectorsLog или ECMA2Host при включенной подробной трассировке. - Перетащите Switch activity внутрь Sequence activity после Log activity. В всплывающем окне выберите тип строки значения переключателя. Введите следующее выражение:
bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E")).NUMBER
- Выберите вариант по умолчанию и перетащите действие CreateCSEntryChangeResult в структуру этого случая. Выберите код ошибки ExportErrorSyntaxViolation.
- Выберите раздел "Добавить новый случай" и введите значение случая 124. Перетащите
CreateCSEntryChangeResult
действие в основную часть данного дела. ВыберитеExportErrorCustomContinueRun
код ошибки.
Вы завершили настройку рабочего процесса экспорта и удаления.
Создание рабочего процесса "Замена экспорта"
Чтобы обновить пользователя в SAP ECC, можно вызвать программу BAPI_USER_CHANGE и указать все параметры, включая имя учетной записи и все сведения о пользователе, включая те, которые не изменяются. Режим экспорта ECMA2, когда все свойства пользователя должны быть предоставлены, называется Replace. По сравнению, режим экспорта AttributeUpdate предоставляет только те атрибуты, которые изменяются, что может привести к перезаписи некоторых свойств пользователя пустыми значениями. Поэтому коннектор веб-службы всегда использует режим экспорта "Замена объектов" и ожидает, что коннектор будет настроен для типа экспорта "Замена".
Процесс "Замена при экспорте" почти идентичен процессу "Добавление при экспорте". Единственное различие заключается в том, что необходимо указать дополнительные параметры, такие как addressX или companyX для программы BAPI_USER_CHANGE. X в конце addressX указывает, что структура адреса содержит изменение.
- Перейдите к типам объектов — пользователь> —> экспорт —> замените рабочий процесс и из панели инструментов в правой области перетащите действие 'Последовательность' в область конструктора рабочих процессов.
- В левом нижнем углу найдите кнопку "Переменные" и выберите ее, чтобы развернуть список переменных, определенных в этой последовательности.
- Добавьте следующие переменные. Чтобы выбрать тип переменной, созданный из SAP WSDL, выберите "Просмотр типов", разверните generated, а затем разверните пространство имен SAPECC. Это инициализирует структуры данных, используемые программой BAPI_USER_CHANGE.
Имя. | Тип переменной | Область | По умолчанию. |
---|---|---|---|
userName | Строка | Последовательность | |
bapiret2Table | SAPECC. TABLE_OF_BAPIRET2 | Последовательность | new TABLE_OF_BAPIRET2() |
адресX | SAPECC. BAPIADDR3X | Последовательность | new BAPIADDR3X() |
адрес | SAPECC. BAPIADDR3 | Последовательность | new BAPIADDR3() |
companyX | SAPECC. BAPIUSCOMX | Последовательность | new BAPIUSCOMX() |
компания | SAPECC. BAPIUSCOMP | Последовательность | new BAPIUSCOMP() |
defaultsX | SAPECC. BAPIDEFAX | Последовательность | new BAPIDEFAX() |
значения по умолчанию | SAPECC. BAPIDEFAUL | Последовательность | новый BAPIDEFAUL() |
logOnDataX | SAPECC.BAPILOGONX | Последовательность | new BAPILOGONX() |
logOnData | SAPECC.BAPILOGOND | Последовательность | new BAPILOGOND() |
Ваш рабочий процесс по замене экспорта выглядит следующим образом:
- Так как мы определили свойство userName как неизменяемый идентификатор, привязку, необходимо извлечь значение userName из коллекции привязок объекта экспорта. Перетащите действие ForEachWithBodyFactory из панели элементов в действие Последовательности. Замените имя переменной элемента привязкой, переключитесь на свойства и выберите TypeArgument
Microsoft.MetadirectoryServices.AnchorAttribute
. В поле "Значение" введитеobjectToExport.AnchorAttributes
.
- Чтобы извлечь строковое значение привязки userName, перетащите действие switch внутри действия ForEach. В всплывающем окне выберите
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper
тип переключателя. Введите значение выражения: NewAnchorAttributeNameWrapper(anchor.Name)
. Выберите область "Добавить новый кейс" в Switch. Введите имя пользователя как значение для тестового случая. Перетащите действие "Назначить" в тело случая userName, затем назначьтеanchor.Value.ToString()
переменной userName. Ваш рабочий процесс "Заменить экспорт" выглядит следующим образом:
- Теперь, когда мы извлекли значение userName из экспортированного свойства привязки объекта, необходимо заполнить другие структуры, такие как компания, значения по умолчанию, адрес, данные входа, содержащие другие сведения о пользователе SAP. Мы делаем это, перебирая коллекцию всех атрибутов, определенных в схеме.
- Сверните ваше действие ForEach и перетащите другое действие ForEachWithBothFactory внутрь действия Sequence после существующего действия ForEach. Замените имя переменной item на schemaAttr, переключитесь в режим свойств и выберите
Microsoft.MetadirectoryServices.SchemaAttribute
TypeArgument. В поле "Значение" введитеschemaType.Attributes
.
- Перетащите активность Sequence в тело активности ForEach. В левом нижнем углу найдите кнопку "Переменные" и выберите ее, чтобы развернуть список переменных, определенных в этой последовательности. Добавьте следующую переменную: xValue типа String. Перетащите действие "Назначить" в действие "Последовательность". Назначьте 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
и нажмите кнопку "ОК". Введите следующее выражение: NewAttributeNameWrapper(schemaAttr.Name)
. Вы увидите значок предупреждения в правом верхнем углу деятельности Switch о необработанных атрибутах, определенных в схеме, которые не назначены ни одному свойству. Выберите область "Добавить новое дело" элемента Switch и введите значение город. Перетащите Sequence activity в основную часть этого кейса. Перетащите действие "Назначение" в основную часть этого случая. Присвойте значение "X" переменной addressX.city. Перетащите другое действие "Назначить" в текст этого дела. Назначьте xValue для адрес.город. Ваш рабочий процесс "Экспорт Замены" организован следующим образом:
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 |
время истечения | logOnDataX.GLTGB = "X" logOnData.GLTGB = xValue |
имя | addressX.firstname = "X" address.firstname = xValue |
lastName | addressX.lastname = "X" address.lastname = xValue |
второе имя | addressX.middlename = "X" address.middlename = xValue |
номер телефона | addressX.TEL1_Numbr = "X" адрес. TEL1_Numbr = xValue |
Должность | addressX.function = "X" address.function = xValue |
Ваш рабочий процесс "Замена экспорта" выглядит следующим образом:
Перед вызовом программы BAPI_USER_CHANGE необходимо проверить наличие непустого имени пользователя. Сверните оба действия ForEach и перетащите и поместите действие IF после второго действия ForEach. Введите следующее условие:
String.IsNullOrEmpty(userName ) = False
Если имя пользователя пусто, мы хотим указать, что операция была неудачной. Перетащите
CreateCSEntryChangeResult
действие в ветвь Else действия IF и выберите код ошибкиExportErrorCustomContinueRun
. Ваш рабочий процесс "Экспорт замены" выглядит следующим образом:Перетащите действие Последовательности в пустую ветвь первого действия IF. Перетащите действие WebSeviceCall внутри действия Sequence. Выберите имя службы SAPECC, конечную точку ZSAPCONNECTORWS и операцию BAPI_USER_CHANGE. Щелкните по кнопке "Аргументы", чтобы задать параметры для вызова веб-службы следующим образом:
Имя. | Направление | Тип | значение |
---|---|---|---|
АДРЕС | In | BAPIADDR3 | адрес |
ADDRESSX | В | BAPIADDR3X | addressX |
КОМПАНИЯ | В | BAPIUSCOMP | компания |
COMPANYX | В | BAPIUSCOMX | компания |
ПО УМОЛЧАНИЮ | В | BAPIDEFAUL | значения по умолчанию |
ДЕФОЛТСИКС | В | BAPIDEFAX | defaultsX |
LOGONDATA | В | BAPILOGOND | logOnData |
LOGONDATAX | В | BAPILOGONX | LogOnDataX |
Возврат | Вход и выход | TABLE_OF_BAPIRET2 | bapiret2Table |
USERNAME | В | Строка | userName |
- Нажмите кнопку "ОК". Знак предупреждения исчезает. Ваш рабочий процесс «Замена Экспорта» выглядит следующим образом:
- Чтобы обработать результаты изменения запросов пользователя, перетащите действие "IF" внутрь действия "Sequence" после действия "WebServiceCall". Введите следующее условие:
Not IsNothing(bapiret2Table.item) AndAlso bapiret2Table.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) <> 0
- Если мы не получим ошибок, предположим, что операция экспорта завершена успешно, и мы хотим указать на успешный экспорт этого объекта, создав
CSEntryChangeResult
со статусом Успех. Перетащите действиеCreateCSEntryChangeResult
в ветвь Else действия IF и выберите код ошибки успешного выполнения. - Перетащите действие последовательности в ветвь Then вашего действия IF. Добавьте действие журнала с тегом Ошибка и значением LogText
string.Join("\n",bapiret2Table.item.Where(Function(retItem) retItem.TYPE.Equals("E")).Select(Function(r) r.MESSAGE))
. ДобавьтеCreateCSEntryChangeResult
действие после действия журнала с кодом ошибкиExportErrorCustomContinueRun
. Ваш рабочий процесс "Заменить экспорт" выглядит следующим образом:
Вы завершили определение рабочего процесса "Экспорт замены".
Следующим шагом является настройка соединителя веб-службы ECMA2Host с помощью этого шаблона.