domingo, 29 de abril de 2012

Transação exposta como Web Service

Um dos recursos interessantes que podemos utilizar no Genexus são os webservices, que tem por finalidade permitir um mecanismo de comunicação entre duas aplicações distintas.  O processo mais comum de utilizar esse mecanismo é mediante o objeto Procedure, mas Gx também permite que Data Provider e Transação também sejam expostas desta forma.   Esse post tratará de desenvolver webservices de transações.

Por que WebService é interessante?
Um dos nossos maiores problemas é o avanço tecnológico, e por que isso gera problema? Os sistemas vão ficando obsoletos com o passar do tempo e aquela tecnologia que foi selecionada na época e foi tão eficaz durante certo tempo, deixa de ser suficiente para atender às novas demandas das pessoas e processos.  Por exemplo, um ótimo sistema programado lá atraz com dBase ou Clipper, atualmente não funciona em uma camada web ou mesmo smartdevice, simplesmente porque essas tecnologias morreram no meio do caminho, e muitas outras também como Visual FoxPro, Visual Basic, Cobol.  Algumas inclusive se adaptam melhor a evoluções, como Java que foi se adaptando com o passar do tempo, mas também essa está fadada há acabar um dia.

Então o que ocorre com essa proliferação imensa de sistemas obsoletos de distintas tecnologias rodando em uma empresa, sendo que muitos dos quais ainda operam de forma eficiente em seus processos. A resposta: ficam isolados em seus processos, ou mesmo, sofrem atualizações tecnológicas (são reprogramados).

Uma solução mais simples seriam interligar novos sistemas (mais tecnológicos) aos bancos de dados dos sistemas antigos (obsoletos) para se buscar uma conexão entre eles.  Esse mecanismo é provido por Data Views, que também é um método de conexão entre sistemas, mas com a desvantagem de que a base de dados deve estar disponível para acesso, não apenas read-only, por outros sistemas.

Uma solução mais inteligente seria interligar os novos sistemas aos sistemas obsoletos por meio de uma camada de comunicação, fazendo com que o sistema novo consuma uma informação do sistema antigo, sem o conhecer, ou seja, não interferem em suas regras de negócio, estrutura funcional, tabelas, campos, ou seja, apenas solicita uma informação e o sistema antigo a devolve para ser processada no sistema novo.  Esse mecanismo é chamado de Web Service e essa funcionalidade é apenas uma visão simples de sua utilidade.

Transação como WebService
Então imagine estar em um sistema de Faturamento e ter acesso a um formulário do sistema de Custos, mas sem acessar diretamente as tabelas do sistema de Custos. Desta forma poder-se-ia ajustar certos valores (controlados) no sistema de Custos na interface do sistema de Faturamento.  Interessante hein?

Esse recurso é interessante porque normalmente consideramos webservices não diretamente sob o ponto de vista de interfaces para usuários, mas procedures e mecanismos que rodam de forma oculta dos usuários.

Considerando que já temos à nossa disposição um objeto que já realiza insert, update e delete, que é a transação, é sobre ele que trabalharemos. E no melhor estilo GeneXus o que precisamos apenas é definir uma propriedade na Transação: Export as WebService.  Isso possibilita que um Business Component (Transação marcada como BC), possa ser acessado por qualquer usuário de outro sistema, bom, não se esqueça de integrar nisso tudo um mecanismo de segurança.

Exemplinho
Então vamos a um exemplo simples, imagine uma transação de Pais que se encontra em uma determinada Kb qualquer, que definimos com um papel de produtor de informação, ou seja, tem a funcionalidade de criar países em sua própria Kb e também permitirá o acesso remoto desta operação em outras kb´s.



Sem muita complicação na estrutura, mas que foi marcada como Business Component e com a propriedade Expose as WebService=True.


Ao executar essa aplicação, o objeto Pais_BC passa a ser acessível no browser como um arquivo WSDL.  Ou seja, responde a uma chamada web service.
 
Desta forma, podemos em um sistema consumidor, definir certa interface para acessar esse objeto para realizar operações, como falamos de transação, de inserção, atualização e remoção de registros de certa tabela. Nessa nova Kb o que teríamos é um objeto externo, obtida pela operação Tools->Application Integration->WSDL Import, que apontado para o endereço do WDSL exemplificado na imagem anterior, nos devolveria três objetos:
 
Um External Object chamado de Pais_BCBC, e dois SDT´s denominados Pais_BCBCPais e Pais_BCBCMessages_Message.  O primeiro SDT traz a estrutura da transação mais alguns atributos de controle e o segundo as mensagens devolvidas pelas operações.

A partir do External Object teríamos a possibilidade de criar variáveis (ou objetos) do tipo Pais, e operar as três operações essenciais: Insert, Update e Delete, ou na linguagem de Business Component: Load, Save e Delete.
 
Apesar de termos agora a possibilidade de operar remotamente a transação em qualquer objeto Gx desta nova kb, poderíamos inclusive, gerar um formulário de Pais e inserir registros nessa tabela remota, que podemos fazer por meio de um webpanel.

