[RESOLVIDO] Trigger para abortar calculo de NF

Discussão em 'EMS , HCM e Totvs 11' iniciado por mpdelphi, Outubro 21, 2016.

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

    mpdelphi Membro Participativo

    Pessoal... tenho uma trigger de banco que trata uma situação especifica aqui....

    Quando faço o calculo da nf pelo ft4001, essa trigger é executada na tabela it-nota-fiscal e de acordo com uma determinada condição preciso abortar o calculo da NF.

    Um exemplo tem simples da trrigger:

    DEFINE PARAMETER BUFFER p-table-new FOR it-nota-fisc. /*Tabela NOVA */
    DEFINE PARAMETER BUFFER p-table-old FOR it-nota-fisc. /*Tabela ANTIGA */


    RETURN 'NOK':U.

    Quando dou o return... ele da os erros conforme as imagens anexas...

    O que você sugerem para que eu possa abortar o calculo dessa nf...

    Quando ocorre o erro.. Eu mostra uma mensagem para o usuário.... aborto o calculo e o usuário precisa voltar a ajustar alguns detalhes...

    Arquivos Anexados:

  2. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    Esse é o típico, cabuloso!!!kkkk

    Pq vc não usa UPC e checa as informações no próprio botão de calcular NF? Muito mais fácil e menos "gambiarrento".
  3. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    faz uma epc na bodi317ef, bo de efetivação de nota, dai qualquer programa que for gerar nota segue a regra
  4. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    Excelente ideia!!!
  5. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    Eu tenho essa aqui na empresa, repare que para abortar o processo em caso de erros, um RETURN 'NOK' é o suficiente.
    Código:
    /**
    *
    * PROGRAMA:
    *   diupc/upc-bodi317ef.p
    *
    * FINALIDADE:
    *   Gravar a esp_nota_fiscal a partir da esp_wt_docto.
    *
    * VERSOES:
    *     Versao Inicial
    *
    */
    {grid2/error.i}
    
    using imesul.ems2.producao.*.
    
    {include/i-epc200.i}
    
    def input        parameter p-ind-event as char no-undo.
    def input-output parameter table for tt-epc.
    
    define buffer bf-epc for tt-epc.
    
    define temp-table tt-notas-geradas no-undo
           field rw-nota-fiscal as rowid
           field nr-nota        as character
           field seq-wt-docto   as integer.
    
    def var h-bo as widget-handle no-undo.
    def var l-procedimento-ok as logical no-undo.
    
    define variable pesoItemOrdem   as pesoItemOrdem                                    no-undo.
    define variable vendaInterna    as imesul.ems2.embarque.GerarVendaInterna           no-undo.
    define variable vendaInternaMOD as imesul.ems2.faturamento.GerarVendaInterna        no-undo.
    define variable verificaFrete   as modular.ems2.faturamento.VerificaNotaFiscalFrete no-undo.
    define variable error           as ExceptionControl                                 no-undo.
    
    define variable pesoItem      as decimal       no-undo.
    
    define variable qtdACA        as decimal       no-undo.
    define variable qtdREQ        as decimal       no-undo.
    
    
    define variable pesoBalanca   as decimal       no-undo.
    define variable pesoNota      as decimal       no-undo.
    
    define variable nivel         as integer       no-undo.
    define variable executaRotina as logical       no-undo.
    define variable calculoNormal as logical       no-undo.
    
    
        assign nivel = 1
               executaRotina = no.
        repeat while program-name(nivel) <> ?:
            if program-name(nivel) begins 'ftp/ft4001.w' then assign executaRotina = yes.
            if program-name(nivel) begins 'ftp/ft4002.w' then assign executaRotina = yes.
            if program-name(nivel) begins 'ftp/ft4003.w' then assign executaRotina = yes.
            assign nivel = nivel + 1.
        end.
    
        assign error = ExceptionControl:getInstance().
    
        assign verificaFrete = new modular.ems2.faturamento.VerificaNotaFiscalFrete().
    
        error:clearExceptions().
    
        for first tt-epc no-lock
            where tt-epc.cod-event     = 'beforeEfetivaNota'
              and tt-epc.cod-parameter = 'Table-Rowid':
    
            error:clearExceptions().
            do {&try}:
                verificaFrete:processar(tt-epc.cod-event, to-rowid(tt-epc.val-parameter)).
            {&catch}
    
            if error:catchException() then do:
                delete object verificaFrete no-error.
                for first bf-epc no-lock
                    where bf-epc.cod-event = 'beforeEfetivaNota'
                      and bf-epc.cod-parameter = 'Object-Handle':
    
                    assign h-bo = widget-handle(bf-epc.val-parameter).
                    run _insertErrorManual   in h-bo (17006,'EMS','ERROR','Erro Interno','FATURAMENTO NÇO LIBERADO. EXISTEM NOTAS FISCAIS COM PENDENCIA DE FRETE','').
                    run setInterrompeCalculo in h-bo(true).
                    return 'NOK'.
                end.
            end.
            delete object verificaFrete no-error.
    
            for first wt-docto exclusive-lock
                where rowid(wt-docto) = to-rowid(tt-epc.val-parameter):
       
                for first ped-venda no-lock
                    where ped-venda.nr-pedcli  = wt-docto.nr-pedcli
                      and ped-venda.nome-abrev = wt-docto.nome-abrev:
                    assign wt-docto.observ-nota = wt-docto.observ-nota + ' ~n ' + ped-venda.observacoes.
                end.
       
                if wt-docto.cod-estabel = '201' or
                   wt-docto.cod-estabel = '202' then do:
                    find first cst_estabel_portador no-lock
                         where cst_estabel_portador.cod-estabel  = wt-docto.cod-estabel
                           and cst_estabel_portador.cod-portador = wt-docto.cod-portador
                           and cst_estabel_portador.modalidade   = wt-docto.modalidade
                               no-error.
               
                    if not avail cst_estabel_portador then do:
                        for first bf-epc no-lock
                            where bf-epc.cod-event = 'beforeEfetivaNota'
                              and bf-epc.cod-parameter = 'Object-Handle':
                            assign h-bo = widget-handle(bf-epc.val-parameter).
                            run _insertErrorManual in h-bo (17006,'EMS','ERROR','Erro Interno',
                                                            substitute('ERRO ADMINISTRATIVO, ESTABELECIMENTO &1 N¶O TEM PERMISSAO PARA FATURAR USANDO PORTADOR/MODALIDADE &2/&3', wt-docto.cod-estabel, wt-docto.cod-portador, wt-docto.modalidade),
                                                            '').
                            run setInterrompeCalculo in h-bo(true).
                            return 'NOK'.
                        end.
                    end.
                end.
       
                if wt-docto.cod-estabel = '201' or
                   wt-docto.cod-estabel = '202' then do:
                    find first emitente no-lock
                         where emitente.cod-emitente = wt-docto.cod-emitente
                               no-error.
               
                    if emitente.natureza = 1 then do:
                        if wt-docto.cod-estabel = '202' then do:
                            if substring(wt-docto.nat-operacao,1,1) <> '6' then do:
                                for first bf-epc no-lock
                                    where bf-epc.cod-event = 'beforeEfetivaNota'
                                      and bf-epc.cod-parameter = 'Object-Handle':
                                    assign h-bo = widget-handle(bf-epc.val-parameter).
                                    run _insertErrorManual in h-bo (17006,'EMS','ERROR','Erro Interno',
                                                                    substitute('ERRO ADMINISTRATIVO, ESTABELECIMENTO &1 N¶O TEM PERMISSAO PARA FATURAR CONTRA PESSOA FISICA &2 DENTRO DO ESTADO', wt-docto.cod-estabel, emitente.nome-abrev),
                                                                    '').
                                    run setInterrompeCalculo in h-bo(true).
                                    return 'NOK'.
                                end.
                            end.
                        end.
                    end.
                    if can-do('5922G0,6922G0,6922E7', wt-docto.nat-operacao) then do:
                        if wt-docto.cod-portador <> 99092 and wt-docto.cod-portador <> 99082 then do:
                            for first bf-epc no-lock
                                where bf-epc.cod-event = 'beforeEfetivaNota'
                                  and bf-epc.cod-parameter = 'Object-Handle':
                                assign h-bo = widget-handle(bf-epc.val-parameter).
                                run _insertErrorManual in h-bo (17006,'EMS','ERROR','Erro Interno',
                                                                substitute('ERRO ADMINISTRATIVO, ESTABELECIMENTO &1 N¶O TEM PERMISSAO PARA FATURAR VENDA FUTURA USANDO PORTADOR &2, DEVE USAR 99092', wt-docto.cod-estabel, wt-docto.cod-portador),
                                                                '').
                                run setInterrompeCalculo in h-bo(true).
                                return 'NOK'.
                            end.
                        end.
                    end.
                    if wt-docto.cod-portador = 99092 then do:
                        if not can-do('5922G0,6922G0,6922E7', wt-docto.nat-operacao) then do:
                            for first bf-epc no-lock
                                where bf-epc.cod-event = 'beforeEfetivaNota'
                                  and bf-epc.cod-parameter = 'Object-Handle':
                                assign h-bo = widget-handle(bf-epc.val-parameter).
                                run _insertErrorManual in h-bo (17006,'EMS','ERROR','Erro Interno',
                                                                substitute('ERRO ADMINISTRATIVO, ESTABELECIMENTO &1 SO PODE FATURAR USANDO PORTADOR &2 NA VENDA FUTURA', wt-docto.cod-estabel, wt-docto.cod-portador),
                                                                '').
                                run setInterrompeCalculo in h-bo(true).
                                return 'NOK'.
                            end.
                        end.
                    end.
               
                end.
       
                if wt-docto.cod-estabel = '201' or
                   wt-docto.cod-estabel = '202' then do:
               
                    assign pesoItemOrdem = new PesoItemOrdem(no).
               
                    for each wt-it-docto exclusive-lock
                        where wt-it-docto.seq-wt-docto = wt-docto.seq-wt-docto:
               
                        if wt-it-docto.un[1] <> 'KG' then do:
                            assign qtdREQ = 0
                                   qtdACA = 0.
               
                            for each  ord-prod no-lock
                                where ord-prod.nr-pedido    = wt-it-docto.nr-pedcli
                                  and ord-prod.nr-sequencia = wt-it-docto.nr-seq-ped
                                  and ord-prod.it-codigo    = wt-it-docto.it-codigo
                                  and ord-prod.nome-abrev   = wt-docto.nome-abrev:
               
                                do {&try}:
                                    pesoItemOrdem:findByOrdem(ord-prod.nr-ord-produ).
                                    assign qtdREQ = qtdREQ + pesoItemOrdem:getQtdREQ()
                                           qtdACA = qtdACA + pesoItemOrdem:getQtdACA().
                                {&catch}
               
                                if qtdREQ <> 0 and
                                   qtdACA <> 0 then do:
                                    assign pesoItem = qtdReq / qtdACA.
                                    assign wt-it-docto.dec-ft-conv-unest  = 1
                                           wt-it-docto.num-casa-dec-unest = 0
                                           wt-it-docto.un[2]              = 'KG'
                                           wt-it-docto.quantidade[2]      = wt-it-docto.quantidade[1] * pesoItem
                                           wt-it-docto.vl-preuni          = wt-it-docto.vl-tot-item / wt-it-docto.quantidade[2]
                                           wt-it-docto.fat-qtfam          = ?.
                                end.
                            end.
                        end.
                    end.
                end.
                if wt-docto.cod-canal-venda = 105 then do:
                    assign pesoItemOrdem = new PesoItemOrdem(no).
               
                    assign pesoNota = 0.
                    for each wt-it-docto exclusive-lock
                        where wt-it-docto.seq-wt-docto = wt-docto.seq-wt-docto
                        ,
                        first item of wt-it-docto no-lock:
               
                        assign pesoItem = item.peso-liquido.
                        assign pesoNota = pesoNota + (wt-it-docto.quantidade[1] * pesoItem).
                    end.
               
                    assign calculoNormal = yes.
               
                    find first cst_emitente_obra no-lock
                         where cst_emitente_obra.cod-emitente = wt-docto.cod-emitente
                               no-error.
               
                    if avail cst_emitente_obra then do:
                        if executaRotina then do:
                            if cst_emitente_obra.peso_balanca                               and
                               cst_emitente_obra.cod-canal-venda = wt-docto.cod-canal-venda then do:
               
                                run upc/ui/pesoBalanca.w(output pesoBalanca).
                                if pesoBalanca <> 0 and
                                   pesoBalanca <> pesoNota then do:
                                    for each wt-it-docto exclusive-lock
                                        where wt-it-docto.seq-wt-docto = wt-docto.seq-wt-docto
                                        ,
                                        first item of wt-it-docto no-lock:
               
                                        assign pesoItem = item.peso-liquido.
                                        assign wt-it-docto.dec-ft-conv-unest       = 1
                                               wt-it-docto.num-casa-dec-unest      = 0
                                               wt-it-docto.un[2]                   = 'KG'
                                               wt-it-docto.quantidade[2]           = wt-it-docto.quantidade[1] * pesoItem
                                               wt-it-docto.fat-qtfam               = ?.
               
                                        assign wt-it-docto.quantidade[2]           = (wt-it-docto.quantidade[2] * pesoBalanca) / pesoNota.
                                               wt-it-docto.vl-tot-item             = wt-it-docto.quantidade[2]  * wt-it-docto.vl-preuni.
                                    end.
                                    assign calculoNormal = no.
                                end.
                            end.
                        end.
                    end.
               
                    if calculoNormal then do:
                        for each wt-it-docto exclusive-lock
                            where wt-it-docto.seq-wt-docto = wt-docto.seq-wt-docto
                            ,
                            first item of wt-it-docto no-lock:
               
                            assign pesoItem = item.peso-liquido.
                            assign wt-it-docto.dec-ft-conv-unest  = 1
                                   wt-it-docto.num-casa-dec-unest = 0
                                   wt-it-docto.un[2]              = 'KG'
                                   wt-it-docto.quantidade[2]      = wt-it-docto.quantidade[1] * pesoItem
                                   wt-it-docto.vl-preuni          = wt-it-docto.vl-tot-item / wt-it-docto.quantidade[2]
                                   wt-it-docto.fat-qtfam          = ?.
                        end.
                    end.
                end.
       
            end.
            release wt-docto no-error.
        end.
       
       
        for first tt-epc no-lock
            where tt-epc.cod-event = 'afterEfetivaNota':
       
            assign h-bo = widget-handle(tt-epc.val-parameter).
       
            run buscaTtNotasGeradas in h-bo (output l-procedimento-ok,
                                             output table tt-notas-geradas).
       
            assign vendaInterna    = new imesul.ems2.embarque.GerarVendaInterna().
            assign vendaInternaMOD = new imesul.ems2.faturamento.GerarVendaInterna().
       
            for each tt-notas-geradas
                ,
                first nota-fiscal fields (cod-estabel serie nr-nota-fis)
                where rowid(nota-fiscal) = tt-notas-geradas.rw-nota-fiscal
                no-lock
                :
    
                error:clearExceptions().
                do {&try}:
                    verificaFrete:processar(tt-epc.cod-event, rowid(nota-fiscal)).
                {&catch}
       
                for first esp_wt_docto of tt-notas-geradas
                    exclusive-lock:
       
                    find esp_nota_fiscal of nota-fiscal
                        exclusive-lock no-error.
       
                    if not avail esp_nota_fiscal then do:
                        create esp_nota_fiscal.
                        buffer-copy nota-fiscal to esp_nota_fiscal.
                    end.
       
                    buffer-copy esp_wt_docto to esp_nota_fiscal.
           
                    delete esp_wt_docto.
                end.
       
                /* executa o procedmento do ime082 para criar a esp_nota_fiscal,
                   pois na atualizacao do estoque (no caso de ser automatica) eh usada */
                publish 'bodi317efAfterEfetivaNota'
                    (input nota-fiscal.cod-estabel,
                     input nota-fiscal.serie,
                     input nota-fiscal.nr-nota-fis).
       
       
                /* Gerar os dados para venda interna caso nota fiscal seja gerada por embarque */
       
                if nota-fiscal.cdd-embarq <> 0 then do:
                    error:clearExceptions().
                    /* Venda interna com base na NF caso seja MODULAR */
                    if nota-fiscal.cod-emitente = 26237 then do:
                        do {&try}:
                            vendaInternaMOD:findNF(nota-fiscal.cod-estabel, nota-fiscal.serie, nota-fiscal.nr-nota-fis).
                            vendaInternaMOD:gerar().
                        {&catch}
                    end.
                    else do:
                        do {&try}:
                            vendaInterna:findEMBARQUE(nota-fiscal.cdd-embarq).
                            vendaInterna:gerar().
                        {&catch}
                    end.
                end.
                else do:
                    /* Venda interna com base na NF caso seja MODULAR */
                    if nota-fiscal.cod-emitente = 26237 then do:
                        do {&try}:
                            vendaInternaMOD:findNF(nota-fiscal.cod-estabel, nota-fiscal.serie, nota-fiscal.nr-nota-fis).
                            vendaInternaMOD:gerar().
                        {&catch}
                    end.
                end.
       
            end. /* tt-notas-geradas */
    
            delete object verificaFrete no-error.
            delete object vendaInterna.
            delete object vendaInternaMOD.
       
        end. /* first tt-epc */
       
        return 'ok':u.
    
  6. mpdelphi

    mpdelphi Membro Participativo

    Obrigado pelo retorno amigo..
    pelo que percebi aqui vc tem uma UPC na bo de calculo....

    no meu caso é uma tigger dentro da tabela... it-nota-fisc..
Status do Tópico:
Não esta aberto para novas mensagens.

Compartilhe esta Página