Skip to Content

Solução de Problemas na Criação do Documento de Faturamento (SD-BIL-IV)

Soluções para problemas comuns e mensagens de erro



Veja as soluções para problemas comuns e mensagens de erro na FAQ de SD-BIL - Problemas frequentes em Faturamento (e a solução!!!).


Se você gostar do guia, não esqueça de avaliar nas estrelinhas ali abaixo do post!


Durante a criação do documento de faturamento nas transações VF01, VF04, VF11 o sistema sempre chama a função RV_INVOICE_CREATE.

Para lançar a função RV_INVOICE_CREATE a partir de um documento de faturamento existente, siga os passos abaixo:

1. VF03

2. Entre o número do documento

3. Menu Edit -> Analysis

Como descobrir como um campo é preenchido

Normalmente, para descobrir como um campo é preenchido:

1. Coloque um breakpoint no início da função RV_INVOICE_CREATE

2. Execute a transação

3. Coloque um watchpoint nesse campo.

Como capturar uma mensagem

Durante a criação do documento de faturamento as mensagens não são exibidas diretamente ao usuário através de um comando ABAP. Ao invés disso, elas são armazenadas na tabela interna XVBFS.

Como capturar uma mensagem:

1. Coloque um breakpoint no início da função RV_INVOICE_CREATE

2. Execute a transação

3. Coloque um watchpoint no campo XVBFS-MSGNO

Pilha de chamadas (Call stack)

Ao alcançar a mensagem ou o código relevante, sempre confira a pilha de chamadas (call stack).

Confira se há qualquer código customizado ou rotina de requisitos de cópia customizada na pilha de chamadas.

Você pode reconhecer facilmente as rotinas de requisitos de cópia customizada porque elas estão no namespace do cliente 600-999 (por exemplo, RV60B888). Para mais detalhes, acessa a nota 356737.

Funções importantes na criação de documento de faturamento

Durante a criação do document de faturamento, o sistema executa a função RV_INVOICE_CREATE.

Sempre que um document de faturamento é salvo (não só quando é criado), o sistema executa a função RV_INVOICE_DOCUMENT_ADD.

Note que quando um documento de faturamento é liberado para a contabilidade, ele também é salvo.

Quando o faturamento é realizado por etapas:

  • VF04 -> Salvar
  • VF04 -> Exibir lis.docs.faturamento a fazer -> Documento de faturamento coletivo
  • VF06

  O sistema chama a função: SD_COLLECTIVE_RUN_EXECUTE



Abaixo estão informações adicionais para depurar (debug) o código do sistema nas funções mencionadas acima.



Depurar (Debug) a criação do documento de faturamento (RV_INVOICE CREATE)


Function RV_INVOICE_CREATE

...

  Fakturen erzeugen

  LOOP AT xkomfk.          <<<< 1 Loop nos documentos de venda a serem faturados

    ...

    PERFORM faktura_erzeugen.          <<<< 2 Criar os itens e o cabeçalho

...

FORM FAKTURA_ERZEUGEN (LV60AA26)

...

IF XKOMFK-VBTYP CA VBTYP_LIEF.

    PERFORM FAKTURA_LIEFERBEZOGEN.          <<<< 3 Faturamento de documentos criados a partir de uma Remessa

    EXIT.

  ENDIF.

  IF XKOMFK-VBTYP CA VBTYP_FAKT.

    PERFORM FAKTURA_FAKTURABEZOGEN.          <<<< 4 Faturamento de documentos criados a partir de uma Fatura

    EXIT.

  ENDIF.

  PERFORM FAKTURA_AUFTRAGSBEZOGEN.          <<<< 5 Faturamento de documentos criados a partir de uma Ordem

...


Depurar (Debug) a Criação do Documento de Faturamento - Documentos criados a partir de uma Remessa


FORM FAKTURA_LIEFERBEZOGEN (LV60AA22)

...

* Prüfen Bedingungen lt. TVCPF

  if *tvcpf-grbed ne 0.

    bedmodul-nr = *tvcpf-grbed.

    perform (bedmodul) in program saplv60a.          <<<< 3.1. Rotina de requisitos de cópia do cabeçalho

...

  loop at alips.          <<<< 3.2. Loop nos itens da remessa

    ...

    if lips-vgbel eq space or...                       

    ...

* Lieferung/Lieferposition ohne Referenzauftrag

      perform fakturaposi_lieferbezogen_o_ap.          <<<< 3.3. Remessa SEM referência

    else.

