Compartilhar via


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

Este guia orienta você pelo processo de criação de um modelo para o conector ECMA (Web Service Extensibility Connectivity Management Agent) para gerenciar usuários do SAP ECC.

Limitações e pressupostos

Este modelo demonstra como gerenciar usuários. Outros tipos de objeto, como Grupos de Atividades Locais, Funções e Perfis, não são cobertos por este guia, pois o ECMA2Host atualmente não oferece 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 cobre a criação da conta de serviço no SAP que é usada para chamar as funções BAPI expostas. Ele assume que um desenvolvedor de conta demo pré-criado é usado com um perfil RFC_ALL que concede permissões aos BAPIs mencionados abaixo.

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

Funções SAP ECC BAPI usadas neste modelo:

  • BAPI_USER_GETLIST - obter uma lista de todos os usuários conectados a este sistema.
  • BAPI_USER_GETDETAIL - obter detalhes de 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 do usuário SAP neste guia são tratadas como propriedades de valor único.

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

Definindo um ponto de extremidade de serviço Web e criando um esquema

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

  1. Na pasta "C:\Program Files\Microsoft ECMA2Host\Web Service Configuration Tool", inicie a ferramenta Configuração do 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 ecrã de adicionar novo serviço Web.

  1. Nomeie seu serviço Web SAPECC, forneça uma URL para baixar WSDL publicado, insira SAPECC como namespace. O nome do serviço Web ajuda-o a distinguir este serviço Web do seu modelo dos outros. Namespace define um nome do namespace Microsoft .NET usado para gerar classes. Escolha o modo de autenticação Básica, a menos que o administrador do SAP receba instruções em contrário. Clique em Seguinte.

Captura de tela da nomeação do serviço Web.

  1. Forneça credenciais para se conectar ao endpoint SAP ECC. Clique em Seguinte.
  2. Na página de pontos de extremidade e operações, verifique se os BAPIs são exibidos e clique em Concluir

Nota

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

Screenshot de BAPIs.

  1. Salve o projeto na pasta C:\Program Files\Microsoft ECMA2Host\Service\ECMA.
  2. Clique na guia Tipos de objeto e escolha adicionar Tipo de objeto de 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 objeto.

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

Captura de tela mostrando a adição de atributos.

  1. Guarde o seu projeto.
Nome Tipo Âncora
cidade string
empresa string
departamento string
Correio eletrónico string
expiraçãoTempo de expiração string
nomePróprio string
apelido string
Nome do meio string
telephoneNumber string
jobTitle string
nome de utilizador string verificado

Criando 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 a criação de usuários duplicados durante o provisionamento.

Se você não criar um fluxo de trabalho de importação, seu 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 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 o Delta Imports por motivos de desempenho, consulte o administrador do SAP para obter uma lista de BAPIs e publique-os como um webservice SOAP. Em seguida, implemente o fluxo de trabalho Delta Import 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 de usuário específico.

Somente esses dois BAPIs são usados 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 seguintes variáveis. Para selecionar um tipo de variável gerada a partir do SAP WSDL, clique em Procurar tipos e expanda o namespace gerado e, em seguida, expanda o namespace SAPECC.
Nome Tipo de variável Âmbito Predefinido
selRangeTable SAPECC. TABLE_OF_BAPIUSSRGE Sequence novas TABLE_OF_BAPIUSSRGE com {.item = new BAPIUSSRGE(){new BAPIUSSRGE}}
getListRetTable SAPECC. TABLE_OF_BAPIRET2 Sequence Nova TABLE_OF_BAPIRET2
pageSize Int32 Sequence 200
returnedSize Int32 Sequence
usersTabela SAPECC. TABLE_OF_BAPIUSNAME Sequence novos 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 Atribuir dentro da atividade 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 eram 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 Sequência após a última operação Atribuir.
  2. No painel direito, alterne para a guia Propriedades e insira esta condição para o DoWhile
  • ciclo: returnedSize = pageSize

Captura de tela da tela de tamanho retornado.

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

Captura de tela da tela dowhile.

  1. Etapa opcional: se você planeja implementar o fluxo de trabalho de Importação Delta, arraste e solte a atividade Atribuir dentro da atividade 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 de ecrã do ecrã customdata.

  1. Na Caixa de Ferramentas, arraste e solte a atividade Sequência dentro da sua 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 a operação BAPI_USER_GETLIST.

