[RESOLVIDO] Mensagem ao Efetivar Nota - BODI317

Discussão em 'EMS , HCM e Totvs 11' iniciado por flavia.nicacio, Abril 18, 2016.

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

    flavia.nicacio Sem Pontuação

    Pessoal, boa tarde!

    Desenvolvi um programa utilizando a BODI317 para geração de nota fiscal. Ele está gerando as notas fiscais corretamente, sem problema nem erro. Porém, durante a execução, é apresentada a mensagem abaixo em tela, para cada nota que ele efetiva:

    ** WARNING--TRANSACTION keyword given within actual transaction level. (214)

    Este erro aparece quando no pi-acompanhar é mostrado o texto “Efetivando a Nota”, o que me leva a crer que o problema está no método EfetivaNota.

    Alguém poderia me ajudar com este problema?

    Segue trecho do meu código:


    For Each tt-ped-novo:

    Assign c-cod-estabel = tt-ped-novo.cod-estabel
    c-nome-abrev = tt-ped-novo.nome-abrev
    c-nat-operacao = tt-ped-novo.nat-operacao
    c-cod-canal-venda = String(tt-ped-novo.cod-canal-venda).

    /* Inicialização das BOs para Cálculo */
    run dibo/bodi317in.p persistent set h-bodi317in.
    run inicializaBOS in h-bodi317in(output h-bodi317pr,
    output h-bodi317sd,
    output h-bodi317im1bra,
    output h-bodi317va).

    /* Início da transação */
    repeat Trans:
    /* Limpar a tabela de erros em todas as BOs */
    run emptyRowErrors in h-bodi317in.

    run criaWtDocto in h-bodi317sd
    (input c-seg-usuario,
    input c-cod-estabel,
    input c-serie,
    input "1", /* Número da nota fiscal, para notas manuais */
    input c-nome-abrev, /* Código, nome abreviado ou CGC do cliente */
    input ?, /* Número do pedido de venda, quando existir */
    input 4, /* Tipo da nota fiscal, conforme tabela abaixo: - 01: Sistema (com pedido ou com embarque); - 02: Nota Manual; - 03: Diferença de preço; - 04: Complementar de mercadoria; - 50: Complementar de imposto */
    input 9999, /* Código do programa que gerou a nota */
    input da-dt-emis-nota,
    input 0, /* Número do embarque, quando existir */
    input c-nat-operacao,
    input c-cod-canal-venda, /* Código do canal de venda do cliente, quando existir */
    output i-seq-wt-docto, /* Seqüência do documento (chave única) */
    output l-proc-ok-aux) /* Execução do método com sucesso ou não */.

    /* Busca possíveis erros que ocorreram nas validações */
    run devolveErrosbodi317sd in h-bodi317sd(output c-ultimo-metodo-exec,
    output table RowErrors).

    /* Pesquisa algum erro ou advertência que tenha ocorrido */
    find first RowErrors no-lock no-error.

    /* Caso tenha achado algum erro ou advertência, mostra em tela */
    if avail RowErrors Then Do:
    For each RowErrors:
    Put Stream str-rp "Erro 1 .: " At 01
    errorsequence At 14 Format "999999"
    errornumber At 22 Format "9999999999" Skip
    errordescription At 01 Format "x(100)" Skip
    errorparameters At 01 Format "x(100)" Skip
    errortype At 01 Format "x(100)" Skip
    errorhelp At 01 Format "x(100)" Skip
    errorsubtype At 01 Format "x(100)" Skip(2).
    end.
    End.

    /* Caso ocorreu problema nas validações, não continua o processo */
    if not l-proc-ok-aux then
    undo, leave.

    /* Bloco a ser repetido para cada item da nota */
    For Each tt-ped-item-novo Where tt-ped-item-novo.nr-pedido = tt-ped-novo.nr-pedido:
    assign c-it-codigo = tt-ped-item-novo.it-codigo
    c-cod-refer = tt-ped-item-novo.cod-refer
    de-quantidade = tt-ped-item-novo.qt-pedida
    de-vl-preori-ped = tt-ped-item-novo.vl-preori /* Preço unitário */
    de-val-pct-desconto-tab-preco = tt-ped-item-novo.val-pct-desconto-tab-preco /* Desconto de tabela */
    de-per-des-item = tt-ped-item-novo.per-des-item. /* Desconto do item */

    /* Limpar a tabela de erros em todas as BOs */
    run emptyRowErrors in h-bodi317in.

    /* Disponibilizar o registro WT-DOCTO na bodi317sd */
    run localizaWtDocto in h-bodi317sd(input i-seq-wt-docto,
    output l-proc-ok-aux).

    /* Cria um item para nota fiscal. */
    run criaWtItDocto in h-bodi317sd (input ?,
    input "",
    input 10,
    input c-it-codigo,
    input c-cod-refer,
    input ?,
    output i-seq-wt-it-docto,
    output l-proc-ok-aux).

    /* Busca possíveis erros que ocorreram nas validações */
    run devolveErrosbodi317sd in h-bodi317sd(output c-ultimo-metodo-exec,
    output table RowErrors).

    /* Pesquisa algum erro ou advertência que tenha ocorrido */
    find first RowErrors no-lock no-error.

    /* Caso tenha achado algum erro ou advertência, mostra em tela */
    if avail RowErrors THEN DO:
    for each RowErrors:
    Put Stream str-rp "Erro 2 .: " At 01
    errorsequence At 14 Format "999999"
    errornumber At 22 Format "9999999999" Skip
    errordescription At 01 Format "x(100)" Skip
    errorparameters At 01 Format "x(100)" Skip
    errortype At 01 Format "x(100)" Skip
    errorhelp At 01 Format "x(100)" Skip
    errorsubtype At 01 Format "x(100)" Skip(2).
    end.
    End.

    /* Caso ocorreu problema nas validações, não continua o processo */
    if not l-proc-ok-aux then
    undo, leave.

    /* Grava informações gerais para o item da nota */
    run gravaInfGeraisWtItDocto in h-bodi317sd
    (input i-seq-wt-docto,
    input i-seq-wt-it-docto,
    input de-quantidade,
    input de-vl-preori-ped,
    input de-val-pct-desconto-tab-preco,
    input de-per-des-item).

    /* Limpar a tabela de erros em todas as BOs */
    run emptyRowErrors in h-bodi317in.

    /* Disp. registro WT-DOCTO, WT-IT-DOCTO e WT-IT-IMPOSTO na bodi317pr */
    run localizaWtDocto in h-bodi317pr(input i-seq-wt-docto,
    output l-proc-ok-aux).
    run localizaWtItDocto in h-bodi317pr(input i-seq-wt-docto,
    input i-seq-wt-it-docto,
    output l-proc-ok-aux).
    run localizaWtItImposto in h-bodi317pr(input i-seq-wt-docto,
    input i-seq-wt-it-docto,
    output l-proc-ok-aux).

    /* Atualiza dados calculados do item */
    run atualizaDadosItemNota in h-bodi317pr(output l-proc-ok-aux).

    /* Busca possíveis erros que ocorreram nas validações */
    run devolveErrosbodi317pr in h-bodi317pr(output c-ultimo-metodo-exec,
    output table RowErrors).

    /* Pesquisa algum erro ou advertência que tenha ocorrido */
    find first RowErrors no-lock no-error.

    /* Caso tenha achado algum erro ou advertência, mostra em tela */
    if avail RowErrors THEN DO:
    for each RowErrors:
    Put Stream str-rp "Erro 3 .: " At 01
    errorsequence At 14 Format "999999"
    errornumber At 22 Format "9999999999" Skip
    errordescription At 01 Format "x(100)" Skip
    errorparameters At 01 Format "x(100)" Skip
    errortype At 01 Format "x(100)" Skip
    errorhelp At 01 Format "x(100)" Skip
    errorsubtype At 01 Format "x(100)" Skip(2).
    end.
    End.

    /* Caso ocorreu problema nas validações, não continua o processo */
    if not l-proc-ok-aux then
    Undo, Leave.

    /* Limpar a tabela de erros em todas as BOs */
    run emptyRowErrors in h-bodi317in.

    /* Valida informações do item */
    run validaItemDaNota in h-bodi317va(input i-seq-wt-docto,
    input i-seq-wt-it-docto,
    output l-proc-ok-aux).

    /* Busca possíveis erros que ocorreram nas validações */
    run devolveErrosbodi317va in h-bodi317va(output c-ultimo-metodo-exec,
    output table RowErrors).

    /* Pesquisa algum erro ou advertência que tenha ocorrido */
    find first RowErrors no-lock no-error.

    /* Caso tenha achado algum erro ou advertência, mostra em tela */
    if avail RowErrors THEN DO:
    for each RowErrors:
    Put Stream str-rp "Erro 4 .: " At 01
    errorsequence At 14 Format "999999"
    errornumber At 22 Format "9999999999" Skip
    errordescription At 01 Format "x(100)" Skip
    errorparameters At 01 Format "x(100)" Skip
    errortype At 01 Format "x(100)" Skip
    errorhelp At 01 Format "x(100)" Skip
    errorsubtype At 01 Format "x(100)" Skip(2).
    end.
    End.

    /* Caso ocorreu problema nas validações, não continua o processo */
    if not l-proc-ok-aux then
    undo, leave.

    End. /* For Each tt-ped-item-novo Of tt-ped-novo */

    /* Finalização das BOs utilizadas no cálculo */
    run finalizaBOS in h-bodi317in.

    /* Reinicialização das BOs para Cálculo */
    run dibo/bodi317in.p persistent set h-bodi317in.
    run inicializaBOS in h-bodi317in(output h-bodi317pr,
    output h-bodi317sd,
    output h-bodi317im1bra,
    output h-bodi317va).

    /* Limpar a tabela de erros em todas as BOs */
    run emptyRowErrors in h-bodi317in.

    /* Calcula o pedido, com acompanhamento */
    run inicializaAcompanhamento in h-bodi317pr.
    run confirmaCalculo in h-bodi317pr(input i-seq-wt-docto,
    output l-proc-ok-aux).
    run finalizaAcompanhamento in h-bodi317pr.

    /* Busca possíveis erros que ocorreram nas validações */
    run devolveErrosbodi317pr in h-bodi317pr (output c-ultimo-metodo-exec,
    output table RowErrors).

    /* Pesquisa algum erro ou advertência que tenha ocorrido */
    find first RowErrors no-lock no-error.

    /* Caso tenha achado algum erro ou advertência, mostra em tela */
    if avail RowErrors THEN DO:
    for each RowErrors:
    Put Stream str-rp "Erro 5 .: " At 01
    errorsequence At 14 Format "999999"
    errornumber At 22 Format "9999999999" Skip
    errordescription At 01 Format "x(100)" Skip
    errorparameters At 01 Format "x(100)" Skip
    errortype At 01 Format "x(100)" Skip
    errorhelp At 01 Format "x(100)" Skip
    errorsubtype At 01 Format "x(100)" Skip(2).
    end.
    End.

    /* Caso ocorreu problema nas validações, não continua o processo */
    if not l-proc-ok-aux then
    undo, leave.

    /* Efetiva os pedidos e cria a nota */
    run dibo/bodi317ef.p persistent set h-bodi317ef.
    run emptyRowErrors in h-bodi317in.
    run inicializaAcompanhamento in h-bodi317ef.
    run setaHandlesBOS in h-bodi317ef(h-bodi317pr,
    h-bodi317sd,
    h-bodi317im1bra,
    h-bodi317va).
    run efetivaNota in h-bodi317ef(input i-seq-wt-docto,
    input yes,
    output l-proc-ok-aux).

    run finalizaAcompanhamento in h-bodi317ef.

    /* Busca possíveis erros que ocorreram nas validações */
    run devolveErrosbodi317ef in h-bodi317ef(output c-ultimo-metodo-exec,
    output table RowErrors).

    /* Pesquisa algum erro ou advertência que tenha ocorrido */
    find first RowErrors
    where RowErrors.ErrorSubType = "ERROR":U no-error.

    /* Caso tenha achado algum erro ou advertência, mostra em tela */
    if avail RowErrors Then Do:
    for each RowErrors:
    Put Stream str-rp "Erro 6 .: " At 01
    errorsequence At 14 Format "999999"
    errornumber At 22 Format "9999999999" Skip
    errordescription At 01 Format "x(100)" Skip
    errorparameters At 01 Format "x(100)" Skip
    errortype At 01 Format "x(100)" Skip
    errorhelp At 01 Format "x(100)" Skip
    errorsubtype At 01 Format "x(100)" Skip(2).
    end.
    End.

    /* Caso ocorreu problema nas validações, não continua o processo */
    if not l-proc-ok-aux then do:
    delete procedure h-bodi317ef.
    undo, leave.
    end.

    /* Busca as notas fiscais geradas */
    run buscaTTNotasGeradas in h-bodi317ef(output l-proc-ok-aux,
    output table tt-notas-geradas).

    For Each tt-notas-geradas:
    for First nota-fiscal
    where rowid(nota-fiscal) = tt-notas-geradas.rw-nota-fiscal exclusive-lock:

    Find First tt-nota Where tt-nota.cod-estabel = nota-fiscal.cod-estabel
    And tt-nota.serie = nota-fiscal.serie
    And tt-nota.nr-nota-fis = nota-fiscal.nr-nota-fis No-error.
    If Not Avail tt-nota Then Do:
    Create tt-nota.
    Assign tt-nota.cod-estabel = nota-fiscal.cod-estabel
    tt-nota.serie = nota-fiscal.serie
    tt-nota.nr-nota-fis = nota-fiscal.nr-nota-fis.
    End.

    End.
    End.

    /* Elimina o handle do programa bodi317ef */
    delete procedure h-bodi317ef.

    leave.
    end. /* repeat trans */

    End. /* For Each tt-ped-novo */

    /* Finalização das BOs utilizadas no cálculo */
    run finalizaBOS in h-bodi317in.
  2. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    Isso ocorre pois fora da transação está fazendo alguma alteração ou um simples "EXCLUSIVE-LOCK" ou "SHARED-LOCK" ai dá conflito de transações.

    para saber que há uma transação ativa, coloque a mensagem em vários pontos do código:

    MESSAGE TRANSACTION VIEW-AS ALERT-BOX.
  3. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    As BOs já fazem transação dentro delas, as procedures já tem um do transaction nela, como vc colocou um repeat trans: pra iniciar o seu processo, deu conflito, apesar de ser só um warning é bom dar atenção pra isso, tenta fazer o seu processo sem transaction.
  4. flavia.nicacio

    flavia.nicacio Sem Pontuação

    @rafael.andrade, essa mensagem sempre mostra Yes, porque os métodos da BO estão sendo chamados dentro do meu "repeat trans"...

    @bootstrapmaster, ao tirar o "repeat trans", quando há um erro na geração de alguma nota fiscal, o programa não gera corretamente as outras. Estou fazendo um teste que deve gerar duas notas diferentes. Quando tiro o "repeat trans", aparece no log somente o erro da primeira nota e a segunda não é gerada.

    Aos dois, obrigada pela ajuda até aqui!!!

    Alguém teria um exemplo de utilização dessa BO?
  5. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    Seguinte, coloca essa rotina dentro um .p, onde vc faz RUN passando as temp-tables com os dados, ai vc individualiza o processo.
    Eu uso assim ....

    Arquivos Anexados:

    jeffyssantos curtiu isso.
  6. flavia.nicacio

    flavia.nicacio Sem Pontuação

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

Compartilhe esta Página