Conteúdo

Quebra de linha via código utilizando ASCII

Pular linha é fácil né? É só dar Enter. Tá bom, então tenta fazer isto concatenando variáveis.
REPORT ZSAPeiros.

TYPES:
  BEGIN OF ty_data,
    linha(20)       TYPE c,
    END OF ty_data.

DATA:
  gt_data           TYPE TABLE OF ty_data,
  wa_data           TYPE          ty_data,
  lv_string         TYPE string,
  lv_pula           TYPE string.

lv_pula = cl_abap_conv_in_ce=>uccp( '000A' ). "CÓDIGO ASCII DO PULO DE LINHA

CONCATENATE '1' lv_pula '2' lv_pula '3' INTO lv_string.

wa_data-linha = lv_string.
APPEND wa_data TO gt_data.


CALL METHOD cl_gui_frontend_services=>gui_download
  EXPORTING
    filename                = 'C:\PULOLINHA.txt'
  CHANGING
    data_tab                = gt_data
  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
    not_supported_by_gui    = 22
    error_no_gui            = 23
    OTHERS                  = 24.

* ABRA NO NOTEPAD++ O ARQUIVO GERADO

Popup com campos, preenchimento obrigatório, etc

Pode parecer besteira, mas se um dia você quiser um programa para gravar algumas informações no meio de um processo qualquer, se você puder abrir um popup com os campos para preencher seria ótimo. Você pode dar uma viajada e gerar isto dinâmico para realizar um select posteriormente, ou buscar informações, etc. Faça bom proveito.
REPORT ZSAPeiros.

DATA:
  t_fields TYPE TABLE OF sval, "Atributos tabela
  w_fields TYPE          sval. "Atributos tabela

w_fields-tabname   = 'MARA'.
w_fields-fieldname = 'MATNR'.
w_fields-field_obl = abap_true.
APPEND w_fields TO t_fields.
CLEAR w_fields.

w_fields-tabname   = 'MARA'.
w_fields-fieldname = 'MEINS'.
APPEND w_fields TO t_fields.
CLEAR w_fields.

CALL FUNCTION 'POPUP_GET_VALUES'
  EXPORTING
    popup_title = 'Informe os dados corretamente'
  IMPORTING
    returncode  = lv_retcode
  TABLES
    fields      = t_fields.

IF lv_retcode NE 'E'. "Cancelar
  LOOP AT t_fields INTO w_fields.
    WRITE:/ w_fields-value.
  ENDLOOP.
ENDIF.

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' ).

Executar aplicativo do PC

Abrir a calculadora do windows na hora certa pode lhe dar créditos com o cliente.
REPORT ZSAPeiros.


CALL METHOD cl_gui_frontend_services=>execute
   EXPORTING
*    document               =
     application            = 'CALC.EXE'
*    parameter              =
*    default_directory      =
     maximized              = 'X'
*    minimized              =
*    synchronous            =
     operation              = 'OPEN'
  EXCEPTIONS
    cntl_error             = 1
    error_no_gui           = 2
    bad_parameter          = 3
    file_not_found         = 4
    path_not_found         = 5
    file_extension_unknown = 6
    error_execute_failed   = 7
    synchronous_failed     = 8
    not_supported_by_gui   = 9
    OTHERS                 = 10.

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.

Comparação do conteúdo de 2 arquivos

Digamos que você vez fez performane num programa que gera um relatório ou tem uma tabela de saída, e agora você precisa comparar o conteúdo, para ver se o resultado final é o mesmo. Está desenhado para comparar arquivos excel e texto. Informa quais são as linhas que estão diferentes e ainda gera um arquivo contendo apenas o que ficou diferente.
REPORT ZSAPeiros.

TYPES: BEGIN OF ty_file,
         line       TYPE string,
         cont(10)   TYPE n,
       END OF ty_file,

       BEGIN OF ty_file_fim,
         line       TYPE string,
       END OF ty_file_fim,

       BEGIN OF ty_file_aux,
         cont(10)   TYPE c,
         line       TYPE string,
       END OF ty_file_aux.