Captura de tela da sequência dowhile.

  1. Clique em ... Botão Argumentos para definir parâmetros para chamada de serviço Web da seguinte maneira:
Nome Direção Type valor
MAX_ROWS Em Int32 pageSize
MAX_ROWSSpecified Em Boolean True
REGRESSO Entrada/saída TABLE_OF_BAPIRET2 getListRetTable
SELECTION_EXP Entrada/saída TABLE_OF_BAPIUSSEXP
SELECTION_RANGE Entrada/saída TABLE_OF_BAPIUSSRGE selRangeTable
LISTA DE UTILIZADORES Entrada/saída TABLE_OF_BAPIUSNAME usersTabela
WITH_USERNAME Em String
LINHAS Do destino para a origem Int32 returnedSize
  1. Clique em OK. O sinal de alerta desaparece. A lista de usuários armazenados 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 páginas. Em seguida, 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 de página de 200, o conector do 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 para desenvolver 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 sobre o 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 sua atividade IF para lançar um erro na importação malsucedida. Alterne para a guia Propriedades e insira esta expressão para a propriedade Exception da atividade Lancar: 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 sua atividade IF. Alterne para a guia Propriedades e selecione SAPECC. BAPIUSNAME como TypeArgument. Clique em ... e digite esta expressão para a propriedade values: if(usersTable.item,Enumerable.Empty(of BAPIUSNAME)())

Captura de ecrã da atividade IF.

  1. Na Caixa de Ferramentas, arraste e solte a atividade Sequência dentro da sua atividade ForEach. Tendo esta janela de atividade Sequência ativa, clique no botão Variáveis e defina estas variáveis:
Nome Tipo de variável Âmbito Predefinido
empresa SAPECC. BAPIUSCOMP Sequence novo BAPIUSCOMP()
Endereço SAPECC. BAPIADDR3 Sequence novos BAPIADDR3()
predefinições SAPECC. BAPIDEFAUL Sequence novo BAPIDEFAUL()
dados de logon SAPECC. BAPILOGOND Sequence novo BAPILOGOND()
getDetailRetTable SAPECC. TABLE_OF_BAPIRET2 Sequence novos TABLE_OF_BAPIRET2()

Sua atividade SE tem esta aparência:

Captura de tela da atividade IF com foreach.

  1. Arraste e solte a atividade CreateCSEntryChangeScope dentro da sua atividade Sequence. Na propriedade DN, insira schemaType.Name item Ads. NOME DE UTILIZADOR. No campo CreateAnchorAttribute AnchorValue, digite 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 Sequence 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 em ... Botão Argumentos para definir parâmetros para chamada de serviço Web da seguinte maneira:
Nome Direção Type valor
REGRESSO Entrada/saída TABLE_OF_BAPIRET2 getDetailRetTable
NOME DE UTILIZADOR Em String item.nome de usuário
ENDEREÇO Do destino para a origem BAPIADDR3 Endereço
EMPRESA Do destino para a origem BAPIUSCOMP empresa
INCUMPRIMENTOS Do destino para a origem BAPIUSDEFAUL predefinições
LOGONDATA Do destino para a origem BAPILOGOND logonData
WITH_USERNAME Em String
LINHAS Do destino para a origem Int32 returnedSize
  1. Clique em OK. O sinal de alerta desaparece. Os detalhes de um usuário são armazenados nas variáveis listadas acima. Sua atividade SE 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 Sequence 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 a falta de detalhes do usuário não deve ser tratada como um evento catastrófico, queremos indicar esse erro e continuar o processamento de outros usuários. Arraste e solte a atividade Sequência na ramificação Else da sua atividade IF. Adicione a atividade de Log dentro dessa nova atividade de Sequência. Alterne para a guia Propriedades e altere a propriedade Level para High, Tag to Trace. Insira o seguinte na propriedade LogText: string.Join("\n", getDetailRetTable.item.Select (Function(item) item.MESSAGE ))

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

Screenshot de ForEach.

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

Screenshot de CreateAttributeChange.

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

