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.

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  

quinta-feira, 22 de maio de 2014

Geração de arquivo XML

  Essa é para ficar no meu histórico.

  DATAlcl_xml TYPE REF TO cl_xml_document.

  CREATE OBJECT lcl_xml.

  CALL METHOD lcl_xml->create_empty_document
    RECEIVING
      retcode l_subrc.

  IF l_subrc <> 0.
    RAISE erro_xml.
  ENDIF.

  CALL METHOD lcl_xml->set_encoding
    EXPORTING
      charset 'UTF-8'.

  CALL METHOD lcl_xml->m_document->set_standalone
    EXPORTING
      standalone l_boolean.
 

  CALL METHOD lcl_xml->m_document->create_element
    EXPORTING
      name 'TLote_GNRE'
    RECEIVING
      rval lcl_lotes_element.

  "Atributos ---------------------------------------------------

  "xmlns
  CALL METHOD lcl_lotes_element->set_attribute
    EXPORTING
      name  'xmlns'
      value 'http://www.gnre.pe.gov.br'
    RECEIVING
      rval  l_rval.
 


  CALL METHOD lcl_xml->m_document->create_element
    EXPORTING
      name 'guias'
    RECEIVING
      rval lcl_guias_element.

  LOOP AT it_gnre INTO lw_gnre.

    PERFORM f_xml_lote USING lw_gnre
                             lcl_lotes_element
                             lcl_guias_element
                    CHANGING lcl_xml.

  ENDLOOP.

  CALL METHOD lcl_lotes_element->append_child
    EXPORTING
      new_child lcl_guias_element
    RECEIVING
      rval      l_rval.


  CALL METHOD lcl_xml->m_document->append_child
    EXPORTING
      new_child lcl_lotes_element
    RECEIVING
      rval      l_rval.

  IF i_display '1'.
    CALL METHOD lcl_xml->display.
  ENDIF.

  lcl_xml->export_to_filefilename l_full_path ).
 




=========================== CÓDIGO DO PERFORM

