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