Propriedade do usuário ECMA Propriedade SAP
cidade endereço.cidade
departamento endereço.departamento
empresa empresa.empresa
Correio eletrónico address.e_mail
nomePróprio endereço.nome_primeiro
apelido endereço.sobrenome
Nome do meio endereço.middleName
jobTitle endereço.função
expiraçãoTempo de expiração logonData.GLTGB
telephoneNumber endereço. TEL1_NUMBR
  1. Finalmente, adicione a atividade SetImportStatusCode após a última atividade CreateAttributeChange. Defina ErrorCode como Success na ramificação Then. Adicione mais uma atividade de código SetImportStatus na ramificação Else e defina ErrorCode como ImportErrorCustomContinueRun.

Screenshot de SetImportStatusCode.

  1. Recolher 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 selRangeTable.item(0).LOW a propriedade. Arraste e solte a atividade SE na atividade Sequência dentro do DoWhile, coloque-a após a atividade IF existente. Digite returnedSize>0 como Condição. Adicione Atribuir atividade na ramificação Then da atividade IF e defina selRangeTable.item(0).LOW como usersTable.item(returnedSize-1).username.

Screenshot de DoWhile final.

Você concluiu a definição do fluxo de trabalho de Importação Completa.

Criando fluxo de trabalho Adicionar exportação

Para criar um usuário no SAP ECC, você pode chamar BAPI_USER_CREATE1 programa e fornecer todos os parâmetros, incluindo um nome de conta e uma senha inicial. Se você precisar que um nome de conta seja gerado no lado SAP, consulte o administrador do SAP e use uma função BAPI personalizada que retorna 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 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 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 seguintes variáveis. Para selecionar um tipo de variável gerada a partir do SAP WSDL, clique em Procurar tipos e expanda o namespace gerado e, em seguida, expanda o namespace SAPECC. Isso inicializa as estruturas de dados usadas por BAPI_USER_CREATE1 programa.
Nome Tipo de variável Âmbito Predefinido
Endereço SAPECC. BAPIADDR3 Sequence novos BAPIADDR3()
nome de utilizador String Sequence
password SAPECC. BAPIPWD Sequence novo BAPIPWD()
empresa SAPECC. BAPIUSCOMP Sequence novo BAPIUSCOMP()
predefinições SAPECC. BAPIDEFAUL Sequence novo BAPIDEFAUL()
logOnData SAPECC. BAPILOGOND Sequence novo BAPILOGOND()
bapiret2Tabela SAPECC. TABLE_OF_BAPIRET2 Sequence novos TABLE_OF_BAPIRET2()

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

  1. Como definimos a propriedade userName como uma 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 sua atividade de Sequência. Substitua o nome da variável do item pela â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 Switch dentro da atividade ForEach. Na janela pop-up, selecione Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper o tipo de opção. Insira o valor da expressão de: New AnchorAttributeNameWrapper(anchor. Nome).
  2. Clique em Adicionar nova área de caso da atividade do Switch. Digite userName como Case Value. Arraste e solte Atribuir atividade no corpo do caso userName e atribuir âncora. Value.ToString() para a variável userName.

Captura de tela do novo caso.

  1. Agora que extraímos o valor userName da propriedade â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 pedalando através da coleção de alterações de atributos.
  2. Recolha sua atividade ForEach e arraste e solte outra atividade ForEachWithBothFactory dentro da atividade Sequence 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 a atividade Alternar no corpo da sua 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 Alternar sobre atributos não tratados definidos no esquema e não atribuídos a nenhuma propriedade.
  4. Clique em Adicionar nova área de caso da atividade Switch e digite um valor de caso de cidade.
  5. Arrastar e soltar Atribua atividade no corpo deste caso. 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 outros casos e atribuições ausentes. Use esta tabela de mapeamento como guia:
Incidente Atribuição
cidade address.city = attributeChange.ValueChanges(0)Value.ToString()
empresa company.company = attributeChange.ValueChanges(0)Value.ToString()
departamento address.department = attributeChange.ValueChanges(0)Value.ToString()
Correio eletrónico address.e_mail = attributeChange.ValueChanges(0)Value.ToString()
expiraçãoTempo de expiração logOnData.GLTGB = attributeChange.ValueChanges(0)Value.ToString()
nomepróprio address.firstname = attributeChange.ValueChanges(0)Value.ToString()
apelido address.lastname = attributeChange.ValueChanges(0)Value.ToString()
Nome do meio address.middlename = attributeChange.ValueChanges(0)Value.ToString()
telephoneNumber endereço. TEL1_Numbr = attributeChange.ValueChanges(0)Value.ToString()
jobTitle address.function = attributeChange.ValueChanges(0)Value.ToString()
export_password palavra-passe. 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 de casos.

  1. Recolha sua atividade ForEach e arraste e solte a atividade IF na atividade Sequence, após a segunda atividade ForEach, para validar as propriedades do usuário, antes de enviar a solicitação de criação do 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. No ramo 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 CreateCSEntryChangeResult atividades em ambas as ramificações da segunda atividade IF e configure ErrorCode de ExportErrorMissingAnchorComponent e ExportErrorMissingProvisioningAttribute.