DATA: lv_hora_ini     TYPE sy-uzeit,
      lv_hora_fim     TYPE sy-uzeit,
      lv_hora         TYPE sy-uzeit,
      lv_cont(8)      TYPE c,
      lv_cont1(8)     TYPE c,
      lv_cont2(8)     TYPE c,
      lv_text(5000)   TYPE c,
      lv_filetype(10) TYPE c,
      lv_filename(30) TYPE c,
      lv_name_exp_srt TYPE string.

DATA: gt_file1         TYPE TABLE OF ty_file WITH HEADER LINE.
DATA: gt_file1_xls     TYPE TABLE OF ty_file_aux WITH HEADER LINE.
DATA: gt_file1_xls_exp TYPE TABLE OF ty_file_fim WITH HEADER LINE.
DATA: gt_file2         TYPE TABLE OF ty_file WITH HEADER LINE.
DATA: gt_file2_xls     TYPE TABLE OF ty_file_aux WITH HEADER LINE.
DATA: gt_file2_xls_exp TYPE TABLE OF ty_file_fim WITH HEADER LINE.

DATA: lv_call_mask(50)    TYPE c,
      lv_name_exp         TYPE ibipparms-path.


************************************************************************


PARAMETERS: p_file1 TYPE string OBLIGATORY,
            p_file2 TYPE string OBLIGATORY.


************************************************************************


INITIALIZATION.
  CLEAR lv_call_mask.
  CONCATENATE ',Excel (*.xls),*.XLS;*.XLSX' ',Texto (*.txt),*.TXT.'
         INTO lv_call_mask.


************************************************************************


AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file1.
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      def_filename     = space
      def_path         = space
      mask             = lv_call_mask
      mode             = 'O'
    IMPORTING
      filename         = lv_name_exp
    EXCEPTIONS
      inv_winsys       = 04
      no_batch         = 08
      selection_cancel = 12
      selection_error  = 16.
  p_file1 = lv_name_exp.


************************************************************************


AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file2.
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      def_filename     = space
      def_path         = space
      mask             = lv_call_mask
      mode             = 'O'
    IMPORTING
      filename         = lv_name_exp
    EXCEPTIONS
      inv_winsys       = 04
      no_batch         = 08
      selection_cancel = 12
      selection_error  = 16.
  p_file2 = lv_name_exp.


************************************************************************


END-OF-SELECTION.
  lv_hora_ini = sy-uzeit.

  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename = p_file1
    TABLES
      data_tab = gt_file1.

  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename = p_file2
    TABLES
      data_tab = gt_file2.


************************************************************************


  LOOP AT gt_file1.
    gt_file1-cont = sy-tabix.
    MODIFY gt_file1 INDEX sy-tabix.
  ENDLOOP.

  LOOP AT gt_file2.
    gt_file2-cont = sy-tabix.
    MODIFY gt_file2 INDEX sy-tabix.
  ENDLOOP.

  SORT: gt_file1 BY line,
        gt_file2 BY line.


************************************************************************


  LOOP AT gt_file1.
    READ TABLE gt_file2 WITH KEY line = gt_file1-line BINARY SEARCH.
    IF sy-subrc IS NOT INITIAL.
      lv_cont1 = lv_cont1 + 1.
      CONDENSE lv_cont1 NO-GAPS.
      gt_file1_xls-cont = gt_file1-cont.
      gt_file1_xls-line = gt_file1-line.
      APPEND gt_file1_xls.
    ENDIF.
  ENDLOOP.

  LOOP AT gt_file2.
    READ TABLE gt_file1 WITH KEY line = gt_file2-line BINARY SEARCH.
    IF sy-subrc IS NOT INITIAL.
      lv_cont2 = lv_cont2 + 1.
      CONDENSE lv_cont2 NO-GAPS.
      gt_file2_xls-cont = gt_file2-cont.
      gt_file2_xls-line = gt_file2-line.
      APPEND gt_file2_xls.
    ENDIF.
  ENDLOOP.


