Compartilhar via


Criação do modelo de conector de serviço Web SAP ECC 7.51 para o ECMA2Host

Este guia orienta você pelo processo de criação de um modelo para o conector do ECMA (Agente de Gerenciamento de Conectividade de Extensibilidade de Serviço Web) para gerenciar usuários do SAP ECC.

Limitações e suposições

Este modelo demonstra como gerenciar usuários. Outros tipos de objeto, como Grupos de Atividades Locais, Funções e Perfis, não são abordados por este guia, pois o ECMA2Host atualmente não dá suporte a referências de vários valores. As operações de senha também estão fora do escopo deste guia.

Este guia não aborda a criação da conta de serviço no SAP usada para chamar as funções BAPI expostas. Ele pressupõe que uma conta de Desenvolvedor de demonstração pré-criada seja usada com um RFC_ALL de perfil que concede permissões aos BAPIs mencionados abaixo.

A Ferramenta de Configuração de Serviço Web não dá suporte aos seguintes recursos expostos no SAP por padrão: Políticas WSP e várias associações por ponto de extremidade. Ele espera um WSDL com SOAP 1.1 apenas, associação de estilo de documento único sem políticas.

Funções BAPI SAP ECC usadas neste modelo:

  • BAPI_USER_GETLIST – obter uma lista de todos os usuários conectados a este sistema.
  • BAPI_USER_GETDETAIL – obter detalhes do usuário específico.
  • BAPI_USER_CREATE1 – cria um usuário.
  • BAPI_USER_DELETE – exclui um usuário.
  • BAPI_USER_CHANGE – atualiza um usuário.

Todas as propriedades de usuário do SAP neste guia são tratadas como propriedades de valor único.

A linguagem de programação usada é Visual Basic.

Definição de um ponto de extremidade de serviço Web e criação de um esquema

Antes de projetar fluxos de trabalho de importação e exportação, você precisa criar um modelo e definir um ponto de extremidade com as funções SAP BAPI expostas em uma interface SOAP. Em seguida, crie um esquema dos objetos ECMA2 e as propriedades disponíveis neste modelo.

  1. Na pasta "C:\Arquivos de Programas\Microsoft ECMA2Host\Web Service Configuration Tool", inicie a ferramenta de Configuração de Serviço Web wsconfigTool.exe
  2. No menu Arquivo–Novo, escolha Criar novo Projeto SOAP

Captura de tela de Criar projeto SOAP.

  1. Clique em Projeto SOAP e escolha Adicionar novo serviço Web.

Captura de tela de adicionar novo serviço Web.

  1. Nomeie seu serviço Web como SAPECC, forneça uma URL para baixar o WSDL publicado, insira SAPECC como namespace. O nome do serviço Web ajuda você a distinguir esse serviço Web em seu modelo de outros. Namespace define um nome do namespace do Microsoft .NET usado para gerar classes. Escolha o modo de autenticação Básica, a menos que receba outra instrução do administrador do SAP. Clique em Avançar.

Captura de tela do serviço Web de nomenclatura.

  1. Forneça credenciais para se conectar ao ponto de extremidade SAP ECC. Clique em Avançar.
  2. Na página de pontos de extremidade e operações, certifique-se de que as BAPIs sejam exibidas e clique em Concluir

Observação

se você vir mais de um ponto de extremidade, terá as ligações SOAP 1.2 e SOAP 1.1 habilitadas. Isso faz o conector falhar. Modifique sua definição de associação no SOAMANAGER e mantenha apenas uma. Em seguida, adicione novamente um serviço Web.

Captura de tela de BAPIs.

  1. Salve o projeto na pasta C:\Arquivos de Programas\Microsoft ECMA2Host\Serviço\ECMA.
  2. Clique na guia Tipos de objeto e escolha adicionar o tipo de objeto Usuário. Clique em OK.
  3. Expanda a guia Tipos de objeto e clique em Definição de tipo de usuário.

Captura de tela de tipos de objetos.

  1. Adicione os atributos a seguir ao esquema e escolha userName como âncora.

Captura de tela da adição de atributos.

  1. Salve seus projetos.
Nome Tipo Âncora
cidade string
company string
department string
Email string
expirationTime string
firstName string
lastName string
middleName string
telephoneNumber string
jobTitle string
userName string verificado

Criação de fluxo de trabalho de importação completa

O fluxo de trabalho de importação, embora seja opcional no ECMA2Host, permite importar usuários SAP existentes para o cache na memória do ECMA2Host e evitar que usuários duplicados sejam criados durante o provisionamento.

Se você não criar um fluxo de trabalho de importação, o conector estará operando no modo Somente exportação e fará com que o ECMA2Host sempre emita operações Criar usuário, mesmo para usuários existentes. Isso pode levar a falhas ou duplicatas quando BAPIs SAP padrão são usados, a menos que as duplicatas sejam tratadas pelo fluxo de trabalho de exportação.

O SAP ECC não oferece um mecanismo integrado para ler as alterações feitas desde a última leitura.

Portanto, estamos implementando apenas o fluxo de trabalho de Importação Completa. Se você precisar implementar importações delta por motivos de desempenho, consulte o administrador do SAP para obter uma lista de BAPIs e publique-as como um serviço Web SOAP. Em seguida, implemente o fluxo de trabalho de Importação Delta usando a abordagem descrita abaixo e uma propriedade customData que contém um carimbo de data/hora da execução bem-sucedida anterior.