Captura de ecrã da segunda atividade IF.

  1. Arraste e solte a atividade Sequência na ramificação Depois vazia da primeira atividade IF. Arraste e solte a atividade WebSeviceCall dentro da atividade Sequence. Selecione o nome do serviço SAPECC, o ponto de extremidade ZSAPCONNECTORWS e a operação BAPI_USER_CREATE1. Clique em ... Botão Argumentos para definir parâmetros para chamada de serviço Web da seguinte maneira:
Nome Direção Type valor
ENDEREÇO Em BAPIADDR3 Endereço
EMPRESA Em BAPIUSCOMP empresa
INCUMPRIMENTOS Em BAPIDEFAUL predefinições
LOGONDATA Em BAPILOGOND logOnData
PALAVRA-PASSE Em BAPIPWD password
REGRESSO Entrada e saída TABLE_OF_BAPIRET2 bapiret2Tabela
SELF_REGISTER Em String "X"
NOME DE UTILIZADOR Em String nome de utilizador
  1. Clique em OK. O sinal de alerta desaparece.

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

  1. Para processar os resultados da solicitação do usuário, arraste e solte a atividade IF dentro da atividade Sequence 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, assumiremos que a operação de exportação foi concluída com êxito e queremos indicar a exportação bem-sucedida desse objeto criando CSEntryChangeResult com status Success. Arraste e solte a atividade CreateCSEntryChangeResult na ramificação Else da sua atividade IF e selecione o código de erro Success.
  3. Opcional: Se a chamada de serviço Web retornar um nome de conta gerado de um usuário, precisaremos atualizar um valor âncora do objeto exportado. Para fazer isso, arraste e solte CreateAttrubuteChangea atividade dentro da CreateCSEntryChangeResult atividade e selecione Adicionar um nome de usuário. Em seguida, arraste e solte CreateValueChange a atividade dentro da atividade e insira o nome da variável preenchido CreateAttributeChange por uma atividade de chamada de serviço Web. Neste guia, você usa 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 Sequência na ramificação Depois vazia da sua atividade IF.
  2. Arraste e solte a atividade Log na atividade Sequence. Alterne para a guia Propriedades e insira o valor LogText de: bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E")). MENSAGEM. Mantenha o nível de registro alto 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 Alternar dentro da atividade Sequência após a atividade Log. Na janela pop-up, selecione Tipo de cadeia de caracteres do valor do switch. Insira a seguinte expressão: bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E")).NUMBER
  4. Clique em Default case e arraste e solte a atividade CreateCSEntryChangeResult no corpo deste caso. Escolha o código de erro ExportErrorInvalidProvisioningAttributeValue.

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

  1. Clique na área Adicionar novo caso e digite um valor de caso de 224. Arraste e solte CreateCSEntryChangeResult a atividade no corpo deste caso. Escolha o ExportErrorCustomContinueRun código de erro.

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

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

Criando fluxo de trabalho de Exportação Excluir

Para excluir um usuário no SAP ECC, você pode chamar BAPI_USER_DELETE programa e fornecer um nome de conta a ser excluído no sistema conectado. Consulte o administrador do SAP 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 cobre cenários relacionados ao sistema SAP Common User Administration, desprovisionamento de usuários de sistemas conectados, revogação de licenças, etc.

