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.
- Na pasta "C:\Program Files\Microsoft ECMA2Host\Web Service Configuration Tool", inicie a ferramenta Configuração do Serviço Web wsconfigTool.exe
- No menu Arquivo-Novo, escolha Criar novo projeto SOAP
- Clique 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. Clique em Seguinte.
- Forneça credenciais para se conectar ao endpoint SAP ECC. Clique em Seguinte.
- 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.
- Salve o projeto na pasta C:\Program Files\Microsoft ECMA2Host\Service\ECMA.
- Clique na guia Tipos de objeto e escolha adicionar Tipo de objeto de usuário. Clique em OK.
- Expanda a guia Tipos de objeto e clique em 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 | |
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.
- 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 clique nele 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, 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() |
- 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.
- 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.
- No painel direito, alterne para a guia Propriedades e insira esta condição para o DoWhile
- ciclo:
returnedSize = pageSize
- Clique nas 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 de importação completa 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.
- 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 |
- 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.
- 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
- 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)
- 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)())
- 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:
- 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.
- 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 |
- 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:
- 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 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.
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 |
- 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.
- Recolher atividade de sequência dentro da atividade ForEach para que seu ciclo DoWhile tenha esta aparência:
- 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 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 -> 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.
- 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 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() |
- 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, 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
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper
o tipo de opção. Insira o valor da expressão de: New AnchorAttributeNameWrapper(anchor. Nome). - 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.
- 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.
- 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, digiteobjectToExport.AttributeChanges
.
- Arraste e solte a atividade Alternar no corpo da sua atividade ForEach.
- No menu pop-up, selecione
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AttributeNameWrapper
e clique em Ok. - 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.
- Clique em Adicionar nova área de caso da atividade Switch e digite um valor de caso de cidade.
- Arrastar e soltar Atribua atividade no corpo deste caso. Atribua
attributeChange.ValueChanges(0).Value.ToString()
a address.city.
- 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.
- 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)
- 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 deExportErrorMissingAnchorComponent
eExportErrorMissingProvisioningAttribute
.
- 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 |
- Clique em OK. O sinal de alerta desaparece.
- 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
- 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 solteCreateValueChange
a atividade dentro da atividade e insira o nome da variável preenchidoCreateAttributeChange
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 Depois vazia da sua atividade 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 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. - 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
- Clique em Default case e arraste e solte a atividade CreateCSEntryChangeResult no corpo deste caso. Escolha o código de erro ExportErrorInvalidProvisioningAttributeValue.
- 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 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 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.
- 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 clique nele 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, 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() |
- 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, 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
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper
o tipo de opção. Insira o valor da expressão de: NovoAnchorAttributeNameWrapper(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 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. 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 |
- Clique em OK. O sinal de alerta desaparece.
- 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
- 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 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.
- 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. - 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
- Clique em Default case e arraste e solte a atividade CreateCSEntryChangeResult no corpo deste caso. Escolha o código de erro ExportErrorSyntaxViolation.
- 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 oExportErrorCustomContinueRun
código de erro.
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.
- 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.
- 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 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:
- 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, 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
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper
o tipo de opção. Insira o valor da expressão de: NovoAnchorAttributeNameWrapper(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 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 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.
- 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, digiteschemaType.Attributes
.
- 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:
- 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: NovoAttributeNameWrapper(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:
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:
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
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 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 |
- Clique em OK. O sinal de alerta desaparece. Seu fluxo de trabalho Export Replace tem esta aparência:
- 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
- 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 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. AdicioneCreateCSEntryChangeResult
atividade após Registrar atividade com o código de erro deExportErrorCustomContinueRun
. 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 conector ECMA2Host Webservice usando esse modelo.