quarta-feira, 16 de julho de 2014

Rotina para cancelamento NFe sem necessidade de entrar no monitor J1BNFE

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
*"----------------------------------------------------------------------

  DATAlt_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.

  DATAlw_doc TYPE j_1bnfdoc.


  SELECT SINGLE *
    INTO lw_doc
    FROM j_1bnfdoc
   WHERE docnum EQ i_docnum.

  CHECK sy-subrc 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 AND lw_doc-docstat space OR
       sy-subrc <> ).
      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 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 lineslt_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 SECONDS.

  ENDDO.

  IF sy-dbcnt 0.

    PERFORM monta_mensagem TABLES it_return
                        USING 'E' 'ZSD' '214'
                              i_docnum '' '' ''.
    RAISE error_message.

  ENDIF.

ENDFUNCTION.

Nenhum comentário:

Postar um comentário