************************************************************************


  SORT: gt_file1_xls BY cont,
        gt_file2_xls BY cont.


************************************************************************


  CLEAR lv_text.
  CONCATENATE sy-vline
              'TEM NO ARQUIVO ARQUIVO'
              p_file1
              'E NÃO TEM NO ARQUIVO'
              p_file2
         INTO lv_text SEPARATED BY space.
  WRITE: / lv_text COLOR COL_HEADING.

  WRITE: / sy-uline.

  LOOP AT gt_file1_xls.
    gt_file1_xls_exp-line = gt_file1_xls-line.
    APPEND gt_file1_xls_exp.
    IF sy-tabix = 1.
      CLEAR lv_text.
      lv_text+0(1)  = sy-vline.
      lv_text+2(10) = 'Linha'.
      lv_text+13(1) = sy-vline.
      lv_text+15    = 'Valor da linha'.
      WRITE: / lv_text COLOR COL_GROUP INTENSIFIED OFF.
      WRITE: / sy-uline.
    ENDIF.
    CLEAR lv_text.
    lv_text+0(1)  = sy-vline.
    lv_text+2(10) = gt_file1_xls-cont.
    lv_text+13(1) = sy-vline.
    lv_text+15    = gt_file1_xls-line.
    WRITE: / lv_text COLOR COL_HEADING INTENSIFIED OFF.
  ENDLOOP.


************************************************************************


  WRITE: / sy-uline.
  CLEAR lv_text.
  lv_text(1)   = sy-vline.
  WRITE: / lv_text COLOR COL_NEGATIVE INTENSIFIED.
  WRITE: / sy-uline.


************************************************************************


  CLEAR lv_text.
  CONCATENATE sy-vline
              'TEM NO ARQUIVO ARQUIVO'
              p_file2
              'E NÃO TEM NO ARQUIVO'
              p_file1
         INTO lv_text SEPARATED BY space.
  WRITE: / lv_text COLOR COL_HEADING.

  WRITE: / sy-uline.

  LOOP AT gt_file2_xls.
    gt_file2_xls_exp-line = gt_file2_xls-line.
    APPEND gt_file2_xls_exp.
    IF sy-tabix = 1.
      CLEAR lv_text.
      lv_text+0(1)  = sy-vline.
      lv_text+2(10) = 'Linha'.
      lv_text+13(1) = sy-vline.
      lv_text+15    = 'Valor da linha'.
      WRITE: / lv_text COLOR COL_GROUP INTENSIFIED OFF.
      WRITE: / sy-uline.
    ENDIF.
    CLEAR lv_text.
    lv_text+0(1)  = sy-vline.
    lv_text+2(10) = gt_file2_xls-cont.
    lv_text+13(1) = sy-vline.
    lv_text+15    = gt_file2_xls-line.
    WRITE: / lv_text COLOR COL_HEADING INTENSIFIED OFF.
  ENDLOOP.


************************************************************************


  WRITE: / sy-uline.


************************************************************************


* Linhas do arquivo 1
  CONDENSE lv_cont1 NO-GAPS.
  CLEAR lv_text.
  CONCATENATE sy-vline
              lv_cont1
              'linhas diferentes no arquivo'
              p_file1
         INTO lv_text SEPARATED BY space.

  IF lv_cont1 IS INITIAL.
    WRITE: / lv_text.
  ELSE.
    WRITE: / lv_text COLOR COL_TOTAL INTENSIFIED ON.
  ENDIF.


************************************************************************


  WRITE: / sy-uline.


************************************************************************


* Linhas do arquivo 2
  CONDENSE lv_cont2 NO-GAPS.
  CLEAR lv_text.
  CONCATENATE sy-vline
              lv_cont2
              'linhas diferentes no arquivo'
              p_file2
         INTO lv_text SEPARATED BY space.

  IF lv_cont2 IS INITIAL.
    WRITE: / lv_text.
  ELSE.
    WRITE: / lv_text COLOR COL_TOTAL INTENSIFIED ON.
  ENDIF.


