Implementing the Template Method Design Pattern

The Template Method pattern establishes a common framework for a process while letting derived classes implement their own versions of certain steps.

For example, generating reports in different formats (PDF, Excel, Text) might have differences in export or formatting logic, but the sequence of operations remains the same:

Fetch data

Prepare output

Download or display the result

 

 

 

METHOD fetch_data.
DATA: ls_sales_data TYPE zug_sales,
lt_sales_data TYPE zug_t_sales.
SELECT SINGLE *
FROM vbak
INTO (ls_vbak)
WHERE vbeln = _vbeln.

” Fetch Items
SELECT *
FROM vbap
INTO TABLE (lt_vbap)
WHERE vbeln = _vbeln.

“————————————————————
” Combine Header + Item into Final ITAB
“————————————————————
LOOP AT lt_vbap INTO DATA(ls_vbap).
CLEAR ls_sales_data.
ls_sales_data-vbeln = ls_vbak-vbeln.
ls_sales_data-kunnr = ls_vbak-kunnr.
ls_sales_data-vkorg = ls_vbak-vkorg.
ls_sales_data-vtweg = ls_vbak-vtweg.
ls_sales_data-spart = ls_vbak-spart.
ls_sales_data-auart = ls_vbak-auart.
ls_sales_data-posnr = ls_vbap-posnr.
ls_sales_data-matnr = ls_vbap-matnr.
ls_sales_data-vrkme = ls_vbap-vrkme.

APPEND ls_sales_data TO lt_sales_data.
ENDLOOP.

gt_data

= lt_sales_data.
ENDMETHOD.

DATA: lt_output TYPE STANDARD TABLE OF string,
lv_filename TYPE string,
lv_line TYPE string.

” Header line
lv_line = |VBELN;KUNNR;VKORG;VTWEG;SPART;AUART;POSNR;MATNR;VRKME|.
APPEND lv_line TO lt_output.

” Data lines
LOOP AT gt_data INTO data(ls_sales_data).
lv_line = |{ ls_sales_data-vbeln };{ ls_sales_data-kunnr };{ ls_sales_data-vkorg };{ ls_sales_data-vtweg };{ ls_sales_data-spart };{ ls_sales_data-auart };{ ls_sales_data-posnr };{ ls_sales_data-matnr };{ ls_sales_data-vrkme }|.
APPEND lv_line TO lt_output.
ENDLOOP.

“————————————————————
” Download to file
“————————————————————
lv_filename = ‘C:UsersuserDownloadsoutput1.txt’.

cl_gui_frontend_services=>gui_download(
EXPORTING
filename = lv_filename
filetype = ‘ASC’
CHANGING
data_tab = lt_output
EXCEPTIONS
OTHERS = 1
).

IF sy-subrc <> 0.
MESSAGE ‘Error during file download’ TYPE ‘E’.
ENDIF.

 

 

 

METHOD fetch_data.

DATA: ls_sales_data TYPE zug_sales,
lt_sales_data TYPE zug_t_sales.
SELECT SINGLE *
FROM vbak
INTO (ls_vbak)
WHERE vbeln = _vbeln.

” Fetch Items
SELECT *
FROM vbap
INTO TABLE (lt_vbap)
WHERE vbeln = _vbeln.

“————————————————————
” Combine Header + Item into Final ITAB
“————————————————————
LOOP AT lt_vbap INTO DATA(ls_vbap).
CLEAR ls_sales_data.
ls_sales_data-vbeln = ls_vbak-vbeln.
ls_sales_data-kunnr = ls_vbak-kunnr.
ls_sales_data-vkorg = ls_vbak-vkorg.
ls_sales_data-vtweg = ls_vbak-vtweg.
ls_sales_data-spart = ls_vbak-spart.
ls_sales_data-auart = ls_vbak-auart.
ls_sales_data-posnr = ls_vbap-posnr.
ls_sales_data-matnr = ls_vbap-matnr.

ls_sales_data-vrkme = ls_vbap-vrkme.

APPEND ls_sales_data TO lt_sales_data.
ENDLOOP.

gt_data

= lt_sales_data.
ENDMETHOD.
DATA(lo_pdf) = NEW cl_apoc_pdf_generator( ).
lo_pdf->create_pdf(
EXPORTING
input = gt_data
RECEIVING
pdf_binary_output = DATA(rv_bin)
).

DATA: lv_bin TYPE xstring,
lt_bin_tab TYPE STANDARD TABLE OF x255,
lv_size TYPE i,
lv_filename TYPE string.

lv_bin = rv_bin. ” Your PDF xstring

