1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

  2. Anuncie Aqui ! Entre em contato fdantas@4each.com.br

Chamadas dinâmicas de Rotinas

Discussão em 'Progress 4GL' iniciado por fdantas, Fevereiro 8, 2009.

  1. fdantas

    fdantas Administrator Moderador

    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.

    Código:
    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:

    Código:
    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:


    Código:
    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

    Código:
    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.

    Código:
    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

Compartilhe esta Página