* Lieferposition mit Referenzauftrag

      perform fakturaposi_lieferbezogen.          <<<< 3.4. Remessa COM referência

    endif.

  endloop.

...


Faturamento a partir de uma remessa - Remessa SEM referência


Esse form é muito parecido com o form FAKTURAPOSI_LIEFERBEZOGEN.

Como não há uma ordem de cliente, nesse form o sistema irá simular VBAP e VBAK.


Depois o sistema executa os mesmos forms do FAKTURAPOSI_LIEFERBEZOGEN.



Faturamento a partir de uma remessa - Remessa COM referência


FORM FAKTURAPOSI_LIEFERBEZOGEN (LV60AA21)

...

  perform vbrk_vbrp_fuellen.                <<<< 3.4.1. alguns campos das tabelas VBRP e VBRK são preenchidos

  perform fakturadaten_lieferbezogen.        <<<< 3.4.1. alguns campos das tabelas VBRP e VBRK são preenchidos

...

  if tvcpf-grbed ne 0.

    bedmodul-nr = tvcpf-grbed.

    perform (bedmodul) in program saplv60a.  <<<< 3.4.2. Rotina de cópia de requisitos no nível de item

...

  perform vbrk_vbrp_datentransport using rc. <<<< 3.4.3. mais dados preenchidos nas tabelas VBRP, VBRK; executa rotina de cópia

...

  perform xvbrk_bearbeiten.                  <<<< 3.4.4. VBRK é setado em XVBRK, se houver partição um novo registro é criado em XVBRK

...

  xvbrp = vbrp.  <<<< 3.4.5 VBRP é copiada para dentro do cabeçalho da tabela interna XVBRP

...

  call function 'PRICING_COPY‘      <<<< 3.4.6. a função PRICING_COPY é executada

...

  perform preisfindung using tvcpf-knprs.  <<<< 3.4.7. a função PRICING é executada

...

  perform xvbrp_hinzufuegen.    <<<< 3.4.8. a nova linha em XVBRP é adicionada na tabela interna

...

  perform vbfa_fuellen using likp-vbeln lips-posnr likp-vbtyp.

  call function 'RV_XVBFA_MAINTAIN‘  <<<< 3.4.9. ajuste do fluxo de documento na tabela interna XVBFA ...

  call function 'LIPS_STATUS_MAINTAIN‘  <<<< 3.4.10. ajuste do status de faturamento da remessa

...


Depurar (Debug) a Criação do Documento de Faturamento - Documentos criados a partir de uma Fatura


FORM FAKTURA_FAKTURABEZOGEN (LV60AA25)

...

CALL FUNCTION 'RV_INVOICE_DOCUMENT_READ‘          <<<< 4.1. Ler o documento de faturamento de referência. A partir de agora, a workarea *VBRK contem os dados do documento de faturamento referenciado

...

  IF XFKART = SPACE.

    PERFORM STORNO_ERZEUGEN.               

  ELSE.

    SELECT SINGLE * FROM TVFK INTO *TVFK WHERE FKART = *VBRK-FKART.

    IF SY-SUBRC = 0.

      IF *TVFK-FKARTS = XFKART.

        PERFORM STORNO_ERZEUGEN.          <<<< 4.2. durante a VF11 o sistema executa STORNO_ERZEUGEN

      ELSE.

        PERFORM FAKTURA_AUS_FAKTURA_ERZEUGEN.  <<<< 4.3. caso contrário, executa o faturamento a partir de uma fatura

...

FORM FAKTURA_AUS_FAKTURA_ERZEUGEN (LV60AD08)

...

* Prüfen Bedingungen lt. TVCPF

  IF *TVCPF-GRBED NE 0.

    BEDMODUL-NR = *TVCPF-GRBED.

    PERFORM (BEDMODUL) IN PROGRAM SAPLV60A.          <<<< 4.4. executa a rotina de cópia de requisitos do cabeçalho

...

  LOOP AT XVBRP WHERE VBELN = XKOMFK-VBELN.          <<<< 4.5. loop nos itens a faturar

    ...

    *VBRP = XVBRP.          <<<< 4.6. de agora em diante *VBRP contem os dados do item a faturar referenciado

    PERFORM FAKTURAPOSI_FAKTURABEZOGEN.          <<<< 4.7. processar o item a faturar

  ENDLOOP.

...


Faturamento a partir de uma fatura - Processar o item a faturar


FORM FAKTURAPOSI_FAKTURABEZOGEN (LV60AD09)

