quinta-feira, 17 de julho de 2014

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.

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.

terça-feira, 15 de julho de 2014

Programa para copiar estratégia de liberação em um ambiente e copiar para outro (por arquivo)

  Esse programa eu fiz para gerar um arquivo com as estratégias de liberação criadas em DEV para serem importados em QA ou PRD.

REPORT  zmmb0009 MESSAGE-ID zmm NO STANDARD PAGE HEADING LINE-COUNT 65
LINE-SIZE 255.

TYPE-POOLS: icon.

TABLES: t16fs.

TYPES: BEGIN OF tp_file,
        tipo              TYPE char1, "(N)num,(C)char,(X)Curr
        objectkey         TYPE bapi1003_key-object,
        objecttable       TYPE bapi1003_key-objecttable,
        classnum          TYPE bapi1003_key-classnum,
        classtype         TYPE bapi1003_key-classtype,
        charact              TYPE char30,
        value_from        TYPE char30,
        value_to          TYPE char30,
        value_relation    TYPE char1,
        unit_from            TYPE char3,
        unit_to              TYPE char3,
        unit_from_iso        TYPE char3,
        unit_to_iso          TYPE char3,
        inherited            TYPE char1,
        instance          TYPE numc3,
        charact_descr        TYPE char30,
        value_char        TYPE char30,
        value_neutral        TYPE char30,
        currency_from        TYPE char5,
        currency_to          TYPE char5,
        currency_from_iso    TYPE char30,
        currency_to_iso      TYPE char30,
       END OF tp_file.

DATA: t_grpest TYPE TABLE OF t16fs WITH HEADER LINE,
      t_file TYPE TABLE OF tp_file WITH HEADER LINE.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.

SELECTION-SCREEN BEGIN OF BLOCK b11 WITH FRAME TITLE text-002.
PARAMETERS: pr_imp RADIOBUTTON GROUP g1 MODIF ID G1 USER-COMMAND USCOM,
            pr_exp RADIOBUTTON GROUP g1 DEFAULT 'X' MODIF ID G1.
SELECTION-SCREEN END OF BLOCK b11.

PARAMETERS: p_frggr TYPE frggr OBLIGATORY DEFAULT 'G3',
            p_clsnum TYPE bapi1003_key-classnum
                          DEFAULT 'LIBERACAO_PEDIDO' OBLIGATORY,
            p_clstyp TYPE bapi1003_key-classtype
                          DEFAULT '032' OBLIGATORY.
SELECT-OPTIONS: s_frgsx FOR t16fs-frgsx.

SELECTION-SCREEN SKIP.

PARAMETERS: p_file TYPE rlgrap-filename.

SELECTION-SCREEN END OF BLOCK b1.

******************************
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
******************************
  PERFORM value_request_file.

******************************
START-OF-SELECTION.
******************************
  PERFORM seleciona_dados.
  PERFORM processa_dados.
  PERFORM exportar_dados.

******************************
END-OF-SELECTION.
******************************

*&---------------------------------------------------------------------*
*&      Form  SELECIONA_DADOS
*&---------------------------------------------------------------------*
FORM seleciona_dados .

  IF pr_exp = 'X'.

    SELECT *
      INTO TABLE t_grpest
      FROM t16fs
     WHERE frggr EQ p_frggr
       AND frgsx IN s_frgsx.

    IF sy-subrc <> 0.
      MESSAGE i000 WITH text-mo1.
      STOP.
    ENDIF.

  ELSE.
    PERFORM importar_dados.

    IF t_file[] IS INITIAL.
      MESSAGE i000 WITH text-mo1.
      STOP.
    ENDIF.

  ENDIF.

ENDFORM.                    " SELECIONA_DADOS

