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

Duvida Como descobrir se a execução vem de uma Function

Discussão em 'Progress 4GL' iniciado por renato.schlogel, Fevereiro 4, 2015.

  1. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    Sei lá meu caro, agora deu certo mesmo, no program-name(2) tem a palavra function indicando que ele foi chamado pela função.
  2. renato.schlogel

    renato.schlogel Membro Participativo

    Bom dia Pessoal, Eu fiz o Código.

    Vejam a função "foiChamadoPorFuncao"..

    Neste momento,. o meu único problema, eh criar uma porteiro para uma rotina sem executa-la.

    Eu só sei fazer assim:

    Código:
    def var vl-handle as handle.
    run programa.p persistent set vl-handle.
    
    Nao sei se tem como criar o handle de outra forma.Pois se conseguisse, eu substituiria o this-procedure pelo handle.

    Código:
    def var vl-msg as char init 'uma mensagem qualquer~n'
                               .
    def frame f-tela
       vl-msg no-label view-as editor size 76 by 8
       with overlay side-labels centered 1 down row 12 col 2 width 78
       title ' MINHA MENSAGEM '.
    
    def var vl-cont as int.
    
    do vl-cont = 1 to 30.
       vl-msg = vl-msg + '~numa mensagem qualquer ' + String(vl-cont).
    end.
    
    Function foiChamadoPorFuncao return log().
    def var vl-cont as int no-undo.
    def var vl-encontrouFuncao as log init no no-undo.
    def var vl-program-name as char no-undo.
    {&debug}
    b-1:
    do on error undo b-1, leave b-1.
    
       do vl-cont = 3 to 200.
          vl-program-name = trim(program-name(vl-cont)).
         
          if vl-program-name eq ? then
             leave.
         
          if r-index( vl-program-name, ' ' ) gt 0 then do.
             if THIS-PROCEDURE:GET-SIGNATURE(
                    ENTRY(1, vl-program-name, ' ') ) begins 'function' then do.
                vl-encontrouFuncao = yes.
                leave.
             end.
               
          end.  
       end.
      
       return vl-encontrouFuncao.
    {catch.i}.
    end.
    {bib00199.i}.
    End Function.
    
    
    
    Procedure UmProcedimentoQualquer.
    b-1:
    do on error undo b-1, leave b-1.
    
       message 'Execucao iniciada por um procedimento' skip view-as alert-box.
    
       run meuProcedimento.
      
       return 'UmProcedimentoQualquer_ok'.
    end.
    message 'Ocorreu erro no ' program-name(1).
    readkey pause 9.
    End Procedure.
    
    
    Function umaFuncaoQualquer return log().
    b-1:
    do on error undo b-1, leave b-1.
    
       message 'Execucao iniciada por uma funcao' skip view-as alert-box.
       run meuProcedimento.
      
       return yes.
    end.
    message 'Ocorreu erro no ' program-name(1).
    readkey pause 9.
    End Function.
    
    
    Procedure meuProcedimento.
    b-1:
    do on error undo b-1, leave b-1 with frame f-tela.
    
       disp vl-msg.
       if foiChamadoPorFuncao() then
          repeat.
            readkey.
            if keyfunc(lastkey) ne 'return' then
               next.
            leave.  
          end. 
       else do.
    
          enable vl-msg.
          wait-for return,recall,go,tab of vl-msg.
          disable vl-msg.
    
       end.  
      
       hide frame f-tela no-pause.
       return 'meuProcedimento_ok'.
    end.
    message 'Ocorreu erro no ' program-name(1).
    readkey pause 9.
    End Procedure.
    
    run UmProcedimentoQualquer.
    umaFuncaoQualquer().

    Arquivos Anexados:

  3. Agnaldo

    Agnaldo Membro Ativo

    Por favor, atente que ele mostra a "frame" duas vezes.
    Veja na linha de baixo da tua tela que aparece a mensagem "Pressione barra de espaço para continuar", uma vez que ele mostra dua vezes o frame, visto que a função que tem o repeat é chamada duas vezes.
    Aqui coloquei um campo a mais para tu veres que são duas passadas mesmo.
    Código:
    define variable campo as character no-undo.
    DEFINE VARIABLE conta AS INTEGER.
    
    DEF VAR xx AS INT.
    
    function funcao return char():
        run meuprocedure.
    end function.
    
    xx = 1.
    run meuprocedure.
    xx = 2.
    assign campo = funcao().
    
    procedure meuprocedure:
        conta = 0.
        DISPLAY xx.
        REPEAT:
            conta = conta + 1.
            IF PROGRAM-NAME(conta) <> ?
               THEN
                   DISPLAY PROGRAM-NAME(conta) FORMAT "X(50)".
               ELSE
                   LEAVE.
        END.
    end procedure.
    
  4. Agnaldo

    Agnaldo Membro Ativo

    Dá uma olhada na documentação.
    Deve ter como usar o handle da programa (this procedure)
  5. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    Para pegar o handle principal não se usa ":pARENT" na variável ?
  6. renato.schlogel

    renato.schlogel Membro Participativo

    Nunca utilizei o ": PARENT" , vou dar uma pesquisada.

Compartilhe esta Página