[RESOLVIDO] Iniciação em UPCs

Discussão em 'EMS , HCM e Totvs 11' iniciado por andivieira, Janeiro 15, 2015.

Status do Tópico:
Não esta aberto para novas mensagens.
  1. andivieira

    andivieira Sem Pontuação

    Bom dia pessoal, tudo bem?

    Sou iniciante no progress, e principalmente no desenvolvimento de UPCs. Preciso de um auxilio no seguinte caso.

    Na digitação de item na cotação (QO0310), o sistema devem apresentar uma mensagem de alerta quando o item possuir base de cálculo reduzida. Quanto a mensagem, está tudo certo.

    O detalhe que não consigo concluir é: como fazer com que a mensagem somente seja apresentada ao passar pelo campo do item? Pois do jeito que está, a mensagem é apresentada ao passar por outros campos também.

    Verifiquei que preciso pegar o HANDLE do objeto, mas não sei fazer isso.

    Anexo segue o arquivo de como está o meu comando dentro da UPC.

    Obrigado desde já. Fico no aguardo.

    Arquivos Anexados:

  2. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    Seguinte, esse codigo ai te acha o handle de um campo, salva esse codigo como findwidget.p por exemplo, eu tenho umas pasta chamada utils.
    e vamos considerar os autores dessa rotina, meu colegas da antiga datasul paranaense e hoje socios proprietarios da empresa Atelieware em curitiba, Leandro Johann e Leandro Dalle laste.

    Código:
    define input  parameter c-widget-name  as char   no-undo.
    define input  parameter c-widget-type  as char   no-undo.
    define input  parameter h-start-widget as handle no-undo.
    define output parameter h-widget       as handle no-undo.
    
    do while valid-handle(h-start-widget):
    
        if h-start-widget:type = c-widget-type and
           (h-start-widget:name = c-widget-name or
            (h-start-widget:type = 'LITERAL':u and
             h-start-widget:screen-value = c-widget-name)) then do:
    
            assign h-widget = h-start-widget:handle.
    
            leave.
        end.
    
        if h-start-widget:type = "field-group":u or
           h-start-widget:type = "frame":u or
           h-start-widget:type = "dialog-box":u then do:
    
            run utils/findWidget.p (input  c-widget-name,
                                    input  c-widget-type,
                                    input  h-start-widget:first-child,
                                    output h-widget).
    
            if valid-handle(h-widget) then
                leave.
        end.
    
        assign h-start-widget = h-start-widget:next-sibling.
    end.
    Bem, salvo esse fonte, pra usar é simples.

    essa upc le o campo comentarios na tela do cc0300a e incluir um evento na tecla F6, é que no meu caso tenho comentarios padronizados, inclusão de pedidos de compra.

    Código:
    /*  --------------------------------
        variaveis para o controle da upc
        -------------------------------- */
        define input parameter p-ind-event  as character           no-undo.
        define input parameter p-ind-object as character           no-undo.
        define input parameter p-wgh-object as handle              no-undo.
        define input parameter p-wgh-frame  as widget-handle       no-undo.
        define input parameter p-cod-table  as character           no-undo.
        define input parameter p-row-table  as rowid               no-undo.
       
    
        define variable c-objeto            as character           no-undo.
    
        define variable comentarios         as handle              no-undo.
       
        /* main() */
    
        assign c-objeto = entry(num-entries(p-wgh-object:private-data, "~/"), p-wgh-object:private-data, "~/").
    
        assign error        = ExceptionControl:getInstance().
    
        run utils/findWidget.p(input 'comentarios', 'editor', p-wgh-frame, output comentarios).
    
        if valid-handle(comentarios) then do:
            on F6 of comentarios persistent run cstzoom/cst0141z02.w(comentarios).
        end.
    
        return 'OK'.
    
  3. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    Esqueci de explicar os parametros da rotina:
    Na sequencia:
    1) campo é o nome do campo na tela;
    2) tipo do campo que vc quer ler, fill-in, editor, combo-box, button ....
    3) a frame que vc está lendo
    4) retorno do handle

    desse jeito ai que eu fiz, a upc será executada varias vezes, mas só vai aplicar o que vc precisa quando o if valid-handle() der certo.
  4. andivieira

    andivieira Sem Pontuação

    Bom dia! Obrigado pelo retorno!

    A UPC funcionou, contudo, existem outras funções dentro do mesmo evento, e a mensagem somente é apresentada ao passar pelo campo pela segunda vez.

    Abaixo, as linhas de como ficou o evento:


    if p-ind-event = 'AfterDisplayItem' then do:
    run pi-busca-handle.

    if valid-handle(wh-qo0310-u01-fi-it-codigo) then do:
    find first item
    where item.it-codigo = wh-qo0310-u01-fi-it-codigo:screen-value no-lock no-error.
    if avail item THEN DO:
    IF ITEM.cd-trib-icm = 4 THEN DO:
    on 'leave':u of wh-qo0310-u01-fi-it-codigo persistent run pi-validacao-item in h-qo0310-u01-upc.
    return 'OK'.
    END.
    IF wh-qo0310-u01-fi-observacao:screen-value = "" then assign wh-qo0310-u01-fi-observacao:screen-value = item.narrativa.
    END.
    END.
    run pi-label-text.
    RUN pi-busca-ult-cot.

    ASSIGN wh-qo0310-u01-rect-37:HEIGHT = 4. /* 3,75 */
    end.
  5. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    Bom dia, então, as UPCs de tela tem essas frescuras mesmo, por isso que no evemplo que te mandei, não fiz um teste de evento pra colocar a função, uma coisa que nos manuais do ddkgui indica pra fazer, mas eu como desenvolvedor acho ruim, é usar uma variavel do tipo global shared, ou seja, o campo de handle vc cria como new global shared, assim mesmo vc saindo da UPC, ela ainda existira, então, quando entrar na upc, a primeira coisa que deve fazer é o if valid-handle(), se o mesmo não for valido, vc procura e carrega o campo, dessa forma vc não precisa testar eventos pra saber quando deve procurar o campo.
  6. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    Opa, desculpa ai, comentei uma coisa sem olhar direito o seu codigo, o uso em si está incorreto, vc acha handle do campo e ativa a trigger (on leave) por exemplo, e fim de conversa, outras funções, como no evento 'afterDisplayItem' é outra conversa, é outro assunto, portanto seria um if separado.
    entendeu ?
    Uma coisa é vc tratar o evento 'afterDisplayItem', outra coisa é colocar a trigger no campo.
Status do Tópico:
Não esta aberto para novas mensagens.

Compartilhe esta Página