[RESOLVIDO] UPC para adicionar campos no filtro do Browser

Discussão em 'EMS , HCM e Totvs 11' iniciado por Guilherme.Moles, Abril 18, 2017.

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

    Guilherme.Moles Membro Participativo

    Boa Tarde Srs,

    Estou com um problema que não consigo resolver eu preciso adicionar um campo no filtro do browser do cm0201 porem não estou conseguindo fazer a alteração no open-query ja tentei de diversas formas a que eu cheguei mais perto foi criando uma query nova na upc e setando no handle do browser do cm0201, porem ele não me traz nenhuma informação. será que alguem poderia me ajudar...?
  2. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    pro campo no filtro estar disponivel para o open query, ou vc mandou o handle do browse para a telinha de filtro ou criou uma variavel global shared pra pegar em uma UPC no programa principal, correto ?
    mas quando vc volta do filtro, o open query original sobrepoe o seu, nunca precisei fazer esse tipo de coisa, eu acho mais facil criar um especifico com o que eu preciso do que alterar telas de consulta do produto padrão, mas nesse caso, o que resolveria pra vc seria criar um gatilho on find para a tabela que o open query usa, mas pra isso precisa de uma certa ginastica, pois se vc colocar o on find na UPC, como a upc é um programa que é feito run varias vezes durante o processo, vc não conseguiria deixar o gatilho ativo.

    Então vc faz o seguinte, cria um cscm0201.p, altera no menu para quando chamar o cm0201 para executar o cscm0201.p ao inves do cm0201, nesse cscm0201 vc cria as variaveis global shared dos campos do filtro extra, que vc vai preencher com a upc que vc fez na telinha de filtros, e cria o gatilho on find of tabela do: ...... e dai vc testa o seu filtro e faz return error para os registros que não devem aparecer no seu browser.
    Guilherme.Moles curtiu isso.
  3. Guilherme.Moles

    Guilherme.Moles Membro Participativo

    Bom dia Srs,

    Eu consegui fazer de uma forma diferente mas eu gostei desse esquema do .p no inicio do programa vou tentar mais pra frente quando eu precisar de algo assim, bom eu peguei o handle da br-table do cm0201 e com uma váriavel handle eu peguei a query da br-table , depois disso eu montei o FOR EACH que eu precisava em uma string = e chamei o query-prepare com a string do FOR EACH com os campos novos do filtro, ai eu dei um query-open na handle e dei um assign na br-table:query recebendo a query q eu alterei depois disso eu dei um apply no open-query do br-table. Funcionou certinho, do jeito q eu precisava, se alguem se interessar pelo código tenho ele comentado td certinho, acho q será bem util.

    Flw.
  4. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    manda ai, esse tipo de coisa nunca é demais ter guardado.
    Essa idéia do .p eu usei outro dia com o programa de embarque, porque eu tenho umas triggers de find para as tabelas saldo-estoq e movto-estoq, brigas entre gerentes dos estabelecimentos, tive que colocar um controle de usuario x estabelecimento e filtrar os dados a serem mostrados em qualquer tela, funciona legal, mas no eq0506, como a consulta que o embarque faz a essas tabelas não usa indice, acabou que com as triggers a coisa ficou bem lenta, levando em consideração que quem usa os embarques é o pessoal da fabrica para mandar itens para as lojas, eu criei um .p que desabilita as triggers para essas 2 tabelas e dai chama o eq0506, caso resolvido ..... hehehehe
    Guilherme.Moles curtiu isso.
  5. Guilherme.Moles

    Guilherme.Moles Membro Participativo

    Código:
    DEFINE NEW GLOBAL SHARED VARIABLE CM0201-br-table         AS WIDGET-HANDLE NO-UNDO.
    DEFINE NEW GLOBAL SHARED VARIABLE CM0201-bt-filtro-new    AS WIDGET-HANDLE NO-UNDO.
    DEFINE NEW GLOBAL SHARED VARIABLE CM0201-bt-filtro-old    AS WIDGET-HANDLE NO-UNDO.
    
    DEFINE NEW GLOBAL SHARED VARIABLE CM0201-dt-entreg-it-ini  AS DATE NO-UNDO. 
    DEFINE NEW GLOBAL SHARED VARIABLE CM0201-dt-entreg-it-fim  AS DATE NO-UNDO. 
    DEFINE NEW GLOBAL SHARED VARIABLE CM0201-nr-pedcli         AS CHAR NO-UNDO.
    DEFINE NEW GLOBAL SHARED VARIABLE CM0201-l-abertos         AS LOG  NO-UNDO.
    DEFINE NEW GLOBAL SHARED VARIABLE CM0201-l-atend-parcial   AS LOG  NO-UNDO.
    DEFINE NEW GLOBAL SHARED VARIABLE CM0201-l-atend-total     AS LOG  NO-UNDO.
    DEFINE NEW GLOBAL SHARED VARIABLE CM0201-l-suspensos       AS LOG  NO-UNDO.
    DEFINE NEW GLOBAL SHARED VARIABLE CM0201-l-cancelados      AS LOG  NO-UNDO.
    DEFINE NEW GLOBAL SHARED VARIABLE CM0201-l-avaliado        AS LOG  NO-UNDO.
    DEFINE NEW GLOBAL SHARED VARIABLE CM0201-l-Nao-avaliado    AS LOG  NO-UNDO.
    DEFINE NEW GLOBAL SHARED VARIABLE CM0201-l-aprovado        AS LOG  NO-UNDO.
    DEFINE NEW GLOBAL SHARED VARIABLE CM0201-l-reprovado       AS LOG  NO-UNDO.
    
    
    DEFINE NEW GLOBAL SHARED VARIABLE CM0201-nome-abrev       AS WIDGET-HANDLE NO-UNDO.
    
    DEFINE VARIABLE c-prep-nr-pedcli AS CHARACTER   NO-UNDO.
    DEFINE VARIABLE c-aval           AS CHARACTER   NO-UNDO.
    DEFINE VARIABLE bf-tt-sit        AS HANDLE      NO-UNDO.
    DEFINE VARIABLE bf-fd-sit        AS HANDLE      NO-UNDO.
    DEFINE VARIABLE l-aval           AS LOGICAL     NO-UNDO.
    
    DEFINE VARIABLE hq AS HANDLE      NO-UNDO.
    
    DEF TEMP-TABLE tt-ped
        FIELD nr-pedcli LIKE ped-venda.nr-pedcli.
    
    /* Logica Filtro Original */            
    APPLY "CHOOSE":U TO CM0201-bt-filtro-old.
    
    /* LOGICA */
    
        /* Instancia uma query */
        CREATE QUERY hq.
       
        /* Recebe a query do browser do CM0201 */
        ASSIGN hQ = CM0201-br-table:QUERY.
    
        /* Recebe o Handle da tabela TT-Situacao */
        ASSIGN bf-tt-sit = hQ:GET-BUFFER-HANDLE(1).
    
        /* Zera a tabela tt-situacao */
        bf-tt-sit:EMPTY-TEMP-TABLE().
    
        /* Recebe o campo situacao   */
        ASSIGN bf-fd-sit = bf-tt-sit:BUFFER-FIELD('situacao').
    
        /* Create das Situacoes */
        if CM0201-l-abertos       then do: bf-tt-sit:BUFFER-CREATE(). bf-fd-sit:BUFFER-VALUE(0) = 1. end.
        if CM0201-l-atend-parcial then do: bf-tt-sit:BUFFER-CREATE(). bf-fd-sit:BUFFER-VALUE(0) = 2. end.
        if CM0201-l-atend-total   then do: bf-tt-sit:BUFFER-CREATE(). bf-fd-sit:BUFFER-VALUE(0) = 3. end.
        if CM0201-l-suspensos     then do: bf-tt-sit:BUFFER-CREATE(). bf-fd-sit:BUFFER-VALUE(0) = 5. end.
        if CM0201-l-cancelados    then do: bf-tt-sit:BUFFER-CREATE(). bf-fd-sit:BUFFER-VALUE(0) = 6. end.
    
        /* Avaliacao */
        ASSIGN c-aval = ""
               l-aval = NO.
    
        if CM0201-l-avaliado     then assign c-aval = c-aval +  "2".
        if CM0201-l-Nao-avaliado then assign c-aval = c-aval + ",1".
        if CM0201-l-aprovado     then assign c-aval = c-aval + ",3".
        if CM0201-l-reprovado    then assign c-aval = c-aval + ",4".
    
    
    
        /* Verifica e Realiza a busca de acordo com os novos campos do filtro */
        IF CM0201-nr-pedcli <> ""
        THEN DO:
            /* Verifica a situa‡Æo da Avalia‡Æo */
            FIND FIRST ped-venda WHERE ped-venda.nome-abrev = CM0201-nome-abrev:SCREEN-VALUE
                                   AND ped-venda.nr-pedcli  = STRING(CM0201-nr-pedcli) NO-LOCK NO-ERROR.
            IF AVAIL ped-venda THEN DO:
                IF LOOKUP(string(ped-venda.cod-sit-aval), c-aval) = 0 THEN ASSIGN l-aval = NO.
                                                                      ELSE ASSIGN l-aval = YES.
            END.
    
            IF l-aval THEN ASSIGN c-prep-nr-pedcli = "ped-venda.nr-pedcli = '" +  STRING(CM0201-nr-pedcli) + "' and ped-venda.cod-sit-ped = tt-situacao.situacao".
        END.
        ELSE IF CM0201-dt-entreg-it-ini <> 01/01/0001 OR
                CM0201-dt-entreg-it-fim <> 12/31/9999 THEN DO:
       
            FOR EACH ped-item WHERE ped-item.nome-abrev = CM0201-nome-abrev:SCREEN-VALUE NO-LOCK:
                IF  ped-item.dt-entrega >= CM0201-dt-entreg-it-ini
                AND ped-item.dt-entrega <= CM0201-dt-entreg-it-fim THEN DO:
                   
                    /* Verifica a situa‡Æo da Avalia‡Æo */
                    FIND FIRST ped-venda OF ped-item NO-LOCK NO-ERROR.
                    IF AVAIL ped-venda THEN DO:
                        IF LOOKUP(string(ped-venda.cod-sit-aval), c-aval) = 0 THEN ASSIGN l-aval = NO.
                                                                              ELSE ASSIGN l-aval = YES.
                    END.
    
                    IF l-aval AND NOT CAN-FIND (FIRST tt-ped WHERE tt-ped.nr-pedcli = ped-item.nr-pedcli) THEN DO:
                        CREATE tt-ped.
                        ASSIGN tt-ped.nr-pedcli = ped-item.nr-pedcli.
                    END.
                END.
            END.
       
            FOR EACH tt-ped NO-LOCK:
                IF c-prep-nr-pedcli = "" THEN ASSIGN c-prep-nr-pedcli = "ped-venda.nr-pedcli = '" +  STRING(tt-ped.nr-pedcli) + "' and ped-venda.cod-sit-ped = tt-situacao.situacao".
                                         ELSE ASSIGN c-prep-nr-pedcli = c-prep-nr-pedcli + " OR ped-venda.nr-pedcli = '" +  STRING(tt-ped.nr-pedcli) + "' and ped-venda.cod-sit-ped = tt-situacao.situacao".
            END.
            IF c-prep-nr-pedcli = "" THEN ASSIGN c-prep-nr-pedcli = "ped-venda.nr-pedcli = '" +  STRING("") + "'".
        END.
    
        IF c-prep-nr-pedcli <> "" THEN DO:
    
            /* Realiza a altera‡Æo no prepare da Query para a nova busca */
            hQ:QUERY-PREPARE("FOR EACH tt-situacao, EACH ped-venda WHERE ped-venda.nome-abrev =  '" + CM0201-nome-abrev:SCREEN-VALUE + "'  and " + c-prep-nr-pedcli + "  and ped-venda.completo = YES and ped-venda.cod-sit-aval <> 5 ,each tt_estab_ems2").
           
            hQ:QUERY-OPEN.
           
            /* Devolve a Query alterada para o Browser */
            ASSIGN CM0201-br-table:QUERY = hQ.
    
        END.
       
        APPLY "open-query":U TO CM0201-br-table.
    
    /*FIM LOGICA*/
    
    
    
    Foi assim q eu consegui @bootstrapmaster...

    Flw Abraço.
Status do Tópico:
Não esta aberto para novas mensagens.

Compartilhe esta Página