Compartir vía


Creación de la plantilla del conector de servicio Web SAP ECC 7.51 para ECMA2Host

Esta guía te explica el proceso de creación de una plantilla para el conector del agente de administración de conectividad de extensibilidad del servicio Web (ECMA) para administrar usuarios de SAP ECC.

Suposiciones y limitaciones

Esta plantilla muestra cómo administrar los usuarios. En esta guía no se tratan otros tipos de objetos como grupos de actividades locales, roles y perfiles, ya que ECMA2Host no admite actualmente referencias multivalor. Las operaciones de contraseña también están fuera del ámbito de esta guía.

Esta guía no cubre la creación de la cuenta de servicio dentro de SAP que se usa para llamar a las funciones BAPI expuestas. Se supone que se usa una cuenta de demostración creada previamente developer con un perfil RFC_ALL que concede permisos a los BAPIs mencionados en este artículo.

La herramienta de configuración del servicio Web no admite las siguientes características expuestas en SAP de forma predeterminada: directivas WSP y varios enlaces por punto de conexión. Espera un WSDL solo con SOAP 1.1, enlace de estilo de documento todo en uno sin directivas.

Funciones BAPI de SAP ECC que se usan en esta plantilla:

  • BAPI_USER_GETLIST: obtiene una lista de todos los usuarios conectados a este sistema.
  • BAPI_USER_GETDETAIL: obtiene detalles de un usuario específico.
  • BAPI_USER_CREATE1: crea un usuario.
  • BAPI_USER_DELETE: elimina un usuario.
  • BAPI_USER_CHANGE: actualiza un usuario.

Todas las propiedades de usuario de SAP de esta guía se tratan como propiedades con valores únicos.

El lenguaje de programación que se usa es Visual Basic.

Definición de un punto de conexión de servicio Web y creación de un esquema

Para poder diseñar flujos de trabajo de importación y exportación, debes crear una plantilla y definir un punto de conexión con las funciones de SAP BAPI expuestas a través de una interfaz SOAP. A continuación, crea un esquema de los objetos ECMA2 y sus propiedades está disponible en esta plantilla.

  1. En la carpeta "C:\Archivos de programa\Microsoft ECMA2Host\Web Service Configuration Tool", inicie la herramienta De configuración del servicio web wsconfigTool.exe
  2. En el menú File-New, elija Crear nuevo proyecto SOAP.

Captura de pantalla de crear proyecto SOAP.

  1. Seleccione en Proyecto SOAP y elija Agregar nuevo servicio web.

Captura de pantalla de la adición de un nuevo servicio Web.

  1. Asigna un nombre al servicio Web SAPECC, proporciona una dirección URL para descargar WSDL publicado y escribe SAPECC como espacio de nombres. El nombre del servicio Web te ayuda a distinguir este servicio Web en la plantilla de otros usuarios. Namespace define un nombre del espacio de nombres de Microsoft .NET que se usa para generar clases. Elige el modo de autenticación básico a menos que el administrador de SAP indique lo contrario. Seleccione Siguiente.

Captura de pantalla de nomenclatura del servicio Web.

  1. Proporciona credenciales para conectarte al punto de conexión de SAP ECC. Seleccione Siguiente.
  2. En la página de puntos de conexión y operaciones, asegúrese de que se muestren los BAPI y seleccione Finalizar

Nota:

si ves más de un punto de conexión, tienes habilitados los enlaces SOAP 1.2 y SOAP 1.1. Esto hace que se produzca un error en el conector. Modifica la definición de enlace en SOAMANAGER y mantén solo una. Luego, vuelve a agregar un servicio Web.

Captura de pantalla de los BAPI.

  1. Guarda el proyecto en la carpeta C:\Program Files\Microsoft ECMA2Host\Service\ECMA.
  2. Seleccione en la pestaña Tipos de objeto y elija agregar el tipo de objeto User. Seleccione Aceptar.
  3. Expanda la pestaña Tipos de objeto y seleccione en Definición de tipo de usuario.

Captura de pantalla de los tipos de objeto.

  1. Agrega los atributos siguientes al esquema y elige userName como anclaje.

Captura de pantalla de la adición de atributos.

  1. Guarda el proyecto.
Nombre Tipo Anclaje
city string
company string
department string
email string
expirationTime string
firstName string
lastName string
middleName string
telephoneNumber string
jobTitle string
userName string Activado

Creación de un flujo de trabajo de importación completa

El flujo de trabajo de importación, si bien es opcional en ECMA2Host, te permite importar usuarios de SAP existentes en la caché en memoria ECMA2Host y evitar que se creen usuarios duplicados durante el aprovisionamiento.

Si no crea un flujo de trabajo de importación, el conector funciona en modo de solo exportación y hace que ECMA2Host emita siempre operaciones de creación de usuario, incluso para los usuarios existentes. Esto puede provocar errores o duplicados cuando se usan BAPI de SAP estándar a menos que el flujo de trabajo de exportación controle duplicados.

SAP ECC no ofrece un mecanismo integrado para leer los cambios realizados desde la última lectura.

Por lo tanto, solo estamos implementando el flujo de trabajo de importación completa. Si necesitas implementar importaciones delta por motivos de rendimiento, consulta al administrador de SAP para obtener una lista de BAPI y hacer que se publiquen como un servicio web SOAP. A continuación, implemente el flujo de trabajo de importación delta con el siguiente enfoque, tal como se describe, y una propiedad customData que contiene una marca de tiempo de la ejecución correcta anterior.

