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 pressupõe que uma conta demo pré-criada Developer seja usada com um perfil RFC_ALL que conceda permissões aos BAPIs mencionados neste artigo.
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. Espera-se um WSDL apenas com SOAP 1.1, com vinculação de estilo de documento integrado, 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.
- Na pasta "C:\Program Files\Microsoft ECMA2Host\Web Service Configuration Tool", inicie a ferramenta Configuração do Serviço Web wsconfigTool.exe
- No menu File-New, escolha Criar novo projeto SOAP
- Selecione em Projeto SOAP e escolha Adicionar novo serviço Web.
- 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. Selecione Avançar.
- Forneça credenciais para se conectar ao endpoint SAP ECC. Selecione Avançar.
- Na página de pontos finais e operações, verifique se os BAPIs são exibidos e selecione 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.
- Salve o projeto na pasta C:\Program Files\Microsoft ECMA2Host\Service\ECMA.
- Selecione o separador Tipos de Objetos e escolha adicionar o tipo de objeto de utilizador. Selecione Ok.
- Expanda a guia Tipos de objeto e selecione Definição de tipo de usuário.
- Adicione os seguintes atributos ao esquema e escolha userName como âncora.
- Guarde o seu projeto.
Nome | Tipo | Âncora |
---|---|---|
cidade | string | |
empresa | string | |
departamento | string | |
Correio eletrónico | string | |
tempo de expiração | string | |
nomePróprio | sequência de caracteres | |
Sobrenome | string | |
Nome do meio | string | |
número de telefone | string | |
título do cargo | 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 não criar um fluxo de trabalho de importação, o seu conector estará operando no modo apenas exportação e fará com que o ECMA2Host esteja sempre a emitir operações Create user, mesmo para utilizadores 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 seguinte abordagem, conforme descrito abaixo e uma propriedade denominada 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.
- 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.
- No canto inferior esquerdo, localize o botão Variáveis e selecione-o para expandir uma lista de variáveis definidas nesta Sequência.
- Adicione as seguintes variáveis. Para selecionar um tipo de variável gerada a partir do SAP WSDL, selecione a opção Procurar tipos, expanda gerado e, em seguida, expanda o namespace SAPECC.
Nome | Tipo de variável | Âmbito | Predefinido |
---|---|---|---|
selRangeTable | SAPEC.TABLE_OF_BAPIUSSRGE | Sequência | new TABLE_OF_BAPIUSSRGE com {.item = new BAPIUSSRGE(){new BAPIUSSRGE}} |
getListRetTable | SAPECC. TABLE_OF_BAPIRET2 | Sequência | nova TABLE_OF_BAPIRET2 |
tamanho da página | Int32 | Sequência | 200 |
returnedSize | Int32 | Sequência | |
TabelaDeUtilizadores | SAPECC. TABLE_OF_BAPIUSNAME | Sequência | novos TABLE_OF_BAPIUSNAME() |
- Na Caixa de Ferramentas, arraste e solte quatro atividades de atribuir 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 eram usados para chamar a função BAPI_USER_GETLIST e implementar a paginação.
- Para implementar a paginação, na Caixa de Ferramentas arraste e solte a atividade DoWhile dentro da atividade Sequence após a última operação Atribuir.
- No painel direito, alterne para a guia Propriedades e insira esta condição para o DoWhile
- ciclo:
returnedSize = pageSize
- Selecione as variáveis e adicione a propriedade currentPageNumber do tipo int32 dentro do ciclo DoWhile com o valor padrão 0.
- 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 completa de importação e esse carimbo de data/hora pode ser usado posteriormente no fluxo de trabalho de Importação Delta.
- 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.
- Selecione o botão Argumentos para definir os parâmetros para a chamada do serviço Web da seguinte forma:
Nome | Direção | Tipo | valor |
---|---|---|---|
MAX_ROWS | Em | Int32 | tamanho da página |
MAX_ROWSSpecified | Em | Booleano | Verdadeiro |
REGRESSO | Entrada/saída | TABLE_OF_BAPIRET2 | getListRetTable |
SELEÇÃO_EXP | Entrada/saída | TABLE_OF_BAPIUSSEXP | |
INTERVALO_DE_SELEÇÃO | Entrada/saída | TABLE_OF_BAPIUSSRGE | TabelaDeIntervaloSel |
LISTA DE UTILIZADORES | Entrada/saída | TABLE_OF_BAPIUSNAME | Tabela de Utilizadores |
COM_NOME_DE_USUÁRIO | Em | String | |
LINHAS | Fora | Int32 | returnedSize |
- Selecione 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 1.000 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 1.000 chamadas individuais para recuperar os detalhes dos usuários. Para melhorar o desempenho, peça à sua equipe SAP para desenvolver um programa BAPI personalizado que liste todos os usos com suas propriedades. Isso evita a necessidade de fazer 1.000 chamadas individuais e expor essa função BAPI num endpoint SOAP WS.
- Na Caixa de Ferramentas, arraste e solte a atividade IF dentro da atividade DoWhile, após a execução da 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
- Na Caixa de Ferramentas, arraste e solte a atividade 'Throw' no ramo Else da atividade 'IF' para lançar um erro na importação malsucedida. Alterne para o separador Propriedades e insira esta expressão para a propriedade Exception da atividade Throw:
New Exception(getListRetTable.item.First(Function(retItem) retItem.TYPE.Equals("E")).MESSAGE)
- Para processar uma lista de utilizadores importados, arraste e solte a atividade ForEachWithBodyFactory da caixa de ferramentas para o ramo Then da sua atividade IF. Alterne para a guia Propriedades e selecione SAPECC.BAPIUSNAME como ArgumentoDeTipo. Clique no botão indicado ... e digite esta expressão para a propriedade dos valores:
if(usersTable.item,Enumerable.Empty(of BAPIUSNAME)())
- Na Caixa de Ferramentas, arraste e solte a atividade Sequência dentro da sua atividade ForEach. Tendo esta janela de atividade Sequência ativa, selecione no botão Variáveis e defina estas variáveis:
Nome | Tipo de variável | Âmbito | Predefinido |
---|---|---|---|
empresa | SAPECC.BAPIUSCOMP | Sequência | novo BAPIUSCOMP() |
Endereço | SAPECC. BAPIADDR3 | Sequência | novo BAPIADDR3() |
predefinições | SAPECC. BAPIDEFAUL | Sequência | novo BAPIDEFAUL() |
dados de login | SAPECC. BAPILOGOND | Sequência | novo BAPILOGOND() |
getDetailRetTable | SAPECC. TABLE_OF_BAPIRET2 | Sequência | novos TABLE_OF_BAPIRET2() |
A sua atividade de IF é assim:
- Arraste e solte a atividade CreateCSEntryChangeScope dentro da sua atividade Sequence. Na propriedade DN, insira schemaType.Name & item.USERNAME. No campo CreateAnchorAttribute AnchorValue, digite item.username.
- 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. Selecione o botão Argumentos para definir os parâmetros para a chamada do serviço Web da seguinte forma:
Nome | Direção | Tipo | valor |
---|---|---|---|
REGRESSO | Entrada/saída | TABLE_OF_BAPIRET2 | getDetailRetTable |
NOME DE UTILIZADOR | Em | String | item.nome de usuário |
ENDEREÇO | Fora | BAPIADDR3 | Endereço |
EMPRESA | Do destino para a origem | BAPIUSCOMP | empresa |
INCUMPRIMENTOS | Saída | BAPIUSDEFAUL | predefinições |
LOGONDATA | Fora | BAPILOGOND | dados de início de sessão |
WITH_USERNAME | Em | Cadeia | |
LINHAS | Fora | Int32 | returnedSize |
- Selecione OK. O sinal de alerta desaparece. Os detalhes de um usuário são armazenados nas variáveis listadas acima. A sua atividade IF tem esta aparência:
- 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 ))
- 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:
- Para cada propriedade de um utilizador, como cidade, empresa, departamento, e-mail, adicione a atividade IF após a atividade CreateAnchorAttribute e verifique se há valores não vazios definindo condições como
Not string.IsNullOrEmpty(address.city)
e adicionando atividades CreateAttributeChange no ramo Then dessa atividade IF.
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 | morada.cidade |
departamento | morada.departamento |
empresa | empresa.empresa |
Correio eletrónico | address.e_mail |
primeiro nome | endereço.nome_primeiro |
apelido | morada.sobrenome |
Nome do meio | endereço.middleName |
título do cargo | endereço.função |
tempo de expiração | logonData.GLTGB |
número de telefone | endereço. TEL1_NUMBR |
- 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.
- Colapsa a atividade de sequência dentro da atividade ForEach para que o ciclo DoWhile fique assim:
- Para recuperar a próxima página de utilizadores, atualize a propriedade
selRangeTable.item(0).LOW
. Arraste e solte a atividade IF dentro da atividade Sequência no DoWhile. Coloque-o após a atividade IF existente. Digite returnedSize>0 como Condição. Adicione a atividade de atribuição na ramificação "Then" da atividade "IF" e definaselRangeTable.item(0).LOW
comousersTable.item(returnedSize-1).username
.
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.
- Navegue até Tipos de objeto -> Utilizador -> 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.
- No canto inferior esquerdo, localize o botão Variáveis e selecione-o para expandir uma lista de variáveis definidas nesta Sequência.
- Adicione as seguintes variáveis. Para selecionar um tipo de variável gerada a partir do SAP WSDL, selecione a opção Procurar tipos, expanda 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 | Sequência | novo BAPIADDR3() |
nome de utilizador | String | Sequência | |
password | SAPECC.BAPIPWD | Sequência | novo BAPIPWD() |
empresa | SAPECC. BAPIUSCOMP | Sequência | novo BAPIUSCOMP() |
predefinições | SAPECC. BAPIDEFAUL | Sequência | novo BAPIDEFAUL() |
logOnData | SAPECC.BAPILOGOND | Sequência | novo BAPILOGOND() |
bapiret2Tabela | SAPECC. TABLE_OF_BAPIRET2 | Sequência | novos TABLE_OF_BAPIRET2() |
- Como definimos a propriedade userName como uma ID imutável, uma âncora, precisamos 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, digiteobjectToExport.AnchorAttributes
.
- 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 o tipo de interruptor
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper
. Insira o valor da expressão: New AnchorAttributeNameWrapper(anchor.Name). - Selecione Adicionar nova área de caso da atividade Switch. Digite userName como Case Value. Arraste e solte a atividade de atribuição para o corpo do caso userName e atribua anchor.Value.ToString() à variável userName.
- Agora que extraímos o valor de userName da propriedade âncora do objeto exportado, precisamos preencher outras estruturas, como empresa, padrões, endereço e dados de logon, que contêm outros detalhes do utilizador SAP. Fazemos isso passando por um conjunto de alterações de atributos.
- Recolha sua atividade ForEach e arraste e solte outra atividade ForEachWithBothFactory dentro da atividade Sequence após a atividade ForEach existente. Substitua item por attributeChange, mude para propriedades e escolha TypeArgument de
Microsoft.MetadirectoryServices.AttributeChange
. No campo Valor, digiteobjectToExport.AttributeChanges
.
- Arraste e solte a atividade Alternar no corpo da sua atividade ForEach.
- No menu de popup, selecione
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AttributeNameWrapper
e selecione OK. - Insira a seguinte expressão: New AttributeNameWrapper(attributeChange.Name). Verá um ícone de aviso no canto superior direito da atividade Switch sobre atributos não tratados, definidos no esquema e não atribuídos a nenhuma propriedade.
- Selecione na área "Adicionar novo caso" da atividade "Alternar" e digite um valor de caso de cidade.
- Arrastar e soltar a atividade "Atribuir" no corpo deste caso. Atribua
attributeChange.ValueChanges(0).Value.ToString()
a morada.cidade.
- 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() |
tempo 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() |
número de telefone | endereço.TEL1_Numbr = attributeChange.ValueChanges(0).Value.ToString() |
título do cargo | 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.
- Minimize a sua atividade ForEach e arraste e solte a atividade IF na atividade Sequence, após a segunda atividade ForEach, para validar as propriedades do utilizador, antes de enviar o pedido de criação de utilizador. 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)
- Na ramificação Else da atividade IF, adicione mais uma atividade IF, pois queremos lançar erros diferentes dependendo do que está em falta. 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 os ErrorCodes deExportErrorMissingAnchorComponent
eExportErrorMissingProvisioningAttribute
.
- Arraste e solte a atividade Sequência na ramificação Então 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. Selecione o botão Argumentos para definir os parâmetros para a chamada do serviço Web da seguinte forma:
Nome | Direção | Tipo | 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 | bapiret2Table |
AUTO_REGISTRO | Em | String | "X" |
NOME DE UTILIZADOR | Em | String | nome de utilizador |
- Selecione OK. O sinal de alerta desaparece.
- Para processar os resultados da solicitação de criação de utilizador, 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
- 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.
- 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
CreateAttrubuteChange
a atividade dentro daCreateCSEntryChangeResult
atividade e selecione Adicionar um nome de usuário. Em seguida, arraste e solte a atividadeCreateValueChange
dentro da atividadeCreateAttributeChange
e insira o nome da variável preenchido por uma atividade de chamada de serviço web. Neste guia, você usa a variável userName que não é atualizada na exportação.
- 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 Então vazia da sua atividade de condição IF.
- 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 registo elevado 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. - Arraste e solte a atividade 'Alternar' dentro da atividade 'Sequência', após a atividade 'Registo'. 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
- Selecione a opção Caso padrão e arraste e largue a atividade CreateCSEntryChangeResult no corpo do caso. Escolha o código de erro ExportErrorInvalidProvisioningAttributeValue.
- Selecione a área Adicionar novo caso e digite um valor de caso de 224. Arraste e solte
CreateCSEntryChangeResult
a atividade no corpo deste caso. Escolha oExportErrorCustomContinueRun
código de erro.
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 para determinar se esse cenário é obrigatório. Na maioria das vezes, as contas SAP ECC não são excluídas, mas são definidas para expirar 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.
- 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.
- No canto inferior esquerdo, localize o botão Variáveis e selecione-o para expandir uma lista de variáveis definidas nesta Sequência.
- Adicione as seguintes variáveis. Para selecionar um tipo de variável gerada a partir do SAP WSDL, selecione a opção Procurar tipos, 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 | Âmbito | Predefinido |
---|---|---|---|
nome de utilizador | String | Sequência | |
bapiret2Tabela | SAPECC. TABLE_OF_BAPIRET2 | Sequência | novos TABLE_OF_BAPIRET2() |
- Como definimos a propriedade userName como uma ID imutável, uma âncora, precisamos 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, mude para propriedades e escolha TypeArgument de
Microsoft.MetadirectoryServices.AnchorAttribute
. No campo Valor, digiteobjectToExport.AnchorAttributes
.
- 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 o tipo de interruptor
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper
. Insira o valor da expressão: NovoAnchorAttributeNameWrapper(anchor.Name)
. Selecione Adicionar nova área de caso da atividade Switch. Digite "userName" como "Case Value". Arraste e solte Atribuir atividade no corpo do caso userName e atribuiranchor.Value.ToString()
à variável userName. - 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. Selecione o botão Argumentos para definir os parâmetros para a chamada do serviço Web da seguinte forma:
Nome | Direção | Tipo | valor |
---|---|---|---|
REGRESSO | Entrada/saída | TABLE_OF_BAPIRET2 | bapiret2Table |
NOME DE UTILIZADOR | Em | Cadeia | nome de utilizador |
- Selecione OK. O sinal de alerta desaparece.
- Para processar os resultados da solicitação de eliminação de usuário, arraste e solte a atividade IF após a atividade WebServiceCall, dentro da atividade Sequence. Insira a seguinte condição:
If(bapiRet2Table.item, Enumerable.Empty(Of BAPIRET2)()).Count(Function(errItem) errItem.TYPE.Equals("E") = True) <> 0
- 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 solteCreateCSEntryChangeResult
a atividade na ramificação Else da sua atividade IF e selecione Código de erro de sucesso.
- A última etapa no processo de Exclusão de Exportação é lidar com e registar erros de exportação. Arraste e solte a atividade "Sequence" no ramo "Then" vazio da sua atividade "IF".
- Arraste e solte a atividade "Log" na atividade "Sequence". Mude para o separador 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. - Arraste e solte a atividade de Alternância dentro da atividade de Sequência, após a atividade de Registro. 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
- Selecione em Caso padrão e arraste e solte a atividade CreateCSEntryChangeResult no corpo desse caso. Escolha o código de erro ExportErrorSyntaxViolation.
- Selecione a área Adicionar novo caso e digite um valor de caso de 124. Arraste e solte
CreateCSEntryChangeResult
a atividade no corpo deste caso. Escolha oExportErrorCustomContinueRun
código de erro.
Você concluiu a definição do fluxo de trabalho Exportar exclusão.
Criação de fluxo de trabalho de substituição de exportação
Para atualizar um usuário no SAP ECC, pode chamar o programa BAPI_USER_CHANGE e fornecer todos os parâmetros, incluindo um nome de conta e todos os detalhes do usuário, mesmo aqueles que não sofrerão alterações. O modo de exportação ECMA2, quando todas as propriedades do utilizador devem ser fornecidas, é chamado 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 utiliza o modo de exportação Object Replace e espera que o conector seja configurado para Export Type: Replace.
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. O X no final do endereçoX indica que a estrutura do endereço contém uma alteração.
- Navegue até Tipos de Objetos -> Utilizador -> Exportar -> Substituir fluxo de trabalho e, à direita na caixa de ferramentas, arraste e solte a atividade Sequência no painel do designer de fluxos de trabalho.
- No canto inferior esquerdo, localize o botão Variáveis e selecione-o para expandir uma lista de variáveis definidas nesta Sequência.
- Adicione as seguintes variáveis. Para selecionar um tipo de variável gerada a partir do SAP WSDL, selecione a opção Procurar tipos, expanda 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 | Sequência | |
bapiret2Tabela | SAPECC. TABLE_OF_BAPIRET2 | Sequência | novos TABLE_OF_BAPIRET2() |
endereçoX | SAPECC. BAPIADDR3X | Sequência | novo BAPIADDR3X() |
Endereço | SAPECC. BAPIADDR3 | Sequência | new BAPIADDR3() |
empresaX | SAPECC. BAPIUSCOMX | Sequência | novo BAPIUSCOMX() |
empresa | SAPECC.BAPIUSCOMP | Sequência | novo BAPIUSCOMP() |
padrãoX; | SAPECC. BAPIDEFAX | Sequência | novo BAPIDEFAX() |
predefinições | SAPECC. BAPIDEFAUL | Sequência | novo BAPIDEFAUL() |
logOnDataX | SAPECC. BAPILOGONX | Sequência | novo BAPILOGONX() |
logOnData | SAPECC.BAPILOGOND | Sequência | novo BAPILOGOND() |
Seu fluxo de trabalho Export Replace tem esta aparência:
- Como definimos a propriedade userName como uma ID imutável, uma âncora, precisamos 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 sua atividade de Sequência. Substitua item pela âncora, mude para propriedades e escolha TypeArgument de
Microsoft.MetadirectoryServices.AnchorAttribute
. No campo Valor, digiteobjectToExport.AnchorAttributes
.
- 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 o tipo de interruptor
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper
. Introduza o valor da expressão de: NovoAnchorAttributeNameWrapper(anchor.Name)
. Selecione Adicionar nova área de caso da atividade Switch. Digite userName como Case Value. Arraste e solte Atribuir atividade no corpo do caso userName e atribuiranchor.Value.ToString()
à variável userName. Seu fluxo de trabalho Export Replace tem esta aparência:
- Agora que extraímos o valor userName da propriedade âncora do objeto exportado, precisamos preencher outras estruturas, como informações da empresa, valores predefinidos, endereço, e dados de logon, que contêm outros detalhes do usuário SAP. Fazemos isso percorrendo a coleção de atributos definidos no esquema.
- Recolha a sua atividade ForEach e arraste e solte outra atividade ForEachWithBothFactory para dentro da atividade Sequence, após a atividade ForEach existente. Substitua item por schemaAttr, alterne para propriedades e escolha TypeArgument de
Microsoft.MetadirectoryServices.SchemaAttribute
. No campo Valor, digiteschemaType.Attributes
.
- Arraste e solte a ação Sequência para o corpo da ação ForEach. No canto inferior esquerdo, localize o botão Variáveis e selecione-o 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 a xValue a expressão de:
If(objectToExport.AttributeChanges.Contains(schemaAttr.Name), objectToExport.AttributeChanges(schemaAttr.Name).ValueChanges(0).Value.ToString(), String.Empty)
Ele extrai as alterações preparadas para exportação para esse atributo ou o inicializa com uma cadeia de caracteres vazia. Seu fluxo de trabalho Export Replace tem esta aparência:
- Arraste e solte a atividade "Alternar" depois da atividade "Atribuir". No menu de atalhos, selecione
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AttributeNameWrapper
e depois Ok. Insira a seguinte expressão: NovoAttributeNameWrapper(schemaAttr.Name)
. Você verá um ícone de aviso no canto superior direito da sua atividade de Switch, indicando atributos não tratados definidos no esquema e não atribuídos a nenhuma propriedade. Selecione a opção "Adicionar novo caso" na atividade "Alternar" e digite um valor de caso de cidade. Arraste e solte a atividade de 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 de Atribuição no corpo deste caso. Atribua xValue a morada.cidade. Seu fluxo de trabalho Export Replace tem esta aparência:
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 |
tempo de expiração | logOnDataX.GLTGB = "X" logOnData.GLTGB = xValue |
nomepróprio | addressX.firstname = "X" address.firstname = xValue |
sobrenome | addressX.lastname = "X" address.lastname = xValue |
Nome intermediário | addressX.middlename = "X" address.middlename = xValue |
número de telefone | addressX.TEL1_Numbr = endereço "X". TEL1_Numbr = xValue |
título do cargo | addressX.function = "X" address.function = xValue |
Seu fluxo de trabalho Export Replace tem esta aparência:
Antes de chamar o programa BAPI_USER_CHANGE, precisamos verificar se há um nome de utilizador não vazio. Recolher as duas atividades ForEach e arrastar e soltar a atividade IF após a segunda atividade ForEach. Insira a seguinte condição:
String.IsNullOrEmpty(userName ) = False
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 selecioneExportErrorCustomContinueRun
o código de erro. Seu fluxo de trabalho Export Replace tem esta aparência:Arraste e solte a atividade Sequência na ramificação Then vazia da primeira atividade SE. 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. Selecione o botão Argumentos para definir os parâmetros para a chamada do serviço Web da seguinte forma:
Nome | Direção | Tipo | 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 |
PREDEFINIÇÕESX | Em | BAPIDEFAX | padrãoX; |
LOGONDATA | Em | BAPILOGOND | logOnData |
LOGONDATAX | Em | BAPILOGONX | logOnDataX |
REGRESSO | Entrada/saída | TABLE_OF_BAPIRET2 | bapiret2Table |
NOME DE UTILIZADOR | Em | cadeia de caracteres | nome de utilizador |
- Selecione OK. O sinal de alerta desaparece. Seu fluxo de trabalho Export Replace tem esta aparência:
- Para processar os resultados da solicitação de alteração do utilizador, arraste e largue a atividade IF 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
- 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 solteCreateCSEntryChangeResult
a atividade na ramificação Else da sua atividade IF e selecione Código de erro de sucesso. - Arraste e solte a atividade Sequência na parte "Então" da sua atividade IF. Adicione a atividade de 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 atividadeCreateCSEntryChangeResult
após a atividade de registo com o código de erroExportErrorCustomContinueRun
. Seu fluxo de trabalho Export Replace tem esta aparência:
Você concluiu a definição do fluxo de trabalho Exportar substituição.
A próxima etapa é configurar o ECMA2Host Webservice connector usando este modelo.