/* POPUP INI */
/* POPUP FIM */

Conteúdo

Converter Tabela Interna para Excel XLS e enviar para o Servidor

Rodei a internet procurando uma função mais simples, mas não encontrei, então ai vai:
CLASS zcl_itab_to_excel DEFINITION PUBLIC FINAL.
  PUBLIC SECTION.
    METHODS:
      itab_to_xstring 
        IMPORTING ir_data_ref       TYPE REF TO data
        RETURNING VALUE(rv_xstring) TYPE xstring.
ENDCLASS.

CLASS zcl_itab_to_excel IMPLEMENTATION.
  METHOD itab_to_xstring.

    FIELD-SYMBOLS: <fs_data> TYPE ANY TABLE.

    CLEAR rv_xstring.
    ASSIGN ir_data_ref->* TO <fs_data>.

    TRY.
        cl_salv_table=>factory(
          IMPORTING r_salv_table = DATA(lo_table)
          CHANGING  t_table      = <fs_data> ).
  
        DATA(lt_fcat) = 
          cl_salv_controller_metadata=>get_lvc_fieldcatalog(
            r_columns      = lo_table->get_columns( )
            r_aggregations = lo_table->get_aggregations( ) ).

        DATA(lo_result) =
          cl_salv_ex_util=>factory_result_data_table( 
            r_data         = ir_data_ref
            t_fieldcatalog = lt_fcat ).

        cl_salv_bs_tt_util=>if_salv_bs_tt_util~transform(
          EXPORTING
            xml_type      = if_salv_bs_xml=>c_type_xlsx
            xml_version   = cl_salv_bs_a_xml_base=>get_version( )
            r_result_data = lo_result
            xml_flavour   = if_salv_bs_c_tt=>c_tt_xml_flavour_export
            gui_type      = if_salv_bs_xml=>c_gui_type_gui
          IMPORTING
            xml           = rv_xstring ).
      CATCH cx_root.
        CLEAR rv_xstring.
    ENDTRY.
  ENDMETHOD.
ENDCLASS.

Depois só chamar passando sua tabela como referência:
DATA lt_sapeiros TYPE TABLE OF MARA.
GET REFERENCE OF lt_sapeiros INTO DATA(lo_data_ref).
DATA(lv_xstring) = NEW zcl_itab_to_excel( )->itab_to_xstring( lo_data_ref ). 
OPEN DATASET lv_xls_file FOR OUTPUT IN BINARY MODE.
IF sy-subrc IS INITIAL.
  TRANSFER lv_xstring TO lv_xls_file.
  CLOSE DATASET.
ENDIF.

Gerar PDF a partir do Spool - Boss Mode

Tenho um amigo, na realidade não é um amigo, mas sim meu chefe, que toda vez me pergunta como faz pra gerar PDF do Spool.

Amigo, alias, Chefe, é esse programa aqui ó ==> RSTXPDFT4

Brincadeira chefe, você é meu amigo sim viu...

Tradução de programas para português estruturado ou outro idioma

Uma forma simples para auxiliar na tradução de programas quando existir a necessidade de gerar alguma documentação em português ou qualquer outro idioma.

Primeiramente é necessário criar uma tabela conforme print abaixo:


Existe uma outra maneira onde se importa a tradução de um arquivo excel ou txt, porém, deixar em uma tabela Z os parceiros podem alimentar a mesma e a tradução fica cada vez melhor.

REPORT ZSAPeiros.


* ----------------------------------------------------------------------
* DEFINIÇÃO DE TIPOS PARA TABELAS / ESTRUTURAS
* ----------------------------------------------------------------------
TYPES:
  BEGIN OF ty_linhas,
    linha(100) TYPE c,
  END OF ty_linhas.


* ----------------------------------------------------------------------
* TABELAS E ESTRUTURAS INTERNAS
* ----------------------------------------------------------------------
DATA:
  t_de_para   TYPE TABLE OF ztraducao WITH HEADER LINE,
  t_progr1    TYPE TABLE OF string    WITH HEADER LINE,
  t_progr     TYPE TABLE OF ty_linhas WITH HEADER LINE.