” Convert XSTRING to BINARY TABLE
CALL FUNCTION ‘SCMS_XSTRING_TO_BINARY’
EXPORTING
buffer = lv_bin
IMPORTING
output_length = lv_size
TABLES
binary_tab = lt_bin_tab.

” Set filename (local path)
lv_filename = ‘C:UsersuserDownloadsoutput.pdf’.

” Download to frontend
cl_gui_frontend_services=>gui_download(
EXPORTING
bin_filesize = lv_size
filename = lv_filename
filetype = ‘BIN’
CHANGING
data_tab = lt_bin_tab
EXCEPTIONS
OTHERS = 1
).
endmethod.

 

 

 

DATA: ls_sales_data TYPE zug_sales,
lt_sales_data TYPE zug_t_sales.

SELECT SINGLE *
FROM vbak
INTO (ls_vbak)
WHERE vbeln = _vbeln.

” Fetch Items
SELECT *
FROM vbap
INTO TABLE (lt_vbap)
WHERE vbeln = _vbeln.

“————————————————————
” Combine Header + Item into Final ITAB
“————————————————————
LOOP AT lt_vbap INTO DATA(ls_vbap).
CLEAR ls_sales_data.
ls_sales_data-vbeln = ls_vbak-vbeln.
ls_sales_data-kunnr = ls_vbak-kunnr.
ls_sales_data-vkorg = ls_vbak-vkorg.
ls_sales_data-vtweg = ls_vbak-vtweg.
ls_sales_data-spart = ls_vbak-spart.
ls_sales_data-auart = ls_vbak-auart.
ls_sales_data-posnr = ls_vbap-posnr.
ls_sales_data-matnr = ls_vbap-matnr.

ls_sales_data-vrkme = ls_vbap-vrkme.

APPEND ls_sales_data TO lt_sales_data.
ENDLOOP.

gt_data

= lt_sales_data.
endmethod.

DATA: lo_salv_table TYPE REF TO cl_salv_table.
DATA: rv_excel_bin TYPE xstring. ” Holds the final XLSX binary data (XSTRING)

” 1. Create ALV instance from the internal table
TRY.
cl_salv_table=>factory(
IMPORTING
r_salv_table = lo_salv_table
CHANGING
t_table = gt_data
).

” 2. Generate the XLSX binary data (XSTRING)
lo_salv_table->to_xml(
EXPORTING
xml_type = if_salv_bs_xml=>c_type_xlsx ” Specify XLSX format
RECEIVING
xml = rv_excel_bin
).

CATCH cx_salv_msg.
” Handle ALV/XML generation error
MESSAGE ‘Error during XLSX generation’ TYPE ‘E’.
RETURN.
ENDTRY.

* The rest of your download logic can remain similar,
* but I’ll use CL_BCS_CONVERT=>XSTRING_TO_SOLIX as it’s often more standard
* for converting to the format required by GUI_DOWNLOAD’s BIN filetype.

DATA: lv_bin TYPE xstring,
lt_bin_tab TYPE solix_tab, ” Use SOLIX_TAB for better compatibility
lv_size TYPE i,
lv_filename TYPE string.

” Move the generated Excel XSTRING
lv_bin = rv_excel_bin.

” Convert XSTRING to SOLIX (Binary Table for GUI_DOWNLOAD)
* SCMS_XSTRING_TO_BINARY is still an option, but CL_BCS_CONVERT is often preferred.

lt_bin_tab = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_bin ).

” Get the size of the XSTRING for GUI_DOWNLOAD
lv_size = xstrlen( lv_bin ).

” Set filename (local path – user will be prompted)
” IMPORTANT: Use a generic name unless you want a fixed path
lv_filename = ‘C:UsersuserDownloadsoutput56.xlsx’. ” Using ‘C:…’ forces a specific path, better to use a simple name

” 4. Download to frontend
cl_gui_frontend_services=>gui_download(
EXPORTING
bin_filesize = lv_size
filename = lv_filename
filetype = ‘BIN’ ” Must be ‘BIN’ for binary files (like XLSX)
CHANGING
data_tab = lt_bin_tab
EXCEPTIONS
OTHERS = 1
).

IF sy-subrc <> 0.
” Handle download error
MESSAGE ‘Error during file download’ TYPE ‘E’.
ENDIF.

 

For pdf. 

 

For text type 

 

 

Excel  

 

 

CONCLUSION

 The Template Method Pattern in ABAP provides a powerful way to design reusable and maintainable frameworks, especially when you have multiple processes that share a common structure but differ in certain implementation steps.

 

 

 

 

 

