segunda-feira, 2 de março de 2015

Correção erro em loop de cancelamento BAPI_INCOMINGINVOICE_CANCEL - com NF

 Eu tive um problema recente esses dias onde eu tinha um programa onde poderiam ser marcados mais de uma fatura (MM) para estorno (MR8M), para isso utilizando a BAPI BAPI_INCOMINGINVOICE_CANCEL, nesse meu processo além da fatura da MIRO eu tinha mais uma fatura MIRO tbm de nota de crédito e eliminação do pedido de compras. Essa nota de crédito sem NF e a fatura da MIRO ref. ao pedido de compras com NF.
No programa quando era marcado mais de um item para cancelamento, somente era processado o primeiro item selecionado, ou seja era estornado a MIRO de nota de crédito, a MIRO do pedido e o pedido de compra em si, a partir do segundo item ficava dando um erro de NF externo inválido, se saísse do programa e executasse novamente, somente a primeira linha selecionada era eliminado e o seguinte dava o erro.
Procurei alternativas de funções que limpassem o buffer, pois com certeza durante o processamento com o programa já carregado em memória, alguma coisa estava ficando para trás e não estava sendo limpo.. depois de algumas horas de DEBUG percebi que a estrutura NFHEADER do programa SAPLJ1BI continuava preenchido no segundo processamento com dados da NF estornada anterior, e além dessa estrutura  a tabela interna X4_RSEG tbm, e essa tabela justamete possui o número do pedido relacionado a MIRO, dessa forma o programa sempre procurava o último pedido processado e não o pedido a ser cancelado.

Solução para o problema, foi apagar o BUFFER antes do processamento e tudo resolvido.

    CALL FUNCTION 'J_1B_IM_NF_REFRESH'.
    ASSIGN ('(SAPLJ1BI)NFHEADER'TO <lfsw_nfheader>.
    IF sy-subrc 0.
      CLEAR <lfsw_nfheader>.
    ENDIF.

    ASSIGN ('(SAPLJ1BI)X4_RSEG[]'TO <lfst_rseg>.
    IF sy-subrc 0.
      CLEAR <lfst_rseg>[].
    ENDIF.

    CALL FUNCTION 'BAPI_INCOMINGINVOICE_CANCEL'
      EXPORTING
        invoicedocnumber          lv_invoicedocnumber
        fiscalyear                lv_fiscalyear
        reasonreversal            '01'
      IMPORTING
        invoicedocnumber_reversal lv_belnr
        fiscalyear_reversal       lv_gjahr
      TABLES
        return                    lt_return.

4 comentários:

  1. Cara...isso resolveu o meu problema..obrigado

    ResponderExcluir
  2. Opa vlw pela dica, resolveu 90% do meu problema tive que limpar a tabela IM também ! obrigado

    ResponderExcluir
  3. pra mim resolveu tambem setando:
    ASSIGN ('(SAPLJ1BI)STORNO_FLAG') TO .
    IF sy-subrc = 0.
    CLEAR .
    ENDIF.

    ResponderExcluir