O SAP ECC oferece várias funções BAPI para obter uma lista de usuários com suas propriedades:

  • BAPI_USER_GETLIST – obter uma lista de todos os usuários conectados a este sistema.
  • BAPI_USER_GETDETAIL – obter detalhes do usuário específico.

Somente essas duas BAPIs são usadas para recuperar usuários existentes do SAP ECC neste modelo.

  1. Navegue até Tipos de Objeto –> Usuário –> Importar –> Fluxo de trabalho de Importação Completa e, na Caixa de Ferramentas à direita, arraste e solte a atividade Sequência no painel do designer de fluxo de trabalho.
  2. No canto inferior esquerdo, localize o botão Variáveis e clique nele para expandir uma lista de variáveis definidas nesta sequência.
  3. Adicione as variáveis a seguir. Para selecionar um tipo de variável gerado a partir do WSDL do SAP, clique em Procurar tipos e expanda gerado e, em seguida, expanda o namespace SAPECC.
Nome Tipo de Variável Escopo Padrão
selRangeTable SAPECC.TABLE_OF_BAPIUSSRGE Sequência new TABLE_OF_BAPIUSSRGE with {.item = new BAPIUSSRGE(){new BAPIUSSRGE}}
getListRetTable SAPECC.TABLE_OF_BAPIRET2 Sequência new TABLE_OF_BAPIRET2
pageSize Int32 Sequência 200
returnedSize Int32 Sequência
usersTable SAPECC.TABLE_OF_BAPIUSNAME Sequência new TABLE_OF_BAPIUSNAME()

Captura de tela do fluxo de trabalho completo da operação de importação.

  1. Na caixa de ferramentas, arraste e solte quatro atividades de Atribuição dentro da atividade de Sequência e defina estes valores:
selRangeTable.item(0).PARAMETER = "USERNAME" 
selRangeTable.item(0).SIGN = "I" selRangeTable.item(0).OPTION = "GT" selRangeTable.item(0).LOW = ""   

Esses parâmetros usados para chamar a função BAPI_USER_GETLIST e implementar a paginação.

Captura de tela do fluxo de trabalho de importação completo.

  1. Para implementar a paginação, na Caixa de Ferramentas, arraste e solte a atividade DoWhile dentro da atividade de Sequência após a última operação de Atribuição.
  2. No painel direito, alterne para a guia Propriedades e insira essa condição para o DoWhile
  • ciclo: returnedSize = pageSize

Captura de tela de returnedsize.

  1. Clique nas Variáveis e adicione a propriedade currentPageNumber do tipo int32 no ciclo DoWhile com o valor padrão de 0.

Captura de tela de dowhile.

  1. Etapa opcional: se você planeja implementar o fluxo de trabalho de Importação Delta, na Caixa de Ferramentas, arraste e solte a atividade Atribuir dentro da atividade de Sequência após o ciclo DoWhile. Defina este valor:
  • customData(schemaType.Name + "_lastImportTime") = DateTimeOffset.UtcNow.Ticks.ToString() Isso salva a data e a hora da última execução de importação completa e esse carimbo de data/hora pode ser usado posteriormente no fluxo de trabalho de importação delta.

Captura da tela de customdata.

  1. Na caixa de ferramentas, arraste e solte a atividade de Sequência dentro da atividade DoWhile. Arraste e solte a atividade WebServiceCall dentro dessa atividade de Sequência e selecione o nome do serviço SAPECC, o ponto de extremidade ZSAPCONNECTORWS e operação BAPI_USER_GETLIST.

Captura de tela da sequência dowhile.

  1. Clique no botão ... Argumentos para definir parâmetros para chamada de serviço Web da seguinte forma:
Nome Direção Tipo Valor
MAX_ROWS In Int32 pageSize
MAX_ROWSSpecified In Booliano Verdadeiro
RETURN Entrada/saída TABLE_OF_BAPIRET2 getListRetTable
SELECTION_EXP Entrada/saída TABLE_OF_BAPIUSSEXP
SELECTION_RANGE Entrada/saída TABLE_OF_BAPIUSSRGE selRangeTable
USERLIST Entrada/saída TABLE_OF_BAPIUSNAME usersTable
WITH_USERNAME No String
ROWS Saída Int32 returnedSize
  1. Clique em OK. O sinal de aviso desaparece. A lista de usuários armazenada na variável usersTable. Como o SAP não retorna uma lista completa de usuários em uma única resposta, precisamos implementar a paginação e chamar essa função várias vezes ao alternar as páginas. Então, para cada usuário importado, você precisa obter os detalhes desse usuário fazendo uma chamada separada. Isso significa que, para um cenário com 1000 usuários e um tamanho da página de 200, o conector de serviço Web faz 5 chamadas para recuperar uma lista de usuários e 1000 chamadas individuais para recuperar os detalhes dos usuários. Para melhorar o desempenho, peça à equipe SAP que desenvolva um programa BAPI personalizado que liste todos os usos com suas propriedades para evitar a necessidade de fazer 1000 chamadas individuais e expor essa função BAPI no ponto de extremidade SOAP WS.
  2. Na Caixa de Ferramentas, arraste e solte a atividade IF dentro da atividade DoWhile após a atividade WebServiceCall. Especifique esta condição para verificar se há resposta não vazia e ausência de erros: IsNothing(getListRetTable.item) OrElse getListRetTable.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) = 0
  3. Na Caixa de Ferramentas, arraste e solte a atividade Lançar na ramificação Else da atividade IF para gerar um erro na importação malsucedida. Alterne para a guia Propriedades e insira esta expressão para a propriedade Exceção da atividade Lançar: New Exception(getListRetTable.item.First(Function(retItem) retItem.TYPE.Equals("E")).MESSAGE)

