Criação do modelo de conector de serviço Web SAP ECC 7.51 para o ECMA2Host
Este guia orienta você pelo processo de criação de um modelo para o conector do ECMA (Agente de Gerenciamento de Conectividade de Extensibilidade de Serviço Web) para gerenciar usuários do SAP ECC.
Limitações e suposições
Este modelo demonstra como gerenciar usuários. Outros tipos de objeto, como Grupos de Atividades Locais, Funções e Perfis, não são abordados por este guia, pois o ECMA2Host atualmente não dá suporte a referências de vários valores. As operações de senha também estão fora do escopo deste guia.
Este guia não aborda a criação da conta de serviço no SAP usada para chamar as funções BAPI expostas. Ele pressupõe que uma conta de Desenvolvedor de demonstração pré-criada seja usada com um RFC_ALL de perfil que concede permissões aos BAPIs mencionados abaixo.
A Ferramenta de Configuração de Serviço Web não dá suporte aos seguintes recursos expostos no SAP por padrão: Políticas WSP e várias associações por ponto de extremidade. Ele espera um WSDL com SOAP 1.1 apenas, associação de estilo de documento único sem políticas.
Funções BAPI SAP ECC usadas neste modelo:
- BAPI_USER_GETLIST – obter uma lista de todos os usuários conectados a este sistema.
- BAPI_USER_GETDETAIL – obter detalhes do usuário específico.
- BAPI_USER_CREATE1 – cria um usuário.
- BAPI_USER_DELETE – exclui um usuário.
- BAPI_USER_CHANGE – atualiza um usuário.
Todas as propriedades de usuário do SAP neste guia são tratadas como propriedades de valor único.
A linguagem de programação usada é Visual Basic.
Definição de um ponto de extremidade de serviço Web e criação de um esquema
Antes de projetar fluxos de trabalho de importação e exportação, você precisa criar um modelo e definir um ponto de extremidade com as funções SAP BAPI expostas em uma interface SOAP. Em seguida, crie um esquema dos objetos ECMA2 e as propriedades disponíveis neste modelo.
- Na pasta "C:\Arquivos de Programas\Microsoft ECMA2Host\Web Service Configuration Tool", inicie a ferramenta de Configuração de 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 como SAPECC, forneça uma URL para baixar o WSDL publicado, insira SAPECC como namespace. O nome do serviço Web ajuda você a distinguir esse serviço Web em seu modelo de outros. Namespace define um nome do namespace do Microsoft .NET usado para gerar classes. Escolha o modo de autenticação Básica, a menos que receba outra instrução do administrador do SAP. Clique em Avançar.
- Forneça credenciais para se conectar ao ponto de extremidade SAP ECC. Clique em Avançar.
- Na página de pontos de extremidade e operações, certifique-se de que as BAPIs sejam exibidas e clique em Concluir
Observação
se você vir mais de um ponto de extremidade, terá as ligações SOAP 1.2 e SOAP 1.1 habilitadas. Isso faz o conector falhar. Modifique sua definição de associação no SOAMANAGER e mantenha apenas uma. Em seguida, adicione novamente um serviço Web.
- Salve o projeto na pasta C:\Arquivos de Programas\Microsoft ECMA2Host\Serviço\ECMA.
- Clique na guia Tipos de objeto e escolha adicionar o tipo de objeto Usuário. Clique em OK.
- Expanda a guia Tipos de objeto e clique em Definição de tipo de usuário.
- Adicione os atributos a seguir ao esquema e escolha userName como âncora.
- Salve seus projetos.
Nome | Tipo | Âncora |
---|---|---|
cidade | string | |
company | string | |
department | string | |
string | ||
expirationTime | string | |
firstName | string | |
lastName | string | |
middleName | string | |
telephoneNumber | string | |
jobTitle | string | |
userName | string | verificado |
Criação de fluxo de trabalho de importação completa
O fluxo de trabalho de importação, embora seja opcional no ECMA2Host, permite importar usuários SAP existentes para o cache na memória do ECMA2Host e evitar que usuários duplicados sejam criados durante o provisionamento.
Se você não criar um fluxo de trabalho de importação, o conector estará operando no modo Somente exportação e fará com que o ECMA2Host sempre emita operações Criar usuário, mesmo para usuários existentes. Isso pode levar a falhas ou duplicatas quando BAPIs SAP padrão são usados, a menos que as duplicatas sejam tratadas pelo fluxo de trabalho de exportação.
O SAP ECC não oferece um mecanismo integrado para ler as alterações feitas desde a última leitura.
Portanto, estamos implementando apenas o fluxo de trabalho de Importação Completa. Se você precisar implementar importações delta por motivos de desempenho, consulte o administrador do SAP para obter uma lista de BAPIs e publique-as como um serviço Web SOAP. Em seguida, implemente o fluxo de trabalho de Importação Delta usando a abordagem descrita abaixo e uma propriedade customData que contém um carimbo de data/hora da execução bem-sucedida anterior.
O SAP ECC oferece várias funções BAPI para obter uma lista de usuários com suas propriedades:
- BAPI_USER_GETLIST – obter uma lista de todos os usuários conectados a este sistema.
- BAPI_USER_GETDETAIL – obter detalhes do usuário específico.
Somente essas duas BAPIs são usadas para recuperar usuários existentes do SAP ECC neste modelo.
- 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 variáveis a seguir. Para selecionar um tipo de variável gerado a partir do WSDL do SAP, clique em Procurar tipos e expanda gerado e, em seguida, expanda o namespace SAPECC.
Nome | Tipo de Variável | Escopo | Padrão |
---|---|---|---|
selRangeTable | SAPECC.TABLE_OF_BAPIUSSRGE | Sequência | new TABLE_OF_BAPIUSSRGE with {.item = new BAPIUSSRGE(){new BAPIUSSRGE}} |
getListRetTable | SAPECC.TABLE_OF_BAPIRET2 | Sequência | new TABLE_OF_BAPIRET2 |
pageSize | Int32 | Sequência | 200 |
returnedSize | Int32 | Sequência | |
usersTable | SAPECC.TABLE_OF_BAPIUSNAME | Sequência | new TABLE_OF_BAPIUSNAME() |
- Na caixa de ferramentas, arraste e solte quatro atividades de Atribuição dentro da atividade de Sequência e defina estes valores:
selRangeTable.item(0).PARAMETER = "USERNAME"
selRangeTable.item(0).SIGN = "I" selRangeTable.item(0).OPTION = "GT" selRangeTable.item(0).LOW = ""
Esses parâmetros usados para chamar a função BAPI_USER_GETLIST e implementar a paginação.
- Para implementar a paginação, na Caixa de Ferramentas, arraste e solte a atividade DoWhile dentro da atividade de Sequência após a última operação de Atribuição.
- No painel direito, alterne para a guia Propriedades e insira essa condição para o DoWhile
- ciclo:
returnedSize = pageSize
- Clique nas Variáveis e adicione a propriedade currentPageNumber do tipo int32 no ciclo DoWhile com o valor padrão de 0.
- Etapa opcional: se você planeja implementar o fluxo de trabalho de Importação Delta, na Caixa de Ferramentas, arraste e solte a atividade Atribuir dentro da atividade de Sequência após o ciclo DoWhile. Defina este valor:
customData(schemaType.Name + "_lastImportTime") = DateTimeOffset.UtcNow.Ticks.ToString()
Isso salva a data e a hora da última execução de importação completa e esse carimbo de data/hora pode ser usado posteriormente no fluxo de trabalho de importação delta.
- Na caixa de ferramentas, arraste e solte a atividade de Sequência dentro da atividade DoWhile. Arraste e solte a atividade WebServiceCall dentro dessa atividade de Sequência e selecione o nome do serviço SAPECC, o ponto de extremidade ZSAPCONNECTORWS e operação BAPI_USER_GETLIST.
- Clique no botão ... Argumentos para definir parâmetros para chamada de serviço Web da seguinte forma:
Nome | Direção | Tipo | Valor |
---|---|---|---|
MAX_ROWS | In | Int32 | pageSize |
MAX_ROWSSpecified | In | Booliano | Verdadeiro |
RETURN | Entrada/saída | TABLE_OF_BAPIRET2 | getListRetTable |
SELECTION_EXP | Entrada/saída | TABLE_OF_BAPIUSSEXP | |
SELECTION_RANGE | Entrada/saída | TABLE_OF_BAPIUSSRGE | selRangeTable |
USERLIST | Entrada/saída | TABLE_OF_BAPIUSNAME | usersTable |
WITH_USERNAME | No | String | |
ROWS | Saída | Int32 | returnedSize |
- Clique em OK. O sinal de aviso desaparece. A lista de usuários armazenada na variável usersTable. Como o SAP não retorna uma lista completa de usuários em uma única resposta, precisamos implementar a paginação e chamar essa função várias vezes ao alternar as páginas. Então, para cada usuário importado, você precisa obter os detalhes desse usuário fazendo uma chamada separada. Isso significa que, para um cenário com 1000 usuários e um tamanho da página de 200, o conector de serviço Web faz 5 chamadas para recuperar uma lista de usuários e 1000 chamadas individuais para recuperar os detalhes dos usuários. Para melhorar o desempenho, peça à equipe SAP que desenvolva um programa BAPI personalizado que liste todos os usos com suas propriedades para evitar a necessidade de fazer 1000 chamadas individuais e expor essa função BAPI no ponto de extremidade SOAP WS.
- 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 atividade IF para gerar um erro na importação malsucedida. Alterne para a guia Propriedades e insira esta expressão para a propriedade Exceção da atividade Lançar:
New Exception(getListRetTable.item.First(Function(retItem) retItem.TYPE.Equals("E")).MESSAGE)
- Para processar uma lista de usuários importados, arraste e solte a atividade ForEachWithBodyFactory da Caixa de Ferramentas para a ramificação Then da atividade IF. Alterne para a guia Propriedades e selecione SAPECC.BAPIUSNAME como TypeArgument. Clique no botão ... e digite esta expressão para a propriedade de valores:
if(usersTable.item,Enumerable.Empty(of BAPIUSNAME)())
- Na caixa de ferramentas, arraste e solte a atividade de Sequência dentro da atividade ForEach. Com essa janela de atividade de Sequência ativa, clique no botão Variáveis e defina estas variáveis:
Nome | Tipo de Variável | Escopo | Padrão |
---|---|---|---|
company | SAPECC.BAPIUSCOMP | Sequência | new BAPIUSCOMP() |
address | SAPECC.BAPIADDR3 | Sequência | new BAPIADDR3() |
defaults | SAPECC.BAPIDEFAUL | Sequência | new BAPIDEFAUL() |
logondata | SAPECC.BAPILOGOND | Sequência | new BAPILOGOND() |
getDetailRetTable | SAPECC.TABLE_OF_BAPIRET2 | Sequência | new TABLE_OF_BAPIRET2() |
Sua atividade IF tem esta aparência:
- Arraste e solte a atividade CreateCSEntryChangeScope dentro da atividade de Sequência. Na propriedade DN, insira Type.Name & item.USERNAME. No campo CreateAnchorAttribute AnchorValue, insira item.username.
- Para recuperar detalhes de cada usuário, na caixa de ferramentas, arraste e solte a atividade WebServiceCall dentro da atividade de Sequência logo antes da atividade CreateAnchorAttribute. Selecione o nome do serviço SAPECC, o ponto de extremidade ZSAPCONNECTORWS e a operação BAPI_USER_GET_DETAIL. Clique no botão ... Argumentos para definir parâmetros para chamada de serviço Web da seguinte forma:
Nome | Direção | Tipo | Valor |
---|---|---|---|
RETURN | Entrada/saída | TABLE_OF_BAPIRET2 | getDetailRetTable |
USERNAME | No | String | item.username |
ADDRESS | Saída | BAPIADDR3 | address |
EMPRESA | Saída | BAPIUSCOMP | company |
DEFAULTS | Saída | BAPIUSDEFAUL | defaults |
LOGONDATA | Saída | BAPILOGOND | logonData |
WITH_USERNAME | No | String | |
ROWS | Saída | Int32 | returnedSize |
- Clique em OK. O sinal de aviso desaparece. Os detalhes de um usuário são armazenados nas variáveis listadas acima. Sua atividade IF tem esta aparência:
- Para verificar os resultados da operação BAPI_USER_GET_DETAIL, na Caixa de Ferramentas, arraste e solte a atividade IF e coloque-a dentro da atividade de Sequência entre as atividades WebServiceCall e CreateAnchorAttribute. Insira esta condição:
IsNothing(getDetailRetTable.item) OrElse getDetailRetTable.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) = 0
Como os detalhes do usuário ausentes não devem ser tratados como um evento catastrófico, queremos indicar esse erro e continuar o processamento de outros usuários. Arraste e solte a atividade de Sequência na ramificação Else da sua atividade IF. Adicione a atividade Log dentro dessa nova atividade de Sequência. Alterne para a guia Propriedades e altere a propriedade Nível para Alto, Marcar para Rastreamento. Insira o seguinte na propriedade LogText: string.Join("\n", getDetailRetTable.item.Select (Function(item) item.MESSAGE ))
- Arraste e solte a atividade de Sequência na ramificação Then da atividade IF. Arraste e solte a atividade CreateAnchorAttribute existente na atividade de Sequência dentro da ramificação Then da atividade IF. Sua atividade ForEach agora tem esta aparência:
- Para cada propriedade de um usuário, como cidade, empresa, departamento, e-mail, adicione a atividade IF após a atividade CreateAnchorAttribute e verifique se há valores não vazios através da inserção de condições como
Not string.IsNullOrEmpty(address.city)
e adição de atividades CreateAttributeChange na ramificação Then dessa atividade IF.
Por exemplo: adicione atividades CreateAttributeChange para todas as propriedades do usuário usando esta tabela de mapeamento:
Propriedade do usuário do ECMA | Propriedade SAP |
---|---|
city | address.city |
department | address.department |
company | company.company |
address.e_mail | |
firstName | address.firstName |
lastName | address.lastName |
middleName | address.middleName |
jobTitle | address.function |
expirationTime | logonData.GLTGB |
telephoneNumber | address.TEL1_NUMBR |
- Por fim, adicione a atividade SetImportStatusCode após a última atividade CreateAttributeChange. Defina ErrorCode como Sucesso na ramificação Then. Adicione mais uma atividade de código SetImportStatus ao branch Else e defina ErrorCode como ImportErrorCustomContinueRun.
- Recolha a 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 a propriedade
selRangeTable.item(0).LOW
. Arraste e solte a atividade IF na atividade de Sequência dentro de DoWhile, coloque-a após a atividade IF já existente. Insira returnedSize>0 como Condição. Adicione a atividade Atribuir à ramificação Then da atividade IF e definaselRangeTable.item(0).LOW
comousersTable.item(returnedSize-1).username
.
Você concluiu a definição do fluxo de trabalho de importação completa.
Criando o fluxo de trabalho Exportar Adicionar
Para criar um usuário no SAP ECC, você pode chamar o programa BAPI_USER_CREATE1 e fornecer todos os parâmetros, incluindo um nome da conta e uma senha inicial. Se você precisar que um nome de conta seja gerado no lado do SAP, consulte o administrador do SAP e use uma função BAPI personalizada que retorne uma propriedade userName de uma conta de usuário recém-criada.
Este guia não demonstra a atribuição de licenças, grupos de atividades locais ou globais, sistemas ou perfis. Consulte o administrador do SAP e modifique esse fluxo de trabalho de acordo.
Não há necessidade de implementar a paginação em fluxos de trabalho de exportação. Há apenas um objeto objectToExport disponível no contexto do fluxo de trabalho.
- Navegue até Tipos de Objeto –> Usuário –> Exportar –> Adicionar fluxo de trabalho e, na Caixa de Ferramentas à direita, arraste e solte a atividade de Sequência no painel do designer de fluxo de trabalho.
- 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 variáveis a seguir. Para selecionar um tipo de variável gerado a partir do WSDL do SAP, clique em Procurar tipos e expanda gerado e, em seguida, expanda o namespace SAPECC. Isso inicializa as estruturas de dados usadas pelo programa BAPI_USER_CREATE1.
Nome | Tipo de Variável | Escopo | Padrão |
---|---|---|---|
address | SAPECC.BAPIADDR3 | Sequência | new BAPIADDR3() |
userName | String | Sequência | |
password | SAPECC.BAPIPWD | Sequência | new BAPIPWD() |
company | SAPECC.BAPIUSCOMP | Sequência | new BAPIUSCOMP() |
defaults | SAPECC.BAPIDEFAUL | Sequência | new BAPIDEFAUL() |
logOnData | SAPECC.BAPILOGOND | Sequência | new BAPILOGOND() |
bapiret2Table | SAPECC.TABLE_OF_BAPIRET2 | Sequência | new TABLE_OF_BAPIRET2() |
- Como definimos a propriedade userName como um ID imutável, uma âncora, precisaremos extrair o valor userName de uma coleção de âncoras de nosso objeto de exportação. Arraste e solte a atividade ForEachWithBodyFactory da Caixa de Ferramentas para a atividade de Sequência. Substitua o nome da variável do item por âncora, alterne para propriedades e escolha TypeArgument de
Microsoft.MetadirectoryServices.AnchorAttribute
. No campo Valor, digiteobjectToExport.AnchorAttributes
.
- Para extrair um valor de cadeia de caracteres de uma âncora userName, arraste e solte a atividade do Comutador dentro da atividade ForEach. Na janela pop-up, selecione o tipo de opção
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper
. Insira o valor da expressão de: New AnchorAttributeNameWrapper(anchor.Name). - Clique na área Adicionar novo caso da atividade do Comutador. Digite userName como Valor da Ocorrência. Arraste e solte a atividade Atribuir no corpo da ocorrência userName e atribua anchor.Value.ToString() para a variável userName.
- Agora que extraímos o valor userName da propriedade de âncora do objeto exportado, precisamos preencher outras estruturas, como empresa, padrões, endereço, dados de logon que contêm outros detalhes do usuário SAP. Fazemos isso percorrendo a coleção de alterações de atributos.
- Recolha a atividade ForEach e arraste e solte outra atividade ForEachWithBothFactory dentro da atividade de Sequência após a atividade ForEach existente. Substitua o nome da variável do item por attributeChange, alterne para propriedades e escolha TypeArgument de
Microsoft.MetadirectoryServices.AttributeChange
. No campo Valor, digiteobjectToExport.AttributeChanges
.
- Arraste e solte uma atividade do Comutador no corpo da 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 do Comutador sobre atributos não tratados definidos no esquema e não atribuídos a nenhuma propriedade.
- Clique em Adicionar nova área de ocorrência da atividade do Comutador e digite um valor de ocorrência de city.
- Arraste e solte uma atividade de Atribuição no corpo dessa ocorrência. Atribua
attributeChange.ValueChanges(0).Value.ToString()
a address.city.
- Adicione outras ocorrências e atribuições ausentes. Use esta tabela de mapeamento como guia:
Case | Atribuição |
---|---|
city | address.city = attributeChange.ValueChanges(0)Value.ToString() |
company | company.company = attributeChange.ValueChanges(0)Value.ToString() |
department | address.department = attributeChange.ValueChanges(0)Value.ToString() |
address.e_mail = attributeChange.ValueChanges(0)Value.ToString() | |
expirationTime | logOnData.GLTGB = attributeChange.ValueChanges(0)Value.ToString() |
firstname | address.firstname = attributeChange.ValueChanges(0)Value.ToString() |
lastName | address.lastname = attributeChange.ValueChanges(0)Value.ToString() |
middleName | address.middlename = attributeChange.ValueChanges(0)Value.ToString() |
telephoneNumber | address.TEL1_Numbr = attributeChange.ValueChanges(0)Value.ToString() |
jobTitle | address.function = attributeChange.ValueChanges(0)Value.ToString() |
export_password | password.BAPIPWD1 = attributeChange.ValueChanges(0)Value.ToString() |
Aqui export_password é um atributo virtual especial que é sempre definido no esquema e pode ser usado para passar uma senha inicial do usuário que está sendo criado.
- Recolha a atividade ForEach e arraste e solte a atividade IF na atividade de Sequência, após a segunda atividade ForEach, para validar as propriedades do usuário, antes de enviar a solicitação de criação de usuário. Precisamos de pelo menos 3 valores não vazios: nome de usuário, sobrenome, senha inicial. Insira esta condição:
(String.IsNullOrEmpty(address.lastname) = False ) AND (String.IsNullOrEmpty(userName) = False) AND (String.IsNullOrEmpty(password.BAPIPWD1) = False)
- Na ramificação Else da atividade IF, adicione mais uma atividade IF, pois queremos lançar erros diferentes dependendo do que está faltando. Insira o valor da condição: String.IsNullOrEmpty(userName). Arraste e solte as atividades
CreateCSEntryChangeResult
em ambas as ramificações da segunda atividade IF e configure o ErrorCode deExportErrorMissingAnchorComponent
eExportErrorMissingProvisioningAttribute
.
- Arraste e solte a atividade de Sequência na ramificação Then vazia da primeira atividade IF. Arraste e solte a atividade WebSeviceCall dentro da atividade de Sequência. Selecione o nome do serviço SAPECC, o ponto de extremidade ZSAPCONNECTORWS e a operação BAPI_USER_CREATE1. Clique no botão ... Argumentos para definir parâmetros para chamada de serviço Web da seguinte forma:
Nome | Direção | Tipo | Valor |
---|---|---|---|
ADDRESS | In | BAPIADDR3 | address |
EMPRESA | In | BAPIUSCOMP | company |
DEFAULTS | In | BAPIDEFAUL | defaults |
LOGONDATA | In | BAPILOGOND | logOnData |
PASSWORD | In | BAPIPWD | password |
RETURN | In-Out | TABLE_OF_BAPIRET2 | bapiret2Table |
SELF_REGISTER | No | String | "X" |
USERNAME | No | String | userName |
- Clique em OK. O sinal de aviso desaparece.
- Para processar os resultados da solicitação de criação do usuário, arraste e solte a atividade IF dentro da atividade de Sequência após a atividade WebServiceCall. Insira a seguinte condição:
IsNothing (bapiret2Table.item) OrElse bapiret2Table.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) <> 0
- Se não obtivermos erros, presumiremos que a operação de exportação foi concluída com êxito e desejamos indicar a exportação bem-sucedida desse objeto criando CSEntryChangeResult com o status Sucesso. Arraste e solte a atividade CreateCSEntryChangeResult na ramificação Else da atividade IF e selecione o código de erro Sucesso.
- Opcional: se a chamada de serviço Web retornar um nome da conta gerado de um usuário, precisamos atualizar um valor de âncora do objeto exportado. Para fazer isso, arraste e solte a atividade
CreateAttrubuteChange
dentro da atividadeCreateCSEntryChangeResult
e selecione Adicionar um userName. Em seguida, arraste e solte a atividadeCreateValueChange
dentro da atividadeCreateAttributeChange
e insira o nome da variável preenchida por uma atividade de chamada de serviço Web. Neste guia, você usará a variável userName que não é atualizada na exportação.
- A última etapa no fluxo de trabalho Exportar Adicionar é manipular e registrar erros de exportação. Arraste e solte a atividade de Sequência na ramificação Then vazia da sua atividade IF.
- Arraste e solte a atividade Log na atividade de Sequência. Alterne para a guia Propriedades e insira o valor LogText de:
bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E"))
.MESSAGE. Mantenha o nível de registros Altos em log e a Tag de rastreamento. Isso registra uma mensagem de erro no ConnectorsLog ou no log de eventos ECMA2Host quando o rastreamento detalhado está habilitado. - Arraste e solte a atividade do Comutador dentro da atividade de Sequência após a atividade Log. Na janela pop-up, selecione Tipo de cadeia de caracteres do valor do comutador. Insira a expressão a seguir:
bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E")).NUMBER
- Clique em Ocorrência padrão e arraste e solte a atividade CreateCSEntryChangeResult no corpo desta ocorrência. Escolha o código de erro ExportErrorInvalidProvisioningAttributeValue.
- Clique na área Adicionar nova ocorrência e digite um valor de ocorrência de 224. Arraste e solte a atividade
CreateCSEntryChangeResult
no corpo desta ocorrência. Escolha o código de erroExportErrorCustomContinueRun
.
Você concluiu a definição do fluxo de trabalho Exportar Adicionar.
Criação do fluxo de trabalho Exportar Excluir
Para excluir um usuário no SAP ECC, é possível chamar o programa BAPI_USER_DELETE e fornecer um nome de conta a ser excluído no sistema conectado. Consulte o administrador do SAP para saber se esse cenário é obrigatório, pois na maioria das vezes as contas SAP ECC não devem ser excluídas, mas expiradas para manter registros históricos.
Este guia não aborda cenários relacionados ao sistema de Administração do Usuário Comum do SAP, desprovisionamento de usuários de sistemas conectados, revogação de licenças, etc.
Não há necessidade de implementar a paginação em fluxos de trabalho de exportação. Há apenas um objeto objectToExport disponível no contexto do fluxo de trabalho.
- Navegue até Tipos de Objeto –> Usuário –> Exportar –> Excluir fluxo de trabalho e, na Caixa de Ferramentas à direita, arraste e solte a atividade de Sequência no painel do designer de fluxo de trabalho.
- 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 variáveis a seguir. Para selecionar um tipo de variável gerado a partir do WSDL do SAP, clique em Procurar tipos e expanda gerado e, em seguida, expanda o namespace SAPECC. Isso inicializa as estruturas de dados usadas pelo programa BAPI_USER_DELETE.
Nome | Tipo de Variável | Escopo | Padrão |
---|---|---|---|
userName | String | Sequência | |
bapiret2Table | SAPECC.TABLE_OF_BAPIRET2 | Sequência | new TABLE_OF_BAPIRET2() |
- Como definimos a propriedade userName como um ID imutável, uma âncora, precisaremos extrair o valor userName de uma coleção de âncoras de nosso objeto de exportação. Arraste e solte a atividade ForEachWithBodyFactory da Caixa de Ferramentas para a atividade de Sequência. Substitua o nome da variável do item por âncora, alterne para propriedades e escolha TypeArgument de
Microsoft.MetadirectoryServices.AnchorAttribute
. No campo Valor, digiteobjectToExport.AnchorAttributes
.
- Para extrair um valor de cadeia de caracteres de uma âncora userName, arraste e solte a atividade do Comutador dentro da atividade ForEach. Na janela pop-up, selecione o tipo de opção
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper
. Insira o valor da expressão de: NewAnchorAttributeNameWrapper(anchor.Name)
. Clique na área Adicionar novo caso da atividade do Comutador. Digite userName como Valor da Ocorrência. Arraste e solte a atividade Atribuir no corpo da ocorrência userName e atribuaanchor.Value.ToString()
à variável userName. - Arraste e solte a atividade WebSeviceCall dentro da atividade de Sequência após a atividade ForEach. Selecione o nome do serviço SAPECC, o ponto de extremidade ZSAPCONNECTORWS e a operação BAPI_USER_DELETE. Clique no botão ... Argumentos para definir parâmetros para chamada de serviço Web da seguinte forma:
Nome | Direção | Tipo | Valor |
---|---|---|---|
RETURN | Entrada/saída | TABLE_OF_BAPIRET2 | bapiret2Table |
USERNAME | No | String | userName |
- Clique em OK. O sinal de aviso desaparece.
- Para processar os resultados da solicitação de exclusão do usuário, arraste e solte a atividade IF dentro da atividade de Sequência após a atividade WebServiceCall. Insira a seguinte condição:
If(bapiRet2Table.item, Enumerable.Empty(Of BAPIRET2)()).Count(Function(errItem) errItem.TYPE.Equals("E") = True) <> 0
- Se não obtivermos erros, assumimos que a operação de exclusão foi concluída com êxito e queremos indicar a exportação bem-sucedida desse objeto criando
CSEntryChangeResult
com o status Sucesso. Arraste e solte a atividadeCreateCSEntryChangeResult
na ramificação Else da sua atividade IF e selecione o código de erro Sucesso.
- A última etapa no fluxo de trabalho Exclusão de Exportação é tratar e registrar erros de exportação. Arraste e solte a atividade de Sequência na ramificação Then vazia da sua atividade IF.
- Arraste e solte a atividade Log na atividade de Sequência. Alterne para a guia Propriedades e insira o valor LogText de:
bapiRetTable.item.First(Function(retItem) retItem.TYPE.Equals("E")= True).MESSAGE
. Mantenha o nível de registros Altos em log e a Tag de rastreamento. Isso registra uma mensagem de erro no log de eventos ConnectorsLog ou ECMA2Host quando o rastreamento detalhado está habilitado. - Arraste e solte a atividade do Comutador dentro da atividade de Sequência após a atividade Log. Na janela pop-up, selecione Tipo de cadeia de caracteres do valor do comutador. Insira a expressão a seguir:
bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E")).NUMBER
- Clique em Ocorrência padrão e arraste e solte a atividade CreateCSEntryChangeResult no corpo desta ocorrência. Escolha o código de erro ExportErrorSyntaxViolation.
- Clique na área Adicionar nova ocorrência e digite um valor de ocorrência de 124. Arraste e solte a atividade
CreateCSEntryChangeResult
no corpo desta ocorrência. Escolha o código de erroExportErrorCustomContinueRun
.
Você concluiu a definição do fluxo de trabalho Exportar Excluir.
Criação do fluxo de trabalho de substituição de exportação
Para atualizar um usuário no SAP ECC, você pode chamar o programa BAPI_USER_CHANGE e fornecer todos os parâmetros, incluindo um nome da conta e todos os detalhes do usuário, incluindo aqueles que não estão sendo alterados. O modo de exportação ECMA2 quando todas as propriedades do usuário devem ser fornecidas é chamado de Substituir. Em comparação, o modo de exportação de AttributeUpdate fornece apenas atributos que estão sendo alterados e isso pode fazer com que algumas propriedades do usuário sejam substituídas por valores vazios. Portanto, o conector de serviço Web sempre usa o modo de exportação Substituição de Objeto e espera que o conector seja configurado para Tipo de Exportação: Substituir.
O fluxo de trabalho Exportar Substituir é quase idêntico ao fluxo de trabalho Exportar Adicionar. A única diferença é que você precisa especificar parâmetros extras como addressX ou companyX para o programa BAPI_USER_CHANGE, onde X terminando no addressX indica que a estrutura do endereço contém uma alteração.
- Navegue até Tipos de Objeto –> Usuário –> Exportar –> Substituir fluxo de trabalho e, na Caixa de Ferramentas à direita, arraste e solte a atividade de Sequência no painel do designer de fluxo de trabalho.
- 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 variáveis a seguir. Para selecionar um tipo de variável gerado a partir do WSDL do SAP, clique em Procurar tipos e expanda gerado e, em seguida, expanda o namespace SAPECC. Isso inicializa as estruturas de dados usadas pelo programa BAPI_USER_CHANGE.
Nome | Tipo de Variável | Escopo | Padrão |
---|---|---|---|
userName | String | Sequência | |
bapiret2Table | SAPECC.TABLE_OF_BAPIRET2 | Sequência | new TABLE_OF_BAPIRET2() |
addressX | SAPECC.BAPIADDR3X | Sequência | new BAPIADDR3X() |
address | SAPECC.BAPIADDR3 | Sequência | new BAPIADDR3() |
companyX | SAPECC. BAPIUSCOMX | Sequência | new BAPIUSCOMX() |
company | SAPECC.BAPIUSCOMP | Sequência | new BAPIUSCOMP() |
defaultsX | SAPECC.BAPIDEFAX | Sequência | new BAPIDEFAX() |
defaults | SAPECC.BAPIDEFAUL | Sequência | new BAPIDEFAUL() |
logOnDataX | SAPECC.BAPILOGONX | Sequência | new BAPILOGONX() |
logOnData | SAPECC.BAPILOGOND | Sequência | new BAPILOGOND() |
Seu fluxo de trabalho de Exportar Substituir tem esta aparência:
- Como definimos a propriedade userName como um ID imutável, uma âncora, precisaremos extrair o valor userName de uma coleção de âncoras de nosso objeto de exportação. Arraste e solte a atividade ForEachWithBodyFactory da Caixa de Ferramentas para a atividade de Sequência. Substitua o nome da variável do item por âncora, alterne para propriedades e escolha TypeArgument de
Microsoft.MetadirectoryServices.AnchorAttribute
. No campo Valor, digiteobjectToExport.AnchorAttributes
.
- Para extrair um valor de cadeia de caracteres de uma âncora userName, arraste e solte a atividade do Comutador dentro da atividade ForEach. Na janela pop-up, selecione o tipo de opção
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper
. Insira o valor da expressão de: NewAnchorAttributeNameWrapper(anchor.Name)
. Clique na área Adicionar novo caso da atividade do Comutador. Digite userName como Valor da Ocorrência. Arraste e solte a atividade Atribuir no corpo da ocorrência userName e atribuaanchor.Value.ToString()
à variável userName. Seu fluxo de trabalho de Exportar Substituir tem esta aparência:
- Agora que extraímos o valor userName da propriedade de âncora do objeto exportado, precisamos preencher outras estruturas, como empresa, padrões, endereço, dados de logon que contêm outros detalhes do usuário SAP. Fazemos isso percorrendo a coleção de todos os atributos definidos no esquema.
- Recolha a atividade ForEach e arraste e solte outra atividade ForEachWithBothFactory dentro da atividade de Sequência após a atividade ForEach existente. Substitua o nome da variável do item por schemaAttr, alterne para propriedades e escolha TypeArgument de
Microsoft.MetadirectoryServices.SchemaAttribute
. No campo Valor, digiteschemaType.Attributes
.
- Arraste e solte a atividade de Sequência no corpo da atividade ForEach. No canto inferior esquerdo, localize o botão Variáveis e clique nele para expandir uma lista de variáveis definidas nesta sequência. Adicione a seguinte variável: xValue do tipo Cadeia de caracteres. Arraste e solte a atividade Atribuir em sua atividade de Sequência. Atribua a xValue a expressão de:
If(objectToExport.AttributeChanges.Contains(schemaAttr.Name), objectToExport.AttributeChanges(schemaAttr.Name).ValueChanges(0).Value.ToString(), String.Empty)
ele extrairá as alterações preparadas para exportação para esse atributo ou o inicializará com uma cadeia de caracteres vazia. Seu fluxo de trabalho de Exportar Substituir tem esta aparência:
- Arraste e solte a atividade de Comutador após a atividade Atribuir. No menu pop-up, selecione
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AttributeNameWrapper
e clique em Ok. Insira a expressão a seguir: NewAttributeNameWrapper(schemaAttr.Name)
. Você verá um ícone de aviso no canto superior direito da atividade do Comutador sobre atributos não tratados definidos no esquema e não atribuídos a nenhuma propriedade. Clique em Adicionar nova área de ocorrência da atividade do Comutador e digite um valor de ocorrência de city. Arraste e solte a atividade de Sequência no corpo deste caso. Arraste e solte a atividade Atribuir no corpo dessa ocorrência. Atribua o valor "X" a addressX.city. Arraste e solte outra atividade Atribuir no corpo dessa ocorrência. Atribua xValue a address.city. Seu fluxo de trabalho de Exportar Substituir tem esta aparência:
10.Adicione outras ocorrências e atribuições ausentes. Use esta tabela de mapeamento como guia:
Case | Atribuição |
---|---|
city | addressX.city = "X" address.city = xValue |
company | companyX.company = "X" company.company = xValue |
department | address.departmentX = "X" address.department = xValue |
addressX.e_mail = "X" address.e_mail = xValue | |
expirationTime | logOnDataX.GLTGB = "X" logOnData.GLTGB = xValue |
firstname | addressX.firstname = "X" address.firstname = xValue |
lastName | addressX.lastname = "X" address.lastname = xValue |
middleName | addressX.middlename = "X" address.middlename = xValue |
telephoneNumber | addressX.TEL1_Numbr = "X" address.TEL1_Numbr = xValue |
jobTitle | addressX.function = "X" address.function = xValue |
Seu fluxo de trabalho de Exportar Substituir tem esta aparência:
Antes de chamar o programa BAPI_USER_CHANGE, precisamos verificar se há nome de usuário não vazio. Recolha as atividades ForEach e arraste e solte a atividade IF após a segunda atividade ForEach. Insira a seguinte condição:
String.IsNullOrEmpty(userName ) = False
Quando o nome de usuário está vazio, queremos indicar que a operação não foi bem-sucedida. Arraste e solte a atividade
CreateCSEntryChangeResult
na ramificação Else da sua atividade IF e selecione o código de erroExportErrorCustomContinueRun
. Seu fluxo de trabalho Exportar Substituir tem esta aparência:Arraste e solte a atividade de Sequência na ramificação Then vazia da primeira atividade IF. Arraste e solte a atividade WebSeviceCall dentro da atividade de Sequência. Selecione o nome do serviço SAPECC, o ponto de extremidade ZSAPCONNECTORWS e a operação BAPI_USER_CHANGE. Clique no botão ... Argumentos para definir parâmetros para chamada de serviço Web da seguinte forma:
Nome | Direção | Tipo | Valor |
---|---|---|---|
ADDRESS | In | BAPIADDR3 | address |
ADDRESSX | In | BAPIADDR3X | addressX |
EMPRESA | In | BAPIUSCOMP | company |
COMPANYX | In | BAPIUSCOMX | company |
DEFAULTS | In | BAPIDEFAUL | defaults |
DEFAULTSX | In | BAPIDEFAX | defaultsX |
LOGONDATA | In | BAPILOGOND | logOnData |
LOGONDATAX | In | BAPILOGONX | logOnDataX |
RETURN | Entrada/saída | TABLE_OF_BAPIRET2 | bapiret2Table |
USERNAME | No | String | userName |
- Clique em OK. O sinal de aviso desaparece. Seu fluxo de trabalho de Exportar Substituir tem esta aparência:
- Para processar os resultados da solicitação do usuário de alteração, arraste e solte a atividade IF dentro da atividade de Sequência após a atividade WebServiceCall. Insira a seguinte condição:
Not IsNothing(bapiret2Table.item) AndAlso bapiret2Table.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) <> 0
- Se não obtivermos erros, presumiremos que a operação de exportação foi concluída com êxito e desejamos indicar a exportação bem-sucedida desse objeto criando
CSEntryChangeResult
com o status Sucesso. Arraste e solte a atividadeCreateCSEntryChangeResult
na ramificação Else da sua atividade IF e selecione o código de erro Sucesso. - Arraste e solte a atividade de Sequência na ramificação Then da atividade IF. Adicione a atividade Log com o valor LogText de
string.Join("\n",bapiret2Table.item.Where(Function(retItem) retItem.TYPE.Equals("E")).Select(Function(r) r.MESSAGE))
e a marca de erro. Adicione a atividadeCreateCSEntryChangeResult
após a atividade de Log com o código de erro deExportErrorCustomContinueRun
. Seu fluxo de trabalho de Exportar Substituir tem esta aparência:
Você concluiu a definição do fluxo de trabalho Exportar Substituir.
A próxima etapa é configurar o conector de serviço Web ECMA2Host usando este modelo.