*&---------------------------------------------------------------------*
*&      Form  PROCESSA_DADOS
*&---------------------------------------------------------------------*
FORM processa_dados .

  DATA: lt_num    TYPE TABLE OF bapi1003_alloc_values_num,
        lt_char   TYPE TABLE OF bapi1003_alloc_values_char,
        lt_curr   TYPE TABLE OF bapi1003_alloc_values_curr,
        lt_return TYPE TABLE OF bapiret2.

  DATA: lt_head TYPE  TABLE OF tp_file WITH HEADER LINE.

  DATA: ls_bapi TYPE bapi1003_key,
        ls_num  TYPE bapi1003_alloc_values_num,
        ls_char TYPE bapi1003_alloc_values_char,
        ls_curr TYPE bapi1003_alloc_values_curr,
        ls_return TYPE bapiret2.

  IF pr_exp = 'X'.

    LOOP AT t_grpest.

      CLEAR ls_bapi.

      CONCATENATE t_grpest-frggr t_grpest-frgsx  INTO ls_bapi-object.
      ls_bapi-objecttable = 'T16FS'.
      ls_bapi-classnum    = p_clsnum.
      ls_bapi-classtype   = p_clstyp.

      REFRESH: lt_num, lt_char, lt_curr, lt_return.

      CALL FUNCTION 'BAPI_OBJCL_GETDETAIL'
        EXPORTING
          objectkey       = ls_bapi-object
          objecttable     = ls_bapi-objecttable
          classnum        = ls_bapi-classnum
          classtype       = ls_bapi-classtype
        TABLES
          allocvaluesnum  = lt_num
          allocvalueschar = lt_char
          allocvaluescurr = lt_curr
          return          = lt_return.

      READ TABLE lt_return WITH KEY type = 'E' TRANSPORTING NO FIELDS.

      IF sy-subrc = 0.
        WRITE: / icon_red_light AS ICON, text-002, ls_bapi-object.

        PERFORM lista_erros TABLES lt_return.

      ELSE.
        WRITE: / icon_green_light AS ICON, text-002, ls_bapi-object.

        LOOP AT lt_num INTO ls_num.
          CLEAR t_file.
          t_file-tipo           = 'N'.
          t_file-objectkey      = ls_bapi-object.
          t_file-objecttable    = ls_bapi-objecttable.
          t_file-classnum       = ls_bapi-classnum.
          t_file-classtype      = ls_bapi-classtype.
          t_file-charact        = ls_num-charact.
          t_file-value_from     = ls_num-value_from.
          t_file-value_to       = ls_num-value_to.
          t_file-value_relation = ls_num-value_relation.
          t_file-unit_from      = ls_num-unit_from.
          t_file-unit_to        = ls_num-unit_to.
          t_file-unit_from_iso  = ls_num-unit_from_iso.
          t_file-unit_to_iso    = ls_num-unit_to_iso.
          t_file-inherited      = ls_num-inherited.
          t_file-instance          = ls_num-instance.
          t_file-charact_descr  = ls_num-charact_descr.
          APPEND t_file.

        ENDLOOP.

        LOOP AT lt_char INTO ls_char.
          CLEAR t_file.
          t_file-tipo          = 'C'.
          t_file-objectkey     = ls_bapi-object.
          t_file-objecttable   = ls_bapi-objecttable.
          t_file-classnum      = ls_bapi-classnum.
          t_file-classtype     = ls_bapi-classtype.
          t_file-charact       = ls_char-charact.
          t_file-value_char    = ls_char-value_char.
          t_file-inherited     = ls_char-inherited.
          t_file-instance      = ls_char-instance.
          t_file-value_neutral = ls_char-value_neutral.
          t_file-charact_descr = ls_char-charact_descr.
          APPEND t_file.
        ENDLOOP.

        LOOP AT lt_curr INTO ls_curr.
          CLEAR t_file.
          t_file-tipo              = 'X'.
          t_file-objectkey         = ls_bapi-object.
          t_file-objecttable       = ls_bapi-objecttable.
          t_file-classnum          = ls_bapi-classnum.
          t_file-classtype         = ls_bapi-classtype.
          t_file-charact           = ls_curr-charact.
          t_file-value_from        = ls_curr-value_from.
          t_file-value_to          = ls_curr-value_to.
          t_file-value_relation    = ls_curr-value_relation.
          t_file-currency_from     = ls_curr-currency_from.
          t_file-currency_to       = ls_curr-currency_to.
          t_file-currency_from_iso = ls_curr-currency_from_iso.
          t_file-currency_to_iso   = ls_curr-currency_to_iso.
          t_file-inherited         = ls_curr-inherited.
          t_file-instance             = ls_curr-instance.
          t_file-charact_descr     = ls_curr-charact_descr.
          APPEND t_file.

        ENDLOOP.

      ENDIF.

    ENDLOOP.

  ELSE.

    lt_head[] = t_file[].
    SORT lt_head BY objectkey objecttable classnum classtype.
    DELETE ADJACENT DUPLICATES FROM lt_head
      COMPARING objectkey objecttable classnum classtype.

    LOOP AT lt_head.

      REFRESH: lt_num, lt_char, lt_curr, lt_return.

      LOOP AT t_file WHERE objectkey   EQ lt_head-objectkey
                       AND objecttable EQ lt_head-objecttable
                       AND classnum    EQ lt_head-classnum
                       AND classtype   EQ lt_head-classtype.

        CASE t_file-tipo.
          WHEN 'N'.
            CLEAR ls_num.
            ls_num-charact        = t_file-charact.
            ls_num-value_from     = t_file-value_from.
            ls_num-value_to       = t_file-value_to.
            ls_num-value_relation = t_file-value_relation.
            ls_num-unit_from      = t_file-unit_from.
            ls_num-unit_to        = t_file-unit_to.
            ls_num-unit_from_iso  = t_file-unit_from_iso.
            ls_num-unit_to_iso    = t_file-unit_to_iso.
            ls_num-inherited      = t_file-inherited.
            ls_num-instance          = t_file-instance.
            ls_num-charact_descr  = t_file-charact_descr.
            APPEND ls_num TO lt_num.

          WHEN 'C'.
            CLEAR ls_char.
            ls_char-charact       = t_file-charact.
            ls_char-value_char    = t_file-value_char.
            ls_char-inherited     = t_file-inherited.
            ls_char-instance      = t_file-instance.
            ls_char-value_neutral = t_file-value_neutral.
            ls_char-charact_descr = t_file-charact_descr.
            APPEND ls_char TO lt_char.

          WHEN 'X'.
            CLEAR ls_curr.
            ls_curr-charact           = t_file-charact.
            ls_curr-value_from        = t_file-value_from.
            ls_curr-value_to          = t_file-value_to.
            ls_curr-value_relation    = t_file-value_relation.
            ls_curr-currency_from     = t_file-currency_from.
            ls_curr-currency_to       = t_file-currency_to.
            ls_curr-currency_from_iso = t_file-currency_from_iso.
            ls_curr-currency_to_iso   = t_file-currency_to_iso.
            ls_curr-inherited         = t_file-inherited.
            ls_curr-instance          = t_file-instance.
            ls_curr-charact_descr     = t_file-charact_descr.
            APPEND ls_curr TO lt_curr.

        ENDCASE.

      ENDLOOP.

      CALL FUNCTION 'BAPI_OBJCL_CREATE'
        EXPORTING
          objectkeynew    = lt_head-objectkey
          objecttablenew  = lt_head-objecttable
          classnumnew     = lt_head-classnum
          classtypenew    = lt_head-classtype
        TABLES
          allocvaluesnum  = lt_num
          allocvalueschar = lt_char
          allocvaluescurr = lt_curr
          return          = lt_return.

      READ TABLE lt_return WITH KEY type = 'E' TRANSPORTING NO FIELDS.

      IF sy-subrc = 0.
        WRITE: / icon_red_light AS ICON, text-002, lt_head-objectkey.

        PERFORM lista_erros TABLES lt_return.

      ELSE.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
         EXPORTING
           WAIT          = 'X'.

        WRITE: / icon_green_light AS ICON, text-002, lt_head-objectkey.
      ENDIF.

    ENDLOOP.

  ENDIF.