Não há necessidade de implementar 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 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 seguintes variáveis. Para selecionar um tipo de variável gerada a partir do SAP WSDL, clique em Procurar tipos e expanda o namespace gerado e, em seguida, expanda o namespace SAPECC. Isso inicializa as estruturas de dados usadas por BAPI_USER_DELETE programa.
Nome Tipo de variável Âmbito Predefinido
nome de utilizador String Sequence
bapiret2Tabela SAPECC. TABLE_OF_BAPIRET2 Sequence novos TABLE_OF_BAPIRET2()
  1. Como definimos a propriedade userName como uma 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 sua atividade de Sequência. Substitua o nome da variável do item pela â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 Switch dentro da atividade ForEach. Na janela pop-up, selecione Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper o tipo de opção. Insira o valor da expressão de: Novo AnchorAttributeNameWrapper(anchor.Name). Clique em Adicionar nova área de caso da atividade do Switch. Digite userName como Case Value. Arraste e solte Atribuir atividade no corpo do caso userName e atribuir anchor.Value.ToString() à variável userName.
  2. Arraste e solte a atividade WebSeviceCall dentro da atividade Sequence 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 em ... Botão Argumentos para definir parâmetros para chamada de serviço Web da seguinte maneira:
Nome Direção Type valor
REGRESSO Entrada/saída TABLE_OF_BAPIRET2 bapiret2Tabela
NOME DE UTILIZADOR Em String nome de utilizador
  1. Clique em OK. O sinal de alerta desaparece.

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

  1. Para processar os resultados da solicitação do usuário de exclusão, arraste e solte a atividade IF dentro da atividade Sequence 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 deste objeto criando CSEntryChangeResult com o status Sucesso. Arraste e solte CreateCSEntryChangeResult a atividade na ramificação Else da sua atividade IF e selecione Código de erro de sucesso.

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

  1. A última etapa no fluxo de trabalho Exportar Exclusão é manipular e registrar erros de exportação. Arraste e solte a atividade Sequência na ramificação Depois vazia da sua atividade IF.
  2. Arraste e solte a atividade Log na atividade Sequence. 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 registro alto 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 Alternar dentro da atividade Sequência após a atividade Log. Na janela pop-up, selecione Tipo de cadeia de caracteres do valor do switch. Insira a seguinte expressão: bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E")).NUMBER
  4. Clique em Default case e arraste e solte a atividade CreateCSEntryChangeResult no corpo deste caso. 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 novo caso e digite um valor de caso de 124. Arraste e solte CreateCSEntryChangeResult a atividade no corpo deste caso. Escolha o ExportErrorCustomContinueRun código de erro.

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

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

Criando fluxo de trabalho de substituição de exportação

Para atualizar um usuário no SAP ECC, você pode chamar BAPI_USER_CHANGE programa e fornecer todos os parâmetros, incluindo um nome de conta e todos os detalhes do usuário, incluindo aqueles que não estão mudando. 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 Webservice sempre usa o modo de exportação Object Replace e espera que o conector seja configurado para Export Type: Replace.

O fluxo de trabalho Exportar substituição é 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 BAPI_USER_CHANGE programa, 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 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 seguintes variáveis. Para selecionar um tipo de variável gerada a partir do SAP WSDL, clique em Procurar tipos e expanda o namespace gerado e, em seguida, expanda o namespace SAPECC. Isso inicializa as estruturas de dados usadas por BAPI_USER_CHANGE programa.
Nome Tipo de variável Âmbito Predefinido
nome de utilizador String Sequence
bapiret2Tabela SAPECC. TABLE_OF_BAPIRET2 Sequence novos TABLE_OF_BAPIRET2()
endereçoX SAPECC. BAPIADDR3X Sequence novos BAPIADDR3X()
Endereço SAPECC. BAPIADDR3 Sequence novos BAPIADDR3()
empresaX SAPECC. BAPIUSCOMX Sequence novo BAPIUSCOMX()
empresa SAPECC. BAPIUSCOMP Sequence novo BAPIUSCOMP()
padrãoX; SAPECC. BAPIDEFAX Sequence novo BAPIDEFAX()
predefinições SAPECC. BAPIDEFAUL Sequence novo BAPIDEFAUL()
logOnDataX SAPECC. BAPILOGONX Sequence novo BAPILOGONX()
logOnData SAPECC. BAPILOGOND Sequence novo BAPILOGOND()

