Duvida É possível alterar um frame dinamicamente?

Discussão em 'Progress 4GL' iniciado por renato.schlogel, Outubro 5, 2016.

  1. renato.schlogel

    renato.schlogel Membro Participativo

    Problema:
    Em uma mesma rotina, as vezes tenho que fazer mais de um tipo de entrada de dados(ex: uma para relatorio, e uma para inclusão). Porem as entradas de dados devem ser em frames diferentes, por conta de particularidades de cada uma. Desta forma, para fazer o update de um campo, que eh utilizado nas duas entrada de dados(dois frames), eu sou obrigado a duplicar o código, e fazer o update duas vezes.


    Gostaria de saber se tem como setar o frame dinamicamente, talvez com persistência, algo do tipo.

    Abaixo um exemplo, do que gostaria de fazer:


    Código:
    def var vl-data as date form '99/99/9999' no-undo.
    
    def frame f-um
       skip(2)
       vl-data
       skip(2)
       with overlay side-labels centered 1 down row 5 col 2 width 78
       title ' frame um '.
    
    def frame f-dois
       vl-data
       skip(14)
       with overlay side-labels centered 1 down row 5 col 2 width 78
       title ' frame dois'.
    
    procedure updateData.
    repeat on error undo, leave
           on endkey undo, return 'updateData_f4' with frame f-um. /* <<< gostaria de poder setar o frame */
    
       update vl-data.  /*  Talvez aqui ?  mas sem duplicar o update, digo dois frames, mas poderia ser mais */
    
       if vl-data gt today then do.
           message 'Data invalida!' skip view-as alert-box.
           next.
       end.
    
       return 'updateData_ok'.
    end.
    message 'Ocorreu um erro na ' program-name(1) view-as alert-box.
    undo, return error.
    End Procedure.
    
    O que acham?
  2. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    Será que assim serve ????

    Código:
    def var vl-data as date form '99/99/9999' no-undo.
    
    def frame f-um
       skip(2)
       vl-data
       skip(2)
       with overlay side-labels centered 1 down row 5 col 2 width 78
       title ' frame um '.
    
    def frame f-dois
       vl-data
       skip(14)
       with overlay side-labels centered 1 down row 5 col 2 width 78
       title ' frame dois'.
    
    run updateData('f-dois').
    
    procedure updateData:
        define input parameter frameName as character.
        repeat on error undo, leave
           on endkey undo, return 'updateData_f4':
       
            case frameName:
                when 'f-um' then do:
                    view frame f-um.
                    update vl-data with frame f-um.
                end.
                when 'f-dois' then do:
                    view frame f-dois.
                    update vl-data with frame f-dois.
                end.
            end case.
        assign vl-data.
       
        if vl-data gt today then do.
           message 'Data invalida!' skip view-as alert-box.
           next.
        end.
       
        return 'updateData_ok'.
        end.
        message 'Ocorreu um erro na ' program-name(1) view-as alert-box.
        undo, return error.
    End Procedure.
    
  3. renato.schlogel

    renato.schlogel Membro Participativo

    Primeiramente obrigado pela resposta!

    Então, seria mais ou menos essa a ideia, do passar o frame por parâmetro. Porem não queria precisar tratar todas as possibilidades.

    Não sei, talvez algo assim:
    Código:
    procedure updateData.
    define input parameter frameName as character.
    
       update vl-data with frame value(frameName).
    
        return 'updateData_ok'.
    End Procedure.
  4. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    não, não aceita value() na frame.

    O que vc pode fazer, usando aqueles comandos que usamos em upcs de tela para achar um campo em frames, vc passa o nome da frame e o nome do campo, localiza vl-data e valida, entendendo que vc esteja em um ambiente grafico, usando telas assincronas (wait-for), que é o padrão das telas feitas pelo appBuilder, ou ainda pode fazer uma trigger ......
    Código:
    on leave anywhere do:
        if self:name = "vl-data" then do:
            if self:value > today then do:
                message "data invalida"
                    view-as alert-box info buttons ok.
                    return no-apply.
            end.
        end.
    end.
    Com esse codigo, pode ter 20 frames que o teste funciona ....
    renato.schlogel curtiu isso.
  5. renato.schlogel

    renato.schlogel Membro Participativo

    Obrigado ...

    Vou dar uma estudada na sua ideia, e ver se consigo utilizar.

    Estou querendo desenvolver bibliotecas com os tipos de update para poder reaproveitar em qualquer parte do sistema.

    vlw pelas idéias.
  6. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    então mude o seu foco, as telas são cascas, trate as validações sempre depois do botão OK, não valide nada nas telas, o maximo um zoom
    renato.schlogel curtiu isso.

Compartilhe esta Página