ENDFORM.                    " PROCESSA_DADOS

*&---------------------------------------------------------------------*
*&      Form  EXPORTAR_DADOS
*&---------------------------------------------------------------------*
FORM exportar_dados .

  DATA: l_string TYPE string.

  CHECK pr_exp = 'X'.

  l_string = p_file.

  CALL FUNCTION 'GUI_DOWNLOAD'
    EXPORTING
      filename                = l_string
    TABLES
      data_tab                = t_file
    EXCEPTIONS
      file_write_error        = 1
      no_batch                = 2
      gui_refuse_filetransfer = 3
      invalid_type            = 4
      no_authority            = 5
      unknown_error           = 6
      header_not_allowed      = 7
      separator_not_allowed   = 8
      filesize_not_allowed    = 9
      header_too_long         = 10
      dp_error_create         = 11
      dp_error_send           = 12
      dp_error_write          = 13
      unknown_dp_error        = 14
      access_denied           = 15
      dp_out_of_memory        = 16
      disk_full               = 17
      dp_timeout              = 18
      file_not_found          = 19
      dataprovider_exception  = 20
      control_flush_error     = 21
      OTHERS                  = 22.

  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.


ENDFORM.                    " EXPORTAR_DADOS

*&---------------------------------------------------------------------*
*&      Form  VALUE_REQUEST_FILE
*&---------------------------------------------------------------------*
FORM value_request_file.

  DATA: l_string TYPE string.

  IF pr_exp = 'X'.
    CALL FUNCTION 'GUI_FILE_SAVE_DIALOG'
      EXPORTING
        window_title      = 'Salvar'
        initial_directory = 'C:/'
      IMPORTING
        fullpath          = l_string.
  ELSE.
    CALL FUNCTION 'GUI_FILE_LOAD_DIALOG'
      EXPORTING
        window_title      = 'Abrir'
        initial_directory = 'C:/'
      IMPORTING
        fullpath          = l_string.
  ENDIF.

  p_file = l_string.

