terça-feira, 7 de julho de 2009

Datetime

Manipular tipos de dados Datetime é simples, ao contrário do que parece, basta utilizar as funções corretas.

Genexus possibilita a definição de atributos do tipo Date e DateTime, e em ambos os casos, no momento da criação na tabela, pelo menos no SQL Server, o que se cria na verdade é um DateTime.

O ambiente proporciona ainda duas variáveis &Time (caracter) e &Today (date), que retornam a hora e data atual respectivamente, e que facilitam a vida na hora da programação. As funções de manipulação de Data e Hora em Genexus normalmente operam em modo texto, também com o intuito de facilitar a vida.

Datetime

No caso de Datetime temos a função NOW() que retorna a combinação de Data+Hora, e que pode ser armazenada em um atributo Datetime, inclusive se este for uma fórmula definida na estrutura.

Já para o caso de operações de soma ou subtração de períodos Datetime, temos duas funções:

  • &result = TAdd(&date1, &sec) Retorna em &result a soma entre a data &date1 mais a quantidade de segundos informado em &sec.
  • &result = TDiff(&date1, &date2) Retorna em &result a diferença (em segundos) das datas &date1 e &date2

Caso seu interesse seja horas, divida o resultado de TDiff por 3600, mas não se esqueça de declarar &result com casas decimais, como Numeric(5.1), por exemplo.

Mais simples que isso, só as constantes data e datetime utilizando #, para se criar datas conhecidas e diferentes da atual, mas isso é assunto para outra publicação.

sexta-feira, 3 de julho de 2009

Web Service

Começei a estudar isso a um bom tempo, 2005 para ser mais preciso, lembro que um aluno meu, Fábio, inclusive escreveu sobre isso em uma monografia excelente, a qual fui orientador. E por causa disso mesmo, não me arrisquei a utilizar esse recurso. Muito bom, excepcional mas de difícil programação. Muitas definições, muitos acrônimos (SOAP, WSDL,..., XML),... vamos falar a verdade, isso assusta mesmo.

Acontece que quando precisamos não tem desculpas para não tentar, necessidade não pede licença. E foi isso que aconteceu, tive que programar o tal Web Service. E lendo o material da Artech sobre isso comecei a me assustar, porque novamente toda aquela teoria voltava, mas enfim vamos mandar ver.

Comecei programando uma Procedure, simples de inicio, que apenas devolvia uma mensagem a quem a chamasse e a fui incrementando de forma que essa mesma procedure inseria, ao final, um registro em uma tabela.



Programei as propriedades da Procedure, como indicado pela Artech:

Main program: true
Call Protocol: SOAP

Observe que na Procedure, que chamei de TicketWebServAdd, foi programada uma variável do tipo SDT, declarada como &ticket, que tinha alguns dos campos que seriam carregados remotamente, tipo TicketData, TicketTitulo, TicketComentario, coisas assim..., Essa SDT foi criada a partir de uma tabela Ticket, portanto, refletia a própria estrutura da tabela.

Em seguida, por recomendação da Artech, seria necessário executar a chamada a essa Procedure, mais com uma pequena alteração, colocando-se um 'a' antes do nome da Procedure, e também passando como parâmetro wsdl. A URL resultante foi: http://localhost/Academica.TicketSystem.NetEnvironment/aticketwebservadd.aspx?wsdl

O IE respondeu com um belo XML cheio de informações, que bom parece que funcionou! Pela minha experiência no assunto, me parecia que a Procedure estava na Web pronta para responder às chamadas.


Tratei da outra ponta então, do programa consumidor, em outra KB. Para isso, primeiramente executei nessa nova KB a ferramenta WSDL Import (Tools->Application Integration->WSDL Import). Informando apenas a mesma URL anterior, e pressionando NEXT.


E em seguida IMPORT.


Genexus criou dois objetos na KB consumidora, um External Object, chamado de TicketWebServAdd, e uma SDT TicketWebServAddTicket_SDT. Que interessante, a ferramenta WSDL Import trouxe a definição da SDT que havia programado na outra KB para dentro desta nova.

Dai foi só colocar num painel as variáveis de entrada e programar a chamada do Web Service, que ficou mais ou menos assim:


E no botão Confirmar, a chamada ao evento 'ENTER' que carregava a SDT de informação e a passava para o External Object.



Só isso? não se esqueça que a variável &ticket foi declarada como uma TicketWebServAddTicket_SDT e a &ticketws como TicketWebServAdd. E ainda que na chamada, a variável &ticket está sendo passada, portanto na Procedure (da outra KB) deve haver uma regra Parm programada. A minha foi programada assim:



O resultado! ao rodar o Painel (Consumidor na KB cliente), o registro era inserido na tabela Ticket pela Procedure (Web Service na KB remota).



Bom, estou até envergonhado, quando comecei a escrever esse artigo pensei em fazer algo diferente do que a própria Artech já havia feito e escrito, mas no final das contas ficou igual :(. Falta então explicar o que é um Web Service, assim fica pelo menos diferente na ordem das coisas, e vou tentar fazer isso de forma bem simples em um único parágrafo.

"Web Service é um recurso de integração entre aplicações distintas, com diferentes linguagens, plataformas, banco de dados, por meio de chamadas através da Internet. Em outras palavras, um programa que conecta aplicações distintas na Web. "

Já pensou em quantas coisas legais dá pra fazer com isso! até ligar sistemas legados à Web.

É isso, palmas para Artech que conseguiu transformar um Dragão em uma Cinderela.