************************************************************************


  WRITE: / sy-uline.


************************************************************************


* Linhas do arquivo 1 e 2
  lv_cont = lv_cont1 + lv_cont2.
  CONDENSE lv_cont NO-GAPS.
  CLEAR lv_text.
  CONCATENATE sy-vline
              lv_cont
              'linhas diferentes no total'
         INTO lv_text SEPARATED BY space.

  IF lv_cont IS INITIAL.
    WRITE: / lv_text.
  ELSE.
    WRITE: / lv_text COLOR COL_TOTAL INTENSIFIED ON.
  ENDIF.


************************************************************************


  WRITE: / sy-uline.


************************************************************************


  lv_hora_fim = sy-uzeit.
  lv_hora = lv_hora_fim - lv_hora_ini.

  CLEAR lv_text.
  CONCATENATE sy-vline
              'Tempo gasto:'
              lv_hora
         INTO lv_text SEPARATED BY space.
  WRITE: / lv_text COLOR COL_POSITIVE INTENSIFIED ON USING EDIT MASK '_________________:__:__'.


************************************************************************


  WRITE: / sy-uline.


************************************************************************


  CLEAR lv_text.
  CONCATENATE sy-vline
              'Duplo clique para exportar as linhas diferentes do arquivo 1:'
              p_file1
              'para TXT ou XLS'
         INTO lv_text SEPARATED BY space.
  WRITE: / lv_text COLOR COL_GROUP INTENSIFIED OFF.


************************************************************************


  WRITE: / sy-uline.


************************************************************************


  CLEAR lv_text.
  CONCATENATE sy-vline
              'Duplo clique para exportar as linhas diferentes do arquivo 2:'
              p_file2
              'para TXT ou XLS'
         INTO lv_text SEPARATED BY space.
  WRITE: / lv_text COLOR COL_GROUP INTENSIFIED OFF.

  WRITE: / sy-uline.


************************************************************************


AT LINE-SELECTION.
  IF sy-ucomm EQ 'PICK'.


************************************************************************


    IF sy-lisel+2(26) = 'Duplo clique para exportar' AND
       sy-lisel+61(1) = '1'.

      lv_cont = STRLEN( p_file1 ).
      lv_cont = lv_cont - 4.
      CONCATENATE p_file1(lv_cont)
                  '_DIF'
             INTO lv_filename.

      CLEAR lv_name_exp.
      CALL FUNCTION 'WS_FILENAME_GET'
        EXPORTING
          def_filename     = lv_filename
          def_path         = space
          mask             = lv_call_mask
          mode             = 'S'
        IMPORTING
          filename         = lv_name_exp
        EXCEPTIONS
          inv_winsys       = 04
          no_batch         = 08
          selection_cancel = 12
          selection_error  = 16.

      IF sy-subrc IS INITIAL.
        lv_cont = STRLEN( lv_name_exp ).
        lv_cont = lv_cont - 3.
        IF lv_name_exp+lv_cont(3) = 'XLS'.
          lv_filetype = 'DAT'.
        ELSE.
          lv_filetype = 'ASC'.
        ENDIF.
        lv_name_exp_srt = lv_name_exp.
        CALL FUNCTION 'GUI_DOWNLOAD'
          EXPORTING
            filename              = lv_name_exp_srt
            filetype              = lv_filetype
            write_field_separator = 'X'
          TABLES
            data_tab              = gt_file1_xls_exp.
      ENDIF.

    ENDIF.