FORM f_xml_lote USING fw_gnre TYPE ztgnre
                      fcl_lote  TYPE REF TO if_ixml_element
                      fcl_guias TYPE REF TO if_ixml_element
             CHANGING fcl_xml TYPE REF TO cl_xml_document.

  DATAlcl_dados_e TYPE REF TO if_ixml_element,
        lcl_emi_e   TYPE REF TO if_ixml_element,
        lcl_des_e   TYPE REF TO if_ixml_element,
        lcl_aux     TYPE REF TO if_ixml_element.

  DATAlw_nfdoc TYPE ztnfdoc,
        lw_sadr  TYPE sadr,
        lw_parnad TYPE j_1binnad.

  DATAl_cgc   TYPE LENGTH 20,
        l_nome  TYPE zze_nome_emp70.

  DATAl_rval   TYPE i,
        l_insc   TYPE char20,
        l_stains TYPE j_1bstains,
        l_value  TYPE string,
        l_descr  TYPE sf_descr50.

  DEFINE lm_set_att.

   CALL METHOD fcl_xml->m_document->create_element
     EXPORTING
       name &2
     RECEIVING
       rval lcl_aux.

    call method lcl_aux->set_value
      exporting
        value &3
      receiving
        rval  &4.

  CALL METHOD &1->append_child
    EXPORTING
      new_child lcl_aux
    RECEIVING
      rval      l_rval.

  END-OF-DEFINITION.


  SELECT SINGLE *
    INTO lw_nfdoc
    FROM j_1bnfdoc
   WHERE docnum EQ fw_gnre-docnum.

  CHECK sy-subrc 0.

  "Dados do favorecido
  CALL FUNCTION 'ZGET_BRANCH_NAME'
    EXPORTING
      i_bukrs         lw_nfdoc-bukrs
      i_branch        lw_nfdoc-branch
    IMPORTING
      e_nome          l_nome
      e_cgc           l_cgc
      e_address       lw_sadr
      e_insc_estadual l_stains.

  "Dados do cliente
  CALL FUNCTION 'ZNF_PARTNER_READ'
    EXPORTING
      partner_type           lw_nfdoc-partyp
      partner_id             lw_nfdoc-parid
    IMPORTING
      parnad                 lw_parnad
    EXCEPTIONS
      partner_not_found      1
      partner_type_not_found 2
      OTHERS                 3.

  CALL METHOD fcl_xml->m_document->create_element
    EXPORTING
      name 'TDadosGNRE'
    RECEIVING
      rval lcl_dados_e.

  l_value lw_parnad-regio.
  lm_set_att lcl_dados_e 'c01_UfFavorecida' l_value l_rval.

  l_value fw_gnre-origtp.
  lm_set_att lcl_dados_e 'c02_receita' l_value l_rval.

  SELECT SINGLE descr
    INTO l_descr
    FROM z023t
   WHERE spras  EQ sy-langu
     AND regio  EQ lw_parnad-regio
     AND origtp EQ fw_gnre-origtp.

  l_value l_descr.
  lm_set_att lcl_dados_e 'c25_detalhamentoReceita' l_value l_rval.

  l_value fw_gnre-codproduto.
  lm_set_att lcl_dados_e 'c26_produto' l_value l_rval.

  l_value '1'.
  lm_set_att lcl_dados_e 'c27_tipoIdentificacaoEmitente' l_value l_rval.

  CALL METHOD fcl_xml->m_document->create_element
    EXPORTING
      name 'c03_idContribuinteEmitente'
    RECEIVING
      rval lcl_emi_e.

  l_value space.
  lm_set_att lcl_emi_e 'CPF' l_value l_rval.

  l_value l_cgc.
  lm_set_att lcl_emi_e 'CNPJ' l_value l_rval.

  CALL METHOD lcl_dados_e->append_child
    EXPORTING
      new_child lcl_emi_e
    RECEIVING
      rval      l_rval.

  l_value '10'"Nota Fiscal
  lm_set_att lcl_dados_e 'c28_tipoDocOrigem' l_value l_rval.

  IF lw_nfdoc-nfe 'X'.
    l_value lw_nfdoc-nfenum.
  ELSE.
    l_value lw_nfdoc-nfnum.
  ENDIF.

  lm_set_att lcl_dados_e 'c04_docOrigem' l_value l_rval.  "NF

  l_value fw_gnre-vlr_princ.
  lm_set_att lcl_dados_e 'c06_valorPrincipal' l_value l_rval.

  l_value fw_gnre-vlr_princ + fw_gnre-vlr_atua +
            fw_gnre-vlr_multa + fw_gnre-vlr_juros.
  lm_set_att lcl_dados_e 'c10_valorTotal' l_value l_rval.

  l_value fw_gnre-vencimento.
  lm_set_att lcl_dados_e 'c14_dataVencimento' l_value l_rval.

  l_value space.
  lm_set_att lcl_dados_e 'c15_convenio' l_value l_rval.

  l_value  l_nome.
  lm_set_att lcl_dados_e 'c16_razaoSocialEmitente' l_value l_rval.

  CALL FUNCTION 'ZGFGNRE_INSC_ESTAD'
    EXPORTING
      i_bukrs          fw_gnre-bukrs
      i_branch         fw_gnre-branch
      i_regio          fw_gnre-regio
    CHANGING
      c_inscr_estadual l_insc.

  l_value l_insc.
  lm_set_att lcl_dados_e 'c17_inscricaoEstadualEmitente' l_value l_rval.

  l_value lw_sadr-stras.
  lm_set_att lcl_dados_e 'c18_enderecoEmitente' l_value l_rval"Local de negócio

  l_value lw_sadr-ort01.
  lm_set_att lcl_dados_e 'c19_municipioEmitente' l_value l_rval"Local de negócio

  l_value lw_sadr-regio.
  lm_set_att lcl_dados_e 'c20_ufEnderecoEmitente' l_value l_rval"Local de negócio

  l_value lw_sadr-pstlz.
  lm_set_att lcl_dados_e 'c21_cepEmitente' l_value l_rval"Local de negócio

  l_value lw_sadr-telf1.
  lm_set_att lcl_dados_e 'c22_telefoneEmitente' l_value l_rval"Local de negócio

  IF lw_parnad-cgc IS NOT INITIAL.
    l_value '1'.
  ELSE.
    l_value '2'.
  ENDIF.

  lm_set_att lcl_dados_e 'c34_tipoIdentificacaoDestinatario' l_value l_rval"1 ou 2

  CALL METHOD fcl_xml->m_document->create_element
    EXPORTING
      name 'c35_idContribuinteDestinatario'
    RECEIVING
      rval lcl_des_e.

  l_value lw_parnad-cpf.
  lm_set_att lcl_des_e 'CPF' l_value l_rval.
  l_value lw_parnad-cgc.
  lm_set_att lcl_des_e 'CNPJ' l_value l_rval.

  CALL METHOD lcl_dados_e->append_child
    EXPORTING
      new_child lcl_des_e
    RECEIVING
      rval      l_rval.

  l_value lw_parnad-stains.
  lm_set_att lcl_dados_e 'c36_inscricaoEstadualDestinatario' l_value l_rval.

  l_value lw_parnad-name1.
  lm_set_att lcl_dados_e 'c37_razaoSocialDestinatario' l_value l_rval.

  l_value lw_parnad-ort01.
  lm_set_att lcl_dados_e 'c38_municipioDestinatario' l_value l_rval.

  l_value fw_gnre-vencimento.
  lm_set_att lcl_dados_e 'c33_dataPagamento' l_value l_rval.

  CALL METHOD fcl_guias->append_child
    EXPORTING
      new_child lcl_dados_e
    RECEIVING
      rval      l_rval.

  CALL METHOD fcl_lote->append_child
    EXPORTING
      new_child fcl_guias
    RECEIVING
      rval      l_rval.

