In this article we are going to generate a zip file which will contain Material Number (MATNR) and Material Description (MAKTX) in two languages (English and German) in two different files.
SAP has provided the class CL_ABAP_ZIP for reading and writing zip files which we are going to utilize to generate zip file. Following is the sequence of process involved to generate a zip file.
- Fetch data into internal tables
- Convert them to xstring.
- Create object for CL_ABAP_ZIP
- Use add method to add new files to the zip archive
- Now, save method returns the final zip file in xstring
- Convert the xstring to internal table
- Download it using GUI_DOWNLOAD
DATA:
BEGIN OF file_stru,
matnr TYPE matnr,
maktx TYPE maktx,
END OF file_stru,
BEGIN OF s_matnr,
matnr TYPE matnr,
END OF s_matnr,
BEGIN OF s_line,
line TYPE c LENGTH 256,
END OF s_line,
gt_mara_en LIKE STANDARD TABLE OF file_stru,
gt_mara_de LIKE STANDARD TABLE OF file_stru,
gt_matnr LIKE STANDARD TABLE OF s_matnr,
go_zip TYPE REF TO cl_abap_zip,
g_xstr_en TYPE xstring,
g_xstr_de TYPE xstring,
g_xstr_zip TYPE xstring.
START-OF-SELECTION.
"Read and prepare data
PERFORM fetch_data.
"Create object for CL_ABAP_ZIP
CREATE OBJECT go_zip.
"Convert itabs to xstring
PERFORM convert_to_xstring
TABLES gt_mara_en
USING g_xstr_en.
PERFORM convert_to_xstring
TABLES gt_mara_de
USING g_xstr_de.
"Add xstring as file content to zip
go_zip->add(
EXPORTING
name = 'en.txt'
content = g_xstr_en
).
go_zip->add(
EXPORTING
name = 'de.txt'
content = g_xstr_de
).
"Get the xstring for final zip file
g_xstr_zip = go_zip->save( ).
"Dowload the xstring received
"from save method
PERFORM download_zip_file.
WRITE 'File Downloaded'.
*&---------------------------------------------------*
*& Form fetch_data
*&---------------------------------------------------*
* text
*----------------------------------------------------*
FORM fetch_data.
DATA:
lt_mara_en LIKE STANDARD TABLE OF file_stru,
lt_mara_de LIKE STANDARD TABLE OF file_stru,
s_temp LIKE file_stru.
"Select thousand materials
SELECT
matnr
FROM mara
INTO TABLE gt_matnr
UP TO 1000 ROWS.
"Select their english texts
SELECT
matnr
maktx
FROM makt
INTO TABLE lt_mara_en
FOR ALL ENTRIES IN gt_matnr
WHERE matnr EQ gt_matnr-matnr
AND spras EQ 'E'.
"Select their german texts
SELECT
matnr
maktx
FROM makt
INTO TABLE lt_mara_de
FOR ALL ENTRIES IN gt_matnr
WHERE matnr EQ gt_matnr-matnr
AND spras EQ 'D'.
SORT gt_matnr ASCENDING.
SORT gt_mara_en ASCENDING.
SORT gt_mara_de ASCENDING.
LOOP AT gt_matnr INTO s_matnr.
CLEAR s_temp.
READ TABLE lt_mara_en INTO s_temp
WITH KEY matnr = s_matnr-matnr.
IF sy-subrc EQ 0.
APPEND s_temp TO gt_mara_en.
ELSE.
s_temp-matnr = s_matnr-matnr.
APPEND s_temp TO gt_mara_en.
ENDIF.
CLEAR s_temp.
READ TABLE lt_mara_de INTO s_temp
WITH KEY matnr = s_matnr-matnr.
IF sy-subrc EQ 0.
APPEND s_temp TO gt_mara_de.
ELSE.
s_temp-matnr = s_matnr-matnr.
APPEND s_temp TO gt_mara_de.
ENDIF.
ENDLOOP.
ENDFORM. "fetch_data
*&----------------------------------------------*
*& Form convert_to_xstring
*&----------------------------------------------*
* text
*-----------------------------------------------*
* -->P_TAB text
* -->P_XSTR text
*-----------------------------------------------*
FORM convert_to_xstring
TABLES p_tab
USING p_xstr.
DATA:
lt_lines LIKE STANDARD TABLE OF s_line.
LOOP AT p_tab INTO file_stru.
s_line-line = file_stru.
APPEND s_line TO lt_lines.
ENDLOOP.
CALL FUNCTION 'SCMS_TEXT_TO_XSTRING'
* EXPORTING
* FIRST_LINE = 0
* LAST_LINE = 0
* MIMETYPE = ' '
IMPORTING
buffer = p_xstr
TABLES
text_tab = lt_lines
EXCEPTIONS
failed = 1
OTHERS = 2
.
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. "convert_to_xstring
*&------------------------------------------------*
*& Form download_zip_file
*&------------------------------------------------*
* text
*-------------------------------------------------*
FORM download_zip_file.
DATA:
l_len TYPE i,
lt_lines LIKE STANDARD TABLE OF s_line.
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
EXPORTING
buffer = g_xstr_zip
* APPEND_TO_TABLE = ' '
IMPORTING
output_length = l_len
TABLES
binary_tab = lt_lines.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
filename = 'D:/out.zip'
filetype = 'BIN'
IMPORTING
filelength = l_len
TABLES
data_tab = lt_lines.
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. "download_zip_file
Serkan AKKAVAK
Computer Engineer
ABAP Developer & SAP MM SD Consultant
Contact : serkurumsal@yandex.com
Social Plugin