************************************************************************


    IF sy-lisel+2(26) = 'Duplo clique para exportar' AND
       sy-lisel+61(1) = '2'.

      lv_cont = STRLEN( p_file2 ).
      lv_cont = lv_cont - 4.
      CONCATENATE p_file2(lv_cont)
                  '_DIF'
             INTO lv_filename.

      CLEAR lv_name_exp.
      CALL FUNCTION 'WS_FILENAME_GET'
        EXPORTING
          def_filename     = lv_filename
          def_path         = space
          mask             = lv_call_mask
          mode             = 'S'
        IMPORTING
          filename         = lv_name_exp
        EXCEPTIONS
          inv_winsys       = 04
          no_batch         = 08
          selection_cancel = 12
          selection_error  = 16.

      IF sy-subrc IS INITIAL.
        lv_cont = STRLEN( lv_name_exp ).
        lv_cont = lv_cont - 3.
        IF lv_name_exp+lv_cont(3) = 'XLS'.
          lv_filetype = 'DAT'.
        ELSE.
          lv_filetype = 'ASC'.
        ENDIF.
        lv_name_exp_srt = lv_name_exp.
        CALL FUNCTION 'GUI_DOWNLOAD'
          EXPORTING
            filename              = lv_name_exp_srt
            filetype              = lv_filetype
            write_field_separator = 'X'
          TABLES
            data_tab              = gt_file2_xls_exp.
      ENDIF.

    ENDIF.

  ENDIF.

Chat entre mandantes e mandantes diferentes

Bóra trocar uma ideia? Só cuidado pra não mandar para TODOS que estiverem logados heim!!!
REPORT ZSAPeiros_a.

*********************************************************************************
* CHAT - MESMO MANDANTE
*********************************************************************************
PARAMETERS: p_client   LIKE sy-mandt DEFAULT sy-mandt,
            p_user     LIKE sy-uname DEFAULT sy-uname,
            p_msg(128) TYPE C        DEFAULT '' LOWER CASE.

DATA: opcode_send_pop_up(1) TYPE x VALUE 31,
      msg_length            LIKE sy-index,
      loc_cut_blanks        TYPE x VALUE 1.

DESCRIBE FIELD p_msg LENGTH msg_length IN CHARACTER MODE.
CALL 'ThUsrInfo' ID 'OPCODE' FIELD opcode_send_pop_up
  ID 'CLIENT'     FIELD p_client
  ID 'USR'        FIELD p_user
  ID 'MSG'        FIELD p_msg
  ID 'MSG_LEN'    FIELD msg_length
  ID 'CUT_BLANKS' FIELD loc_cut_blanks.

IF sy-subrc = 0.
  WRITE:/ 'Mensagem enviada para ', p_user, ' com sucesso!'.
ELSE.
  WRITE:/ 'Usuário Inexistente!'.
ENDIF.


REPORT ZSAPeiros_b.

*********************************************************************************
* CHAT - MANDANTES DIFERENTES
*********************************************************************************
PARAMETERS: p_client     LIKE sy-mandt DEFAULT sy-mandt,
            p_user       LIKE sy-uname DEFAULT sy-uname,
            p_msg(128)   TYPE c        DEFAULT '' LOWER CASE.

CALL FUNCTION 'TH_POPUP'
  EXPORTING
    client         = p_client
    user           = p_user
    MESSAGE        = p_msg
  EXCEPTIONS
    user_not_found = 1
    OTHERS         = 2.

IF sy-subrc = 0.
  WRITE:/ 'Mensagem enviada para ', p_user, ' com sucesso!'.
ELSE.
  WRITE:/ 'Usuário Inexistente!'.
ENDIF.

Chamar variante ao iniciar um programa

Sabe aquele programa que você está testando e tem trocentos campos para preencher, então você chama a variante toda hora para testar? Então, o esquema é já chamar a variante logo de cara.
REPORT ZSAPeiros.

INITIALIZATION.
CALL FUNCTION 'RS_SUPPORT_SELECTIONS'
EXPORTING
report                     = sy-repid
variant                    = 'PADRAO'
EXCEPTIONS
VARIANT_NOT_EXISTENT       = 1
VARIANT_OBSOLETE           = 2
OTHERS                     = 3.

Calcular milisegundos do tempo de execução

Certa vez eu precisei calcular a diferença que o programa leva do trecho A ao trecho B, porém este era executado tão rapidamente que o resultado final era impreciso, então o cálculo foi necessário em milissegundos.
REPORT ZSAPeiros.