SAP ECC ofrece varias funciones BAPI para obtener una lista de usuarios con sus propiedades:

  • BAPI_USER_GETLIST: obtiene una lista de todos los usuarios conectados a este sistema.
  • BAPI_USER_GETDETAIL: obtiene detalles de un usuario específico.

Solo estos dos BAPIs se usan para recuperar usuarios existentes de SAP ECC en esta plantilla.

  1. Ve a Object Types - > User - > Import -> Full Import workflow y desde el cuadro de herramientas en la derecha, arrastra y coloca la actividad Sequence en el panel del diseñador de flujo de trabajo.
  2. En la parte inferior izquierda, busque el botón Variables y selecciónelo para expandir una lista de variables definidas en esta secuencia.
  3. Agrega las variables siguientes. Para seleccionar un tipo de variable generado desde el WSDL de SAP, seleccione Examinar tipos, expanda generado y luego expanda el espacio de nombres SAPECC.
Nombre Tipo de variable Ámbito Valor predeterminado
selRangeTable SAPECC.TABLE_OF_BAPIUSSRGE Sequence new TABLE_OF_BAPIUSSRGE with {.item = new BAPIUSSRGE(){new BAPIUSSRGE}}
getListRetTable SAPECC.TABLE_OF_BAPIRET2 Sequence new TABLE_OF_BAPIRET2
pageSize Int32 Sequence 200
returnedSize Int32 Sequence
usersTable SAPECC.TABLE_OF_BAPIUSNAME Sequence new TABLE_OF_BAPIUSNAME()

Captura de pantalla del flujo de trabajo de la operación de importación completa.

  1. En el Cuadro de herramientas, arrastre y coloque cuatro Actividades de asignación dentro de la actividad Secuencia y establezca estos valores:
selRangeTable.item(0).PARAMETER = "USERNAME" 
selRangeTable.item(0).SIGN = "I" selRangeTable.item(0).OPTION = "GT" selRangeTable.item(0).LOW = ""   

Estos parámetros se usan para llamar a la función BAPI_USER_GETLIST e implementar la paginación.

Captura de pantalla del flujo de trabajo de importación completo.

  1. Para implementar la paginación, desde el cuadro de herramientas, arrastra y coloca la actividad DoWhile dentro de la actividad Sequence después de la última operación Asignar.
  2. En el panel derecho, cambia a la pestaña Propiedades y escribe esta condición para DoWhile.
  • ciclo: returnedSize = pageSize

Captura de pantalla de la pantalla returnedsize.

  1. Seleccione las variables y agregue la propiedad currentPageNumber del tipo int32 dentro del ciclo DoWhile con el valor predeterminado 0.

Captura de pantalla de la pantalla dowhile.

  1. Paso opcional: si planeas implementar el flujo de trabajo de importación delta, desde el cuadro de herramientas arrastra y coloca la actividad Assign dentro de la actividad Sequence después del ciclo DoWhile. Establece este valor:
  • customData(schemaType.Name + "_lastImportTime") = DateTimeOffset.UtcNow.Ticks.ToString() Esto guarda la fecha y hora de la última ejecución de importación completa y esta marca de tiempo se puede usar más adelante en el flujo de trabajo de importación delta.

Captura de pantalla de la pantalla customdata.

  1. En el Cuadro de herramientas, arrastre y coloque la actividad Secuencia dentro de la actividad DoWhile. Arrastra y coloca la actividad WebServiceCall dentro de esa actividad Sequence y selecciona Nombre de servicio SAPECC, punto de conexión ZSAPCONNECTORWS y operación BAPI_USER_GETLIST.

Captura de pantalla de la secuencia dowhile.

  1. Seleccione el botón argumentos para definir los parámetros de la llamada al servicio web de la siguiente manera:
Nombre Dirección Tipo Valor
MAX_ROWS In Int32 pageSize
MAX_ROWSSpecified In Boolean True
RETURN In/Out TABLE_OF_BAPIRET2 getListRetTable
SELECTION_EXP In/Out TABLE_OF_BAPIUSSEXP
SELECTION_RANGE In/Out TABLE_OF_BAPIUSSRGE selRangeTable
USERLIST In/Out TABLE_OF_BAPIUSNAME usersTable
WITH_USERNAME In String
ROWS Out Int32 returnedSize
  1. Seleccione Aceptar. El signo de advertencia desaparece. La lista de usuarios almacenados en la variable usersTable. Dado que SAP no devuelve una lista completa de usuarios en una sola respuesta, es necesario implementar la paginación y llamar a esta función varias veces al cambiar de página. Luego, para cada usuario importado, debes obtener los detalles del usuario realizando una llamada independiente. Esto significa que para un entorno con 1000 usuarios y un tamaño de página de 200, el conector de servicios web realiza 5 llamadas para recuperar una lista de usuarios y 1000 llamadas individuales para recuperar los detalles de los usuarios. Para mejorar el rendimiento, pida a su equipo de SAP que desarrolle un programa BAPI personalizado que muestre todos los usos con sus propiedades. Esto evita la necesidad de realizar 1000 llamadas individuales y exponer esa función BAPI a través del punto de conexión de SOAP WS.
  2. En el Cuadro de herramientas, arrastre y coloque la actividad IF dentro de la actividad DoWhile después de la actividad WebServiceCall. Especifica esta condición para comprobar si hay una respuesta no vacía y ausencia de errores: IsNothing(getListRetTable.item) OrElse getListRetTable.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) = 0
  3. En el Cuadro de herramientas, arrastre y coloque la actividad Throw en la rama Else de la actividad IF para producir un error en la importación incorrecta. Cambia a la pestaña Propiedades y escribe esta expresión para la propiedad Exception de la actividad Throw: New Exception(getListRetTable.item.First(Function(retItem) retItem.TYPE.Equals("E")).MESSAGE)