Nesse nosso teste é carregar o pais 1, por meio deste objeto externo e apresentá-lo na interface, o método LoadKeySvc realiza a carga de um registro no WebService.  Um evento Enter faz o papel de atualizar a informação, por meio do método SaveSvc.

Event Start
    &Messages = &Pais.LoadKeySvc(1, &Pais_SDT)
    do 'MessagesShow'
EndEvent

Event Enter
     &Messages = &Pais.SaveSvc(&Pais_SDT)
    do 'MessagesShow'
EndEvent

Sub 'MessagesShow'
    for &Message in &Messages
         msg(&Message.Description)
    endfor
EndSub

Se você tem dificuldades em determinar os tipos das variáveis, ai vai uma ajudinha.

A interface mais simples é inserir a variável &Pais na tela, que é apresentada no formato de uma tabela com campos. Se quiser simplificar, arraste a variável &Pais_SDT, para a interface que o GeneXus monta o formulário.



Finalmente, ao executar o formulario remotamente verá que é possível alterar um registro de Pais estando em outro sistema. A operação remota produz o mesmo efeito da manipulação do formulário da transação na Kb original. 

Conclusão
Se você tem por objetivo dividir seu projeto em kbs isoladas, e se a quebra de intregridade referencial provocada por essa divisão não afetar significativamente seu modelo, então temos aqui um recurso excepcional para trabalhar com informações que não precisam estar em uma mesma base de dados, ou sistema, enfim, temos em nossa mão um mecanismo para acessar e operar informações de tabelas distantes.

Observe o quão simples foi fazer tudo isso em GeneXus, visto que a complexidade envolvida no processo limitou-se a compreensão de meras propriedades e objetos.  Portanto, com um pouco de investimento cerebral é possível pensar em sistemas mais modularizados, melhores e mais eficientes, e também reaproveitar o que está pronto sem ter que reprogramar tudo.

Controle remoto? sim, eficiente, interessante e muito simples.

Maiores informações em:

quarta-feira, 18 de abril de 2012

Que tal começar?

Agora pessoal não tem volta, GeneXus é Smartdevices Enabled, só não faz quem não quer (ou não tem, rs...), então, mãos na massa e vamos programar algo no Android.  Faz um certo tempo que já venho fazendo aplicaçõezinhas despretenciosas no EV2 Beta, mas a versão final publicada com certeza quebra todas as expectativas.

Recomendo iniciar com o My First Android Application (http://wiki.gxtechnical.com/commwiki/servlet/hwiki?My+First+Android+Application,) que é uma excelente fonte para iniciar.  A parte mais chata é a instalação do próprio SDK Android, aproximadamente 3.7Gb, e até 12 horas, dependendo da conexão (http://wiki.gxtechnical.com/commwiki/servlet/hwiki?Android+SDK,), mas não tem escapatória, tem que instalar.  As vezes ainda tem que se atualizar, como foi o caso abaixo:

error:
error: BUILD FAILED
error: C:\Models\Manicure\JavaModel\mobile\Android\SalaoVirtual\build.xml:83: Cannot find C:\Android\android-sdk\tools\ant\build.xml imported from C:\Models\Manicure\JavaModel\mobile\Android\Teste\build.xml
error:
error: Total time: 0 seconds
error: Android SDK Tools version 14 or greater is required. Version 13 was found.
Android Compilation Failed
Run Teste Failed

Observe que na documentação da Artech para instalação do SDK é necessário instalar os pacotes da versão 15 e 7.

Nesse exemplo simples cria-se uma transação e em seguida aplica-se o pattern Work With SmartDevices, e um objeto DashBoard para se montar o menu. Uma dica importante, pois o exemplo é simples de se seguir, é definir o DashBoard como Startup Application, caso contrário uma mensagem (...apk) is not available será apresentada indicando que não tem aplicação possível para ser instalada no SD.

Para instalar a aplicação no SmartDevices recomendo o uso do APP QrDroid que é gratuito e pode ser obtido no Android Market. Basta escanear o QRCode que o próprio Gx gera no DeveloperMenu, e a URL onde se encontra a aplicação (APK) será disponibilizada para download e instalação no aparelho.


A pior parte vem agora, que é ter uma idéia fresca, boa e simples para aproveitar essa onda.  Mesmo porque nossa cabecinha, meio obsoleta, insiste em pensar em aplicações Web corporativas, com suas tabelas, fluxos, transações, ..., nada Facebook enabled.  Aliás a nova dessa semana é que o Facebook desbancou a Google em número de acessos no Brasil. (http://blogs.estadao.com.br/link/facebook-ultrapassa-audiencia-do-google/)


segunda-feira, 2 de abril de 2012

Evento Genexus Brasil

O que você pretende fazer no dia 11 de abril? anote ai na sua agenda, a Artech promoverá o IX Encontro Genexus Brasil, e a grande novidade será o lançamento da versão GeneXus X Evolution 2.