Captura de tela da propriedade de exceção.

  1. Para processar uma lista de usuários importados, arraste e solte a atividade ForEachWithBodyFactory da Caixa de Ferramentas para a ramificação Then da atividade IF. Alterne para a guia Propriedades e selecione SAPECC.BAPIUSNAME como TypeArgument. Clique no botão ... e digite esta expressão para a propriedade de valores: if(usersTable.item,Enumerable.Empty(of BAPIUSNAME)())

Captura de tela da atividade IF.

  1. Na caixa de ferramentas, arraste e solte a atividade de Sequência dentro da atividade ForEach. Com essa janela de atividade de Sequência ativa, clique no botão Variáveis e defina estas variáveis:
Nome Tipo de Variável Escopo Padrão
company SAPECC.BAPIUSCOMP Sequência new BAPIUSCOMP()
address SAPECC.BAPIADDR3 Sequência new BAPIADDR3()
defaults SAPECC.BAPIDEFAUL Sequência new BAPIDEFAUL()
logondata SAPECC.BAPILOGOND Sequência new BAPILOGOND()
getDetailRetTable SAPECC.TABLE_OF_BAPIRET2 Sequência new TABLE_OF_BAPIRET2()

Sua atividade IF tem esta aparência:

Captura de tela da atividade IF com foreach.

  1. Arraste e solte a atividade CreateCSEntryChangeScope dentro da atividade de Sequência. Na propriedade DN, insira Type.Name & item.USERNAME. No campo CreateAnchorAttribute AnchorValue, insira item.username.

Captura de tela de CreateCSEntryChangeScope.

  1. Para recuperar detalhes de cada usuário, na caixa de ferramentas, arraste e solte a atividade WebServiceCall dentro da atividade de Sequência logo antes da atividade CreateAnchorAttribute. Selecione o nome do serviço SAPECC, o ponto de extremidade ZSAPCONNECTORWS e a operação BAPI_USER_GET_DETAIL. Clique no botão ... Argumentos para definir parâmetros para chamada de serviço Web da seguinte forma:
Nome Direção Tipo Valor
RETURN Entrada/saída TABLE_OF_BAPIRET2 getDetailRetTable
USERNAME No String item.username
ADDRESS Saída BAPIADDR3 address
EMPRESA Saída BAPIUSCOMP company
DEFAULTS Saída BAPIUSDEFAUL defaults
LOGONDATA Saída BAPILOGOND logonData
WITH_USERNAME No String
ROWS Saída Int32 returnedSize
  1. Clique em OK. O sinal de aviso desaparece. Os detalhes de um usuário são armazenados nas variáveis listadas acima. Sua atividade IF tem esta aparência:

Captura de tela dos parâmetros.

  1. Para verificar os resultados da operação BAPI_USER_GET_DETAIL, na Caixa de Ferramentas, arraste e solte a atividade IF e coloque-a dentro da atividade de Sequência entre as atividades WebServiceCall e CreateAnchorAttribute. Insira esta condição: IsNothing(getDetailRetTable.item) OrElse getDetailRetTable.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) = 0

Como os detalhes do usuário ausentes não devem ser tratados como um evento catastrófico, queremos indicar esse erro e continuar o processamento de outros usuários. Arraste e solte a atividade de Sequência na ramificação Else da sua atividade IF. Adicione a atividade Log dentro dessa nova atividade de Sequência. Alterne para a guia Propriedades e altere a propriedade Nível para Alto, Marcar para Rastreamento. Insira o seguinte na propriedade LogText: string.Join("\n", getDetailRetTable.item.Select (Function(item) item.MESSAGE ))

  1. Arraste e solte a atividade de Sequência na ramificação Then da atividade IF. Arraste e solte a atividade CreateAnchorAttribute existente na atividade de Sequência dentro da ramificação Then da atividade IF. Sua atividade ForEach agora tem esta aparência:

Captura de tela do ForEach.

  1. Para cada propriedade de um usuário, como cidade, empresa, departamento, e-mail, adicione a atividade IF após a atividade CreateAnchorAttribute e verifique se há valores não vazios através da inserção de condições como Not string.IsNullOrEmpty(address.city) e adição de atividades CreateAttributeChange na ramificação Then dessa atividade IF.

Captura de tela de CreateAttributeChange.

Por exemplo: adicione atividades CreateAttributeChange para todas as propriedades do usuário usando esta tabela de mapeamento:

Propriedade do usuário do ECMA Propriedade 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 fim, adicione a atividade SetImportStatusCode após a última atividade CreateAttributeChange. Defina ErrorCode como Sucesso na ramificação Then. Adicione mais uma atividade de código SetImportStatus ao branch Else e defina ErrorCode como ImportErrorCustomContinueRun.

Captura de tela de SetImportStatusCode.

  1. Recolha a atividade de Sequência dentro da atividade ForEach para que seu ciclo DoWhile tenha esta aparência:

Captura de tela do ciclo DoWhile.

  1. Para recuperar a próxima página de usuários, atualize a propriedade selRangeTable.item(0).LOW. Arraste e solte a atividade IF na atividade de Sequência dentro de DoWhile, coloque-a após a atividade IF já existente. Insira returnedSize>0 como Condição. Adicione a atividade Atribuir à ramificação Then da atividade IF e defina selRangeTable.item(0).LOW como usersTable.item(returnedSize-1).username.

Captura de tela do DoWhile final.

Você concluiu a definição do fluxo de trabalho de importação completa.

Criando o fluxo de trabalho Exportar Adicionar

Para criar um usuário no SAP ECC, você pode chamar o programa BAPI_USER_CREATE1 e fornecer todos os parâmetros, incluindo um nome da conta e uma senha inicial. Se você precisar que um nome de conta seja gerado no lado do SAP, consulte o administrador do SAP e use uma função BAPI personalizada que retorne uma propriedade userName de uma conta de usuário recém-criada.

Este guia não demonstra a atribuição de licenças, grupos de atividades locais ou globais, sistemas ou perfis. Consulte o administrador do SAP e modifique esse fluxo de trabalho de acordo.

Não há necessidade de implementar a paginação em fluxos de trabalho de exportação. Há apenas um objeto objectToExport disponível no contexto do fluxo de trabalho.

  1. Navegue até Tipos de Objeto –> Usuário –> Exportar –> Adicionar fluxo de trabalho e, na Caixa de Ferramentas à direita, arraste e solte a atividade de Sequência no painel do designer de fluxo de trabalho.
  2. No canto inferior esquerdo, localize o botão Variáveis e clique nele para expandir uma lista de variáveis definidas nesta sequência.
  3. Adicione as variáveis a seguir. Para selecionar um tipo de variável gerado a partir do WSDL do SAP, clique em Procurar tipos e expanda gerado e, em seguida, expanda o namespace SAPECC. Isso inicializa as estruturas de dados usadas pelo programa BAPI_USER_CREATE1.
Nome Tipo de Variável Escopo Padrão
address SAPECC.BAPIADDR3 Sequência new BAPIADDR3()
userName String Sequência
password SAPECC.BAPIPWD Sequência new BAPIPWD()
company SAPECC.BAPIUSCOMP Sequência new BAPIUSCOMP()
defaults SAPECC.BAPIDEFAUL Sequência new BAPIDEFAUL()
logOnData SAPECC.BAPILOGOND Sequência new BAPILOGOND()
bapiret2Table SAPECC.TABLE_OF_BAPIRET2 Sequência new TABLE_OF_BAPIRET2()

Captura de tela do fluxo de trabalho de adição de exportação.

  1. Como definimos a propriedade userName como um ID imutável, uma âncora, precisaremos extrair o valor userName de uma coleção de âncoras de nosso objeto de exportação. Arraste e solte a atividade ForEachWithBodyFactory da Caixa de Ferramentas para a atividade de Sequência. Substitua o nome da variável do item por âncora, alterne para propriedades e escolha TypeArgument de Microsoft.MetadirectoryServices.AnchorAttribute. No campo Valor, digite objectToExport.AnchorAttributes.

Captura de tela da sequência de adição de exportação.

  1. Para extrair um valor de cadeia de caracteres de uma âncora userName, arraste e solte a atividade do Comutador dentro da atividade ForEach. Na janela pop-up, selecione o tipo de opção Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper. Insira o valor da expressão de: New AnchorAttributeNameWrapper(anchor.Name).
  2. Clique na área Adicionar novo caso da atividade do Comutador. Digite userName como Valor da Ocorrência. Arraste e solte a atividade Atribuir no corpo da ocorrência userName e atribua anchor.Value.ToString() para a variável userName.

Captura de tela da nova ocorrência.

  1. Agora que extraímos o valor userName da propriedade de âncora do objeto exportado, precisamos preencher outras estruturas, como empresa, padrões, endereço, dados de logon que contêm outros detalhes do usuário SAP. Fazemos isso percorrendo a coleção de alterações de atributos.
  2. Recolha a atividade ForEach e arraste e solte outra atividade ForEachWithBothFactory dentro da atividade de Sequência após a atividade ForEach existente. Substitua o nome da variável do item por attributeChange, alterne para propriedades e escolha TypeArgument de Microsoft.MetadirectoryServices.AttributeChange. No campo Valor, digite objectToExport.AttributeChanges.

Captura de tela da nova sequência.

  1. Arraste e solte uma atividade do Comutador no corpo da atividade ForEach.
  2. No menu pop-up, selecione Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AttributeNameWrapper e clique em Ok.
  3. Insira a seguinte expressão: New AttributeNameWrapper(attributeChange.Name). Você verá um ícone de aviso no canto superior direito da atividade do Comutador sobre atributos não tratados definidos no esquema e não atribuídos a nenhuma propriedade.
  4. Clique em Adicionar nova área de ocorrência da atividade do Comutador e digite um valor de ocorrência de city.
  5. Arraste e solte uma atividade de Atribuição no corpo dessa ocorrência. Atribua attributeChange.ValueChanges(0).Value.ToString() a address.city.

