Chamadas dinâmicas de Rotinas

Não sei se já aconteceu com vocês, mas dependendo do nível de reaproveitamento de código da sua aplicação podemos ter a necessidade de chamarmos uma PROCEDURE ou FUNCTION que não sabemos o nome ou que não sabemos o numero de parâmetros.
Para isso existe uma solução muito interessante.
Todas AS procedures e functions do PROGRESS são executadas internamente através de uma instancia de CALL.
Então para podermos fazer uma chamada dinâmica precisamos apenas de uma instancia de CALL.

Vamos criá-la então.

DEFINE VARIABLE hCall AS HANDLE.

DEF VAR tipo AS CHAR.

DEF VAR opcao AS INTEGER.

CREATE CALL hCall.

Agora para testar o funcionamento vamos criar duas funções simples:

FUNCTION mostraString RETURNS CHAR (INPUT a AS INT, INPUT b AS CHAR):

MESSAGE ‘String é ‘ b
VIEW-AS ALERT-BOX INFO BUTTONS OK.

END FUNCTION.

FUNCTION mostraInteiro RETURNS CHAR (INPUT a AS INT, INPUT b AS CHAR):

MESSAGE ‘Inteiro é ‘ a

VIEW-AS ALERT-BOX INFO BUTTONS OK.

END FUNCTION.

Vamos dar ao usuário a opção de escolher qual PROCEDURE vai ser executada:

UPDATE opcao.

CASE opcao :

WHEN 1 THEN ASSIGN tipo = ‘mostraString’.

WHEN 2 THEN ASSIGN tipo = ‘mostraInteiro’.

END CASE.

E NO final vamos chamar a PROCEDURE escolhida

hCall:CALL-NAME = tipo.

hcall:CALL-TYPE = 2.

hCall:NUM-PARAMETERS = 2.

hCall:SET-PARAMETER( 1, “INTEGER”, “INPUT”, 20).

hCall:SET-PARAMETER( 2, “CHARACTER”, “INPUT”, “USA”).

hCall:INVOKE.

E eliminar o objeto CALL.

DELETE OBJECT hCall.

Lembramos que obviamente nesse exemplo não era necessário o uso DO CALL.

O CASE sozinho resolveria o problema. Mas a idéia e mostrar que você pode fazer qualquer coisa, ate mesmo salvar em uma tabela DO banco o nome da PROCEDURE, basta criatividade.

Abraço Galera

E não esqueça qualquer duvida entrem nos comentarios

Você pode gostar...

Deixe um comentário

O seu endereço de e-mail não será publicado.