ENDFORM.                    " F_XML_LOTE
  

+++++++++++++++++++++++++++++++++++++++++++=
saída do arquivo
+++++++++++++++++++++++++++++++++++++++++++=
  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
- <TLote_GNRE xmlns="http://www.gnre.pe.gov.br">
- <guias>
- <TDadosGNRE>
  <c01_UfFavorecida>PR</c01_UfFavorecida>
  <c02_receita>1210</c02_receita>
  <c25_detalhamentoReceita>Recolhimento Antecipado - Entradas do Exterior.</c25_detalhamentoReceita>
  <c26_produto />
  <c27_tipoIdentificacaoEmitente>1</c27_tipoIdentificacaoEmitente>
- <c03_idContribuinteEmitente>
  <CPF />
  <CNPJ>74.544.297/0001-92</CNPJ>
  </c03_idContribuinteEmitente>
  <c28_tipoDocOrigem>10</c28_tipoDocOrigem>
  <c04_docOrigem>000000046</c04_docOrigem>
  <c06_valorPrincipal>213.50</c06_valorPrincipal>
  <c10_valorTotal>213.50</c10_valorTotal>
  <c14_dataVencimento>20100731</c14_dataVencimento>
  <c15_convenio />
  <c16_razaoSocialEmitente>FH Consultoria Empresarial Ltda</c16_razaoSocialEmitente>
  <c17_inscricaoEstadualEmitente>1017622974</c17_inscricaoEstadualEmitente>
  <c18_enderecoEmitente>Rua Visconde de Nac 1440, 13º andar</c18_enderecoEmitente>
  <c19_municipioEmitente>Curitiba</c19_municipioEmitente>
  <c20_ufEnderecoEmitente>PR</c20_ufEnderecoEmitente>
  <c21_cepEmitente>80410-201</c21_cepEmitente>
  <c22_telefoneEmitente>(41) 3593-3223</c22_telefoneEmitente>
  <c34_tipoIdentificacaoDestinatario>1</c34_tipoIdentificacaoDestinatario>
- <c35_idContribuinteDestinatario>
  <CPF>00000000000</CPF>
  <CNPJ>61194080000158</CNPJ>
  </c35_idContribuinteDestinatario>
  <c36_inscricaoEstadualDestinatario />
  <c37_razaoSocialDestinatario>Fornecedor nacional Paraná</c37_razaoSocialDestinatario>
  <c38_municipioDestinatario>Curitiba</c38_municipioDestinatario>
  <c33_dataPagamento>20100731</c33_dataPagamento>
  </TDadosGNRE>
  </guias>
  </TLote_GNRE>