Captura de tela do novo fluxo de trabalho de adição de exportação.

  1. Adicione outras ocorrências e atribuições ausentes. Use esta tabela de mapeamento como guia:
Case Atribuição
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()

Aqui export_password é um atributo virtual especial que é sempre definido no esquema e pode ser usado para passar uma senha inicial do usuário que está sendo criado.

Captura de tela das ocorrências.

  1. Recolha a atividade ForEach e arraste e solte a atividade IF na atividade de Sequência, após a segunda atividade ForEach, para validar as propriedades do usuário, antes de enviar a solicitação de criação de usuário. Precisamos de pelo menos 3 valores não vazios: nome de usuário, sobrenome, senha inicial. Insira esta condição: (String.IsNullOrEmpty(address.lastname) = False ) AND (String.IsNullOrEmpty(userName) = False) AND (String.IsNullOrEmpty(password.BAPIPWD1) = False)
  2. Na ramificação Else da atividade IF, adicione mais uma atividade IF, pois queremos lançar erros diferentes dependendo do que está faltando. Insira o valor da condição: String.IsNullOrEmpty(userName). Arraste e solte as atividades CreateCSEntryChangeResult em ambas as ramificações da segunda atividade IF e configure o ErrorCode de ExportErrorMissingAnchorComponent e ExportErrorMissingProvisioningAttribute.

Captura de tela da segunda atividade IF.

  1. Arraste e solte a atividade de Sequência na ramificação Then vazia da primeira atividade IF. Arraste e solte a atividade WebSeviceCall dentro da atividade de Sequência. Selecione o nome do serviço SAPECC, o ponto de extremidade ZSAPCONNECTORWS e a operação BAPI_USER_CREATE1. Clique no botão ... Argumentos para definir parâmetros para chamada de serviço Web da seguinte forma:
Nome Direção Tipo Valor
ADDRESS In BAPIADDR3 address
EMPRESA In BAPIUSCOMP company
DEFAULTS In BAPIDEFAUL defaults
LOGONDATA In BAPILOGOND logOnData
PASSWORD In BAPIPWD password
RETURN In-Out TABLE_OF_BAPIRET2 bapiret2Table
SELF_REGISTER No String "X"
USERNAME No String userName
  1. Clique em OK. O sinal de aviso desaparece.

Captura de tela do fluxo de trabalho após os parâmetros.

  1. Para processar os resultados da solicitação de criação do usuário, arraste e solte a atividade IF dentro da atividade de Sequência após a atividade WebServiceCall. Insira a seguinte condição: IsNothing (bapiret2Table.item) OrElse bapiret2Table.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) <> 0
  2. Se não obtivermos erros, presumiremos que a operação de exportação foi concluída com êxito e desejamos indicar a exportação bem-sucedida desse objeto criando CSEntryChangeResult com o status Sucesso. Arraste e solte a atividade CreateCSEntryChangeResult na ramificação Else da atividade IF e selecione o código de erro Sucesso.
  3. Opcional: se a chamada de serviço Web retornar um nome da conta gerado de um usuário, precisamos atualizar um valor de âncora do objeto exportado. Para fazer isso, arraste e solte a atividade CreateAttrubuteChangedentro da atividade CreateCSEntryChangeResult e selecione Adicionar um userName. Em seguida, arraste e solte a atividade CreateValueChange dentro da atividade CreateAttributeChange e insira o nome da variável preenchida por uma atividade de chamada de serviço Web. Neste guia, você usará a variável userName que não é atualizada na exportação.

Captura de tela do fluxo de sequência atualizado.

  1. A última etapa no fluxo de trabalho Exportar Adicionar é manipular e registrar erros de exportação. Arraste e solte a atividade de Sequência na ramificação Then vazia da sua atividade IF.
  2. Arraste e solte a atividade Log na atividade de Sequência. Alterne para a guia Propriedades e insira o valor LogText de: bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E")).MESSAGE. Mantenha o nível de registros Altos em log e a Tag de rastreamento. Isso registra uma mensagem de erro no ConnectorsLog ou no log de eventos ECMA2Host quando o rastreamento detalhado está habilitado.
  3. Arraste e solte a atividade do Comutador dentro da atividade de Sequência após a atividade Log. Na janela pop-up, selecione Tipo de cadeia de caracteres do valor do comutador. Insira a expressão a seguir: bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E")).NUMBER
  4. Clique em Ocorrência padrão e arraste e solte a atividade CreateCSEntryChangeResult no corpo desta ocorrência. Escolha o código de erro ExportErrorInvalidProvisioningAttributeValue.

Captura de tela da nova atualização do fluxo de trabalho.

  1. Clique na área Adicionar nova ocorrência e digite um valor de ocorrência de 224. Arraste e solte a atividade CreateCSEntryChangeResult no corpo desta ocorrência. Escolha o código de erro ExportErrorCustomContinueRun.

Captura de tela da atualização final do fluxo de trabalho.