Captura de pantalla de la propiedad Exception.

  1. Para procesar una lista de usuarios importados, arrastra y coloca la actividad ForEachWithBodyFactory desde el cuadro de herramientas en la rama Then de la actividad IF. Cambia a la pestaña Propiedades y selecciona SAPECC.BAPIUSNAME como TypeArgument. Seleccione el botón ... y escriba esta expresión para la propiedad valores: if(usersTable.item,Enumerable.Empty(of BAPIUSNAME)())

Captura de pantalla de la actividad IF.

  1. En el Cuadro de herramientas, arrastre y coloque la actividad Secuencia dentro de la actividad ForEach. Si esta ventana de actividad de secuencia está activa, seleccione en el botón Variables y defina estas variables:
Nombre Tipo de variable Ámbito Valor predeterminado
company SAPECC.BAPIUSCOMP Sequence new BAPIUSCOMP()
address SAPECC.BAPIADDR3 Sequence new BAPIADDR3()
defaults SAPECC.BAPIDEFAUL Sequence new BAPIDEFAUL()
logondata SAPECC.BAPILOGOND Sequence new BAPILOGOND()
getDetailRetTable SAPECC.TABLE_OF_BAPIRET2 Sequence new TABLE_OF_BAPIRET2()

La actividad IF tiene este aspecto:

Captura de pantalla de la actividad IF con foreach.

  1. Arrastra y coloca la actividad CreateCSEntryChangeScope dentro de la actividad Sequence. En la propiedad DN, escriba schemaType.Name & item.NOMBRE_DE_USUARIO. En el campo CreateAnchorAttribute AnchorValue, escribe item.username.

Captura de pantalla de CreateCSEntryChangeScope.

  1. Para recuperar detalles de cada usuario, desde el cuadro de herramientas, arrastra y coloca la actividad WebServiceCall dentro de la actividad Sequence justo antes de la actividad CreateAnchorAttribute. Selecciona el nombre de servicio SAPECC, el punto de conexión ZSAPCONNECTORWS y la operación BAPI_USER_GET_DETAIL. Haga clic en el botón Argumentos para definir los parámetros de la llamada al servicio web de la siguiente manera:
Nombre Dirección Tipo Valor
RETURN In/Out TABLE_OF_BAPIRET2 getDetailRetTable
USERNAME In String item.username
ADDRESS Out BAPIADDR3 address
COMPANY Out BAPIUSCOMP company
DEFAULTS Out BAPIUSDEFAUL defaults
LOGONDATA Out BAPILOGOND logonData
WITH_USERNAME In String
ROWS Out Int32 returnedSize
  1. Seleccione Aceptar. El signo de advertencia desaparece. Los detalles de un usuario se almacenan en las variables enumeradas anteriormente. La actividad IF tiene este aspecto:

Captura de pantalla de parámetros.

  1. Para comprobar los resultados de la operación BAPI_USER_GET_DETAIL, desde el cuadro de herramientas, arrastra y coloca la actividad IF y colócala dentro de la actividad Sequence entre las actividades WebServiceCall y CreateAnchorAttribute. Escribe esta condición: IsNothing(getDetailRetTable.item) OrElse getDetailRetTable.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) = 0

Como los detalles del usuario que faltan no deben tratarse como un evento catastrófico, queremos indicar este error y continuar el procesamiento de otros usuarios. Arrastra y coloca la actividad Sequence en la rama Else de la actividad IF. Agrega la actividad Log dentro de esa nueva actividad Sequence. Cambia a la pestaña Propiedades y cambia la propiedad Level a High, Tag a Trace. Escribe lo siguiente en la propiedad LogText: string.Join("\n", getDetailRetTable.item.Select (Function(item) item.MESSAGE ))

  1. Arrastra y coloca la actividad Sequence en la rama Then de la actividad IF. Arrastra y coloca la actividad CreateAnchorAttribute existente en la actividad Sequence dentro de la rama Then de la actividad IF. La actividad ForEach ahora tiene el siguiente aspecto:

Captura de pantalla de ForEach.

  1. Para cada propiedad de un usuario como ciudad, empresa, departmento o correo electrónico, agrega la actividad IF después de la actividad CreateAnchorAttribute y comprueba si hay valores no vacíos mediante la escritura de condiciones como Not string.IsNullOrEmpty(address.city) y la adición de las actividades CreateAttributeChange en la rama Then de esa actividad IF.

Captura de pantalla de CreateAttributeChange.

Por ejemplo: agrega actividades CreateAttributeChange para todas las propiedades de usuario mediante esta tabla de asignación:

Propiedad usuario ECMA Propiedad SAP
city address.city
department address.department
company company.company
email address.e_mail
firstName address.firstName
lastName address.lastName
middleName address.middleName
jobTitle address.function
expirationTime logonData.GLTGB
telephoneNumber address.TEL1_NUMBR
  1. Por último, agrega la actividad SetImportStatusCode después de la última actividad CreateAttributeChange. Establece ErrorCode en Correcto en la rama Then. Agrega una actividad de código SetImportStatus más en la rama Else y establece ErrorCode en ImportErrorCustomContinueRun.

Captura de pantalla de SetImportStatusCode.

  1. Contrae la actividad Sequence dentro de la actividad ForEach para que el ciclo DoWhile tenga este aspecto:

Captura de pantalla del ciclo DoWhile.

  1. Para recuperar la página siguiente de los usuarios, actualiza la propiedad selRangeTable.item(0).LOW. Arrastre y coloque la actividad IF en la actividad Sequence dentro de DoWhile. Colóquela después de la actividad IF existente. Escribe returnedSize>0 como Condición. Agrega la actividad Assign a la rama Then de la actividad IF y establece selRangeTable.item(0).LOW en usersTable.item(returnedSize-1).username.

Captura de pantalla de DoWhile final.

Has completado la definición del flujo de trabajo de importación completa.

Creación de un flujo de trabajo de adición de exportación

Para crear un usuario en SAP ECC, puedes llamar al programa BAPI_USER_CREATE1 y proporcionar todos los parámetros, incluido un nombre de cuenta y una contraseña inicial. Si necesitas que se genere un nombre de cuenta en SAP, consulta con el administrador de SAP y usa una función BAPI personalizada que devuelva una propiedad userName de una cuenta de usuario recién creada.

En esta guía no se muestra la asignación de licencias, los grupos de actividades locales o globales, los sistemas o perfiles. Consulta con el administrador de SAP y modifica este flujo de trabajo en consecuencia.

No es necesario implementar la paginación en flujos de trabajo de exportación. Solo hay un objeto objectToExport disponible en el contexto del flujo de trabajo.

  1. Ve a Object Types - > User - > Export - > Add workflow y desde el cuadro de herramientas de la derecha, arrastra y coloca la actividad Sequence en el panel del diseñador de flujo de trabajo.
  2. En la parte inferior izquierda, busque el botón Variables y selecciónelo para expandir una lista de variables definidas en esta secuencia.
  3. Agrega las variables siguientes. Para seleccionar un tipo de variable generado desde el WSDL de SAP, seleccione Examinar tipos, expanda generado y luego expanda el espacio de nombres SAPECC. Esto inicializa las estructuras de datos usadas por el programa BAPI_USER_CREATE1.
Nombre Tipo de variable Ámbito Valor predeterminado
address SAPECC.BAPIADDR3 Sequence new BAPIADDR3()
userName String Sequence
password SAPECC.BAPIPWD Sequence new BAPIPWD()
company SAPECC.BAPIUSCOMP Sequence new BAPIUSCOMP()
defaults SAPECC.BAPIDEFAUL Sequence new BAPIDEFAUL()
logOnData SAPECC.BAPILOGOND Sequence new BAPILOGOND()
bapiret2Table SAPECC.TABLE_OF_BAPIRET2 Sequence new TABLE_OF_BAPIRET2()

Captura de pantalla del flujo de trabajo de adición de exportación.

  1. Como definimos la propiedad userName como un identificador inmutable, un delimitador, necesitamos extraer el valor userName de una colección de delimitadores de nuestro objeto de exportación. Arrastra y coloca la actividad ForEachWithBodyFactory desde el cuadro de herramientas a la actividad Sequence. Reemplaza el nombre de la variable de elemento por anclaje, cambia a las propiedades y elige TypeArgument de Microsoft.MetadirectoryServices.AnchorAttribute. En el campo Valor, escriba objectToExport.AnchorAttributes.

Captura de pantalla de la secuencia para agregar exportación.

  1. Para extraer un valor de cadena de un anclaje userName, arrastra y coloca la actividad Switch dentro de la actividad ForEach. En la ventana emergente, seleccione Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper tipo de conmutador. Escribe el valor Expression de: New AnchorAttributeNameWrapper(anchor.Name).
  2. Seleccione el área Agregar nuevo caso de la actividad Switch. Escribe userName como valor Case. Arrastra y coloca la actividad Assign en el cuerpo del caso userName y asigna anchor.Value.ToString() a la variable userName.

Captura de pantalla de nuevo Case.

  1. Ahora que hemos extraído el valor userName de la propiedad de anclaje de objeto exportado, es necesario rellenar otras estructuras como company, defaults, address, logon data que contienen otros detalles de usuario de SAP. Para ello, realizamos un ciclo a través de la colección de cambios de atributo.
  2. Contrae la actividad ForEach, arrastra y coloca otra actividad ForEachWithBothFactory dentro de la actividad Sequence después de la actividad ForEach existente. Reemplaza el nombre de la variable de elemento por attributeChange, cambia a propiedades y elige TypeArgument de Microsoft.MetadirectoryServices.AttributeChange. En el campo Valor, escriba objectToExport.AttributeChanges.

