GeneXus permite que objetos se comuniquem através de chamadas entre si ou com programas externos, passando informações por parâmetros. Os objetos podem ser chamados usando CALL ou UDP, declarando parâmetros no objeto chamado.
2. Os objetos GeneXus podem comunicar-se entre eles ou com outros programas externos.
Um objeto GeneXus pode chamar ou ser chamado por qualquer outro objeto, trocando informações
através de parâmetros.
Veremos em seguida como chamar desde um objeto a outro, e como especificar os parâmetros (no
objeto chamador e no chamado) para a troca da informação.
O esquema apresentado acima ilustra as possíveis interações entre objetos GeneXus para uma
aplicação Web. Observe que a flecha simples entre Web Panel e Procedimento PDF (assim como
entre Transação e Procedimento PDF) indica que uma web panel poderá chamar um Procedimento
PDF mas um Procedimento PDF não poderá chamar uma web panel (ou transação Web).
3. CALL - Permite chamar a um objeto GeneXus ou a um programa externo, podendo passar
parâmetros ou não.
UDP (User Defined Procedure)– Permite chamar a um objeto GeneXus ou programa externo tanto
passando parâmetros ou não, e com a particularidade de que o programa chamado retornará
necessariamente ao menos um valor ao programa que chamou. Em ambientes Web, um objeto
com interface uma vez chamado não devolve o controle ao chamador, porque a UDP é utiliza
unicamente para chamar Procedimentos e Data Providers (devido que estes cumprem com a
condição de executar e devolver o controle ao chamador).
Uma chamada (seja com CALL ou UDP) pode ser utilizado em distintas partes do objeto chamador,
dependendo se o mesmo é uma transação, wep panel, procedimento, etc.
A UDP pode utilizar-se também na definição de um atributo formula. Quer dizer que se define que
certo atributo é uma formula e que a definição da mesma consiste no chamada a um procedimento
utilizando UDP.
Quando na sintaxe da chamada se escreve o nome do objeto chamado e nenhum método de
chamada, se assume que se está chamando com udp, e pode ser omitida e escrever diretamente:
att|&var = PgmName( par1, ..., parN)
PARM – Quando um objeto é chamado desde outro com parâmetros, deve ter declarada a lista de
parâmetros que recebe. Esta declaração se realiza mediante a regra: PARM.
A continuação daremos mais detalhes sobre o uso de CALL, UDP e PARM.
4. Aqui mostramos um exemplo do uso do CALL para realizar uma chamada e outro exemplo do uso do
UDP.
Dependendo de qual objeto for o chamador, estas chamadas poderão escrever-se em uma seção ou
outra do mesmo, mas independentemente disso, aqui mostraremos que CALL permite chamar um
objeto com estilo de chamada a um programa, enquanto que UDP uma chamada a um objeto com
estilo de chamada em uma função.
No primeiro exemplo esta se utilizando CALL para chamar um procedimento pdf (objeto ListInvoice)
passando um parâmetro (InvoiceId). No procedimento chamado se declarou o parâmetro que recebe
(em sua seção de regras, mediante a regra parm).
No segundo exemplo é utilizado UDP para chamar um procedimento (objeto GetDiscount) passando
dois parâmetros (ProductId, CustomerId). Agora observemos na sintaxe da chamada ao
procedimento, que o mesmo retornará um valor (na variável &disc). Por este motivo no procedimento
solicitado são declarados três parâmetros utilizando a regra parm: os dois parâmetros recebidos + o
parâmetro de retorno no último lugar.
Podemos ver então que quando se utiliza CALL para chamar um objeto enviando-lhe N-parâmetros,
se devem declarar os N parâmetros (posicionais e do mesmo tipo de dados que os enviados) no
objeto solicitado mediante a regra parm.
Por outro lado quando se utiliza UDP para chamar um objeto enviando N parâmetros (exceto que seja
o caso particular de um Data Provider, caso que veremos mais adiante):
• na regra parm do objeto chamado se devem declarar N + 1
• o último parâmetro declarado na regra parm do objeto chamado corresponde ao que se encontra no
começo de tudo na chamada, é dizer, ao que recebe o valor retornado.
• em algum lugar do objeto chamado deverá ser atribuído valor ao parâmetro de retorno.
5. Ao definir uma Chamada a um objeto (seja utilizando CALL ou UDP), se tivermos que enviar dados
por parâmetro ao objeto chamado, precisamos determinar se enviaremos atributos e/ou variáveis: se
um dado a ser enviado por parâmetro, se encontra no objeto que o chamou, em um atributo, terá
que enviar o mesmo; e se estiver numa variável, terá que enviar a variável.
Todavia, ao declarar a lista de parâmetros no objeto chamado, o programador GeneXus deverá
decidir para cada parâmetro, se o declara como um atributo ou uma variável, independentemente de
como tenha sido enviado.
Qual é a diferença entre declarar o parâmetro como variável ou como atributo na regra parm do
objeto chamado? Se for declarar como uma variável, poderá utilizar livremente a mesma lógica do
objeto chamado: pode utilizá-la como condição de filtro por igualdade, por maior, maior ou igual,
menor, menor ou igual, LIKE, etc.; poderá utilizar para alguma operação aritmética, como bandeira
(flag), ou para o que se queira. Se for declarar um atributo, automaticamente o mesmo atuará como
filtro por igualdade no objeto, não sendo possível modificar o valor recebido.
Quando cheguemos à etapa do curso na qual podemos chamar a procedimentos pdf para listagem,
passando parâmetros, assim como a outros objetos, poderemos terminar de compreender melhor
este tema.
6. Como pode-se perceber claramente na sintaxe do exemplo o primeiro parâmetro definido é de saída, o
segundo parâmetro é de entrada, e o quarto parâmetro é de entrada-saída. Quando não for especificado,
como é o caso do terceiro parâmetro do exemplo, dependerá do seguinte:
• se o objeto foi chamado com CALL, o parâmetro, será de entrada-saída.
• se o objeto foi chamado com UDP, e se trata do último parâmetro, será de saída; e se for outro parâmetro
diferente do último, dependerá da linguagem de operação.
Declarar explicitamente como se quer que cada parâmetro opere, possui as seguintes vantagens:
1. Melhor especificação da semântica das interfaces; ou seja, o GeneXus e o programador quando trabalham
com um objeto, fica claro:
- se o mesmo chegar com valor e depois da execução do objeto chamado, é devolvido ao
objeto que o chamou o valor que tenha ficado (inout).
- se o mesmo chegar com valor e depois da execução do objeto chamado, não devolve ao
objeto que o chamou o valor que tenha ficado (in).
- se o mesmo não chegar com valor e depois da execução do objeto que o chamado, se
devolve ao objeto que o chamou o valor que tenha ficado (out).
2. Independência da linguagem de geração; isto é, se define explicitamente como deseja que cada parâmetro
opere, ao gerar as aplicações utilizando diferentes linguagens de geração não muda o comportamento dos
parâmetros baseados ao comportamento por default da linguagem de geração correspondente.
3. Otimizar a passagem de parâmetros de acordo com a arquitetura gerada (sendo uma vantagem que
contrasta com a anterior); isto se refere que para a maioria das linguagens é mais eficiente passar os
parâmetros por referência (inout) que por valor (in / out); mas em Java, por exemplo, os parâmetros somente
podem ser passados por valor, para poder obter esta funcionalidade de passá-los por referência é necessário
que exista conversões de parâmetros, que pode redundar em um overhead importante; por outro lado, quando
se trata de aplicações distribuídas (por exemplo Java com RMI ou HTTP), a utilização de parâmetros de tipo
out têm a vantagem de que não é necessário enviar parâmetro na chamada, diferente de definir os
parâmetros inout (tem que passar todos parâmetros); isto tem como conseqüência que serão enviados mais
bytes do que os necessários, o que é inconveniente especialmente nos casos como Internet.
7. A função Link se associa à propriedade link de um controle dentro de qualquer evento de uma
transação ou web panel, tendo como resultado que ao fazer click sobre dito controle se realiza a
chamada ao objeto URL referenciada no Link.
PgmName (o objeto chamado) poderá ser uma web panel, transação, ou procedimento PDF1.
______________________________________________________________________________
1 também um procedimento HTTP, mas não aprofundaremos sobre este conceito neste curso
8. O comando Link pode ser utilizado dentro de qualquer evento de uma transação ou web panel¹
Quando se execute o evento, ao chegar a sentença com o comando Link, se redirecionará em forma
automática à URL especificada.
No caso de utilizar-se o comando Link como no exemplo 1, chamando um PgmName (sendo
PgmName uma web panel, transação ou procedimento PDF), será equivalente à utilização do Call.
Opcionalmente se poderá passar parâmetros ao objeto chamado, devendo declarar-se os mesmos no
objeto chamado, com a regra parm.
_____________________________________________________________________________
1 também um procedimento HTTP, mas não aprofundaremos sobre este conceito neste curso