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