Captura de pantalla de la nueva secuencia.

  1. Arrastra y coloca la actividad Switch en el cuerpo de la actividad ForEach.
  2. En el menú emergente, seleccione Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AttributeNameWrapper y seleccione Aceptar.
  3. Escribe la expresión siguiente: New AttributeNameWrapper(attributeChange.Name). Verás un icono de advertencia en la esquina superior derecha de la actividad Switch sobre los atributos no controlados definidos en el esquema y no asignados a ninguna propiedad.
  4. Seleccione el área Agregar nuevo caso de la actividad Switch y escriba un valor de caso de ciudad.
  5. Arrastra y coloca la actividad Assign en el cuerpo de este caso. Asigna attributeChange.ValueChanges(0).Value.ToString() a address.city.

Captura de pantalla del nuevo flujo de trabajo de adición de exportación.

  1. Agrega los otros casos y asignaciones que faltan. Usa esta tabla de asignación como guía:
Caso Asignación
city address.city = attributeChange.ValueChanges(0)Value.ToString()
company company.company = attributeChange.ValueChanges(0)Value.ToString()
department address.department = attributeChange.ValueChanges(0)Value.ToString()
email 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 address.TEL1_Numbr = attributeChange.ValueChanges(0)Value.ToString()
jobTitle address.function = attributeChange.ValueChanges(0)Value.ToString()
export_password password.BAPIPWD1 = attributeChange.ValueChanges(0)Value.ToString()

Aquí, export_password es un atributo virtual especial que siempre se define en el esquema y se puede usar para pasar una contraseña inicial del usuario que se va a crear.

Captura de pantalla de casos.

  1. Contrae la actividad ForEach, arrastra y coloca la actividad IF en la actividad Sequence, después de la segunda actividad ForEach, para validar las propiedades del usuario, antes de enviar la solicitud de creación del usuario. Necesitamos al menos 3 valores no vacíos: nombre de usuario, apellido, contraseña inicial. Escribe esta condición: (String.IsNullOrEmpty(address.lastname) = False ) AND (String.IsNullOrEmpty(userName) = False) AND (String.IsNullOrEmpty(password.BAPIPWD1) = False)
  2. En la rama Else de la actividad IF, agregue una actividad IF más, ya que queremos producir diferentes errores en función de lo que falta. Escribe el valor de condición: String.IsNullOrEmpty(userName). Arrastra y coloca las actividades CreateCSEntryChangeResult en ambas ramas de la segunda actividad IF y configura ErrorCode de ExportErrorMissingAnchorComponent y ExportErrorMissingProvisioningAttribute.

Captura de pantalla de la segunda actividad IF.

  1. Arrastra y coloca la actividad Sequence en la rama Then vacía de la primera actividad IF. Arrastra y coloca la actividad WebSeviceCall dentro de la actividad Sequence. Selecciona el nombre de servicio SAPECC, el punto de conexión ZSAPCONNECTORWS y la operación BAPI_USER_CREATE1. Haga clic en el botón Argumentos para definir los parámetros para una llamada al servicio web de la siguiente manera:
Nombre Dirección Tipo Valor
ADDRESS In BAPIADDR3 address
COMPANY In BAPIUSCOMP company
DEFAULTS In BAPIDEFAUL defaults
LOGONDATA In BAPILOGOND logOnData
PASSWORD In BAPIPWD password
RETURN In-Out TABLE_OF_BAPIRET2 bapiret2Table
SELF_REGISTER In String "X"
USERNAME In String userName
  1. Seleccione Aceptar. El signo de advertencia desaparece.

Captura de pantalla del flujo de trabajo después de los parámetros.

  1. Para procesar los resultados de la solicitud de creación de usuario, arrastre y coloque la actividad IF dentro de la actividad Sequence después de la actividad WebServiceCall. Escribe la siguiente condición: IsNothing (bapiret2Table.item) OrElse bapiret2Table.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) <> 0
  2. Si no se produce ningún error, se supone que la operación de exportación se completó correctamente y queremos indicar la exportación correcta de este objeto mediante la creación de CSEntryChangeResult con el estado Correcto. Arrastra y coloca la actividad CreateCSEntryChangeResult en la rama Else de la actividad IF y selecciona el código de error correcto.
  3. Opcional: si la llamada al servicio Web devuelve un nombre de cuenta generado de un usuario, es necesario actualizar un valor de anclaje del objeto exportado. Para ello, arrastra y coloca la actividad CreateAttrubuteChange dentro de la actividad CreateCSEntryChangeResult y selecciona Add a userName. Luego, arrastra y coloca la actividad CreateValueChange dentro de la actividad CreateAttributeChange y escribe el nombre de la variable rellenado por una actividad de llamada de servicio Web. En esta guía, usas la variable userName, que no se actualiza en la exportación.

Captura de pantalla del flujo de secuencia actualizado.

  1. El último paso del flujo de trabajo de adición de exportación es controlar y registrar los errores de exportación. Arrastra y coloca la actividad Sequence en la rama Then vacía de la actividad IF.
  2. Arrastra y coloca actividad de registro en la actividad Sequence. Cambia a la pestaña Propiedades y escribe el valor logText de: bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E")).MESSAGE. Mantén el nivel de registro alto y la etiqueta de seguimiento. Esto registra un mensaje de error en ConnectorsLog o en el registro de eventos ECMA2Host cuando está habilitado el seguimiento detallado.
  3. Arrastra y coloca la actividad Switch dentro de la actividad Sequence después de la actividad Log. En la ventana emergente, seleccione el tipo de cadena para el valor del interruptor. Escribe la siguiente expresión: bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E")).NUMBER
  4. Seleccione el caso predeterminado y arrastre y coloque la actividad CreateCSEntryChangeResult en el cuerpo de este caso. Elige el código de error ExportErrorInvalidProvisioningAttributeValue.