...

  PERFORM vbrk_vbrp_fuellen_f USING space.

...

  IF tvcpf-grbed NE 0.

    bedmodul-nr = tvcpf-grbed.

    PERFORM (bedmodul) IN PROGRAM saplv60a.

...

  PERFORM vbrk_vbrp_datentransport_f USING rc.

...

  PERFORM xvbrk_bearbeiten.

...

  xvbrp = vbrp.

...

  CALL FUNCTION 'PRICING_COPY'

...

  PERFORM preisfindung USING tvcpf-knprs.

...

  PERFORM xvbrp_hinzufuegen.

...

  PERFORM vbfa_fuellen USING *vbrk-vbeln *vbrp-posnr *vbrk-vbtyp.

  CALL FUNCTION 'RV_XVBFA_MAINTAIN'

...


Depurar (Debug) a Criação do Documento de Faturamento - Documentos criados a partir de uma Ordem


FORM FAKTURA_AUFTRAGBEZOGEN (LV60AA30)

...

* Prüfen Bedingungen lt. TVCPF

  if *tvcpf-grbed ne 0.

    bedmodul-nr = *tvcpf-grbed.

    perform (bedmodul) in program saplv60a.          <<<< 5.1. executar rotina de requisitos de cópia do cabeçalho

...

  loop at avbap where fkrel ne con_fkrel_fpl          <<<< 5.2. loop no item da ordem sem programa de faturamento

    ...

    perform fakturaposi_auftragsbezogen using da_subrc.          <<<< 5.3. processar item da ordem

    ...

  endloop.

...

  loop at avbkd where fplnr ne space

                and  posnr ne posnr_low.          <<<< 5.4. loop no item da ordem com programa de faturamento

    do.

*    Lesen der Fakturierungsplanpositionen

      read table xfplt index da_index.          <<<< 5.5. loop nas linhas do programa de fturamento de item

      ...

      perform fakturaposi_auftragsbezogen using da_subrc.          <<<< 5.6. processar item da ordem

      ...         

    enddo.

  endloop.

endform.                    "FAKTURA_AUFTRAGSBEZOGEN


Faturamento a partir de uma ordem - Processar item da ordem


FORM FAKTURAPOSI_AUFTRAGBEZOGEN (LV60AA29)

...

  perform vbrk_vbrp_fuellen.          <<<< 5.3.1. Tabelas VBRP e VBRK são preenchidas

  perform fakturadaten_auftragbezogen.          <<<< 5.3.1. Tabelas VBRP e VBRK são preenchidas

...

  if tvcpf-grbed ne 0.

    bedmodul-nr = tvcpf-grbed.

    perform (bedmodul) in program saplv60a.          <<<< 5.3.2. Rotina de cópia de requisitos no nível do item

...

  perform vbrk_vbrp_datentransport using rc.          <<<< 5.3.3. mais dados preenchidos nas tabelas VBRP, VBRK; rotina de cópia executada

...

  perform xvbrk_bearbeiten.          <<<< 5.3.4. VBRK é definida como XVBRK, se houver partição um novo registro é adicionado na XVBRK

...

  xvbrp = vbrp.          <<<< 5.3.5. VBRP é copiado para o cabeçalho da tabela interna XVBRP

...

  call function 'PRICING_COPY‘          <<<< 5.3.6. A função PRICING_COPY é executada

...

  perform preisfindung using tvcpf-knprs.          <<<< 5.3.7. A função PRICING é executada

...

  perform xvbrp_hinzufuegen.          <<<< 5.3.8. a nova linha da XVBRP é adicionada na tabela interna

...

  perform vbfa_fuellen using vbak-vbeln vbap-posnr vbak-vbtyp.

  call function 'RV_XVBFA_MAINTAIN‘          <<<< 5.3.9. Ajuste do fluxo de documentos na tabela interna XVBFA

...

  call function 'RV_XVBUP_MAINTAIN_FKGSA ‘          <<<< 5.3.10. Ajuste do status de faturamento da ordem

...



Depurar (Debug) a gravação do documento de faturamento (RV_INVOICE_DOCUMENT_ADD)


Function RV_INVOICE_DOCUMENT_ADD

LOOP AT xvbrk.                                            >>>> 1. loop em todos os documentos de faturamento a serem atualizados

    ...

    PERFORM faktura_bearbeiten_ende USING preisfindungsart. >>>> 2. Executa a função PRICING_COMPLETE

    ...

    CALL FUNCTION 'NUMBER_GET_NEXT'

          EXPORTING

            nr_range_nr            = da_numki

            object                  = 'RV_BELEG'

            ignore_buffer          = no_buffer

          IMPORTING

            returncode              = ld_returncode

            number                  = xvbrk-vbeln          >>>> 3. Pegar um novo número do objeto do intervalo de numeração RV_BELEG

