quinta-feira, 17 de julho de 2014

Função para gerar Remessa de transferência VL10B

  Função que faz a remessa de transferência como as transação VL10*, dependendo do tipo de transferência tem q fazer alguma alteração, essa é especifica para VL10B.

FUNCTION ZSDF_CD_GERA_REMESSA_VL10B.
*"----------------------------------------------------------------------
*"*"Interface local:
*"  IMPORTING
*"     REFERENCE(I_EBELN) TYPE  EKKO-EBELN
*"     REFERENCE(I_VSTEL) TYPE  LIKP-VSTEL DEFAULT SPACE
*"  EXPORTING
*"     REFERENCE(E_VBELN) TYPE  LIKP-VBELN
*"  TABLES
*"      IT_RETURN STRUCTURE  BAPIRET2
*"----------------------------------------------------------------------

  CONSTANTScl_list_type_indx  VALUE '1',  "Show Index data
             cl_list_type_item  VALUE '2',  "show Item  data
             cl_list_type_sche  VALUE '3'.  "show Schedulelines

  FIELD-SYMBOLS<fs_head>   TYPE table,
                 <fs_item>   TYPE table,
                 <fs_head_name>,
                 <fs_item_name>.

  DATAl_layout TYPE shp_vl10_szenario,
        l_subrc  TYPE sy-subrc,
        l_tabix  TYPE sy-tabix,
        l_role,
        l_frame.

  DATAlt_ebeln    TYPE TABLE OF shp_ebeln_range,
        lt_vstel    TYPE TABLE OF shp_vstel_range,
        lt_delivery TYPE shp_vl10_delivery,
        lt_vbls     TYPE TABLE OF vbls WITH HEADER LINE,
        lt_table    TYPE shp_vl10_postab_t,
        lt_head     TYPE shp_vl10_postab_t,
        lt_item     TYPE shp_vl10_postab_t,
        lt_head2    TYPE shp_vl10_indx_t,
        lt_item2    TYPE shp_vl10_indx_t,
        lt_vbsk_all       TYPE shp_vbsk_t.

  DATAlw_profilname     TYPE shp_vl10_list_profilname,
        lw_t186v          TYPE t186v,
        lw_vbsk           TYPE vbsk,
        lw_list_profil    TYPE shp_vl10_list_profil,
        lw_parameters     TYPE shp_vl10_parameters,
        lw_select_options TYPE shp_vl10_select_options,
        lw_ebeln          TYPE shp_ebeln_range,
        lw_vstel          TYPE shp_vstel_range,
        lw_enqueue        TYPE shp_vl10_package_t,
        lw_delivery       TYPE shp_vl10_delivery,
        lw_selfield       TYPE slis_selfield,
        lw_table          LIKE LINE OF lt_table.

  CLEAR lw_ebeln.
  lw_ebeln-sign   'I'.
  lw_ebeln-option 'EQ'.
  lw_ebeln-low    i_ebeln.
  COLLECT lw_ebeln INTO lt_ebeln.

  lw_select_options-ebeln lt_ebeln[].
  lw_select_options-vstel lt_vstel[].

  l_layout '0002'"Purchase order
  lw_profilname '0002'.

  PERFORM profil_data_complete(saplv50r_preUSING l_layout
                                                   lw_profilname
                                          CHANGING lw_t186v
                                                   lw_list_profil.

  lw_list_profil-ampel SPACE.

* Do not display VL10B output.
  SEARCH lw_list_profil-fcodes FOR 'DISPLAY'.
  IF sy-subrc 0.
    DELETE lw_list_profil-fcodes INDEX sy-tabix.
  ENDIF.

  lw_parameters-vstel i_vstel.

  CALL FUNCTION 'SHP_EXTENDED_DUE_LIST'
    EXPORTING
      ix_list_profil    lw_list_profil
      ix_parameters     lw_parameters
      ix_select_options lw_select_options
    IMPORTING
      ex_delivery       lt_delivery
    TABLES
      et_postab         lt_table
    EXCEPTIONS
      OTHERS            1.


* Note: lt_table has all the data that we see in VL10B output due list.

************Create Delivery...
  CASE lw_list_profil-list_type.

    WHEN cl_list_type_indx.
      ASSIGN lt_head2[] TO <fs_head>.
      ASSIGN lt_item2[] TO <fs_item>.

    WHEN cl_list_type_item.
      ASSIGN lt_head[] TO <fs_head>.
      ASSIGN lt_item[] TO <fs_item>.

    WHEN OTHERS.
      PERFORM userexit_prepare_assign_tabs(saplv50r_view)
              USING lw_list_profil
           CHANGING <fs_head_name>
                    <fs_item_name>.
      ASSIGN (<fs_head_name>TO <fs_head>.
      ASSIGN (<fs_item_name>TO <fs_item>.

  ENDCASE.

* --> Marco o item p/ processar
  lw_table-selkz 'X'.
  MODIFY lt_table FROM lw_table TRANSPORTING selkz
   WHERE selkz space.

* Regra de cálculo o mesmo da tela da VL10B
  lw_list_profil-ampel SPACE.
  lw_list_profil-ledat_high sy-datum + 30.

  PERFORM fcode_samd(saplv50r_viewCHANGING lw_enqueue
                                             lw_list_profil
                                             lw_selfield
                                             lt_vbsk_all
                                             lt_table
                                             <fs_head>
                                             <fs_item>
                                             lw_delivery  "created(sel.)
                                             l_subrc.

  lt_vbls[] lw_delivery-vbls.
  READ TABLE lt_vbls INDEX 1.
  IF sy-subrc IS INITIAL AND NOT lt_vbls-vbeln_lif IS INITIAL ).
    e_vbeln lt_vbls-vbeln_lif.

    SET PARAMETER ID 'VL' FIELD e_vbeln.
  ELSE.
    CLEAR lw_vbsk.

    READ TABLE lt_vbsk_all INTO lw_vbsk INDEX 1.

    PERFORM processa_erro TABLES it_return
                          USING lw_vbsk-sammg.

  ENDIF.


ENDFUNCTION.


====================== NOVO 2022 =====================

BAPI_OUTB_DELIVERY_CREATE_STO


Erro NFe depois do retorno da SEFAZ

  Estava com um problema numa NFe, um caso meio atípico, mas que aconteceu comigo essa semana.. fui cancelar uma NFe pelo programa que usava a função q postei aqui esses dias, e que inclusive fiz uma correção. O que ocorreu é que foi executado o estorno pelo programa e enviou a mensagem de cancelamente para o SEFAZ, foi aprovada e no retorno na atualização da NF com status de cancelado, deu um erro pq a NF estava aberta por um usuário, nisso o status no monitor ficou como em processamento não indo nem para frente e nem para trás.  Conferi no SEFAZ e o cancelamento tinha sido homologado então vi q o erro era no retorno mesmo.

Solução: tive q fazer pelo PI uma estratégia para poder simular um retorno do SEFAZ para concluir o processo de atualização da NF como cancelado.

- Entra no ambiente do PI.


- Executar SE16 na tabela /XNFE/NFEHD  para buscar o GUID do documento de NF.




Depois pegar o ID e ir na tabela /XNFE/EVENT_STAT  - colocar o ID da NFEHD no GUID do EVENT_STAT
Importante verificar no campo PROCSTEP que tem o valor ERPUPDAT, verificar  STEPSTATUS, se estiver com valor diferente de 01, alterar na marretada para 01.



Pegar esse mesmo ID e executar o programa via SE38 - /XNFE/UPDATE_ERP_STATUS_DIAL
 
Se der erro.. ainda.. debugar e marretar para processar até passar com sucesso.



 

quarta-feira, 16 de julho de 2014

Estorno de Saída de mercadoria VL09 sem batch input

Aproveitando o tópico que fiz sobre a rotina de estorno da NFe, estou aproveitando para postar essa rotina para estorno de saída de mercadoria, como não existe bapi para tal e não queria usar o batch input optei por uma função interna do standard, e criei uma função para o processo.

FUNCTION zfsd_cancela_saida_mercadoria.
*"----------------------------------------------------------------------
*"*"Interface local:
*"  IMPORTING
*"     REFERENCE(I_VBELN) TYPE  VBELN_VL
*"  TABLES
*"      IT_RETURN STRUCTURE  BAPIRET2
*"  EXCEPTIONS
*"      ERROR_MESSAGE
*"----------------------------------------------------------------------

  DATAlt_mesg TYPE TABLE OF mesg.

  DATA lw_mesg TYPE mesg.

  DATAl_garg  TYPE seqg3-garg,
        l_subrc TYPE sy-subrc.

  SELECT COUNT)
    FROM vbuk
   WHERE vbeln EQ i_vbeln
     AND wbstk EQ 'C'.

  CHECK sy-subrc 0.

  CONCATENATE sy-mandt i_vbeln INTO l_garg.

  PERFORM verifica_bloqueio USING 'LIKP'  l_garg
                         CHANGING l_subrc.

  IF l_subrc 0.

    CLEAR lt_mesg[].

    CALL FUNCTION 'WS_REVERSE_GOODS_ISSUE'
      EXPORTING
        i_vbeln                   i_vbeln
        i_budat                   sy-datum
        i_tcode                   'VL09'
        i_vbtyp                   'J'
      TABLES
        t_mesg                    lt_mesg
      EXCEPTIONS
        error_reverse_goods_issue 1
        OTHERS                    2.

    IF sy-subrc 0.
      COMMIT WORK.

      DO 100 TIMES.

        SELECT COUNT)
          FROM vbuk
         WHERE vbeln EQ i_vbeln
           AND wbstk NE 'C'.

        IF sy-subrc 0.
          EXIT.
        ENDIF.

        WAIT UP TO SECONDS.

      ENDDO.

      IF sy-dbcnt 0.
        PERFORM monta_mensagem TABLES it_return
                            USING 'E' 'ZSD' '216'
                                  i_vbeln '' '' ''.
        RAISE error_message.
      ENDIF.


    ELSE.

      LOOP AT lt_mesg INTO lw_mesg.

        PERFORM monta_mensagem TABLES it_return
                                USING lw_mesg-msgty lw_mesg-arbgb
                                      lw_mesg-txtnr
                                      lw_mesg-msgv1
                                      lw_mesg-msgv2
                                      lw_mesg-msgv3
                                      lw_mesg-msgv4.

      ENDLOOP.

      RAISE error_message.

    ENDIF.

  ELSE.
    PERFORM monta_mensagem TABLES it_return
                                USING 'E' 'ZSD' '213'
                                      i_vbeln '' '' ''.
    RAISE error_message.
  ENDIF.

ENDFUNCTION.