Captura de pantalla de la nueva actualización del flujo de trabajo.

  1. Seleccione en el área Agregar nuevo caso y escriba un valor de caso de 224. Arrastra y coloca la actividad CreateCSEntryChangeResult en el cuerpo de este caso. Elige el código de error ExportErrorCustomContinueRun.

Captura de pantalla de la actualización final del flujo de trabajo.

Has completado la definición del flujo de trabajo de adición de exportación.

Creación de un flujo de trabajo de eliminación de exportación

Para eliminar un usuario de SAP ECC, puede llamar al programa BAPI_USER_DELETE y proporcionar un nombre de cuenta que se va a eliminar en el sistema conectado. Consulte con el administrador de SAP para determinar si este escenario es obligatorio. La mayoría de las veces, las cuentas sap ECC no se eliminan, pero están configuradas para expirar para mantener registros históricos.

En esta guía no se tratan escenarios relacionados con el sistema de administración de usuarios comunes de SAP, el desaprovisionamiento de usuarios de los sistemas conectados, la revocación de licencias, etc.

No es necesario implementar la paginación en flujos de trabajo de exportación. Solo hay un objeto objectToExport disponible en el contexto del flujo de trabajo.

  1. Ve a Object Types - > User - > Export -> Delete workflow y desde el cuadro de herramientas de la derecha, arrastra y coloca la actividad Sequence en el panel del diseñador de flujo de trabajo.
  2. En la parte inferior izquierda, busque el botón Variables y selecciónelo para expandir una lista de variables definidas en esta secuencia.
  3. Agrega las variables siguientes. Para seleccionar un tipo de variable generado desde el WSDL de SAP, seleccione Examinar tipos, expanda generado y luego expanda el espacio de nombres SAPECC. Esto inicializa las estructuras de datos usadas por el programa BAPI_USER_DELETE.
Nombre Tipo de variable Ámbito Valor predeterminado
userName String Sequence
bapiret2Table SAPECC.TABLE_OF_BAPIRET2 Sequence new TABLE_OF_BAPIRET2()
  1. Como definimos la propiedad userName como un identificador inmutable, un delimitador, necesitamos extraer el valor userName de una colección de delimitadores de nuestro objeto de exportación. Arrastra y coloca la actividad ForEachWithBodyFactory desde el cuadro de herramientas a la actividad Sequence. Reemplaza el nombre de la variable de elemento por anclaje, cambia a las propiedades y elige TypeArgument de Microsoft.MetadirectoryServices.AnchorAttribute. En el campo Valor, escriba objectToExport.AnchorAttributes.

Captura de pantalla del flujo de trabajo de la operación de eliminación de exportación.

  1. Para extraer un valor de cadena de un anclaje userName, arrastra y coloca la actividad Switch dentro de la actividad ForEach. En la ventana emergente, seleccione Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper tipo de conmutador. Escribe el valor Expression de: New AnchorAttributeNameWrapper(anchor.Name). Seleccione el área Agregar nuevo caso de la actividad Switch. Escribe userName como valor Case. Arrastra y coloca la actividad Assign en el cuerpo del caso userName y asígnale anchor.Value.ToString() a la variable userName.
  2. Arrastra y coloca la actividad WebSeviceCall dentro de la actividad Sequence después de la actividad ForEach. Selecciona el nombre de servicio SAPECC, el punto de conexión ZSAPCONNECTORWS y la operación BAPI_USER_DELETE. Seleccione el botón Argumentos para definir los parámetros para la llamada al servicio web de la siguiente manera:
Nombre Dirección Tipo Valor
RETURN In/Out TABLE_OF_BAPIRET2 bapiret2Table
USERNAME In String userName
  1. Seleccione Aceptar. El signo de advertencia desaparece.

Captura de pantalla del flujo de trabajo de la operación de eliminación actualizada.

  1. Para procesar la eliminación de los resultados de la solicitud de usuario, arrastra y coloca la actividad IF dentro de la actividad Sequence después de la actividad WebServiceCall. Escribe la siguiente condición: If(bapiRet2Table.item, Enumerable.Empty(Of BAPIRET2)()).Count(Function(errItem) errItem.TYPE.Equals("E") = True) <> 0
  2. Si no se produce ningún error, se supone que la operación de eliminación se completó correctamente y queremos indicar la exportación correcta de este objeto mediante la creación CSEntryChangeResult con el estado Correcto. Arrastra y coloca la actividad CreateCSEntryChangeResult en la rama Else de la actividad IF y selecciona código de error correcto.

Captura de pantalla del flujo de trabajo de eliminación de exportación.

  1. El último paso del flujo de trabajo de eliminación de exportación es controlar y registrar los errores de exportación. Arrastra y coloca la actividad Sequence en la rama Then vacía de la actividad IF.
  2. Arrastra y coloca actividad de registro en la actividad Sequence. Cambia a la pestaña Propiedades y escribe el valor logText de: bapiRetTable.item.First(Function(retItem) retItem.TYPE.Equals("E")= True).MESSAGE. Mantén el nivel de registro alto y la etiqueta de seguimiento. Esto registra un mensaje de error en el registro de eventos ConnectorsLog o ECMA2Host cuando está habilitado el seguimiento detallado.
  3. Arrastra y coloca la actividad Switch dentro de la actividad Sequence después de la actividad Log. En la ventana emergente, seleccione Tipo de cadena del valor del interruptor. Escribe la siguiente expresión: bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E")).NUMBER
  4. Seleccione el caso predeterminado y arrastre y coloque la actividad CreateCSEntryChangeResult en el cuerpo de este caso. Elige el código de error ExportarErrorSyntaxViolation.