...

    CALL FUNCTION 'RV_ACCOUNTING_DOCUMENT_CREATE‘          >>>> 4. Liberar o documento de faturamento para a contabilidade

    ...

    CALL FUNCTION 'REBATE_INDEX_BUILD‘                      >>>> 5. Atualizar a tabela VBOX (processo de bonificação)

    ...

  ENDLOOP.

...

  CALL FUNCTION 'RV_INVOICE_POST' IN UPDATE TASK            >>>> 6. ver abaixo

...

  CALL FUNCTION 'RV_INVOICE_REFRESH‘                        >>>> 7.  ver abaixo

6. Essa função atualiza o novo (atualizado) documento. Ela é executada em update task, então não pode ser depurada (debug) via debugging normal. As informações armazenadas nas tabelas internas XVBR* e YVBR* serão atualizadas no banco de dados de acordo com o campo UPDKZ (nota 178328).


7. Essa função, chamada ao final, executa o COMMIT no banco de dados. Uma vez que é executada o novo (atualizado) documento de faturamento fica disponível.

Observações:

É perigoso depurar a função RV_INVOICE_DOCUMENT_ADD durante a criação do documento de faturamento em um sistema produtivo. Após a execução da função NUMBER_GET_NEXT o sistema irá buscar o próximo número do objeto RV_BELEG, e há um risco de perder esse número. Isso irá causar uma lacuna no intervalo de numeração em SD Billing (e em documentos de FI também caso usem a mesma numeração).

Essas lacunas na numeração de documentos SD e FI são proibidas em muitos países.

É por essa razão que é muito perigoso depurar a criação de documento de faturamento em sistema produtivo, a menos que você esteja disposto a aceitar essa lacuna na numeração.



Depurar (Debug) a criação do documento de faturamento coletivo (SD_COLLECTIVE_RUN_EXECUTE)

Function SD_COLLECTIVE_RUN_EXECUTE

...

  MAX_DOCUMENTS = 1000.

  CALL CUSTOMER-FUNCTION '009'

      TABLES

            CT_VKDFIF = V60P_INPUT_VKDFIF

      CHANGING

            CD_MAX_DOCUMENTS = MAX_DOCUMENTS      <<<< 1. Userexit para alterar MAX_DOCUMENTS (notas 111813, 130585)

...

  SORT V60P_INPUT_VKDFIF BY KUNNR VKORG V_FKART V_FKDAT SORTKRI

                            FKDAT FKART VBELN.

  CALL CUSTOMER-FUNCTION '010'

      TABLES

            CT_VKDFIF = V60P_INPUT_VKDFIF        <<<< 2. Userexit para alterar critério de classificação

...

  LOOP AT V60P_INPUT_VKDFIF WHERE SELKZ NE SPACE. <<<< 3. Loop nos documentos a faturar

...

    ON CHANGE OF V60P_INPUT_VKDFIF-KUNNR OR

                V60P_INPUT_VKDFIF-VKORG OR

                V60P_INPUT_VKDFIF-V_FKART.  <<<< 4. Se o emissor ou organização de vendas ou tipo de faturamento é alterado

      IF COUNTER > 0.                       

        PERFORM RV_INVOICE_CREATE            <<<< 4.1. Se COUNTER > 0 então chamar a função para criar o documento de faturamento

...

        CLEAR COUNTER.                        <<<< 4.2. Inicializar COUNTER

        REFRESH XKOMFK.

      ENDIF.

    ENDON.

    ADD 1 TO COUNTER.                        <<<< 5. Aumentar COUNTER

...

    IF COUNTER > MAX_DOCUMENTS.  "maximale Anzahl Belege  <<<< 6. Se MAX_DOCUMENTS é alcançado

      PERFORM RV_INVOICE_CREATE              <<<< 6.1. executar a função de criação do documento de faturamento e

      ...

      CLEAR COUNTER.                          <<<< 6.2. inicializar COUNTER

...

  ENDLOOP.

...

  IF COUNTER <> 0.                            <<<< 7. Depois do Loop faturar os últimos documentos que sobraram depois da última alteração

    CLEAR SY-CALLD.

    PERFORM RV_INVOICE_CREATE                           

...


Tags: