Создание шаблона соединителя веб-службы 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
- В меню "Создать файл" выберите "Создать проект 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.
- Щелкните вкладку "Типы объектов" и выберите добавить тип объекта User. Нажмите кнопку ОК.
- Разверните вкладку "Типы объектов" и щелкните определение типа пользователя.
- Добавьте следующие атрибуты в схему и выберите userName в качестве привязки.
- Сохраните проект.
Имя. | Тип | Привязка |
---|---|---|
city | string | |
company | строка | |
department | string | |
эл. почта | string | |
expirationTime; | строка | |
firstName | строка | |
lastName | строка | |
middleName | строка | |
telephoneNumber | строка | |
jobTitle | строка | |
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, нажмите кнопку "Обзор типов" и разверните созданный, а затем разверните пространство имен SAPECC.
Имя. | Тип переменной | Область | По умолчанию. |
---|---|---|---|
selRangeTable | SAPECC. TABLE_OF_BAPIUSSRGE | Sequence | new TABLE_OF_BAPIUSSRGE with {.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 и реализации разбиения на страницы.
- Чтобы реализовать разбивку на страницы, перетащите действие DoTime в действие Последовательности после последней операции "Назначить".
- На правой панели перейдите на вкладку "Свойства" и введите это условие для DoTime
- цикл:
returnedSize = pageSize
- Щелкните переменные и добавьте свойство currentPageNumber типа int32 в цикле DoTime со значением по умолчанию 0.
- Необязательный шаг. Если вы планируете реализовать рабочий процесс разностного импорта, перетащите действие "Назначить" в действии последовательности после цикла DoTime. Задайте это значение:
customData(schemaType.Name + "_lastImportTime") = DateTimeOffset.UtcNow.Ticks.ToString()
При этом сохраняется дата и время последнего полного выполнения импорта, и эта метка времени позже может использоваться в рабочем процессе разностного импорта.
- Из области элементов перетащите действие последовательности внутри действия DoTime. Перетащите действие WebServiceCall внутри этого действия последовательности и выберите имя службы SAPECC, конечную точку ZSAPCONNECTORWS и операцию BAPI_USER_GETLIST.
- Щелкните ... Кнопка "Аргументы", чтобы определить параметры для вызова веб-службы следующим образом:
Имя. | Направление | Тип | значение |
---|---|---|---|
MAX_ROWS | In | Int32 | pageSize |
MAX_ROWSSpecified | In | Логический | Истина |
RETURN | Вход и выход | TABLE_OF_BAPIRET2 | getListRetTable |
SELECTION_EXP | Вход и выход | TABLE_OF_BAPIUSSEXP | |
SELECTION_RANGE | Вход и выход | TABLE_OF_BAPIUSSRGE | selRangeTable |
USERLIST | Вход и выход | TABLE_OF_BAPIUSNAME | usersTable |
WITH_USERNAME | In | Строка | |
СТРОКИ | выход | Int32 | returnedSize |
- Щелкните OK. Знак предупреждения исчезает. Список пользователей, хранящихся в переменной usersTable. Так как SAP не возвращает полный список пользователей в одном ответе, необходимо реализовать разбиение на страницы и вызвать эту функцию несколько раз при переключении страниц. Затем для каждого импортированного пользователя необходимо получить сведения об этом пользователе, выполнив отдельный вызов. Это означает, что для ландшафта с 1000 пользователями и размером страницы 200 соединитель веб-службы выполняет 5 вызовов для получения списка пользователей и 1000 отдельных вызовов для получения сведений о пользователях. Чтобы повысить производительность, вы попросите группу SAP разработать пользовательскую программу BAPI, которая перечисляет все их свойства, чтобы избежать необходимости выполнения 1000 отдельных вызовов и предоставления этой функции BAPI через конечную точку SOAP WS.
- Из панели элементов перетащите действие IF внутри действия DoTime после действия WebServiceCall. Укажите это условие, чтобы проверить наличие непустого ответа и отсутствия ошибок:
IsNothing(getListRetTable.item) OrElse getListRetTable.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) = 0
- Из области перетаскивания и перетаскивания действий в ветвь 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. При активном окне действия последовательности нажмите кнопку "Переменные" и определите следующие переменные:
Имя. | Тип переменной | Область | По умолчанию. |
---|---|---|---|
company | SAPECC. BAPIUSCOMP | Sequence | new BAPIUSCOMP() |
address | SAPECC. BAPIADDR3 | Sequence | new BAPIADDR3() |
значения по умолчанию | SAPECC. BAPIDEFAUL | Sequence | new BAPIDEFAUL() |
вход в систему | SAPECC. BAPILOGOND | Sequence | new BAPILOGOND() |
getDetailRetTable | SAPECC. TABLE_OF_BAPIRET2 | Sequence | new TABLE_OF_BAPIRET2() |
Действие IF выглядит следующим образом:
- Перетащите действие CreateCSEntryChangeScope внутри действия Последовательности. В свойстве DN введите schemaType.Name и элемент. ИМЯ ПОЛЬЗОВАТЕЛЯ. В поле CreateAnchorAttribute AnchorValue введите item.username.
- Чтобы получить сведения о каждом пользователе, из панели элементов перетащите действие WebServiceCall внутри действия Sequence прямо перед действием CreateAnchorAttribute. Выберите имя службы SAPECC, конечную точку ZSAPCONNECTORWS и BAPI_USER_GET_DETAIL операцию. Щелкните ... Кнопка "Аргументы", чтобы определить параметры для вызова веб-службы следующим образом:
Имя. | Направление | Тип | значение |
---|---|---|---|
RETURN | Вход и выход | TABLE_OF_BAPIRET2 | getDetailRetTable |
USERNAME | In | Строка | item.username |
АДРЕС | выход | BAPIADDR3 | address |
КОМПАНИЯ | выход | BAPIUSCOMP | company |
ПО УМОЛЧАНИЮ | выход | BAPIUSDEFAUL | значения по умолчанию |
LOGONDATA | выход | BAPILOGOND | вход в систему |
WITH_USERNAME | In | Строка | |
СТРОКИ | выход | Int32 | returnedSize |
- Щелкните OK. Знак предупреждения исчезает. Сведения о пользователе хранятся в перечисленных выше переменных. Действие IF выглядит следующим образом:
- Чтобы проверить результаты операции BAPI_USER_GET_DETAIL, на панели элементов перетащите действие IF и поместите его внутри действия Последовательности между действиями WebServiceCall и CreateAnchorAttribute. Введите это условие:
IsNothing(getDetailRetTable.item) OrElse getDetailRetTable.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) = 0
Так как отсутствующие сведения о пользователе не должны рассматриваться как катастрофическое событие, мы хотим указать эту ошибку и продолжить обработку других пользователей. Перетащите действие последовательности в ветвь else действия 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 |
---|---|
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 |
- Наконец, добавьте действие SetImportStatusCode после последнего действия CreateAttributeChange. Задайте значение ErrorCode для успешного выполнения в ветви Then. Добавьте еще одно действие кода SetImportStatus в ветвь Else и задайте для объекта ErrorCode значение ImportErrorCustomContinueRun.
- Свернуть действие последовательности внутри действия ForEach, чтобы цикл DoTime выглядел следующим образом:
- Чтобы получить следующую страницу пользователей, обновите
selRangeTable.item(0).LOW
свойство. Перетащите действие IF в действие Последовательности в DoTime, поместите его после существующего действия 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, нажмите кнопку "Обзор типов" и разверните созданный, а затем разверните пространство имен 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 как неизменяемый идентификатор, привязку, нам потребуется извлечь значение userName из коллекции привязок объекта экспорта. Перетащите действие ForEachWithBodyFactory из панели элементов в действие Последовательности. Замените имя переменной элемента привязкой, переключитесь на свойства и выберите TypeArgument
Microsoft.MetadirectoryServices.AnchorAttribute
. В поле "Значение" введитеobjectToExport.AnchorAttributes
.
- Чтобы извлечь строковое значение привязки userName, перетащите действие switch внутри действия ForEach. В всплывающем окне выберите
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper
тип переключателя. Введите значение выражения: New AnchorAttributeNameWrapper(anchor). Имя). - Нажмите кнопку "Добавить новый регистр" действия Switch. Введите имя пользователя в качестве значения регистра. Перетащите действие "Назначить" в текст дела userName и назначьте привязку. Значение.ToString() в переменную userName.
- Теперь, когда мы извлекли значение userName из экспортированного свойства привязки объекта, необходимо заполнить другие структуры, такие как компания, значения по умолчанию, адрес, данные входа, содержащие другие сведения о пользователе SAP. Мы делаем это путем велоспорта через коллекцию изменений атрибутов.
- Свернуть действие ForEach и перетащите другое действие ForEachWithBothBothFactory внутри действия Sequence после существующего действия ForEach. Замените имя переменной элемента атрибутом 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()
адрес.город.
- Добавьте другие отсутствующие случаи и назначения. Используйте эту таблицу сопоставления в качестве руководства:
Регистр | Передача прав и обязанностей |
---|---|
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)
- В ветви Else действия IF добавьте еще одно действие IF, так как мы хотим вызвать различные ошибки в зависимости от того, что отсутствует. Введите значение условия: String.IsNullOrEmpty(userName).
CreateCSEntryChangeResult
Перетащите действия в обе ветви второго действия IF и настройте КодExportErrorMissingAnchorComponent
ошибок иExportErrorMissingProvisioningAttribute
.
- Перетащите действие последовательности в пустую ветвь первого действия IF. Перетащите действие WebSeviceCall внутри действия Sequence. Выберите имя службы SAPECC, конечную точку ZSAPCONNECTORWS и BAPI_USER_CREATE1 операцию. Щелкните ... Кнопка "Аргументы", чтобы определить параметры для вызова веб-службы следующим образом:
Имя. | Направление | Тип | значение |
---|---|---|---|
АДРЕС | In | BAPIADDR3 | address |
КОМПАНИЯ | In | BAPIUSCOMP | company |
ПО УМОЛЧАНИЮ | In | BAPIDEFAUL | значения по умолчанию |
LOGONDATA | In | BAPILOGOND | logOnData |
ПАРОЛЬ | In | BAPIPWD | password |
RETURN | Выход | TABLE_OF_BAPIRET2 | bapiret2Table |
SELF_REGISTER | In | Строка | "X" |
USERNAME | In | Строка | userName |
- Щелкните OK. Знак предупреждения исчезает.
- Чтобы обработать создание результатов запроса пользователя, перетащите действие 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, которая не обновляется при экспорте.
- Последний шаг в рабочем процессе "Добавить экспорт" — обработка ошибок экспорта и журналов. Перетащите действие последовательности в пустую ветвь действия IF.
- Перетащите действие журнала в действие последовательности. Перейдите на вкладку "Свойства" и введите значение LogText:
bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E"))
СООБЩЕНИЕ. Сохраняйте высокий уровень ведения журнала и тег трассировки. Это регистрирует сообщение об ошибке в ConnectorsLog или журнал событий ECMA2Host при включенной подробной трассировке. - Перетащите действие switch внутри действия Последовательности после действия журнала. В всплывающем окне выберите тип строки значения переключателя. Введите следующее выражение:
bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E")).NUMBER
- Щелкните вариант по умолчанию и перетащите действие CreateCSEntryChangeResult в текст этого дела. Выберите exportErrorInvalidProvisioningAttributeValue code.
- Щелкните область "Добавить новый регистр" и введите значение регистра 224.
CreateCSEntryChangeResult
Перетащите действие в текст этого дела. ВыберитеExportErrorCustomContinueRun
код ошибки.
Вы завершили определение рабочего процесса экспорта добавления.
Создание рабочего процесса экспорта удаления
Чтобы удалить пользователя в SAP ECC, можно вызвать программу BAPI_USER_DELETE и указать имя учетной записи для удаления в подключенной системе. Обратитесь к администратору SAP, является ли этот сценарий обязательным, так как чаще всего учетные записи SAP ECC не удаляются, но срок действия истек, чтобы сохранить исторические записи.
В этом руководстве не рассматриваются сценарии, связанные с системой общего администрирования пользователей SAP, отменой подготовки пользователей из подключенных систем, отзывом лицензий и т. д.
Нет необходимости реализовать разбиение на страницы в рабочих процессах экспорта. В контексте рабочего процесса доступно только один объект objectToExport.
- Перейдите к типам объектов — пользователь> —> экспорт —> удаление рабочего процесса и из панели элементов в правой области перетаскивания последовательности в область конструктора рабочих процессов.
- В левом нижнем углу найдите кнопку "Переменные" и щелкните ее, чтобы развернуть список переменных, определенных в этой последовательности.
- Добавьте следующие переменные. Чтобы выбрать тип переменной, созданный из SAP WSDL, нажмите кнопку "Обзор типов" и разверните созданный, а затем разверните пространство имен SAPECC. Это инициализирует структуры данных, используемые программой BAPI_USER_DELETE.
Имя. | Тип переменной | Область | По умолчанию. |
---|---|---|---|
userName | Строка | Sequence | |
bapiret2Table | SAPECC. TABLE_OF_BAPIRET2 | Sequence | new TABLE_OF_BAPIRET2() |
- Так как мы определили свойство 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. - Перетащите действие WebSeviceCall внутри действия Sequence после действия ForEach. Выберите имя службы SAPECC, конечную точку ZSAPCONNECTORWS и BAPI_USER_DELETE операцию. Щелкните ... Кнопка "Аргументы", чтобы определить параметры для вызова веб-службы следующим образом:
Имя. | Направление | Тип | значение |
---|---|---|---|
RETURN | Вход и выход | TABLE_OF_BAPIRET2 | bapiret2Table |
USERNAME | In | Строка | userName |
- Щелкните OK. Знак предупреждения исчезает.
- Чтобы обработать удаление результатов запроса пользователя, перетащите действие IF внутри действия Sequence после действия WebServiceCall. Введите следующее условие:
If(bapiRet2Table.item, Enumerable.Empty(Of BAPIRET2)()).Count(Function(errItem) errItem.TYPE.Equals("E") = True) <> 0
- Если ошибка не возникает, предполагается, что операция удаления завершена успешно, и мы хотим указать успешный экспорт этого объекта, создав
CSEntryChangeResult
состояние success.CreateCSEntryChangeResult
Перетащите действие в ветвь else действия IF и выберите код ошибки success.
- Последним шагом в рабочем процессе экспорта удаления является обработка ошибок экспорта и журналов. Перетащите действие последовательности в пустую ветвь действия IF.
- Перетащите действие журнала в действие последовательности. Перейдите на вкладку "Свойства" и введите значение LogText:
bapiRetTable.item.First(Function(retItem) retItem.TYPE.Equals("E")= True).MESSAGE
Сохраняйте высокий уровень ведения журнала и тег трассировки. Это регистрирует сообщение об ошибке в журнал событий ConnectorsLog или ECMA2Host при включенной подробной трассировке. - Перетащите действие switch внутри действия Последовательности после действия журнала. В всплывающем окне выберите тип строки значения переключателя. Введите следующее выражение:
bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E")).NUMBER
- Щелкните вариант по умолчанию и перетащите действие CreateCSEntryChangeResult в текст этого дела. Выберите код ошибки ExportErrorSyntaxViolation.
- Щелкните область "Добавить новый регистр" и введите значение регистра 124.
CreateCSEntryChangeResult
Перетащите действие в текст этого дела. ВыберитеExportErrorCustomContinueRun
код ошибки.
Вы завершили определение рабочего процесса экспорта удаления.
Создание рабочего процесса "Замена экспорта"
Чтобы обновить пользователя в SAP ECC, можно вызвать программу BAPI_USER_CHANGE и указать все параметры, включая имя учетной записи и все сведения о пользователе, включая те, которые не изменяются. Режим экспорта ECMA2, когда все свойства пользователя должны быть предоставлены, называется Replace. В сравнении, режим экспорта АтрибутаUpdate предоставляет только измененные атрибуты, и это может привести к перезаписи некоторых свойств пользователя пустыми значениями. Поэтому соединитель веб-службы всегда использует режим экспорта замены объектов и ожидает, что соединитель будет настроен для типа экспорта: Замена.
Рабочий процесс "Замена экспорта" почти идентичен рабочему процессу "Добавить экспорт". Единственное различие заключается в том, что необходимо указать дополнительные параметры, такие как addressX или companyX для программы BAPI_USER_CHANGE, где X заканчивается в addressX, указывает, что структура адреса содержит изменение.
- Перейдите к типам объектов — пользователь> —> экспорт —> замена рабочего процесса и из панели элементов в правой области перетаскивания последовательности в область конструктора рабочих процессов.
- В левом нижнем углу найдите кнопку "Переменные" и щелкните ее, чтобы развернуть список переменных, определенных в этой последовательности.
- Добавьте следующие переменные. Чтобы выбрать тип переменной, созданный из 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 как неизменяемый идентификатор, привязку, нам потребуется извлечь значение 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 и перетащите другое действие ForEachWithBothBothFactory внутри действия Sequence после существующего действия ForEach. Замените имя переменной элемента схемойAttr, переключитесь на свойства и выберите TypeArgument
Microsoft.MetadirectoryServices.SchemaAttribute
. В поле "Значение" введите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 и введите значение регистра города. Перетащите действие последовательности в текст этого дела. Перетащите действие "Назначение" в текст этого дела. Назначьте значение "X" адресу addressX.city. Перетащите другое действие "Назначить" в текст этого дела. Назначьте xValue адресу.city. Рабочий процесс "Заменить экспорт" выглядит следующим образом:
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, так и перетащите действие IF после второго действия ForEach. Введите следующее условие:
String.IsNullOrEmpty(userName ) = False
Если имя пользователя пусто, мы хотим указать, что операция была неудачной.
CreateCSEntryChangeResult
Перетащите действие в ветвь else действия IF и выберитеExportErrorCustomContinueRun
код ошибки. Рабочий процесс "Заменить экспорт" выглядит следующим образом:Перетащите действие Последовательности в пустую ветвь первого действия IF. Перетащите действие WebSeviceCall внутри действия Sequence. Выберите имя службы SAPECC, конечную точку ZSAPCONNECTORWS и BAPI_USER_CHANGE операцию. Щелкните ... Кнопка "Аргументы", чтобы определить параметры для вызова веб-службы следующим образом:
Имя. | Направление | Тип | значение |
---|---|---|---|
АДРЕС | 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 |
- Щелкните OK. Знак предупреждения исчезает. Рабочий процесс "Заменить экспорт" выглядит следующим образом:
- Чтобы изменить результаты запроса пользователя, перетащите действие IF внутри действия Sequence после действия WebServiceCall. Введите следующее условие:
Not IsNothing(bapiret2Table.item) AndAlso bapiret2Table.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) <> 0
- Если мы не получим ошибок, предположим, что операция экспорта завершена успешно, и мы хотим указать успешный экспорт этого объекта, создав
CSEntryChangeResult
состояние success.CreateCSEntryChangeResult
Перетащите действие в ветвь else действия IF и выберите код ошибки success. - Перетащите действие последовательности в ветвь действия IF. Добавьте действие журнала со значением LogText и тегом
string.Join("\n",bapiret2Table.item.Where(Function(retItem) retItem.TYPE.Equals("E")).Select(Function(r) r.MESSAGE))
error. ДобавьтеCreateCSEntryChangeResult
действие после действия журнала с кодомExportErrorCustomContinueRun
ошибки. Рабочий процесс "Заменить экспорт" выглядит следующим образом:
Вы завершили определение рабочего процесса "Замена экспорта".
Следующим шагом является настройка соединителя веб-службы ECMA2Host с помощью этого шаблона.