Бөлісу құралы:


Создание шаблона соединителя веб-службы 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, а их свойства доступны в этом шаблоне.

  1. Из папки "C:\Program Files\Microsoft ECMA2Host\Web Service Configuration Tool" запустите средство настройки веб-службы wsconfigTool.exe
  2. В меню "Создать файл" выберите "Создать проект SOAP"

Снимок экрана: создание проекта SOAP.

  1. Щелкните проект SOAP и выберите "Добавить новую веб-службу".

Снимок экрана: добавление новой веб-службы.

  1. Назовите веб-службу SAPECC, укажите URL-адрес для скачивания опубликованной WSDL, введите SAPECC в качестве пространства имен. Имя веб-службы помогает различать эту веб-службу в шаблоне от других пользователей. Пространство имен определяет имя пространства имен Microsoft .NET, используемого для создания классов. Выберите режим базовой проверки подлинности, если не указан администратор SAP. Нажмите кнопку "Далее".

Снимок экрана: именование веб-службы.

  1. Укажите учетные данные для подключения к конечной точке SAP ECC. Нажмите кнопку "Далее".
  2. На странице конечных точек и операций убедитесь, что отображаются BAPIs и нажмите кнопку "Готово"

Примечание.

Если отображается несколько конечных точек, у вас есть привязки SOAP 1.2 и SOAP 1.1. Это приводит к сбою соединителя. Измените определение привязки в SOAMANAGER и сохраните только одно. Затем повторно добавьте веб-службу.

Снимок экрана: BAPIs.

  1. Сохраните проект в папку C:\Program Files\Microsoft ECMA2Host\Service\ECMA.
  2. Щелкните вкладку "Типы объектов" и выберите добавить тип объекта User. Нажмите кнопку ОК.
  3. Разверните вкладку "Типы объектов" и щелкните определение типа пользователя.

Снимок экрана: типы объектов.

  1. Добавьте следующие атрибуты в схему и выберите userName в качестве привязки.

Снимок экрана: добавление атрибутов.

  1. Сохраните проект.
Имя. Тип Привязка
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 в этом шаблоне.

  1. Перейдите к типам объектов — пользователь> —> импорт> — полный импорт рабочего процесса и из панели элементов в правой области перетаскивания последовательности в область конструктора рабочих процессов.
  2. В левом нижнем углу найдите кнопку "Переменные" и щелкните ее, чтобы развернуть список переменных, определенных в этой последовательности.
  3. Добавьте следующие переменные. Чтобы выбрать тип переменной, созданный из 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()

Снимок экрана: рабочий процесс полного импорта.

  1. На панели элементов перетащите четыре действия "Назначить" в действии Последовательности и задайте следующие значения:
selRangeTable.item(0).PARAMETER = "USERNAME" 
selRangeTable.item(0).SIGN = "I" selRangeTable.item(0).OPTION = "GT" selRangeTable.item(0).LOW = ""   

Эти параметры используются для вызова функции BAPI_USER_GETLIST и реализации разбиения на страницы.

Снимок экрана: полный рабочий процесс импорта.

  1. Чтобы реализовать разбивку на страницы, перетащите действие DoTime в действие Последовательности после последней операции "Назначить".
  2. На правой панели перейдите на вкладку "Свойства" и введите это условие для DoTime
  • цикл: returnedSize = pageSize

Снимок экрана: возвращенный экран.

  1. Щелкните переменные и добавьте свойство currentPageNumber типа int32 в цикле DoTime со значением по умолчанию 0.

Снимок экрана: экран dotime.

  1. Необязательный шаг. Если вы планируете реализовать рабочий процесс разностного импорта, перетащите действие "Назначить" в действии последовательности после цикла DoTime. Задайте это значение:
  • customData(schemaType.Name + "_lastImportTime") = DateTimeOffset.UtcNow.Ticks.ToString() При этом сохраняется дата и время последнего полного выполнения импорта, и эта метка времени позже может использоваться в рабочем процессе разностного импорта.

