Duvida Como dar um "refresh" num combo-box no Leave do estabelecimento?

Discussão em 'EMS , HCM e Totvs 11' iniciado por Marcelo Goncalves, Setembro 15, 2023.

  1. Marcelo Goncalves

    Marcelo Goncalves Membro Participativo

    Bom dia!
    Enfim sextou! Mas as bicas seguem, elas não ligam pra isso! rsrs

    Estou com uma dúvida sobre como dar um "refresh"(que na verdade seria um recarregar lista) num combo-box, sempre que seleciono um estabelecimento diferente.
    Por ex: tenho estabelecimentos 102 e 103 e as réguas de prazo que cada estabelecimento pode usar.
    Sempre que troco o estabelecimento, preciso atualizar o combo-box seguindo as regras definidas para seleção das réguas(cláusulas WHERE), pois tem réguas que é só pro 102, outras só pro 103, ok?
    Legal! Neste momento, o combo-box não atualiza para mostrar só as réguas do estabelecimento que selecionei e além disso, ele repete as réguas, deixando a lista bem maior do que deveria.

    Abaixo está a transcrição de parte do código relativo à definição do combo-box e sua exibição na tela e o código do Leave do campo estabelecimento onde tem as regras para seleção das réguas.

    Dentro da Definitions of the field level widgets, tenho:
    DEFINE VARIABLE cb-regua AS CHARACTER FORMAT "X(256)":U
    LABEL "Régua"
    VIEW-AS COMBO-BOX INNER-LINES 500
    LIST-ITEM-PAIRS "",""
    DROP-DOWN-LIST
    SIZE 28.8 BY 1

    Dentro da Define Frame, além dos outros campos, tenho lá a exibição:
    cb-regua AT ROW 10.33 COL 14 COLON-ALIGNED WIDGET-ID 4

    Nas Control-triggers tenho:
    &Scoped-define SELF-NAME cb-regua
    &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL cb-regua w-relat
    ON VALUE-CHANGED OF cb-regua IN FRAME f-pg-sel /* Régua */
    DO:
    ASSIGN cb-regua
    c-regua = cb-regua.
    END.
    /* _UIB-CODE-BLOCK-END */
    &ANALYZE-RESUME

    Já dentro do Leave do campo fi-cod-estabel tenho as validações para o estabelecimento que vou utilizar:
    &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL fi-cod-estabel w-relat
    ON LEAVE OF fi-cod-estabel IN FRAME f-pg-sel /* Estabelecimento */
    DO:
    {include/LEAVE.i &tabela=estabelec
    &atributo-ref=cod-estabel
    &variavel-ref=fi-cod-estabel
    &WHERE="estabelec.cod-estabel = input frame {&frame-name} fi-cod-estabel"}

    IF fi-cod-estabel:SCREEN-VALUE <> "" THEN
    DO:
    FIND estabelec WHERE estabelec.cod-estabel = fi-cod-estabel:SCREEN-VALUE NO-LOCK NO-ERROR.
    IF AVAIL estabelec THEN ASSIGN fi-desc-estab:SCREEN-VALUE = estabelec.nome.
    END.
    IF fi-cod-estabel:SCREEN-VALUE = '102' THEN
    DO:
    ASSIGN
    cb-regua:DELIMITER IN FRAME f-pg-sel = "|".
    FOR EACH os-regua
    WHERE os-regua.inativa = NO
    BY os-regua.regua:
    IF SUBSTRING (os-regua.regua, 1, 1) = "P" THEN
    NEXT.
    IF cb-regua:ADD-LAST(os-regua.regua,os-regua.regua) IN FRAME f-pg-sel THEN.
    END.
    cb-regua:ADD-FIRST('PADRÃO','PADRÃO') IN FRAME f-pg-sel.
    END.
    ELSE
    IF fi-cod-estabel:SCREEN-VALUE = '103' THEN
    DO:
    ASSIGN
    cb-regua:DELIMITER IN FRAME f-pg-sel = "|".
    FOR EACH os-regua
    WHERE os-regua.regua BEGINS 'P' AND os-regua.inativa = NO
    BY os-regua.regua:
    IF cb-regua:ADD-LAST(os-regua.regua,os-regua.regua) IN FRAME f-pg-sel THEN.
    END.
    cb-regua:ADD-FIRST('PADRÃO','PADRÃO') IN FRAME f-pg-sel.

    END.
    ELSE
    IF fi-cod-estabel:SCREEN-VALUE = '201' THEN
    DO:
    ASSIGN
    cb-regua:DELIMITER IN FRAME f-pg-sel = "|".
    FOR EACH os-regua
    WHERE os-regua.inativa = NO AND os-regua.regua BEGINS 'Z' /* Ticket#2023042710000256 */
    BY os-regua.regua:
    IF cb-regua:ADD-LAST(os-regua.regua,os-regua.regua) IN FRAME f-pg-sel THEN.
    END.
    cb-regua:ADD-FIRST('PADRÃO','PADRÃO') IN FRAME f-pg-sel.
    END.
    END.
    /* _UIB-CODE-BLOCK-END */
    &ANALYZE-RESUME

    Neste ponto, espera-se que o combo-box seja atualizado com a réguas definidas nas cláusulas WHERE, mas isso não ocorre.
    Aceito sugestões ou dicas de como melhorar essa lógica do Leave para atualizar o combo-box. Já procurei artigos aqui no site e em outros sobre Progress, mas não encontrei nada conclusivo.
    Quem puder ajudar, agradeço!
    Obrigado!
  2. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    Remonta a lista e reatribui no combo-box, assim:

    Exemplo:
    Código:
    
    DEF VAR minhaLista AS CHAR.
    
    FOR EACH minhaTabela WHERE [MeuWhere] NO-LOCK.
        IF LENGTH(minhaLista) = 0 THEN DO:
           ASSIGN minhaLista = minhaTabela.campoTextoVisivel + "|" + minhaTabela.campoValorOculto.
           ASSIGN MeuComboBox = minhaTabela.campoValorOculto. //Para que o primeiro valor da lista já venha preenchido
        END.
        ELSE ASSIGN minhaLista = minhaLista + "|" + minhaTabela.campoTextoVisivel + "|" + minhaTabela.campoValorOculto.
    END.
    
    MeuComboBox:DELIMITER       IN FRAME f-pg-sel = "|".
    MeuComboBox:LIST-ITEM-PAIRS IN FRAME f-pg-sel = minhaLista.
    
    DISPLAY MeuComboBox WITH FRAME f-pg-sel. //Atualiza o valor do campo que está nele contido, no ASSIGN dentro do FOR EACH
    
    
  3. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    Se colocar o código abaixo no evento VALUE-CHANGED do COMBO-BOX, vai aparecer o valor dele.

    Exemplo, no combo-box está a seguinte lista:
    Primeiro|1|Segundo|2|Terceiro|3

    Se selecionar o "Segundo" no combo-box, e no evento estiver:
    MESSAGE SELF:INPUT-VALUE VIEW-AS ALERT-BOX.
    ou
    MESSAGE meuComboBox:INPUT-VALUE VIEW-AS ALERT-BOX.

    vai aparecer 2 na mensagem.

    Entendeu?
  4. Marcelo Goncalves

    Marcelo Goncalves Membro Participativo

    Bom dia Rafael, tudo bem?
    Usei parte do que você postou, com um pequeno ajuste, limpando a lista sempre antes de carregar o estabelecimento novo, daí funcionou certinho, obedecendo os Where's e também não duplicando 3 ou 4 vezes a lista. Veja como ficou:

    IF fi-cod-estabel:SCREEN-VALUE = '102' THEN
    DO:
    ASSIGN listareguas = "" + "|" + "" . <--Limpo a lista sempre que for selecionado outro estabelecimento.
    FOR EACH os-regua
    WHERE os-regua.inativa = NO AND substring(os-regua.regua, 1, 1) <> 'P' NO-LOCK
    BY os-regua.regua.
    IF LENGTH(listareguas) = 0 THEN DO:
    ASSIGN listareguas = os-regua.regua + "|" + os-regua.regua.
    ASSIGN cb-regua = os-regua.regua.
    END.
    ELSE ASSIGN listareguas = listareguas + "|" + os-regua.regua + "|" + os-regua.regua.
    END.
    cb-regua:DELIMITER IN FRAME f-pg-sel = "|".
    cb-regua:LIST-ITEM-PAIRS IN FRAME f-pg-sel = listareguas.
    cb-regua:ADD-FIRST('PADRÃO','PADRÃO') IN FRAME f-pg-sel. <-- Incluo no início o "Padrão", que obrigatoriamente tem que ter.
    END.

    Para os demais estabelecimentos apenas repeti colocando o where adequado e boas.
    Vou aplicar este mesmo conceito para outras telas que tem o comportamento semelhante e solucionar o problema.
    Lhe devo um café!
    Agora preciso aprender a marcar como resolvido! rsrs
    Obrigado pela ajuda!
  5. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    Só de responder já tá perfeito, obrigado pelo feedback
    Marcelo Goncalves curtiu isso.

Compartilhe esta Página