DATA: lv_char     TYPE i,
      lv_char2    TYPE i,
      lv_retorno  TYPE i.

*--------------------------------------------------

* Horário de início em milisegundos
GET RUN TIME FIELD lv_char.

WAIT UP TO 2 SECONDS.

* Horário de fim em milisegundos
GET RUN TIME FIELD lv_char2.

WRITE: / 'INI',lv_char.

WRITE: / 'FIM',lv_char2.

lv_retorno =  ( lv_char2 - lv_char ).

WRITE: / 'TOT',lv_retorno.

* Transforma em segundos
lv_retorno =  lv_retorno * ( 10 ** -6 ).

WRITE: / 'SEG',lv_retorno.

*--------------------------------------------------
WRITE: / sy-uline.
*--------------------------------------------------

* Horário de início em milisegundos
GET RUN TIME FIELD lv_char.

WAIT UP TO 3 SECONDS.

* Horário de fim em milisegundos
GET RUN TIME FIELD lv_char2.

WRITE: / 'INI',lv_char.

WRITE: / 'FIM',lv_char2.

lv_retorno =  ( lv_char2 - lv_char ).

WRITE: / 'TOT',lv_retorno.

* Transforma em segundos
lv_retorno =  lv_retorno * ( 10 ** -6 ).

WRITE: / 'SEG',lv_retorno.

Alimentar Select-Options manualmente

Caso você não tenha um elemento de dados com informações, ou simplesmente não queira utilizar um, basta inserir desta maneira, para que o usuário fique apenas com as informações que você adicionar ao campo. Neste exemplo, o campo terá apenas os estados do Brasil.
REPORT ZSAPeiros.

* Definição grupo de tipos
TYPE-POOLS: vrm.

* Definição de tipos
TYPES:
  BEGIN OF ty_t005u,
    bland     TYPE          t005u-bland,    "Código estado
    bezei     TYPE          t005u-bezei,    "Descr. estado
    END OF ty_t005u.

* Declaração de tabelas internas/estruturas
DATA:
  t_t005u     TYPE TABLE OF ty_t005u,       "Chaves província
  w_t005u     TYPE          ty_t005u,       "Chaves província
  t_lista     TYPE          vrm_values,     "Valores listbox
  w_lista     TYPE          vrm_value.      "Valores listbox

* Parâmetros de seleção
PARAMETERS p_bland TYPE t005u-bland AS LISTBOX VISIBLE LENGTH 20.

* Ações de tela antes da execução do programa
AT SELECTION-SCREEN OUTPUT.
  SELECT bland bezei
    FROM t005u
    INTO TABLE t_t005u
   WHERE spras EQ 'PT'
     AND land1 EQ 'BR'.

* Monta linhas do listbox com dados dos estados
  LOOP AT t_t005u INTO w_t005u.
    w_lista-key  = w_t005u-bland.
    w_lista-text = w_t005u-bezei.
    APPEND w_lista TO t_lista.
  ENDLOOP.

* Ordena
  SORT t_lista BY key.

* Função para setar os valores selecionados no parâmetro de tela
  CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      id              = 'P_BLAND'
      values          = t_lista
    EXCEPTIONS
      id_illegal_name = 1
      OTHERS          = 2.

* Inicializar parâmetros
INITIALIZATION.
  sy-title               = 'SAPeiros: Alimentar Select-Options manualmente'.
  %_p_bland_%_app_%-text = 'Estado'.

* Ações após execução
END-OF-SELECTION.
  sy-title               = 'SAPeiros: Alimentar Select-Options manualmente'.
  WRITE: / p_bland.

Adicionar espaços em branco no final do registro

E quem já não precisou gerar um arquivo com espaços até o limite solicitado pelo cliente? Bom, eu já, e na época ninguém me ensinou, e agora está mastigadinho pra você.
REPORT ZSAPeiros.

***************************************************************************
* NO SERVIDOR, UTILIZAR:
***************************************************************************
TRANSFER tabela-campo
      TO tabela_dest-campo_dest
         LENGTH 100. "Ou seja, 100 caracteres, adicionando brancos no final


