Em um exemplo anterior escrevi um artigo de como fazemos para usar o ForEach do BPEL, mas neste exemplo estarei mostrando uma forma mais prática ou mais usual que é usado no dia a dia, onde fazemos a invocação de um serviço que retornará uma lista de Empregados no Oracle XE e posteriormente iremos trabalhar na iteração desta lista.
Neste primeiro passo faça o download do arquivo ForEachMaisPratico.zip e extraia o nosso WSDL que usaremos para nosso exemplo.
Crie um novo projeto chamado ForEachMaisPratico
Dentro do seu composite.xml arraste um Database Adapter para External References e dê o nome de ListaEmpregadosDbAdapter
Aqui explicarei rapidamente as opções que estou selecionando visto que nosso foco será nosso ForEach
Selecione a opção Select
Estou aqui importando a tabela EMPLOYEE
Abaixo cliquei em Remove para remover os dois relacionamentos que Neste Caso NÃO são necessários.
Veja abaixo os campos que faremos o Select.
Temos então nosso DBAdapter Criado.
Copie o arquivo ForEachMaisPratico.wsdl para dentro do seu projeto BPEL
Arraste agora um BPEL Process e escolha a opção Base on a WSDL para selecionar este WSDL
Depois ligue o BPEL no nosso DBAdapter
Abra o ForEachBPEL e dentro dele arraste um Invoke e aponte para nosso Partner Link
Dê o nome de Invoke_ListaEmpregados, crie as variaveis de input e OutPut
Deverá ficar conforme abaixo:
Vamos agora criar uma variável para referenciar nosso Response do WSDL
Clique então no (X) conforme abaixo para criarmos essa variável
Dê o nome de var_consultarEmpregadosResponse e escolha a opção Element e clicando na Lupa navegue nas pastas conforme abaixo até chegar dentro do nosso WSDL na operação ConsultarEmpregadosResponse
Clique em OK acima e ficará conforme abaixo:
Clique agora ainda nesta caixa, na aba Initialize para inicializarmos nossa listaEmpregado conforme a operação ConsultarEmpregadosResponse em nosso WSDL
Já na aba Initialize na opção Type selecione Literal e dentro cole o trecho de XML abaixo:
<ConsultarEmpregadosResponse xmlns="br.com.uanscarvalho.model"> <listaEmpregado> </listaEmpregado> </ConsultarEmpregadosResponse>
Para que você entenda o XML:
Estou colocando as tags da nossa operação de Response e na frente dela coloco em xmlns o targetNamespace do nosso WSDL
Dentro da operação de Response coloco a listaEmpregado conforme está no WSDL
Após clicar em OK acima, ficará conforme abaixo:
Arraste agora um ForEach abaixo do nosso Invoke_ListaEmpregados
Dê um duplo clique sobre a caixa do nosso ForEach para edita-lo
Em Name: coloque ForEach e em Counter Name: coloque ForEachCounter
Clique agora na aba Counter Values e em na primeira Expression coloque o numero 1 e na segunda Expression clique ao lado no ícone onde parece ser uma calculadora
Abaixo faça por partes o seguinte:
Coloque primeiro a função ora:countNodes()
Agora dentro da função coloque duas aspas simples e DENTRO da aspas simples aperte a tecla CONTROL + ESPAÇO e escolha a opção Invoke_ListaEmpregados_ListaEmpregadosDbAdapterSelect_OutputVariable do seu teclado
Continuando, agora ao lado da aspas simples coloque uma virgula e mais uma aspas simples, aperte a tecla CONTROL + ESPAÇO novamente e escolha então a opção EmployeeCollection
Novamente ao lado da aspas simples coloque mais uma virgula e mais uma aspas simples e escolha a opção ns3:Employee/
Agora ao lado da / aperte novamente CONTROL + ESPAÇO do seu teclado e escolha a opção ns3:empno e ao lado feche a tag acrescentando uma aspas simples e ficará conforme abaixo (Veja e expressão inteira)
Obs: Aqui coloquei passo a passo a expressão porque é muito importante as aspas simples e a virgula entre eles ou nosso ForEach não funcionará
countNodes('Invoke_ListaEmpregados_ListaEmpregadosDbAdapterSelect_OutputVariable','EmployeeCollection','ns3:Employee/ns3:empno')
Ficará então conforme abaixo:
Dentro do ForEach ao lado esquerdo clique no (X) para adicionarmos mais uma variável (Este (X) está dentro de nosso Escopo) conforme abaixo:
Esta variável fará referencia ao tipoEmpregado que também referencia o EmpregadoType conforme linha abaixo do nosso WSDL:
<xsd:element name=”tipoEmpregado” type=”inter:EmpregadoType”/>
Obs: Este elemento foi criado exclusivamente para ser usado em nosso ForEach para representar nosso EmpregadoType o qual tem os outros elementos que compõem nosso EmpregadoType como codigoEmpregado, nomeEmpregado e etc..
<xsd:element name=”tipoEmpregado” type=”inter:EmpregadoType”/> <xsd:complexType name=”EmpregadoType”> <xsd:sequence> <xsd:element name=”codigoEmpregado” type=”xsd:integer”/> <xsd:element name=”nomeEmpregado” type=”xsd:string” /> ... </xsd:sequence> </xsd:complexType
Dê o nome de var_tipoEmpregado e escolha a opção Element e clicando na Lupa navegue nas pastas conforme abaixo até chegar dentro do nosso WSDL no tipoEmpregado
Clique em OK e ficará conforme abaixo:
Clique novamente em OK
Arraste agora um Assign abaixo do nosso ForEach e dê o nome de Seta_Index_Nas_Variaveis
Abra agora este Seta_Index_Nas_Variaveis e dentro dele ligue nosso ns3:empno que está ao lado esquerdo que é o elemento de resposta do nosso Invoke para o ns1:codigoEmpregado ao lado direito que está dentro da variável var_tipoEmpregado que criamos dentro do Scope1 conforme abaixo:
Dê agora um duplo clique na linha que ele criou mas do lado do From e você verá a tela abaixo:
Em Empression coloque ao lado do ns3:Employee o [$ForEachCounter].
Veja a expressão como ficará:
Obs: Veja que o [$ForEachCounter] está entre colchetes e está antes da barra / do ns3:empno
$Invoke_ListaEmpregados_ListaEmpregadosDbAdapterSelect_OutputVariable.EmployeeCollection/ns3:Employee[$ForEachCounter]/ns3:empnovoke_ListaEmpregados_ListaEmpregadosDbAdapterSelect_OutputVariable.EmployeeCollection/ns3:Employee[$ForEachCounter]/ns3:empno
Clique em OK e agora repita todo este procedimento para os demais elementos colocando também o nome [$ForEachCounter] antes de cada elemento dentro da Expression
Clique em OK e abaixo do Seta_Index_Nas_Variaveis arraste um IF
Aqui vou acrescentar uma lógica bem simples apenas para que você entenda que aqui deverá ser sua lógica
Neste IF estarei colocando SE o nome do Empregado for igual a UANS, deverá acrescentar 100 ao salário mostrando também os demais elementos da lista
Mas é interessante você prestar atenção que estou usando da variável var_tipoEmpregado pois foi nela que atribuímos nosso response de nossa Consulta(Invoke) conforme passos acima
Dentro do IF no caso de ser verdadeiro acrescente um Assign para podermos adicionar 100 ao salário
Aqui eu liguei salário com salário mas ao acrescentar o valor + 100 ele mesmo joga essa linha para o ns1:tipoEmpregado (isso é normal)
Dei o nome para esta Assign de Adicona_100_salario_UANS e ao lado direito no ELSE arraste uma EMPTY e dê o nome de Continua_Fluxo
Ainda dentro do seu ForEach abaixo do seu IF acrescente mais um Assign e dê o nome de Adiciona_na_Lista
Abra esse Assign e faremos então a atribuição da nossa variável var_tipoEmpregado para nossa variável var_ConstaEmpregadosResponse que criamos no começo do nosso Fluxo:
Para que você entenda:
A variável var_tipoEmpregado já esta sendo preenchida a cada execução do Loop e depois estamos adicionando estes dados na nossa listaEmpregado que é o elemento dentro do nosso Response do WSDL no caso o ConsultaEmpregadosResponse
Após esta ligação ao lado do From você deverá clicar com o botão direito e deverá aparecer um pequeno menu conforme abaixo, então vá até Change rule type e escolha a opção Append
Após o passo acima, agora para terminar, fora do nosso ForEach acrescente mais um Assign e dê o nome de Seta_OutPut
Neste Assign apenas adicionaremos o conteúdo de nossa variável var_ConstaEmpregadosResponse que já foi toda preenchida por causa do nosso FOR para nosso OutPut e devolver esse resultado
Aqui eu liguei o var_consultarEmpregadosResponse ao ns1:ConsultarEmpregadosResponse do outputVariable mas é normal ele ficar ligado no parameters conforme acima
Pronto, agora é só fazer o deploy do nosso projeto e testar.
Abaixo mostro UMA PARTE do XML retornado após nosso Teste.
Veja acima que onde está o salário para o nomeEmpregado UANS ele adicionou 100, retornando o valor de 1100.
Abaixo o Select na Tabela:
Duvidas ? Deixe seu comentário e faça download deste Projeto
Abraços e até a Próxima
/:-D