ENDFORM.                    " VALUE_REQUEST_FILE

*&---------------------------------------------------------------------*
*&      Form  IMPORTAR_DADOS
*&---------------------------------------------------------------------*
FORM importar_dados .

  DATA: l_string TYPE string.

  REFRESH t_file.

  l_string = p_file.

  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename                = l_string
    TABLES
      data_tab                = t_file
    EXCEPTIONS
      file_open_error         = 1
      file_read_error         = 2
      no_batch                = 3
      gui_refuse_filetransfer = 4
      invalid_type            = 5
      no_authority            = 6
      unknown_error           = 7
      bad_data_format         = 8
      header_not_allowed      = 9
      separator_not_allowed   = 10
      header_too_long         = 11
      unknown_dp_error        = 12
      access_denied           = 13
      dp_out_of_memory        = 14
      disk_full               = 15
      dp_timeout              = 16
      OTHERS                  = 17.

  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

ENDFORM.                    " IMPORTAR_DADOS

*&---------------------------------------------------------------------*
*&      Form  LISTA_ERROS
*&---------------------------------------------------------------------*
FORM lista_erros TABLES ft_return STRUCTURE bapiret2.

  LOOP AT ft_return.

    CASE ft_return-type.
      WHEN 'E'.
        WRITE: /5 icon_message_error_small AS ICON.
      WHEN 'W'.
        WRITE: /5 icon_message_warning_small AS ICON.
      WHEN OTHERS.
        WRITE: /5 icon_message_information_small AS ICON.
    ENDCASE.

    WRITE: ft_return-message.

  ENDLOOP.

ENDFORM.                    " LISTA_ERROS

quinta-feira, 12 de junho de 2014

SE78 - Carregamento de imagem

Fiquei me batendo numa carga de imagem na SE78.. Eu tinha um logo de uma empresa.. eu tive que redimensionar a imagem e trabalhar o fundo dela.. eu utilizei o PAINT.NET editor free muito bom para isso,  eu coloquei um fundo branco para não atrapalhar na visualização na visualização do meu smartforms, só estava salvando como .BMP padrão para importação de imagens na SE78, quando importava o logo o fundo da imagem em vez de branco ficava cinza. Daí eu encontrei no SDN uma solução, na verdade uma deficiência no SAP para trabalhar imagens com mais de 8 bits.. e reparei que ao salvar a imagem ele salvava com uma resolução automática para BMP, eu simplesmente marquei para salvar em 8 bits e resolveu o problema.

ALV - campo com matchcode F4 - Implementação manual

 Esse é para os casos de se desejar colocar uma lista de valores (matchcode) especifico em um campo de uma lista ALV.


Não esquecer de colocar o flag no campo que vai ter o F4 no fieldcat.
      WHEN 'ORIGTP'.
        <lfsw_fcat>-edit       'X'.
        <lfsw_fcat>-f4availabl 'X'.