​ The Template Method pattern establishes a common framework for a process while letting derived classes implement their own versions of certain steps.For example, generating reports in different formats (PDF, Excel, Text) might have differences in export or formatting logic, but the sequence of operations remains the same:Fetch dataPrepare outputDownload or display the result   METHOD fetch_data.
DATA: ls_sales_data TYPE zug_sales,
lt_sales_data TYPE zug_t_sales.
SELECT SINGLE *
FROM vbak
INTO (ls_vbak)
WHERE vbeln = _vbeln.

” Fetch Items
SELECT *
FROM vbap
INTO TABLE (lt_vbap)
WHERE vbeln = _vbeln.

“————————————————————
” Combine Header + Item into Final ITAB
“————————————————————
LOOP AT lt_vbap INTO DATA(ls_vbap).
CLEAR ls_sales_data.
ls_sales_data-vbeln = ls_vbak-vbeln.
ls_sales_data-kunnr = ls_vbak-kunnr.
ls_sales_data-vkorg = ls_vbak-vkorg.
ls_sales_data-vtweg = ls_vbak-vtweg.
ls_sales_data-spart = ls_vbak-spart.
ls_sales_data-auart = ls_vbak-auart.
ls_sales_data-posnr = ls_vbap-posnr.
ls_sales_data-matnr = ls_vbap-matnr.
ls_sales_data-vrkme = ls_vbap-vrkme.

APPEND ls_sales_data TO lt_sales_data.
ENDLOOP.

gt_data

= lt_sales_data.
ENDMETHOD.

DATA: lt_output TYPE STANDARD TABLE OF string,
lv_filename TYPE string,
lv_line TYPE string.

” Header line
lv_line = |VBELN;KUNNR;VKORG;VTWEG;SPART;AUART;POSNR;MATNR;VRKME|.
APPEND lv_line TO lt_output.

” Data lines
LOOP AT gt_data INTO data(ls_sales_data).
lv_line = |{ ls_sales_data-vbeln };{ ls_sales_data-kunnr };{ ls_sales_data-vkorg };{ ls_sales_data-vtweg };{ ls_sales_data-spart };{ ls_sales_data-auart };{ ls_sales_data-posnr };{ ls_sales_data-matnr };{ ls_sales_data-vrkme }|.
APPEND lv_line TO lt_output.
ENDLOOP.

“————————————————————
” Download to file
“————————————————————
lv_filename = ‘C:UsersuserDownloadsoutput1.txt’.

cl_gui_frontend_services=>gui_download(
EXPORTING
filename = lv_filename
filetype = ‘ASC’
CHANGING
data_tab = lt_output
EXCEPTIONS
OTHERS = 1
).

IF sy-subrc <> 0.
MESSAGE ‘Error during file download’ TYPE ‘E’.
ENDIF.    METHOD fetch_data.

DATA: ls_sales_data TYPE zug_sales,
lt_sales_data TYPE zug_t_sales.
SELECT SINGLE *
FROM vbak
INTO (ls_vbak)
WHERE vbeln = _vbeln.

” Fetch Items
SELECT *
FROM vbap
INTO TABLE (lt_vbap)
WHERE vbeln = _vbeln.

“————————————————————
” Combine Header + Item into Final ITAB
“————————————————————
LOOP AT lt_vbap INTO DATA(ls_vbap).
CLEAR ls_sales_data.
ls_sales_data-vbeln = ls_vbak-vbeln.
ls_sales_data-kunnr = ls_vbak-kunnr.
ls_sales_data-vkorg = ls_vbak-vkorg.
ls_sales_data-vtweg = ls_vbak-vtweg.
ls_sales_data-spart = ls_vbak-spart.
ls_sales_data-auart = ls_vbak-auart.
ls_sales_data-posnr = ls_vbap-posnr.
ls_sales_data-matnr = ls_vbap-matnr.

ls_sales_data-vrkme = ls_vbap-vrkme.

APPEND ls_sales_data TO lt_sales_data.
ENDLOOP.

gt_data

= lt_sales_data.
ENDMETHOD.
DATA(lo_pdf) = NEW cl_apoc_pdf_generator( ).
lo_pdf->create_pdf(
EXPORTING
input = gt_data
RECEIVING
pdf_binary_output = DATA(rv_bin)
).

DATA: lv_bin TYPE xstring,
lt_bin_tab TYPE STANDARD TABLE OF x255,
lv_size TYPE i,
lv_filename TYPE string.

lv_bin = rv_bin. ” Your PDF xstring