Você concluiu a definição do fluxo de trabalho Exportar Adicionar.

Criação do fluxo de trabalho Exportar Excluir

Para excluir um usuário no SAP ECC, é possível chamar o programa BAPI_USER_DELETE e fornecer um nome de conta a ser excluído no sistema conectado. Consulte o administrador do SAP para saber se esse cenário é obrigatório, pois na maioria das vezes as contas SAP ECC não devem ser excluídas, mas expiradas para manter registros históricos.

Este guia não aborda cenários relacionados ao sistema de Administração do Usuário Comum do SAP, desprovisionamento de usuários de sistemas conectados, revogação de licenças, etc.

Não há necessidade de implementar a paginação em fluxos de trabalho de exportação. Há apenas um objeto objectToExport disponível no contexto do fluxo de trabalho.

  1. Navegue até Tipos de Objeto –> Usuário –> Exportar –> Excluir fluxo de trabalho e, na Caixa de Ferramentas à direita, arraste e solte a atividade de Sequência no painel do designer de fluxo de trabalho.
  2. No canto inferior esquerdo, localize o botão Variáveis e clique nele para expandir uma lista de variáveis definidas nesta sequência.
  3. Adicione as variáveis a seguir. Para selecionar um tipo de variável gerado a partir do WSDL do SAP, clique em Procurar tipos e expanda gerado e, em seguida, expanda o namespace SAPECC. Isso inicializa as estruturas de dados usadas pelo programa BAPI_USER_DELETE.
Nome Tipo de Variável Escopo Padrão
userName String Sequência
bapiret2Table SAPECC.TABLE_OF_BAPIRET2 Sequência new TABLE_OF_BAPIRET2()
  1. Como definimos a propriedade userName como um ID imutável, uma âncora, precisaremos extrair o valor userName de uma coleção de âncoras de nosso objeto de exportação. Arraste e solte a atividade ForEachWithBodyFactory da Caixa de Ferramentas para a atividade de Sequência. Substitua o nome da variável do item por âncora, alterne para propriedades e escolha TypeArgument de Microsoft.MetadirectoryServices.AnchorAttribute. No campo Valor, digite objectToExport.AnchorAttributes.

Captura de tela do fluxo de trabalho da operação de exclusão de exportação.

  1. Para extrair um valor de cadeia de caracteres de uma âncora userName, arraste e solte a atividade do Comutador dentro da atividade ForEach. Na janela pop-up, selecione o tipo de opção Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper. Insira o valor da expressão de: New AnchorAttributeNameWrapper(anchor.Name). Clique na área Adicionar novo caso da atividade do Comutador. Digite userName como Valor da Ocorrência. Arraste e solte a atividade Atribuir no corpo da ocorrência userName e atribua anchor.Value.ToString() à variável userName.
  2. Arraste e solte a atividade WebSeviceCall dentro da atividade de Sequência após a atividade ForEach. Selecione o nome do serviço SAPECC, o ponto de extremidade ZSAPCONNECTORWS e a operação BAPI_USER_DELETE. Clique no botão ... Argumentos para definir parâmetros para chamada de serviço Web da seguinte forma:
Nome Direção Tipo Valor
RETURN Entrada/saída TABLE_OF_BAPIRET2 bapiret2Table
USERNAME No String userName
  1. Clique em OK. O sinal de aviso desaparece.

Captura de tela do fluxo de trabalho atualizado da operação de exclusão.

  1. Para processar os resultados da solicitação de exclusão do usuário, arraste e solte a atividade IF dentro da atividade de Sequência após a atividade WebServiceCall. Insira a seguinte condição: If(bapiRet2Table.item, Enumerable.Empty(Of BAPIRET2)()).Count(Function(errItem) errItem.TYPE.Equals("E") = True) <> 0
  2. Se não obtivermos erros, assumimos que a operação de exclusão foi concluída com êxito e queremos indicar a exportação bem-sucedida desse objeto criando CSEntryChangeResult com o status Sucesso. Arraste e solte a atividade CreateCSEntryChangeResult na ramificação Else da sua atividade IF e selecione o código de erro Sucesso.

Captura de tela do fluxo de trabalho de exclusão de exportação.

  1. A última etapa no fluxo de trabalho Exclusão de Exportação é tratar e registrar erros de exportação. Arraste e solte a atividade de Sequência na ramificação Then vazia da sua atividade IF.
  2. Arraste e solte a atividade Log na atividade de Sequência. Alterne para a guia Propriedades e insira o valor LogText de: bapiRetTable.item.First(Function(retItem) retItem.TYPE.Equals("E")= True).MESSAGE. Mantenha o nível de registros Altos em log e a Tag de rastreamento. Isso registra uma mensagem de erro no log de eventos ConnectorsLog ou ECMA2Host quando o rastreamento detalhado está habilitado.
  3. Arraste e solte a atividade do Comutador dentro da atividade de Sequência após a atividade Log. Na janela pop-up, selecione Tipo de cadeia de caracteres do valor do comutador. Insira a expressão a seguir: bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E")).NUMBER
  4. Clique em Ocorrência padrão e arraste e solte a atividade CreateCSEntryChangeResult no corpo desta ocorrência. Escolha o código de erro ExportErrorSyntaxViolation.