Captura de pantalla de la actualización para exportar el flujo de trabajo de la operación de eliminación.

  1. Seleccione en el área Agregar nuevo caso y escriba un valor de caso de 124. Arrastra y coloca la actividad CreateCSEntryChangeResult en el cuerpo de este caso. Elige el código de error ExportErrorCustomContinueRun.

Captura de pantalla del flujo de trabajo final de la operación de eliminación de exportación.

Has completado la definición del flujo de trabajo de eliminación de exportación.

Creación de un flujo de trabajo de reemplazo de exportación

Para actualizar un usuario en SAP ECC, puede llamar al programa BAPI_USER_CHANGE y proporcionar todos los parámetros, incluido un nombre de cuenta y todos los detalles del usuario, incluidos los que no cambian. El modo de exportación ECMA2 cuando se proporcionan todas las propiedades de usuario se denomina Reemplazar. En comparación, el modo de exportación de AttributeUpdate solo proporciona atributos que se están cambiando y esto puede hacer que algunas propiedades de usuario se sobrescriban con valores vacíos. Por lo tanto, el conector de servicios Web siempre usa el modo de exportación reemplazar objeto y espera que el conector se configure para Tipo de exportación: Reemplazar.

El flujo de trabajo de reemplazo de exportación es casi idéntico al flujo de trabajo de adición de exportación. La única diferencia es que debe especificar parámetros adicionales como addressX o companyX para el programa BAPI_USER_CHANGE. La X al final de addressX indica que la estructura de la dirección contiene un cambio.

  1. Ve a Object Types -> User -> Export -> Replace workflow y desde el cuadro de herramientas de la derecha, arrastra y coloca la actividad Sequence en el panel del diseñador de flujo de trabajo.
  2. En la parte inferior izquierda, busque el botón Variables y selecciónelo para expandir una lista de variables definidas en esta secuencia.
  3. Agrega las variables siguientes. Para seleccionar un tipo de variable generado desde el WSDL de SAP, seleccione Examinar tipos, expanda generado y luego expanda el espacio de nombres SAPECC. Esto inicializa las estructuras de datos usadas por el programa BAPI_USER_CHANGE.
Nombre Tipo de variable Ámbito Valor predeterminado
userName String 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()
defaults SAPECC.BAPIDEFAUL Sequence new BAPIDEFAUL()
logOnDataX SAPECC.BAPILOGONX Sequence new BAPILOGONX()
logOnData SAPECC.BAPILOGOND Sequence new BAPILOGOND()

El flujo de trabajo de reemplazo de exportación tiene este aspecto:

Captura de pantalla del inicio del flujo de trabajo de la operación de reemplazo.

  1. Como definimos la propiedad userName como un identificador inmutable, un delimitador, necesitamos extraer el valor userName de una colección de delimitadores de nuestro objeto de exportación. Arrastra y coloca la actividad ForEachWithBodyFactory desde el cuadro de herramientas a la actividad Sequence. Reemplaza el nombre de la variable de elemento por anclaje, cambia a las propiedades y elige TypeArgument de Microsoft.MetadirectoryServices.AnchorAttribute. En el campo Valor, escriba objectToExport.AnchorAttributes.

Captura de pantalla de la actualización del flujo de trabajo de la operación de reemplazo.

  1. Para extraer un valor de cadena de un anclaje userName, arrastra y coloca la actividad Switch dentro de la actividad ForEach. En la ventana emergente, seleccione Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper tipo de conmutador. Escribe el valor Expression de: New AnchorAttributeNameWrapper(anchor.Name). Seleccione el área Agregar nuevo caso de la actividad Switch. Escribe userName como valor Case. Arrastra y coloca la actividad Assign en el cuerpo del caso userName y asígnale anchor.Value.ToString() a la variable userName. El flujo de trabajo de reemplazo de exportación tiene este aspecto:

Captura de pantalla de otra actualización del flujo de trabajo de la operación de reemplazo.

  1. Ahora que hemos extraído el valor userName de la propiedad de anclaje de objeto exportado, es necesario rellenar otras estructuras como company, defaults, address, logon data que contienen otros detalles de usuario de SAP. Para ello, realizamos el ciclo a través de la recopilación de todos los atributos definidos en el esquema.
  2. Contrae la actividad ForEach, arrastra y coloca otra actividad ForEachWithBothFactory dentro de la actividad Sequence después de la actividad ForEach existente. Reemplaza el nombre de la variable de elemento por schemaAttr, cambia a las propiedades y elige TypeArgument de Microsoft.MetadirectoryServices.SchemaAttribute. En el campo Valor, escriba schemaType.Attributes.