Seu fluxo de trabalho Export Replace 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 uma 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 sua atividade de Sequência. Substitua o nome da variável do item pela â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 Switch dentro da atividade ForEach. Na janela pop-up, selecione Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper o tipo de opção. Insira o valor da expressão de: Novo AnchorAttributeNameWrapper(anchor.Name). Clique em Adicionar nova área de caso da atividade do Switch. Digite userName como Case Value. Arraste e solte Atribuir atividade no corpo do caso userName e atribuir anchor.Value.ToString() à variável userName. Seu fluxo de trabalho Export Replace tem esta aparência:

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

  1. Agora que extraímos o valor userName da propriedade â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 alternando através da coleção de todos os atributos definidos no esquema.
  2. Recolha sua atividade ForEach e arraste e solte outra atividade ForEachWithBothFactory dentro da atividade Sequence 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 ecrã da atividade da sequência de operações de substituição.

  1. Arraste e solte a atividade 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 String. Arraste e solte Atribuir atividade à sua atividade de Sequência. Atribua 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 este atributo ou inicializá-lo-á com uma cadeia de caracteres vazia. Seu fluxo de trabalho Export Replace tem esta aparência:

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

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

Captura de ecrã da atividade do interruptor de arrastar e largar.

10.Adicione outros casos e atribuições em falta. Use esta tabela de mapeamento como guia:

Incidente Atribuição
cidade addressX.city = "X" endereço.cidade = xValue
empresa empresaX.empresa = "X" empresa.empresa = xValue
departamento address.departmentX = "X" address.department = xValue
Correio eletrónico addressX.e_mail = "X" address.e_mail = xValue
expiraçãoTempo de expiração logOnDataX.GLTGB = "X" logOnData.GLTGB = xValue
nomepróprio addressX.firstname = "X" address.firstname = xValue
apelido addressX.lastname = "X" address.lastname = xValue
Nome do meio addressX.middlename = "X" address.middlename = xValue
telephoneNumber addressX.TEL1_Numbr = endereço "X". TEL1_Numbr = xValue
jobTitle addressX.function = "X" address.function = xValue

Seu fluxo de trabalho Export Replace tem esta aparência:

Captura de ecrã da segunda atividade do interruptor de arrastar e largar.

  1. Antes de chamar BAPI_USER_CHANGE programa, precisamos verificar se há um nome de usuário não vazio. Recolher ambas as atividades ForEach e arrastar e soltar 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 CreateCSEntryChangeResult a atividade na ramificação Else da sua atividade IF e selecione ExportErrorCustomContinueRun o código de erro. Seu fluxo de trabalho Export Replace tem esta aparência: Captura de tela da atividade CreateCSEntryChangeResult.

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

Nome Direção Type valor
ENDEREÇO Em BAPIADDR3 Endereço
ENDEREÇOX Em BAPIADDR3X endereçoX
EMPRESA Em BAPIUSCOMP empresa
EMPRESAX Em BAPIUSCOMX empresa
INCUMPRIMENTOS Em BAPIDEFAUL predefinições
INADIMPLÊNCIAX Em BAPIDEFAX padrãoX;
LOGONDATA Em BAPILOGOND logOnData
LOGONDATAX Em BAPILOGONX logOnDataX
REGRESSO Entrada/saída TABLE_OF_BAPIRET2 bapiret2Tabela
NOME DE UTILIZADOR Em String nome de utilizador
  1. Clique em OK. O sinal de alerta desaparece. Seu fluxo de trabalho Export Replace tem esta aparência:

Captura de tela de BAPI_USER_CHANGE operação.

  1. Para processar os resultados da solicitação do usuário de alteração, arraste e solte a atividade SE dentro da atividade Sequence 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, assumiremos que a operação de exportação foi concluída com êxito e queremos indicar a exportação bem-sucedida desse objeto criando CSEntryChangeResult com o status Êxito. Arraste e solte CreateCSEntryChangeResult a atividade na ramificação Else da sua atividade IF e selecione Código de erro de sucesso.
  3. Arraste e solte a atividade Sequência na ramificação Em seguida da sua atividade IF. Adicione a atividade de log com o valor LogText de e a marca de string.Join("\n",bapiret2Table.item.Where(Function(retItem) retItem.TYPE.Equals("E")).Select(Function(r) r.MESSAGE)) erro. Adicione CreateCSEntryChangeResult atividade após Registrar atividade com o código de erro de ExportErrorCustomContinueRun. Seu fluxo de trabalho Export Replace 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 substituição.

A próxima etapa é configurar o conector ECMA2Host Webservice usando esse modelo.

Próximos passos