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
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.
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.
Assinar:
Postagens (Atom)