” Convert XSTRING to BINARY TABLE
CALL FUNCTION ‘SCMS_XSTRING_TO_BINARY’
EXPORTING
buffer = lv_bin
IMPORTING
output_length = lv_size
TABLES
binary_tab = lt_bin_tab.

” Set filename (local path)
lv_filename = ‘C:UsersuserDownloadsoutput.pdf’.

” Download to frontend
cl_gui_frontend_services=>gui_download(
EXPORTING
bin_filesize = lv_size
filename = lv_filename
filetype = ‘BIN’
CHANGING
data_tab = lt_bin_tab
EXCEPTIONS
OTHERS = 1
).
endmethod.    

DATA: ls_sales_data TYPE zug_sales,
lt_sales_data TYPE zug_t_sales.

SELECT SINGLE *
FROM vbak
INTO (ls_vbak)
WHERE vbeln = _vbeln.

” Fetch Items
SELECT *
FROM vbap
INTO TABLE (lt_vbap)
WHERE vbeln = _vbeln.

“————————————————————
” Combine Header + Item into Final ITAB
“————————————————————
LOOP AT lt_vbap INTO DATA(ls_vbap).
CLEAR ls_sales_data.
ls_sales_data-vbeln = ls_vbak-vbeln.
ls_sales_data-kunnr = ls_vbak-kunnr.
ls_sales_data-vkorg = ls_vbak-vkorg.
ls_sales_data-vtweg = ls_vbak-vtweg.
ls_sales_data-spart = ls_vbak-spart.
ls_sales_data-auart = ls_vbak-auart.
ls_sales_data-posnr = ls_vbap-posnr.
ls_sales_data-matnr = ls_vbap-matnr.

ls_sales_data-vrkme = ls_vbap-vrkme.

APPEND ls_sales_data TO lt_sales_data.
ENDLOOP.

gt_data

= lt_sales_data.
endmethod.

DATA: lo_salv_table TYPE REF TO cl_salv_table.
DATA: rv_excel_bin TYPE xstring. ” Holds the final XLSX binary data (XSTRING)

” 1. Create ALV instance from the internal table
TRY.
cl_salv_table=>factory(
IMPORTING
r_salv_table = lo_salv_table
CHANGING
t_table = gt_data
).

” 2. Generate the XLSX binary data (XSTRING)
lo_salv_table->to_xml(
EXPORTING
xml_type = if_salv_bs_xml=>c_type_xlsx ” Specify XLSX format
RECEIVING
xml = rv_excel_bin
).

CATCH cx_salv_msg.
” Handle ALV/XML generation error
MESSAGE ‘Error during XLSX generation’ TYPE ‘E’.
RETURN.
ENDTRY.

* The rest of your download logic can remain similar,
* but I’ll use CL_BCS_CONVERT=>XSTRING_TO_SOLIX as it’s often more standard
* for converting to the format required by GUI_DOWNLOAD’s BIN filetype.

DATA: lv_bin TYPE xstring,
lt_bin_tab TYPE solix_tab, ” Use SOLIX_TAB for better compatibility
lv_size TYPE i,
lv_filename TYPE string.

” Move the generated Excel XSTRING
lv_bin = rv_excel_bin.

” Convert XSTRING to SOLIX (Binary Table for GUI_DOWNLOAD)
* SCMS_XSTRING_TO_BINARY is still an option, but CL_BCS_CONVERT is often preferred.

lt_bin_tab = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_bin ).

” Get the size of the XSTRING for GUI_DOWNLOAD
lv_size = xstrlen( lv_bin ).

” Set filename (local path – user will be prompted)
” IMPORTANT: Use a generic name unless you want a fixed path
lv_filename = ‘C:UsersuserDownloadsoutput56.xlsx’. ” Using ‘C:…’ forces a specific path, better to use a simple name

” 4. Download to frontend
cl_gui_frontend_services=>gui_download(
EXPORTING
bin_filesize = lv_size
filename = lv_filename
filetype = ‘BIN’ ” Must be ‘BIN’ for binary files (like XLSX)
CHANGING
data_tab = lt_bin_tab
EXCEPTIONS
OTHERS = 1
).

IF sy-subrc <> 0.
” Handle download error
MESSAGE ‘Error during file download’ TYPE ‘E’.
ENDIF.

 For pdf.  For text type   Excel    CONCLUSION The Template Method Pattern in ABAP provides a powerful way to design reusable and maintainable frameworks, especially when you have multiple processes that share a common structure but differ in certain implementation steps.       Read More Technology Blog Posts by Members articles 

#SAP

#SAPTechnologyblog

You May Also Like

More From Author