Captura de pantalla de la actividad secuencia de la operación de reemplazo.

  1. Arrastra y coloca la actividad Sequence en el cuerpo de la actividad ForEach. En la parte inferior izquierda, busque el botón Variables y selecciónelo para expandir una lista de variables definidas en esta secuencia. Agrega la variable siguiente: xValue de tipo String. Arrastra y coloca la actividad Assign en la actividad Sequence. Asigna a xValue la expresión: If(objectToExport.AttributeChanges.Contains(schemaAttr.Name), objectToExport.AttributeChanges(schemaAttr.Name).ValueChanges(0).Value.ToString(), String.Empty), ya sea extrae los cambios almacenados provisionalmente para la exportación de este atributo, o lo inicializa con una cadena vacía. El flujo de trabajo de reemplazo de exportación tiene este aspecto:

Captura de pantalla de la actualización de la secuencia de reemplazo.

  1. Arrastra y coloca la actividad Switch después de la actividad Assign. En el menú emergente, seleccione Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AttributeNameWrapper y seleccione Aceptar. Escribe la siguiente expresión: new AttributeNameWrapper(schemaAttr.Name). Verás un icono de advertencia en la esquina superior derecha de la actividad Switch sobre los atributos no controlados definidos en el esquema y no asignados a ninguna propiedad. Seleccione el área Agregar nuevo caso de la actividad Switch y escriba un valor de caso de ciudad. Arrastra y coloca la actividad Sequence en el cuerpo de este caso. Arrastra y coloca la actividad Assign en el cuerpo de este caso. Asigna el valor "X" a addressX.city. Arrastra y coloca otra actividad Assign en el cuerpo de este caso. Asigna xValue a address.city. El flujo de trabajo de reemplazo de exportación tiene este aspecto:

Captura de pantalla de arrastrar y colocar la actividad Switch.

10. Agrega los otros casos y asignaciones que faltan. Usa esta tabla de asignación como guía:

Caso Asignación
city addressX.city = "X" address.city = xValue
company companyX.company = "X" company.company = xValue
department address.departmentX = "X" address.department = xValue
email 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" address.TEL1_Numbr = xValue
jobTitle addressX.function = "X" address.function = xValue

El flujo de trabajo de reemplazo de exportación tiene este aspecto:

Captura de pantalla de arrastrar y colocar la segunda actividad Switch.

  1. Antes de llamar al programa BAPI_USER_CHANGE, es necesario comprobar si hay un nombre de usuario no vacío. Contrae las actividades ForEach y arrastra y coloca la actividad IF después de la segunda actividad ForEach. Escribe la siguiente condición: String.IsNullOrEmpty(userName ) = False

  2. Cuando el nombre de usuario está vacío, queremos indicar que la operación no se realizó correctamente. Arrastra y coloca la actividad CreateCSEntryChangeResult en la rama Else de la actividad IF y selecciona el código de error ExportErrorCustomContinueRun. El flujo de trabajo de reemplazo de exportación tiene este aspecto: Captura de pantalla de la actividad CreateCSEntryChangeResult.

  3. Arrastra y coloca la actividad Sequence en la rama Then vacía de la primera actividad IF. Arrastra y coloca la actividad WebSeviceCall dentro de la actividad Sequence. Selecciona el nombre de servicio SAPECC, el punto de conexión ZSAPCONNECTORWS y la operación BAPI_USER_CHANGE. Haga clic en el botón Argumentos para definir los parámetros para la llamada de servicio web de la siguiente manera:

Nombre Dirección Tipo Valor
ADDRESS In BAPIADDR3 address
ADDRESSX In BAPIADDR3X addressX
COMPANY In BAPIUSCOMP company
COMPANYX In BAPIUSCOMX company
DEFAULTS In BAPIDEFAUL defaults
DEFAULTSX In BAPIDEFAX defaultsX
LOGONDATA In BAPILOGOND logOnData
LOGONDATAX In BAPILOGONX logOnDataX
RETURN In/Out TABLE_OF_BAPIRET2 bapiret2Table
USERNAME In String userName
  1. Seleccione Aceptar. El signo de advertencia desaparece. El flujo de trabajo de reemplazo de exportación tiene este aspecto:

Captura de pantalla de la operación BAPI_USER_CHANGE.

  1. Para procesar los resultados de la solicitud de usuario, arrastra y coloca la actividad IF dentro de la actividad Sequence después de la actividad WebServiceCall. Escribe la siguiente condición: Not IsNothing(bapiret2Table.item) AndAlso bapiret2Table.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) <> 0
  2. Si no se produce ningún error, se supone que la operación de exportación se completó correctamente y queremos indicar la exportación correcta de este objeto mediante la creación de CSEntryChangeResult con el estado Correcto. Arrastra y coloca la actividad CreateCSEntryChangeResult en la rama Else de la actividad IF y selecciona código de error correcto.
  3. Arrastra y coloca la actividad Sequence en la rama Then de la actividad IF. Agrega la actividad Log con el valor LogText de string.Join("\n",bapiret2Table.item.Where(Function(retItem) retItem.TYPE.Equals("E")).Select(Function(r) r.MESSAGE)) y la etiqueta Error. Agrega la actividad CreateCSEntryChangeResult después de la actividad Log con código de error ExportErrorCustomContinueRun. El flujo de trabajo de reemplazo de exportación tiene este aspecto:

Captura de pantalla del flujo de trabajo final para reemplazar la exportación.

Has completado la definición del flujo de trabajo de reemplazo de exportación.

El siguiente paso consiste en configurar el conector de servicios Web ECMA2Host mediante esta plantilla.

Pasos siguientes