Captura de tela da atualização para exportar o fluxo de trabalho da operação de exclusão.

  1. Clique na área Adicionar nova ocorrência e digite um valor de ocorrência de 124. Arraste e solte a atividade CreateCSEntryChangeResult no corpo desta ocorrência. Escolha o código de erro ExportErrorCustomContinueRun.

Captura de tela do fluxo de trabalho final da operação de exclusão de exportação.

Você concluiu a definição do fluxo de trabalho Exportar Excluir.

Criação do fluxo de trabalho de substituição de exportação

Para atualizar um usuário no SAP ECC, você pode chamar o programa BAPI_USER_CHANGE e fornecer todos os parâmetros, incluindo um nome da conta e todos os detalhes do usuário, incluindo aqueles que não estão sendo alterados. O modo de exportação ECMA2 quando todas as propriedades do usuário devem ser fornecidas é chamado de Substituir. Em comparação, o modo de exportação de AttributeUpdate fornece apenas atributos que estão sendo alterados e isso pode fazer com que algumas propriedades do usuário sejam substituídas por valores vazios. Portanto, o conector de serviço Web sempre usa o modo de exportação Substituição de Objeto e espera que o conector seja configurado para Tipo de Exportação: Substituir.

O fluxo de trabalho Exportar Substituir é quase idêntico ao fluxo de trabalho Exportar Adicionar. A única diferença é que você precisa especificar parâmetros extras como addressX ou companyX para o programa BAPI_USER_CHANGE, onde X terminando no addressX indica que a estrutura do endereço contém uma alteração.

  1. Navegue até Tipos de Objeto –> Usuário –> Exportar –> Substituir fluxo de trabalho e, na Caixa de Ferramentas à direita, arraste e solte a atividade de Sequência no painel do designer de fluxo de trabalho.
  2. No canto inferior esquerdo, localize o botão Variáveis e clique nele para expandir uma lista de variáveis definidas nesta sequência.
  3. Adicione as variáveis a seguir. Para selecionar um tipo de variável gerado a partir do WSDL do SAP, clique em Procurar tipos e expanda gerado e, em seguida, expanda o namespace SAPECC. Isso inicializa as estruturas de dados usadas pelo programa BAPI_USER_CHANGE.
Nome Tipo de Variável Escopo Padrão
userName String Sequência
bapiret2Table SAPECC.TABLE_OF_BAPIRET2 Sequência new TABLE_OF_BAPIRET2()
addressX SAPECC.BAPIADDR3X Sequência new BAPIADDR3X()
address SAPECC.BAPIADDR3 Sequência new BAPIADDR3()
companyX SAPECC. BAPIUSCOMX Sequência new BAPIUSCOMX()
company SAPECC.BAPIUSCOMP Sequência new BAPIUSCOMP()
defaultsX SAPECC.BAPIDEFAX Sequência new BAPIDEFAX()
defaults SAPECC.BAPIDEFAUL Sequência new BAPIDEFAUL()
logOnDataX SAPECC.BAPILOGONX Sequência new BAPILOGONX()
logOnData SAPECC.BAPILOGOND Sequência new BAPILOGOND()

Seu fluxo de trabalho de Exportar Substituir tem esta aparência:

Captura de tela do início do fluxo de trabalho da operação de substituição.

  1. Como definimos a propriedade userName como um ID imutável, uma âncora, precisaremos extrair o valor userName de uma coleção de âncoras de nosso objeto de exportação. Arraste e solte a atividade ForEachWithBodyFactory da Caixa de Ferramentas para a atividade de Sequência. Substitua o nome da variável do item por âncora, alterne para propriedades e escolha TypeArgument de Microsoft.MetadirectoryServices.AnchorAttribute. No campo Valor, digite objectToExport.AnchorAttributes.

Captura de tela da atualização para substituir o fluxo de trabalho da operação.

  1. Para extrair um valor de cadeia de caracteres de uma âncora userName, arraste e solte a atividade do Comutador dentro da atividade ForEach. Na janela pop-up, selecione o tipo de opção Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper. Insira o valor da expressão de: New AnchorAttributeNameWrapper(anchor.Name). Clique na área Adicionar novo caso da atividade do Comutador. Digite userName como Valor da Ocorrência. Arraste e solte a atividade Atribuir no corpo da ocorrência userName e atribua anchor.Value.ToString() à variável userName. Seu fluxo de trabalho de Exportar Substituir tem esta aparência:

Captura de tela de outra atualização para substituir o fluxo de trabalho de operação.

  1. Agora que extraímos o valor userName da propriedade de âncora do objeto exportado, precisamos preencher outras estruturas, como empresa, padrões, endereço, dados de logon que contêm outros detalhes do usuário SAP. Fazemos isso percorrendo a coleção de todos os atributos definidos no esquema.
  2. Recolha a atividade ForEach e arraste e solte outra atividade ForEachWithBothFactory dentro da atividade de Sequência após a atividade ForEach existente. Substitua o nome da variável do item por schemaAttr, alterne para propriedades e escolha TypeArgument de Microsoft.MetadirectoryServices.SchemaAttribute. No campo Valor, digite schemaType.Attributes.