* ----------------------------------------------------------------------
* VARIÁVEIS GLOBAIS
* ----------------------------------------------------------------------
DATA:
  gv_size_para(10)  TYPE c,
  gv_tabix        TYPE sy-tabix,
  gv_posi(3)      TYPE c,
  gv_length(3)    TYPE n.


* ----------------------------------------------------------------------
* PARÂMETROS
* ----------------------------------------------------------------------
SELECTION-SCREEN BEGIN OF BLOCK b1.
PARAMETERS:
  p_repid     TYPE sy-repid,
  p_dest      TYPE rlgrap-filename DEFAULT 'c:\ZSAPeiros.txt'.
SELECTION-SCREEN END OF BLOCK b1.


* ----------------------------------------------------------------------
* INITIALIZATION
* ----------------------------------------------------------------------
INITIALIZATION.
  %_p_repid_%_app_%-text  = 'Programa a ser traduzido'.
  %_p_dest_%_app_%-text   = 'Arquivo de destino'.


* ----------------------------------------------------------------------
* Destino da tradução
* ----------------------------------------------------------------------
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_dest.
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      def_path = 'C:\'
      mode     = 'S'
    IMPORTING
      filename = p_dest
    EXCEPTIONS
      OTHERS   = 1.


* ----------------------------------------------------------------------
* START-OF-SELECTION
* ----------------------------------------------------------------------
START-OF-SELECTION.
  SELECT *
    FROM ztraducao
    INTO TABLE t_de_para.

  IF sy-subrc IS INITIAL.
    SORT t_de_para BY de.
    DELETE t_de_para WHERE de IS INITIAL.
  ENDIF.

  IF t_de_para[] IS INITIAL.
    MESSAGE 'Dados de tradução inexistentes' TYPE 'I'.
    LEAVE LIST-PROCESSING.
  ENDIF.

  READ REPORT p_repid INTO t_progr1.
  t_progr[] = t_progr1[].

  LOOP AT t_de_para.

    gv_size_para = STRLEN( t_de_para-para ).

    LOOP AT t_progr.

      gv_tabix = sy-tabix.

      TRANSLATE t_progr-linha USING '''"'.

      CLEAR: gv_posi, gv_length.

      FIND t_de_para-de IN t_progr-linha MATCH OFFSET gv_posi
                                         MATCH LENGTH gv_length
                                         IGNORING CASE.

      IF sy-subrc IS INITIAL.

        gv_posi = gv_posi - 1.

        IF gv_posi = -1 OR t_progr-linha+gv_posi(1) = ' '.

          gv_posi = gv_posi + 1.

          REPLACE t_progr-linha+gv_posi(gv_length) WITH t_de_para-para(gv_size_para) INTO t_progr-linha.

        ENDIF.

      ENDIF.

      MODIFY t_progr INDEX gv_tabix.

    ENDLOOP.

  ENDLOOP.


  LOOP AT t_progr.
    WRITE: / t_progr-linha.
  ENDLOOP.

Gerar PDF do spool (OTF e ABAPLIST)

Sabe aquele Spool gerado que ficaria lindo dentro de um programa abap? Caraca, isso é possível se você gerar um PDF deste spool. Se liga na lógica:
REPORT ZSAPeiros.
PARAMETERS:
  p_spool1              TYPE          tsp01-rqident,
  p_spool2              TYPE          tsp01-rqident.

DATA:
  tab1                  TYPE TABLE OF soli,
  tab2                  TYPE TABLE OF soli,
  tab1xls               TYPE TABLE OF soli,
  wa_tab1xls            TYPE          soli,
  gt_pdf                TYPE TABLE OF tline,
  gt_pdf1               TYPE TABLE OF tline,
  gt_pdf2               TYPE TABLE OF tline,
  wa_pdf1               TYPE          tline,
  wa_pdf2               TYPE          tline,
  lo_docking_container1 TYPE REF TO   cl_gui_docking_container,
  lo_docking_container2 TYPE REF TO   cl_gui_docking_container,
  lo_html               TYPE REF TO   cl_gui_html_viewer,
  lo_html2              TYPE REF TO   cl_gui_html_viewer,
  lt_data               TYPE STANDARD TABLE OF x255,
  lt_data2              TYPE STANDARD TABLE OF x255,
  lv_url                TYPE          char255,
  lv_url2               TYPE          char255,
  lv_content            TYPE          xstring,
  lv_content2           TYPE          xstring.

FIELD-SYMBOLS:
  <fs_pdf1>             TYPE x,
  <fs_pdf2>             TYPE x.

INITIALIZATION.
  %_p_spool1_%_app_%-text = 'Spool - ABAPLIST'.
  %_p_spool2_%_app_%-text = 'Spool - OTF'.

END-OF-SELECTION.
* Converter ABAPLIST para PDF
  IF p_spool1 IS NOT INITIAL.
    CALL FUNCTION 'CONVERT_ABAPSPOOLJOB_2_PDF'
      EXPORTING
        src_spoolid = p_spool1
      TABLES
        pdf         = gt_pdf1.
  ENDIF.

* Converter OTF para PDF
  IF p_spool2 IS NOT INITIAL.
    CALL FUNCTION 'CONVERT_OTFSPOOLJOB_2_PDF'
      EXPORTING
        src_spoolid = p_spool2
      TABLES
        pdf         = gt_pdf2.
  ENDIF.

* Converter PDF em xstring string ABAPLIST
  IF lv_content IS NOT INITIAL.
    LOOP AT gt_pdf1 INTO wa_pdf1.
      ASSIGN wa_pdf1 TO <fs_pdf1> CASTING.
      CONCATENATE lv_content <fs_pdf1> INTO lv_content IN BYTE MODE.
    ENDLOOP.
  ENDIF.

* Converter PDF em xstring string OTF
  IF lv_content2 IS NOT INITIAL.
    LOOP AT gt_pdf2 INTO wa_pdf2.
      ASSIGN wa_pdf2 TO <fs_pdf2> CASTING.
      CONCATENATE lv_content2 <fs_pdf2> INTO lv_content2 IN BYTE MODE.
    ENDLOOP.
  ENDIF.

* Container ABAPLIST
  IF lv_content IS NOT INITIAL.
    CREATE OBJECT lo_docking_container1
      EXPORTING
        repid     = sy-repid
        dynnr     = sy-dynnr
        side      = lo_docking_container1->dock_at_right
        extension = 700.
  ENDIF.

* Container OTF
  IF lv_content2 IS NOT INITIAL.
    CREATE OBJECT lo_docking_container2
      EXPORTING
        repid     = sy-repid
        dynnr     = sy-dynnr
        side      = lo_docking_container2->dock_at_left
        extension = 700.
  ENDIF.

* HTML ABAPLIST
  IF lv_content IS NOT INITIAL.
    CREATE OBJECT lo_html
      EXPORTING
        parent = lo_docking_container1.
  ENDIF.

* HTML OTF
  IF lv_content2 IS NOT INITIAL.
    CREATE OBJECT lo_html2
      EXPORTING
        parent = lo_docking_container2.
  ENDIF.

* Converter xstring em binary table ABAPLIST
  IF lv_content IS NOT INITIAL.
    CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
      EXPORTING
        buffer     = lv_content
      TABLES
        binary_tab = lt_data.
  ENDIF.

* Converter xstring em binary table OTF
  IF lv_content2 IS NOT INITIAL.
    CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
      EXPORTING
        buffer     = lv_content2
      TABLES
        binary_tab = lt_data2.
  ENDIF.

* Carregar HTML ABAPLIST
  IF lv_content IS NOT INITIAL.
    lo_html->load_data(
      EXPORTING
        type                 = 'application'
        subtype              = 'PDF'
      IMPORTING
        assigned_url         = lv_url
      CHANGING
        data_table           = lt_data
      EXCEPTIONS
        dp_invalid_parameter = 1
        dp_error_general     = 2
        cntl_error           = 3
        OTHERS               = 4 ).
  ENDIF.

* Carregar HTML OTF
  IF lv_content2 IS NOT INITIAL.
    lo_html2->load_data(
      EXPORTING
        type                 = 'application'
        subtype              = 'PDF'
      IMPORTING
        assigned_url         = lv_url2
      CHANGING
        data_table           = lt_data2
      EXCEPTIONS
        dp_invalid_parameter = 1
        dp_error_general     = 2
        cntl_error           = 3
        OTHERS               = 4 ).
  ENDIF.

* Exibir HTML ABAPLIST
  IF lv_content IS NOT INITIAL.
    CALL METHOD lo_html->show_url
      EXPORTING
        url      = lv_url
        in_place = 'X'.
  ENDIF.

* Exibir HTML OTF
  IF lv_content2 IS NOT INITIAL.
    CALL METHOD lo_html2->show_url
      EXPORTING
        url      = lv_url2
        in_place = 'X'.
  ENDIF.

Gerar arquivo XML

Chegou a hora de trabalhar com interfaces, legados e tudo mais, e você precisa gerar um XML de sua aplicação. Eis um exemplo facinho para se tomar como base.
REPORT ZSAPeiros.

DATA: it_table              LIKE t001 OCCURS 0.

DATA: l_dom                 TYPE REF TO if_ixml_element,
      m_document            TYPE REF TO if_ixml_document,
      m_xmldoc              TYPE REF TO cl_xml_document,
      g_ixml                TYPE REF TO if_ixml,
      w_result              TYPE i,
      w_rc                  LIKE sy-subrc.


START-OF-SELECTION.
  SELECT * FROM t001 INTO TABLE it_table.


END-OF-SELECTION.
* Inicializa o iXML-Framework
  CLASS cl_ixml DEFINITION LOAD.
  g_ixml = cl_ixml=>create( ).
  CHECK NOT g_ixml IS INITIAL.


* Cria o DOM com dados do SAP
  m_document = g_ixml->create_document( ).
  CHECK NOT m_document IS INITIAL.

* Conversão da tabela interna em DOM
  CALL FUNCTION 'SDIXML_DATA_TO_DOM'
    EXPORTING
      name         = 'IT_TABLE'
      dataobject   = it_table[]
    IMPORTING
      data_as_dom  = l_dom
    CHANGING
      document     = m_document
    EXCEPTIONS
      illegal_name = 1
      OTHERS       = 2.

  IF NOT sy-subrc = 0.
    WRITE: /'Erro DADOS -> DOM: ', sy-subrc.
  ENDIF.

  CHECK NOT l_dom IS INITIAL.


* Apendando o DOM ao documento iXML
  w_rc = m_document->append_child( new_child = l_dom ).

  IF NOT w_rc IS INITIAL.
    WRITE: /'Erro DOM -> iXML: ', w_rc.
  ENDIF.


* Criar XML apartir do DOM no iXML
  CREATE OBJECT m_xmldoc.
  CHECK NOT m_xmldoc IS INITIAL.

  w_rc = m_xmldoc->create_with_dom( document = m_document ).
  IF NOT w_rc IS INITIAL.
    WRITE: /'Erro DOM+iXML -> XML: ', w_rc.
  ENDIF.


* Mostrando o arquivo XML
  CALL METHOD m_xmldoc->display.


* Salvar o arquivo XML
  CALL METHOD m_xmldoc->export_to_file( filename = 'c:\teste.xml' ).

Data por extenso, feriado, dia da semana, etc

Vamos deixar seu sapscript ou algum resultado mais bunitinho? Utilize esta função para gerar uma data por extenso, feriado, dia da semana, entre outras opções.
REPORT ZSAPeiros.

DATA: dt_extenso TYPE TABLE OF casdayattr WITH HEADER LINE.

CALL FUNCTION 'DAY_ATTRIBUTES_GET'
  EXPORTING
    date_from      = '20121225'
    date_to        = '20121225'
    language       = sy-langu
  TABLES
    day_attributes = dt_extenso.

WRITE: / dt_extenso-day_string, 
       / dt_extenso-freeday, 
       / dt_extenso-holiday.

Copiar arquivo entre Unix e Local, e também eliminar

Já precisou copiar aquele arquivo para o servidor para testar seu desenvolvimento né? Ou então enviar um arquivo para o servidor. Pois bem, este código faz isto, e ainda por cima também elimina, converte em texto ou binário, manda de Unix para Local, Local para Unix, Unix para Unix. Tudo isto e mais um pouco.
REPORT ZSAPeiros.

*********************************************************************************
* COPIAR ARQUIVOS DO UNIX PARA LOCAL E VICE-VERSA
*********************************************************************************
*&---------------------------------------------------------------------*
* Tela de seleção
*&---------------------------------------------------------------------*
PARAMETERS: p_origem  LIKE rlgrap-filename OBLIGATORY,
            p_destin  LIKE rlgrap-filename OBLIGATORY,
            p_get     RADIOBUTTON GROUP g0,
            p_put     RADIOBUTTON GROUP g0,
            p_unix    RADIOBUTTON GROUP g0,
            p_deleta  AS CHECKBOX,
            p_tex     RADIOBUTTON GROUP g1,
            p_bin     RADIOBUTTON GROUP g1.


*&---------------------------------------------------------------------*
*Initialization
*&---------------------------------------------------------------------*
INITIALIZATION.
  %_p_origem_%_app_%-text   = 'Arquivo de Origem'.
  %_p_destin_%_app_%-text   = 'Arquivo de Destino'.
  %_p_get_%_app_%-text      = 'Copiar do UNIX para PC'.
  %_p_put_%_app_%-text      = 'Copiar do PC para o UNIX'.
  %_p_unix_%_app_%-text     = 'Copiar do UNIX para UNIX'.
  %_p_deleta_%_app_%-text   = 'Deletar Arquivo Origem'.
  %_p_tex_%_app_%-text      = 'Arquivo Texto'.
  %_p_bin_%_app_%-text      = 'Arquivo Binário'.


*&---------------------------------------------------------------------*
* Tabelas Internas
*&---------------------------------------------------------------------*
  DATA: tg_file(1200) TYPE c OCCURS 0 WITH HEADER LINE.


*&---------------------------------------------------------------------*
* Variáveis
*&---------------------------------------------------------------------*
  DATA: vg_filename   TYPE string,
        vg_texto(100) type c.


*&---------------------------------------------------------------------*
*Start-of-selection
*&---------------------------------------------------------------------*
START-OF-SELECTION.
  IF p_get = 'X'.
    PERFORM get_unix.        "Copiar do UNIX  para o Local
  ELSEIF p_unix = 'X'.
    PERFORM move_unix.       "Copiar do UNIX  para o UNIX
  ELSE.
    PERFORM put_unix.        "Copiar do Local para o UNIX
  ENDIF.


*&---------------------------------------------------------------------*
*&      Form  get_unix
*&---------------------------------------------------------------------*
FORM get_unix.
  clear vg_filename.
  vg_filename = p_destin.

  IF p_tex = 'X'.
    OPEN DATASET p_origem FOR INPUT IN TEXT MODE ENCODING DEFAULT.
  ELSE.
    OPEN DATASET p_origem FOR INPUT IN BINARY MODE.
  ENDIF.

  IF sy-subrc NE 0.
    WRITE: / 'Erro na abertura do arquivo UNIX'.
    EXIT.
  ENDIF.

  DO.
    READ DATASET p_origem INTO tg_file.
    IF sy-subrc NE 0.
      EXIT.
    ENDIF.
    APPEND tg_file.
  ENDDO.

  CLOSE DATASET p_origem.

  CHECK sy-subrc = 0.

  CALL FUNCTION 'GUI_DOWNLOAD'
    EXPORTING
      filename = vg_filename
      filetype = 'ASC'
    TABLES
      data_tab = tg_file
    EXCEPTIONS
      OTHERS   = 8.

  IF sy-subrc NE 0.
    WRITE: / 'Erro no Download do arquivo local'.
  ELSE.
    WRITE: / 'Transferência p/o Local executada com sucesso!'.
    IF p_deleta = 'X'.
      DELETE DATASET p_origem.
      IF NOT sy-subrc IS INITIAL.
        WRITE: /  'Erro ao deletar Arquivo Origem!'.
      ELSE.
        WRITE: / 'Arquivo Origem deletado com sucesso!'.
      ENDIF.
    ENDIF.
  ENDIF.
ENDFORM.                    "get_unix


*&---------------------------------------------------------------------*
*&      Form  put_unix
*&---------------------------------------------------------------------*
FORM put_unix.
  clear vg_filename.
  vg_filename = p_origem.

  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename = vg_filename
      filetype = 'ASC'
    TABLES
      data_tab = tg_file
    EXCEPTIONS
      OTHERS   = 8.

  IF sy-subrc NE 0.
    WRITE: / 'Erro no Upload do arquivo local'.
    EXIT.
  ENDIF.

  IF p_tex = 'X'.
    OPEN DATASET p_destin FOR OUTPUT IN TEXT MODE ENCODING DEFAULT.
  ELSE.
    OPEN DATASET p_destin FOR OUTPUT IN BINARY MODE.
  ENDIF.

  IF sy-subrc NE 0.
    WRITE: / 'Erro na abertura do arquivo UNIX'.
    EXIT.
  ENDIF.

  LOOP AT tg_file.
    TRANSFER tg_file TO p_destin.
  ENDLOOP.

  CLOSE DATASET p_destin.

  WRITE: / 'Transferência p/o UNIX executada com sucesso!'.
ENDFORM.                    "put_unix


*&---------------------------------------------------------------------*
*&      Form  move_unix
*&---------------------------------------------------------------------*
FORM move_unix.
  OPEN DATASET p_origem FOR INPUT IN TEXT MODE ENCODING DEFAULT.

  clear vg_texto(100).

  IF sy-subrc NE 0.
    CONCATENATE 'Erro na abertura do arquivo:' p_origem
    INTO vg_texto SEPARATED BY space.
    WRITE:/ vg_texto COLOR COL_NEGATIVE INTENSIFIED OFF.
    EXIT.
  ENDIF.

  OPEN DATASET p_destin FOR OUTPUT IN TEXT MODE ENCODING DEFAULT.

  IF sy-subrc NE 0.
    CONCATENATE 'Erro na abertura do arquivo:' p_destin
    INTO vg_texto SEPARATED BY space.
    WRITE:/ vg_texto COLOR COL_NEGATIVE INTENSIFIED OFF.
    EXIT.
  ENDIF.

  WHILE sy-subrc EQ 0.
    READ DATASET p_origem INTO tg_file.
    IF sy-subrc EQ 0.
      TRANSFER tg_file TO p_destin.
    ENDIF.
  ENDWHILE.

  CLOSE DATASET p_origem.

  IF sy-subrc EQ 0.
    IF NOT p_deleta IS INITIAL.
      DELETE DATASET p_origem.
    ENDIF.
    CONCATENATE 'O arquivo' p_origem 'foi movido para' p_destin
           INTO vg_texto SEPARATED BY space.
    WRITE:/ vg_texto COLOR COL_POSITIVE INTENSIFIED OFF.
  ENDIF.

  CLOSE DATASET p_destin.
ENDFORM.                    "move_unix

Conversão de unidade de medida de um material

Funçãozinha básica para converter Kilo para Tonelada, ou qualquer outra medida do material.
REPORT ZSAPeiros.

DATA: vl_matnr     TYPE mara-matnr,
      vl_de        TYPE mara-meins,
      vl_para      TYPE mara-meins,
      vl_valorde   TYPE ekpo-menge,
      vl_valorpara TYPE ekpo-menge.

CALL FUNCTION 'MD_CONVERT_MATERIAL_UNIT'
  EXPORTING
    i_matnr  = vl_matnr   "Material
    i_in_me  = vl_de      "Unidade de medida
    i_out_me = vl_para    "Unidade de medida
    i_menge  = vl_valorde "Valor
  IMPORTING
    e_menge  = vl_valorpara.

WRITE: vl_valorpara.
/* POPUP INI */ /* POPUP FIM */