Esse é um código desenvolvido para estorno de NFe feito para aqueles programas malucos onde além de fazer um processo de SD ou MM eu tenho um processo de estorno do mesmo e como hoje a maioria das NF são eletrônicas peguei uma parte da rotina do monitor J1BNFE para fazer no programa sem a necessidade de solicitar o cancelamento pelo monitor.
FUNCTION zfsd_cancela_nfe.
*"----------------------------------------------------------------------
*"*"Interface local:
*"  IMPORTING
*"     REFERENCE(I_DOCNUM) TYPE  J_1BNFDOC-DOCNUM
*"     REFERENCE(I_REASON) TYPE  J_1BNFE_ACTIVE-REASON
*"  TABLES
*"      IT_RETURN STRUCTURE  BAPIRET2
*"  EXCEPTIONS
*"      ERROR_MESSAGE
*"----------------------------------------------------------------------
  DATA: lt_tab_active     TYPE TABLE OF j_1bnfe_active WITH HEADER LINE,
        lt_tab_active_mod TYPE TABLE OF j_1bnfe_active WITH HEADER LINE,
        lt_et_active_mod  TYPE TABLE OF j_1bnfe_active WITH HEADER LINE,
        lt_et_errtab      TYPE TABLE OF j_1bnfe_active WITH HEADER LINE.
  DATA: lw_doc TYPE j_1bnfdoc.
  SELECT SINGLE *
    INTO lw_doc
    FROM j_1bnfdoc
   WHERE docnum EQ i_docnum.
  CHECK sy-subrc = 0 AND lw_doc-cancel = space.
  CALL FUNCTION 'ENQUEUE_EJ_1BNFE'
    EXPORTING
      docnum         = i_docnum
    EXCEPTIONS
      foreign_lock   = 1
      system_failure = 2
      OTHERS         = 3.
  IF sy-subrc <> 0.
    PERFORM monta_mensagem TABLES it_return
                            USING 'E' 'ZSD' '224'
                                  i_docnum '' '' ''.
    RAISE error_message.
  ELSE.
    CALL FUNCTION 'DEQUEUE_EJ_1BNFE'
      EXPORTING
        docnum = i_docnum.
  ENDIF.
  CLEAR lt_tab_active.
* Busca dados da NFE p/ NF de saída
  SELECT SINGLE *
    INTO lt_tab_active
    FROM j_1bnfe_active
   WHERE docnum EQ i_docnum.
  IF sy-subrc <> 0.
    PERFORM monta_mensagem TABLES it_return
                            USING 'E' 'ZSD' '209'
                                  i_docnum '' '' ''.
    RAISE error_message.
  ENDIF.
* O código 3 é o scan
  IF lt_tab_active-conting = 'X'.
    SELECT SINGLE *
      INTO lw_doc
      FROM j_1bnfdoc
     WHERE docnum EQ i_docnum.
    IF ( sy-subrc = 0 AND lw_doc-docstat = space ) OR
       ( sy-subrc <> 0 ).
      RAISE contingencia.
    ENDIF.
  ELSEIF lt_tab_active-docsta = space. "Status enviado sem retorno
    PERFORM monta_mensagem TABLES it_return
                            USING 'E' 'ZSD' '210'
                                  i_docnum '' '' ''.
    RAISE error_message.
  ENDIF.
  DO 60 TIMES.
    SELECT SINGLE *
      INTO lt_tab_active
      FROM j_1bnfe_active
     WHERE docnum EQ i_docnum.
    IF lt_tab_active-docsta <> ''.
      EXIT.
    ENDIF.
    WAIT UP TO 5 SECONDS.
  ENDDO.
  APPEND lt_tab_active.
  lt_tab_active_mod[] = lt_tab_active[].
* Dados do cancelamento da NF
  lt_tab_active_mod-reason = i_reason.
  SELECT SINGLE reason1
    INTO lt_tab_active_mod-reason1
    FROM j_1bnfe_cancelrt
   WHERE reason EQ lt_tab_active_mod-reason
     AND spras  EQ sy-langu.
  IF sy-subrc <> 0.
    PERFORM monta_mensagem TABLES it_return
                            USING 'E' 'ZSD' '211'
                                  '' '' '' ''.
    RAISE error_message.
  ENDIF.
  MODIFY lt_tab_active_mod TRANSPORTING reason reason1
   WHERE docnum EQ i_docnum.
  CALL FUNCTION 'J_1B_NFE_SEND_REQUESTS'
    TABLES
      it_acttab     = lt_tab_active
      et_errtab     = lt_et_errtab
      et_active_mod = lt_et_active_mod
      it_acttab_mod = lt_tab_active_mod
    EXCEPTIONS
      status_error  = 1
      rfc_failure   = 2
      OTHERS        = 3.
  IF sy-subrc <> 0.
    PERFORM monta_mensagem TABLES it_return
                            USING 'E' 'ZSD' '212'
                                  i_docnum '' '' ''.
    RAISE error_message.
  ENDIF.
  DATA l_line TYPE i.
  IF lines( lt_et_errtab ) <> 0.
    PERFORM monta_mensagem TABLES it_return
                        USING 'E' 'ZSD' '212'
                              i_docnum '' '' ''.
    RAISE error_message.
  ENDIF.
  DO 100 TIMES.
    SELECT COUNT( * )
      FROM j_1bnfdoc
     WHERE docnum EQ i_docnum
       AND cancel EQ 'X'.
    IF sy-subrc = 0.
      EXIT.
    ENDIF.
    WAIT UP TO 1 SECONDS.
  ENDDO.
  IF sy-dbcnt = 0.
    PERFORM monta_mensagem TABLES it_return
                        USING 'E' 'ZSD' '214'
                              i_docnum '' '' ''.
    RAISE error_message.
  ENDIF.
ENDFUNCTION.
 
Olá Administrador do Blog,
ResponderExcluirQuero apenas deixar esta mensagem aqui no seu blogue para dar a conhecer a alguém um apoio financeiro que o Sr. Pedro me oferece durante a época do covid-19 porque essa época foi muito má e difícil para mim depois do confinamento do país quase perdi o o meu negócio perante Pedro Jerome, um agente de crédito que me ajudou com um empréstimo à taxa de 2% em troca de financiar o meu negócio, estou muito grato e mostrar gratidão ao seu apoio testemunhará o quanto estou grato ao seu serviço e à sua equipa de trabalho como bem, depois de visitar o seu escritório na minha localidade, soube que era um bom homem com um coração agradecido.
Gostaria que qualquer pessoa aqui com condições financeiras contactasse o Sr Pedro Jerome no seu email pedroloanss@gmail.com e WhatsApp: +393510140339 ele irá ajudá-lo com qualquer tipo de crédito, crédito habitação, crédito automóvel, crédito construção, crédito empresarial, pessoal empréstimo, desde que seja honesto o suficiente para fazer um retorno.