Снимок экрана: экран customdata.

  1. Из области элементов перетащите действие последовательности внутри действия DoTime. Перетащите действие WebServiceCall внутри этого действия последовательности и выберите имя службы SAPECC, конечную точку ZSAPCONNECTORWS и операцию BAPI_USER_GETLIST.

Снимок экрана: последовательность dotime.

  1. Щелкните ... Кнопка "Аргументы", чтобы определить параметры для вызова веб-службы следующим образом:
Имя. Направление Тип значение
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
  1. Щелкните OK. Знак предупреждения исчезает. Список пользователей, хранящихся в переменной usersTable. Так как SAP не возвращает полный список пользователей в одном ответе, необходимо реализовать разбиение на страницы и вызвать эту функцию несколько раз при переключении страниц. Затем для каждого импортированного пользователя необходимо получить сведения об этом пользователе, выполнив отдельный вызов. Это означает, что для ландшафта с 1000 пользователями и размером страницы 200 соединитель веб-службы выполняет 5 вызовов для получения списка пользователей и 1000 отдельных вызовов для получения сведений о пользователях. Чтобы повысить производительность, вы попросите группу SAP разработать пользовательскую программу BAPI, которая перечисляет все их свойства, чтобы избежать необходимости выполнения 1000 отдельных вызовов и предоставления этой функции BAPI через конечную точку SOAP WS.
  2. Из панели элементов перетащите действие IF внутри действия DoTime после действия WebServiceCall. Укажите это условие, чтобы проверить наличие непустого ответа и отсутствия ошибок: IsNothing(getListRetTable.item) OrElse getListRetTable.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) = 0
  3. Из области перетаскивания и перетаскивания действий в ветвь else действия IF, чтобы вызвать ошибку при неудачном импорте. Перейдите на вкладку "Свойства" и введите это выражение для свойства Exception действия Throw: New Exception(getListRetTable.item.First(Function(retItem) retItem.TYPE.Equals("E")).MESSAGE)

Снимок экрана: свойство исключения.

  1. Чтобы обработать список импортированных пользователей, перетащите действие ForEachWithBodyFactory из панели элементов в ветвь действия IF. Перейдите на вкладку "Свойства" и выберите SAPECC. BAPIUSNAME в качестве TypeArgument. Щелкните ... кнопка и введите это выражение для свойства значений: if(usersTable.item,Enumerable.Empty(of BAPIUSNAME)())

Снимок экрана: действие IF.

  1. Из области элементов перетащите действие последовательности внутри действия 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 выглядит следующим образом:

Снимок экрана: действие IF с элементом foreach.

  1. Перетащите действие CreateCSEntryChangeScope внутри действия Последовательности. В свойстве DN введите schemaType.Name и элемент. ИМЯ ПОЛЬЗОВАТЕЛЯ. В поле CreateAnchorAttribute AnchorValue введите item.username.

Снимок экрана: CreateCSEntryChangeScope.

  1. Чтобы получить сведения о каждом пользователе, из панели элементов перетащите действие 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
  1. Щелкните OK. Знак предупреждения исчезает. Сведения о пользователе хранятся в перечисленных выше переменных. Действие IF выглядит следующим образом:

Снимок экрана: параметры.

  1. Чтобы проверить результаты операции 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 ))

  1. Перетащите действие последовательности в ветвь действия IF. Перетащите существующее действие CreateAnchorAttribute в действие Sequence внутри ветви действия IF. Теперь действие ForEach выглядит следующим образом:

Снимок экрана: ForEach.

  1. Для каждого свойства пользователя, например города, компании, отдела, электронной почты добавьте действие IF после действия CreateAnchorAttribute и проверьте наличие непустых значений, введя такие условия, как Not string.IsNullOrEmpty(address.city) и добавив действия CreateAttributeChange в ветвь этого действия IF.

Снимок экрана: CreateAttributeChange.

Например: добавление действий 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
  1. Наконец, добавьте действие SetImportStatusCode после последнего действия CreateAttributeChange. Задайте значение ErrorCode для успешного выполнения в ветви Then. Добавьте еще одно действие кода SetImportStatus в ветвь Else и задайте для объекта ErrorCode значение ImportErrorCustomContinueRun.

Снимок экрана: SetImportStatusCode.

  1. Свернуть действие последовательности внутри действия ForEach, чтобы цикл DoTime выглядел следующим образом:

Снимок экрана: цикл DoTime.

  1. Чтобы получить следующую страницу пользователей, обновите selRangeTable.item(0).LOW свойство. Перетащите действие IF в действие Последовательности в DoTime, поместите его после существующего действия IF. Введите returnedSize>0 в качестве условия. Добавьте действие "Назначить" в ветвь действия IF и задайте для нее значение selRangeTable.item(0).LOW usersTable.item(returnedSize-1).username.

Снимок экрана: финал DoTime.

Вы завершили определение рабочего процесса полного импорта.

Создание рабочего процесса добавления экспорта

Чтобы создать пользователя в SAP ECC, можно вызвать программу BAPI_USER_CREATE1 и предоставить все параметры, включая имя учетной записи и начальный пароль. Если вам нужно создать имя учетной записи на стороне SAP, обратитесь к администратору SAP и используйте пользовательскую функцию BAPI, которая возвращает свойство userName только что созданной учетной записи пользователя.

В этом руководстве не демонстрируется назначение лицензий, локальных или глобальных групп действий, систем или профилей. Обратитесь к администратору SAP и измените этот рабочий процесс соответствующим образом.

Нет необходимости реализовать разбиение на страницы в рабочих процессах экспорта. В контексте рабочего процесса доступно только один объект objectToExport.

  1. Перейдите к типам объектов — пользователь —> экспорт —>> добавление рабочего процесса и из панели элементов в правой области перетаскивания последовательности в область конструктора рабочих процессов.
  2. В левом нижнем углу найдите кнопку "Переменные" и щелкните ее, чтобы развернуть список переменных, определенных в этой последовательности.
  3. Добавьте следующие переменные. Чтобы выбрать тип переменной, созданный из 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()

Снимок экрана: экспорт рабочего процесса добавления.

  1. Так как мы определили свойство userName как неизменяемый идентификатор, привязку, нам потребуется извлечь значение userName из коллекции привязок объекта экспорта. Перетащите действие ForEachWithBodyFactory из панели элементов в действие Последовательности. Замените имя переменной элемента привязкой, переключитесь на свойства и выберите TypeArgumentMicrosoft.MetadirectoryServices.AnchorAttribute. В поле "Значение" введите objectToExport.AnchorAttributes.

Снимок экрана: последовательность добавления экспорта.

  1. Чтобы извлечь строковое значение привязки userName, перетащите действие switch внутри действия ForEach. В всплывающем окне выберите Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper тип переключателя. Введите значение выражения: New AnchorAttributeNameWrapper(anchor). Имя).
  2. Нажмите кнопку "Добавить новый регистр" действия Switch. Введите имя пользователя в качестве значения регистра. Перетащите действие "Назначить" в текст дела userName и назначьте привязку. Значение.ToString() в переменную userName.

Снимок экрана: новый случай.

  1. Теперь, когда мы извлекли значение userName из экспортированного свойства привязки объекта, необходимо заполнить другие структуры, такие как компания, значения по умолчанию, адрес, данные входа, содержащие другие сведения о пользователе SAP. Мы делаем это путем велоспорта через коллекцию изменений атрибутов.
  2. Свернуть действие ForEach и перетащите другое действие ForEachWithBothBothFactory внутри действия Sequence после существующего действия ForEach. Замените имя переменной элемента атрибутом AttributeChange, переключитесь на свойства и выберите TypeArgumentMicrosoft.MetadirectoryServices.AttributeChange. В поле "Значение" введите objectToExport.AttributeChanges.

Снимок экрана: новая последовательность.

  1. Перетащите действие Switch в текст действия ForEach.
  2. В всплывающем меню выберите Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AttributeNameWrapper и нажмите кнопку "ОК".
  3. Введите следующее выражение: New AttributeNameWrapper(attributeChange.Name). Вы увидите значок предупреждения в правом верхнем углу действия Switch о необработанных атрибутах, определенных в схеме и не назначенных любому свойству.
  4. Щелкните "Добавить новый регистр" действия Switch и введите значение регистра города.
  5. Перетащите действие "Назначить" в текст этого дела. Назначьте attributeChange.ValueChanges(0).Value.ToString() адрес.город.

Снимок экрана: новый рабочий процесс экспорта.

  1. Добавьте другие отсутствующие случаи и назначения. Используйте эту таблицу сопоставления в качестве руководства:
Регистр Передача прав и обязанностей
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 — это специальный виртуальный атрибут, который всегда определен в схеме и может использоваться для передачи начального пароля создаваемого пользователя.

Снимок экрана: варианты.

  1. Свернуть действие ForEach и перетащите действие IF в действие Последовательности после второго действия ForEach, чтобы проверить свойства пользователя перед отправкой запроса на создание пользователя. Нам нужно по крайней мере 3 непустых значения: имя пользователя, фамилия, начальный пароль. Введите это условие: (String.IsNullOrEmpty(address.lastname) = False ) AND (String.IsNullOrEmpty(userName) = False) AND (String.IsNullOrEmpty(password.BAPIPWD1) = False)
  2. В ветви Else действия IF добавьте еще одно действие IF, так как мы хотим вызвать различные ошибки в зависимости от того, что отсутствует. Введите значение условия: String.IsNullOrEmpty(userName). CreateCSEntryChangeResult Перетащите действия в обе ветви второго действия IF и настройте Код ExportErrorMissingAnchorComponent ошибок и ExportErrorMissingProvisioningAttribute.

Снимок экрана: второе действие IF.

  1. Перетащите действие последовательности в пустую ветвь первого действия 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
  1. Щелкните OK. Знак предупреждения исчезает.

Снимок экрана: рабочий процесс после параметров.

  1. Чтобы обработать создание результатов запроса пользователя, перетащите действие IF внутри действия Sequence после действия WebServiceCall. Введите следующее условие: IsNothing (bapiret2Table.item) OrElse bapiret2Table.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) <> 0
  2. Если ошибка не возникает, предполагается, что операция экспорта выполнена успешно, и мы хотим указать успешный экспорт этого объекта, создав CSEntryChangeResult с состоянием Success. Перетащите действие CreateCSEntryChangeResult в ветвь else действия IF и выберите код ошибки success.
  3. Необязательно. Если вызов веб-службы возвращает имя созданной учетной записи пользователя, необходимо обновить значение привязки экспортированного объекта. Для этого перетащите CreateAttrubuteChangeдействие внутри CreateCSEntryChangeResult действия и выберите "Добавить имя пользователя". Затем перетащите CreateValueChange действие внутри действия и введите имя переменной CreateAttributeChange , заполненное действием вызова веб-службы. В этом руководстве используется переменная userName, которая не обновляется при экспорте.

Снимок экрана: обновленный поток последовательности.

  1. Последний шаг в рабочем процессе "Добавить экспорт" — обработка ошибок экспорта и журналов. Перетащите действие последовательности в пустую ветвь действия IF.
  2. Перетащите действие журнала в действие последовательности. Перейдите на вкладку "Свойства" и введите значение LogText: bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E")) СООБЩЕНИЕ. Сохраняйте высокий уровень ведения журнала и тег трассировки. Это регистрирует сообщение об ошибке в ConnectorsLog или журнал событий ECMA2Host при включенной подробной трассировке.
  3. Перетащите действие switch внутри действия Последовательности после действия журнала. В всплывающем окне выберите тип строки значения переключателя. Введите следующее выражение: bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E")).NUMBER
  4. Щелкните вариант по умолчанию и перетащите действие CreateCSEntryChangeResult в текст этого дела. Выберите exportErrorInvalidProvisioningAttributeValue code.

Снимок экрана: новое обновление для рабочего процесса.

  1. Щелкните область "Добавить новый регистр" и введите значение регистра 224. CreateCSEntryChangeResult Перетащите действие в текст этого дела. Выберите ExportErrorCustomContinueRun код ошибки.

Снимок экрана: окончательное обновление рабочего процесса.

Вы завершили определение рабочего процесса экспорта добавления.

Создание рабочего процесса экспорта удаления

Чтобы удалить пользователя в SAP ECC, можно вызвать программу BAPI_USER_DELETE и указать имя учетной записи для удаления в подключенной системе. Обратитесь к администратору SAP, является ли этот сценарий обязательным, так как чаще всего учетные записи SAP ECC не удаляются, но срок действия истек, чтобы сохранить исторические записи.

В этом руководстве не рассматриваются сценарии, связанные с системой общего администрирования пользователей SAP, отменой подготовки пользователей из подключенных систем, отзывом лицензий и т. д.

Нет необходимости реализовать разбиение на страницы в рабочих процессах экспорта. В контексте рабочего процесса доступно только один объект objectToExport.

  1. Перейдите к типам объектов — пользователь> —> экспорт —> удаление рабочего процесса и из панели элементов в правой области перетаскивания последовательности в область конструктора рабочих процессов.
  2. В левом нижнем углу найдите кнопку "Переменные" и щелкните ее, чтобы развернуть список переменных, определенных в этой последовательности.
  3. Добавьте следующие переменные. Чтобы выбрать тип переменной, созданный из SAP WSDL, нажмите кнопку "Обзор типов" и разверните созданный, а затем разверните пространство имен SAPECC. Это инициализирует структуры данных, используемые программой BAPI_USER_DELETE.
Имя. Тип переменной Область По умолчанию.
userName Строка Sequence
bapiret2Table SAPECC. TABLE_OF_BAPIRET2 Sequence new TABLE_OF_BAPIRET2()
  1. Так как мы определили свойство userName как неизменяемый идентификатор, привязку, нам потребуется извлечь значение userName из коллекции привязок объекта экспорта. Перетащите действие ForEachWithBodyFactory из панели элементов в действие Последовательности. Замените имя переменной элемента привязкой, переключитесь на свойства и выберите TypeArgumentMicrosoft.MetadirectoryServices.AnchorAttribute. В поле "Значение" введите objectToExport.AnchorAttributes.

Снимок экрана: рабочий процесс экспорта операции удаления.

  1. Чтобы извлечь строковое значение привязки userName, перетащите действие switch внутри действия ForEach. В всплывающем окне выберите Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper тип переключателя. Введите значение выражения: New AnchorAttributeNameWrapper(anchor.Name). Нажмите кнопку "Добавить новый регистр" действия Switch. Введите имя пользователя в качестве значения регистра. Перетащите действие "Назначить" в текст регистра userName и назначьте anchor.Value.ToString() переменную userName.
  2. Перетащите действие WebSeviceCall внутри действия Sequence после действия ForEach. Выберите имя службы SAPECC, конечную точку ZSAPCONNECTORWS и BAPI_USER_DELETE операцию. Щелкните ... Кнопка "Аргументы", чтобы определить параметры для вызова веб-службы следующим образом:
Имя. Направление Тип значение
RETURN Вход и выход TABLE_OF_BAPIRET2 bapiret2Table
USERNAME In Строка userName
  1. Щелкните OK. Знак предупреждения исчезает.

Снимок экрана: обновленный рабочий процесс удаления.

  1. Чтобы обработать удаление результатов запроса пользователя, перетащите действие IF внутри действия Sequence после действия WebServiceCall. Введите следующее условие: If(bapiRet2Table.item, Enumerable.Empty(Of BAPIRET2)()).Count(Function(errItem) errItem.TYPE.Equals("E") = True) <> 0
  2. Если ошибка не возникает, предполагается, что операция удаления завершена успешно, и мы хотим указать успешный экспорт этого объекта, создав CSEntryChangeResult состояние success. CreateCSEntryChangeResult Перетащите действие в ветвь else действия IF и выберите код ошибки success.

Снимок экрана: экспорт рабочего процесса удаления.

  1. Последним шагом в рабочем процессе экспорта удаления является обработка ошибок экспорта и журналов. Перетащите действие последовательности в пустую ветвь действия IF.
  2. Перетащите действие журнала в действие последовательности. Перейдите на вкладку "Свойства" и введите значение LogText: bapiRetTable.item.First(Function(retItem) retItem.TYPE.Equals("E")= True).MESSAGE Сохраняйте высокий уровень ведения журнала и тег трассировки. Это регистрирует сообщение об ошибке в журнал событий ConnectorsLog или ECMA2Host при включенной подробной трассировке.
  3. Перетащите действие switch внутри действия Последовательности после действия журнала. В всплывающем окне выберите тип строки значения переключателя. Введите следующее выражение: bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E")).NUMBER
  4. Щелкните вариант по умолчанию и перетащите действие CreateCSEntryChangeResult в текст этого дела. Выберите код ошибки ExportErrorSyntaxViolation.

Снимок экрана: обновление для экспорта рабочего процесса операции удаления.

  1. Щелкните область "Добавить новый регистр" и введите значение регистра 124. CreateCSEntryChangeResult Перетащите действие в текст этого дела. Выберите ExportErrorCustomContinueRun код ошибки.

Снимок экрана: окончательный рабочий процесс операции удаления экспорта.

Вы завершили определение рабочего процесса экспорта удаления.

Создание рабочего процесса "Замена экспорта"

Чтобы обновить пользователя в SAP ECC, можно вызвать программу BAPI_USER_CHANGE и указать все параметры, включая имя учетной записи и все сведения о пользователе, включая те, которые не изменяются. Режим экспорта ECMA2, когда все свойства пользователя должны быть предоставлены, называется Replace. В сравнении, режим экспорта АтрибутаUpdate предоставляет только измененные атрибуты, и это может привести к перезаписи некоторых свойств пользователя пустыми значениями. Поэтому соединитель веб-службы всегда использует режим экспорта замены объектов и ожидает, что соединитель будет настроен для типа экспорта: Замена.

Рабочий процесс "Замена экспорта" почти идентичен рабочему процессу "Добавить экспорт". Единственное различие заключается в том, что необходимо указать дополнительные параметры, такие как addressX или companyX для программы BAPI_USER_CHANGE, где X заканчивается в addressX, указывает, что структура адреса содержит изменение.

  1. Перейдите к типам объектов — пользователь> —> экспорт —> замена рабочего процесса и из панели элементов в правой области перетаскивания последовательности в область конструктора рабочих процессов.
  2. В левом нижнем углу найдите кнопку "Переменные" и щелкните ее, чтобы развернуть список переменных, определенных в этой последовательности.
  3. Добавьте следующие переменные. Чтобы выбрать тип переменной, созданный из 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()

Рабочий процесс "Заменить экспорт" выглядит следующим образом:

Снимок экрана: начало рабочего процесса замены.

  1. Так как мы определили свойство userName как неизменяемый идентификатор, привязку, нам потребуется извлечь значение userName из коллекции привязок объекта экспорта. Перетащите действие ForEachWithBodyFactory из панели элементов в действие Последовательности. Замените имя переменной элемента привязкой, переключитесь на свойства и выберите TypeArgumentMicrosoft.MetadirectoryServices.AnchorAttribute. В поле "Значение" введите objectToExport.AnchorAttributes.

Снимок экрана: обновление для замены рабочего процесса операции.

  1. Чтобы извлечь строковое значение привязки userName, перетащите действие switch внутри действия ForEach. В всплывающем окне выберите Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper тип переключателя. Введите значение выражения: New AnchorAttributeNameWrapper(anchor.Name). Нажмите кнопку "Добавить новый регистр" действия Switch. Введите имя пользователя в качестве значения регистра. Перетащите действие "Назначить" в текст регистра userName и назначьте anchor.Value.ToString() переменную userName. Рабочий процесс "Заменить экспорт" выглядит следующим образом:

Снимок экрана: другое обновление для замены рабочего процесса операции.

  1. Теперь, когда мы извлекли значение userName из экспортированного свойства привязки объекта, необходимо заполнить другие структуры, такие как компания, значения по умолчанию, адрес, данные входа, содержащие другие сведения о пользователе SAP. Мы делаем это путем велоспорта через коллекцию всех атрибутов, определенных в схеме.
  2. Свернуть действие ForEach и перетащите другое действие ForEachWithBothBothFactory внутри действия Sequence после существующего действия ForEach. Замените имя переменной элемента схемойAttr, переключитесь на свойства и выберите TypeArgumentMicrosoft.MetadirectoryServices.SchemaAttribute. В поле "Значение" введите schemaType.Attributes.

Снимок экрана: действие последовательности операций замены.

  1. Перетащите действие Sequence в текст действия ForEach. В левом нижнем углу найдите кнопку "Переменные" и щелкните ее, чтобы развернуть список переменных, определенных в этой последовательности. Добавьте следующую переменную: xValue типа String. Перетащите действие "Назначить" в действие Последовательности. Назначьте xValue выражение: If(objectToExport.AttributeChanges.Contains(schemaAttr.Name), objectToExport.AttributeChanges(schemaAttr.Name).ValueChanges(0).Value.ToString(), String.Empty) он извлекает изменения, этапированные для экспорта для этого атрибута, или инициализирует его пустой строкой. Рабочий процесс "Заменить экспорт" выглядит следующим образом:

Снимок экрана: обновление последовательности замены.

  1. Перетащите действие Switch после назначения действия. В всплывающем меню выберите Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AttributeNameWrapper и нажмите кнопку "ОК". Введите следующее выражение: New AttributeNameWrapper(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

Рабочий процесс "Заменить экспорт" выглядит следующим образом:

Снимок экрана: действие переключения второго перетаскивания.

  1. Перед вызовом программы BAPI_USER_CHANGE необходимо проверить наличие непустого имени пользователя. Свернуть как действия ForEach, так и перетащите действие IF после второго действия ForEach. Введите следующее условие: String.IsNullOrEmpty(userName ) = False

  2. Если имя пользователя пусто, мы хотим указать, что операция была неудачной. CreateCSEntryChangeResult Перетащите действие в ветвь else действия IF и выберите ExportErrorCustomContinueRun код ошибки. Рабочий процесс "Заменить экспорт" выглядит следующим образом: Снимок экрана: действие CreateCSEntryChangeResult.

  3. Перетащите действие Последовательности в пустую ветвь первого действия 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
  1. Щелкните OK. Знак предупреждения исчезает. Рабочий процесс "Заменить экспорт" выглядит следующим образом:

Снимок экрана: операция BAPI_USER_CHANGE.

  1. Чтобы изменить результаты запроса пользователя, перетащите действие IF внутри действия Sequence после действия WebServiceCall. Введите следующее условие: Not IsNothing(bapiret2Table.item) AndAlso bapiret2Table.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) <> 0
  2. Если мы не получим ошибок, предположим, что операция экспорта завершена успешно, и мы хотим указать успешный экспорт этого объекта, создав CSEntryChangeResult состояние success. CreateCSEntryChangeResult Перетащите действие в ветвь else действия IF и выберите код ошибки success.
  3. Перетащите действие последовательности в ветвь действия IF. Добавьте действие журнала со значением LogText и тегом string.Join("\n",bapiret2Table.item.Where(Function(retItem) retItem.TYPE.Equals("E")).Select(Function(r) r.MESSAGE)) error. Добавьте CreateCSEntryChangeResult действие после действия журнала с кодом ExportErrorCustomContinueRunошибки. Рабочий процесс "Заменить экспорт" выглядит следующим образом:

Снимок экрана: окончательный рабочий процесс замены экспорта.

Вы завершили определение рабочего процесса "Замена экспорта".

Следующим шагом является настройка соединителя веб-службы ECMA2Host с помощью этого шаблона.

Следующие шаги