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?
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.
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.
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 ....
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.
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