Captura de tela da atividade de sequência de operação de substituição.

  1. Arraste e solte a atividade de Sequência no corpo da atividade ForEach. No canto inferior esquerdo, localize o botão Variáveis e clique nele para expandir uma lista de variáveis definidas nesta sequência. Adicione a seguinte variável: xValue do tipo Cadeia de caracteres. Arraste e solte a atividade Atribuir em sua atividade de Sequência. Atribua a xValue a expressão de: If(objectToExport.AttributeChanges.Contains(schemaAttr.Name), objectToExport.AttributeChanges(schemaAttr.Name).ValueChanges(0).Value.ToString(), String.Empty) ele extrairá as alterações preparadas para exportação para esse atributo ou o inicializará com uma cadeia de caracteres vazia. Seu fluxo de trabalho de Exportar Substituir tem esta aparência:

Captura de tela da atualização para a sequência de substituição.

  1. Arraste e solte a atividade de Comutador após a atividade Atribuir. No menu pop-up, selecione Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AttributeNameWrapper e clique em Ok. Insira a expressão a seguir: New AttributeNameWrapper(schemaAttr.Name). Você verá um ícone de aviso no canto superior direito da atividade do Comutador sobre atributos não tratados definidos no esquema e não atribuídos a nenhuma propriedade. Clique em Adicionar nova área de ocorrência da atividade do Comutador e digite um valor de ocorrência de city. Arraste e solte a atividade de Sequência no corpo deste caso. Arraste e solte a atividade Atribuir no corpo dessa ocorrência. Atribua o valor "X" a addressX.city. Arraste e solte outra atividade Atribuir no corpo dessa ocorrência. Atribua xValue a address.city. Seu fluxo de trabalho de Exportar Substituir tem esta aparência:

Captura de tela da atividade do Comutador de arrastar e soltar.

10.Adicione outras ocorrências e atribuições ausentes. Use esta tabela de mapeamento como guia:

Case Atribuição
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

Seu fluxo de trabalho de Exportar Substituir tem esta aparência:

Captura de tela da segunda atividade do comutador de arrastar e soltar.

  1. Antes de chamar o programa BAPI_USER_CHANGE, precisamos verificar se há nome de usuário não vazio. Recolha as atividades ForEach e arraste e solte a atividade IF após a segunda atividade ForEach. Insira a seguinte condição: String.IsNullOrEmpty(userName ) = False

  2. Quando o nome de usuário está vazio, queremos indicar que a operação não foi bem-sucedida. Arraste e solte a atividade CreateCSEntryChangeResult na ramificação Else da sua atividade IF e selecione o código de erro ExportErrorCustomContinueRun. Seu fluxo de trabalho Exportar Substituir tem esta aparência: Captura de tela da atividade CreateCSEntryChangeResult.

  3. Arraste e solte a atividade de Sequência na ramificação Then vazia da primeira atividade IF. Arraste e solte a atividade WebSeviceCall dentro da atividade de Sequência. Selecione o nome do serviço SAPECC, o ponto de extremidade ZSAPCONNECTORWS e a operação BAPI_USER_CHANGE. Clique no botão ... Argumentos para definir parâmetros para chamada de serviço Web da seguinte forma:

Nome Direção Tipo Valor
ADDRESS In BAPIADDR3 address
ADDRESSX In BAPIADDR3X addressX
EMPRESA In BAPIUSCOMP company
COMPANYX In BAPIUSCOMX company
DEFAULTS In BAPIDEFAUL defaults
DEFAULTSX In BAPIDEFAX defaultsX
LOGONDATA In BAPILOGOND logOnData
LOGONDATAX In BAPILOGONX logOnDataX
RETURN Entrada/saída TABLE_OF_BAPIRET2 bapiret2Table
USERNAME No String userName
  1. Clique em OK. O sinal de aviso desaparece. Seu fluxo de trabalho de Exportar Substituir tem esta aparência:

Captura de tela da operação BAPI_USER_CHANGE.

  1. Para processar os resultados da solicitação do usuário de alteração, arraste e solte a atividade IF dentro da atividade de Sequência após a atividade WebServiceCall. Insira a seguinte condição: Not IsNothing(bapiret2Table.item) AndAlso bapiret2Table.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) <> 0
  2. Se não obtivermos erros, presumiremos que a operação de exportação foi concluída com êxito e desejamos indicar a exportação bem-sucedida desse objeto criando CSEntryChangeResult com o status Sucesso. Arraste e solte a atividade CreateCSEntryChangeResult na ramificação Else da sua atividade IF e selecione o código de erro Sucesso.
  3. Arraste e solte a atividade de Sequência na ramificação Then da atividade IF. Adicione a atividade Log com o valor LogText de string.Join("\n",bapiret2Table.item.Where(Function(retItem) retItem.TYPE.Equals("E")).Select(Function(r) r.MESSAGE)) e a marca de erro. Adicione a atividade CreateCSEntryChangeResult após a atividade de Log com o código de erro de ExportErrorCustomContinueRun. Seu fluxo de trabalho de Exportar Substituir tem esta aparência:

Captura de tela do fluxo de trabalho de substituição de exportação final.

Você concluiu a definição do fluxo de trabalho Exportar Substituir.

A próxima etapa é configurar o conector de serviço Web ECMA2Host usando este modelo.

Próximas etapas