e tem q registrar o evento no objeto ALV.
  DATAlt_f4 TYPE lvc_t_f4.
  DATAlw_f4 TYPE lvc_s_f4.

  CLEAR lw_f4.
  lw_f4-fieldname  'ORIGTP'.
  lw_f4-register   'X'.
  APPEND lw_f4 TO lt_f4.

  CALL METHOD gcl_alv->register_f4_for_fields
    EXPORTING
      it_f4 lt_f4.


No meu caso coloquei o código acima antes do método SET_TABLE_FOR_FIRST_DISPLAY.

Abaixo restante do código.

=========================================================

Criação do evento.

CLASS gcl_alv_event DEFINITION.

    on_f4
       FOR EVENT onf4 OF cl_gui_alv_grid
        IMPORTING e_fieldname
                  e_fieldvalue
                  es_row_no
                  er_event_data
                  et_bad_cells
                  e_display.




ENDCLASS.    



=========================================================
*Implementação da classe.

CLASS gcl_alv_event IMPLEMENTATION.



  METHOD on_f4.
    PERFORM on_f4 USING e_fieldname
                        e_fieldvalue
                        es_row_no
                        er_event_data
                        et_bad_cells
                        e_display.
  ENDMETHOD.                                                "on_f4

ENDCLASS.   



==================================================



"Implementaçao da rotina..
" As linhas em vermelho são obrigatórias pois elas modificam o valor em tela logo após a seleção do valor da lista.. e o m_event_handler evita um erro que dá no retorno a tela.


FORM on_f4  USING f_fieldname    TYPE lvc_fname
                  f_fieldvalue   TYPE lvc_value
                  fw_row_no      TYPE lvc_s_roid
                  fcl_event_data TYPE REF TO cl_alv_event_data
                  ft_bad_cells   TYPE lvc_t_modi
                  f_display      TYPE char01.

  DATA: lw_alv  TYPE ze_gnre_rel_lote,
        lw_modi TYPE lvc_s_modi.

  DATA: l_origtp TYPE zgnre_origtp.

  FIELD-SYMBOLS: <lfst_modi> TYPE lvc_t_modi.

  ASSIGN fcl_event_data->m_data->* TO <lfst_modi>.
  CHECK sy-subrc = 0.


  READ TABLE gt_alv INTO lw_alv INDEX fw_row_no-row_id.
  CHECK sy-subrc = 0.

  CASE f_fieldname.
    WHEN 'ORIGTP'.
      IF lw_alv-gnreid IS INITIAL.

        PERFORM f4_codreceita USING lw_alv-regio
                           CHANGING l_origtp.

        f_fieldvalue = l_origtp.

        CLEAR lw_modi.
        lw_modi-row_id    = fw_row_no-row_id.
        lw_modi-fieldname = f_fieldname.
        lw_modi-value = f_fieldvalue.
        APPEND lw_modi TO <lfst_modi>.

      ENDIF.

      fcl_event_data->m_event_handled = 'X'.

  ENDCASE.

ENDFORM.                                                    " ON_F4




*&---------------------------------------------------------------------*
*&      Form  F4_CODRECEITA
*&---------------------------------------------------------------------*
FORM f4_codreceita USING f_regio TYPE regio
                CHANGING f_origtp TYPE zgnre_origtp.

  DATA: lt_rettab TYPE TABLE OF ddshretval,
        lt_c023 TYPE TABLE OF zc023.

  DATA: lw_rettab TYPE ddshretval.

  SELECT *
    INTO TABLE lt_c023
    FROM zc023
   WHERE regio EQ f_regio.

  CHECK sy-subrc = 0.

  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      ddic_structure  = 'ZC023'
      retfield        = 'ORIGTP'
      value_org       = 'S'
    TABLES
      value_tab       = lt_c023
      return_tab      = lt_rettab
    EXCEPTIONS
      parameter_error = 1
      no_values_found = 2
      OTHERS          = 3.

  CHECK sy-subrc = 0.

  READ TABLE lt_rettab INTO lw_rettab INDEX 1.

  CHECK sy-subrc = 0.

  f_origtp = lw_rettab-fieldval.

ENDFORM.                    " F4_CODRECEITA