Technology Blog Posts by Members
cancel
Showing results for 
Search instead for 
Did you mean: 
Umesh_Gauda
Explorer
435

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:

  1. Fetch data

  2. Prepare output

  3. Download or display the result

 

Umesh_Gauda_9-1762514216787.png

 

Umesh_Gauda_10-1762514216789.png

Umesh_Gauda_11-1762514216790.png

 

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:\Users\user\Downloads\output1.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. 

 

Umesh_Gauda_12-1762514216791.png

 

 

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:\Users\user\Downloads\output.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. 

 

Umesh_Gauda_13-1762514216793.png

 

 

 

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:\Users\user\Downloads\output56.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. 

Umesh_Gauda_14-1762514216794.png

 

Umesh_Gauda_15-1762514216795.png

For text type 

 

Umesh_Gauda_16-1762514216795.png

 

Umesh_Gauda_17-1762514216795.png

Excel  

Umesh_Gauda_18-1762514216796.png

 

 

Umesh_Gauda_19-1762514216797.png

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.