***************************************************************************
* PARA ARQUIVOS LOCAIS, UTILIZAR:
***************************************************************************
* Tipo para tabela / estrutura principal
TYPES: BEGIN OF ty_data,
        linha(20)       TYPE c,                 "Linha
       END OF ty_data.

* Variáveis globais
DATA: gv_campo_espc     TYPE string,            "Espaço convertido
      gv_campo_qtde     TYPE i,                 "Quantidade caracteres
      gv_qtde_vezes     TYPE i,                 "Quantidade espaços a serem inseridos
      gv_campo_size(50) TYPE c.                 "Tamanho real do campo

* Tabela principal
DATA: gt_data           TYPE TABLE OF ty_data.  "Tabela

* Estrutura principal
DATA: wa_data           TYPE          ty_data.  "Estrutura

* Encode do espaço em branco
gv_campo_espc = cl_abap_conv_in_ce=>uccp( '00a0' ).

* Tamanho real do campo
DESCRIBE FIELD wa_data-linha LENGTH gv_campo_size IN CHARACTER MODE.

* Registro 1
wa_data-linha = '12345'.
gv_campo_qtde = STRLEN( wa_data-linha ).
gv_qtde_vezes = gv_campo_size - gv_campo_qtde.
DO gv_qtde_vezes TIMES.
  wa_data-linha+gv_campo_qtde(1) = gv_campo_espc.
  gv_campo_qtde = gv_campo_qtde + 1.
ENDDO.
CALL FUNCTION 'SCP_REPLACE_STRANGE_CHARS'
  EXPORTING
    intext            = wa_data-linha
  IMPORTING
    outtext           = wa_data-linha
  EXCEPTIONS
    invalid_codepage  = 1
    codepage_mismatch = 2
    internal_error    = 3
    cannot_convert    = 4
    fields_not_type_c = 5
    OTHERS            = 6.
APPEND wa_data TO gt_data.

* Registro 2
wa_data-linha = '67890'.
gv_campo_qtde = STRLEN( wa_data-linha ).
gv_qtde_vezes = gv_campo_size - gv_campo_qtde.
DO gv_qtde_vezes TIMES.
  wa_data-linha+gv_campo_qtde(1) = gv_campo_espc.
  gv_campo_qtde = gv_campo_qtde + 1.
ENDDO.
APPEND wa_data TO gt_data.

* Gera arquivo
CALL METHOD cl_gui_frontend_services=>gui_download
  EXPORTING
    filename                = 'C:\espacos_final.txt'
  CHANGING
    data_tab                = gt_data
  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
    not_supported_by_gui    = 22
    error_no_gui            = 23
    OTHERS                  = 24.

IF sy-subrc IS INITIAL.
  WRITE: / 'Arquivo gerado com sucesso!'.
ELSE.
  WRITE: / 'Erro ao gerar arquivo!'.
ENDIF.

Adicionar botão na tela

Normalmente utilizado em aplicações para mobile.
REPORT ZSAPeiros.

TABLES: sscrfields.

SELECTION-SCREEN:
PUSHBUTTON 1(29) text-p01 USER-COMMAND cli1.

AT SELECTION-SCREEN.
  CASE sscrfields-ucomm.
    WHEN 'CLI1'.
      CALL TRANSACTION 'ZSEUPROGRAMA'.
  ENDCASE.

Adicionar botão ao lado do botão executar

Uma maneira simples de colocar um botão ao lado do botão executar sem precisar criar telas ou alterar a standard de seu programa.
REPORT ZSAPeiros.

TABLES sscrfields.

DATA w_buttons TYPE smp_dyntxt.

SELECTION-SCREEN: FUNCTION KEY 1.

INITIALIZATION.
  w_buttons-text        = 'NEW'.
  w_buttons-icon_id     = '@0Y@'.
  w_buttons-quickinfo   = 'Insert new values'(001).
  sscrfields-functxt_01 = w_buttons.