Batch Processing Multiple Files
Examples for processing large datasets and multiple Excel files efficiently.
Large Dataset Processing
Chunked Data Processing
abap
" Process large internal table in chunks
CLASS zcl_excel_batch_processor DEFINITION.
PUBLIC SECTION.
METHODS: process_large_dataset
IMPORTING it_data TYPE ANY TABLE
RETURNING VALUE(rv_excel) TYPE xstring.
PRIVATE SECTION.
CONSTANTS: c_chunk_size TYPE i VALUE 10000.
METHODS: process_chunk
IMPORTING it_chunk TYPE ANY TABLE
io_worksheet TYPE REF TO zcl_excel_worksheet
iv_start_row TYPE i.
ENDCLASS.
CLASS zcl_excel_batch_processor IMPLEMENTATION.
METHOD process_large_dataset.
DATA: lo_excel TYPE REF TO zcl_excel,
lo_worksheet TYPE REF TO zcl_excel_worksheet,
lo_writer TYPE REF TO zcl_excel_writer_huge_file,
lt_chunk TYPE TABLE OF string,
lv_current_row TYPE i VALUE 1.
CREATE OBJECT lo_excel.
CREATE OBJECT lo_writer.
lo_worksheet = lo_excel->add_new_worksheet( ).
" Process data in chunks
DATA: lv_total_rows TYPE i,
lv_processed TYPE i.
lv_total_rows = lines( it_data ).
LOOP AT it_data INTO DATA(ls_data).
APPEND ls_data TO lt_chunk.
ADD 1 TO lv_processed.
" Process chunk when size reached or at end
IF lines( lt_chunk ) = c_chunk_size OR lv_processed = lv_total_rows.
process_chunk(
it_chunk = lt_chunk
io_worksheet = lo_worksheet
iv_start_row = lv_current_row
).
lv_current_row = lv_current_row + lines( lt_chunk ).
CLEAR lt_chunk.
" Optional: Force garbage collection
CALL FUNCTION 'SYSTEM_RESET_MEMORY'.
ENDIF.
ENDLOOP.
rv_excel = lo_writer->write_file( lo_excel ).
ENDMETHOD.
METHOD process_chunk.
" Process individual chunk
LOOP AT it_chunk INTO DATA(ls_row).
lo_worksheet->set_cell(
ip_column = 'A'
ip_row = iv_start_row + sy-tabix - 1
ip_value = ls_row
).
ENDLOOP.
ENDMETHOD.
ENDCLASS.
Memory-Efficient Processing
abap
" Memory-conscious Excel generation
REPORT zexcel_memory_efficient.
DATA: lo_excel TYPE REF TO zcl_excel,
lo_worksheet TYPE REF TO zcl_excel_worksheet,
lo_writer TYPE REF TO zcl_excel_writer_huge_file.
PARAMETERS: p_rows TYPE i DEFAULT 100000.
START-OF-SELECTION.
" Monitor memory usage
DATA: lv_memory_start TYPE i,
lv_memory_current TYPE i.
CALL FUNCTION 'MEMORY_GET_INFO'
IMPORTING allocated_bytes = lv_memory_start.
CREATE OBJECT lo_excel.
CREATE OBJECT lo_writer.
lo_worksheet = lo_excel->add_new_worksheet( ).
" Generate data in batches
DATA: lv_batch_size TYPE i VALUE 1000,
lv_current_row TYPE i VALUE 1.
DO p_rows TIMES.
" Add row data
lo_worksheet->set_cell(
ip_column = 'A'
ip_row = lv_current_row
ip_value = |Row { lv_current_row }|
).
ADD 1 TO lv_current_row.
" Check memory every batch
IF lv_current_row MOD lv_batch_size = 0.
CALL FUNCTION 'MEMORY_GET_INFO'
IMPORTING allocated_bytes = lv_memory_current.
DATA(lv_memory_used) = lv_memory_current - lv_memory_start.
WRITE: / |Processed { lv_current_row } rows, Memory: { lv_memory_used } bytes|.
" Optional: Trigger garbage collection
IF lv_memory_used > 100000000. " 100MB threshold
CALL FUNCTION 'SYSTEM_RESET_MEMORY'.
ENDIF.
ENDIF.
ENDDO.
" Write final file
DATA(lv_excel_data) = lo_writer->write_file( lo_excel ).
WRITE: / |Final file size: { xstrlen( lv_excel_data ) } bytes|.
Multiple File Generation
Parallel File Processing
abap
" Generate multiple Excel files in parallel
CLASS zcl_parallel_excel_generator DEFINITION.
PUBLIC SECTION.
TYPES: BEGIN OF ty_file_request,
filename TYPE string,
data TYPE REF TO data,
END OF ty_file_request,
tt_file_requests TYPE TABLE OF ty_file_request.
METHODS: generate_multiple_files
IMPORTING it_requests TYPE tt_file_requests
RETURNING VALUE(rt_results) TYPE string_table.
ENDCLASS.
CLASS zcl_parallel_excel_generator IMPLEMENTATION.
METHOD generate_multiple_files.
" Process each file request
LOOP AT it_requests INTO DATA(ls_request).
" Generate individual Excel file
DATA: lo_excel TYPE REF TO zcl_excel,
lo_worksheet TYPE REF TO zcl_excel_worksheet,
lo_writer TYPE REF TO zif_excel_writer.
CREATE OBJECT lo_excel.
CREATE OBJECT lo_writer TYPE zcl_excel_writer_2007.
lo_worksheet = lo_excel->add_new_worksheet( ).
" Process data for this file
FIELD-SYMBOLS: <lt_data> TYPE STANDARD TABLE.
ASSIGN ls_request-data->* TO <lt_data>.
" Add data to worksheet
LOOP AT <lt_data> INTO DATA(ls_data).
" Implementation specific to data structure
ENDLOOP.
" Save file
DATA(lv_excel_data) = lo_writer->write_file( lo_excel ).
" Store result
APPEND |File { ls_request-filename } generated successfully| TO rt_results.
ENDLOOP.
ENDMETHOD.
ENDCLASS.
Background Job Coordination
abap
" Coordinate multiple background jobs for Excel generation
REPORT zexcel_job_coordinator.
PARAMETERS: p_jobs TYPE i DEFAULT 5.
START-OF-SELECTION.
" Submit multiple background jobs
DATA: lv_job_name TYPE btcjob,
lv_job_number TYPE btcjobcnt.
DO p_jobs TIMES.
" Create unique job name
lv_job_name = |EXCEL_GEN_{ sy-index }|.
" Submit background job
SUBMIT zexcel_background_worker
WITH p_job_id = sy-index
VIA JOB lv_job_name
NUMBER lv_job_number
AND RETURN.
WRITE: / |Submitted job { lv_job_name } with number { lv_job_number }|.
ENDDO.
" Monitor job completion
PERFORM monitor_jobs.
FORM monitor_jobs.
" Implementation to check job status
" and collect results when complete
ENDFORM.
Performance Optimization
Efficient Data Structures
abap
" Use efficient data structures for batch processing
DATA: BEGIN OF ls_optimized_data,
field1 TYPE string,
field2 TYPE i,
field3 TYPE p DECIMALS 2,
END OF ls_optimized_data,
lt_optimized_data LIKE TABLE OF ls_optimized_data.
" Avoid deep structures and object references in large tables
" Use appropriate data types to minimize memory usage
Streaming Data Processing
abap
" Stream data directly to Excel without storing in memory
CLASS zcl_excel_streamer DEFINITION.
PUBLIC SECTION.
METHODS: stream_data_to_excel
IMPORTING iv_source TYPE string
RETURNING VALUE(rv_excel) TYPE xstring.
PRIVATE SECTION.
METHODS: read_data_chunk
IMPORTING iv_offset TYPE i
iv_size TYPE i
RETURNING VALUE(rt_data) TYPE string_table.
ENDCLASS.
CLASS zcl_excel_streamer IMPLEMENTATION.
METHOD stream_data_to_excel.
DATA: lo_excel TYPE REF TO zcl_excel,
lo_worksheet TYPE REF TO zcl_excel_worksheet,
lo_writer TYPE REF TO zcl_excel_writer_huge_file.
CREATE OBJECT lo_excel.
CREATE OBJECT lo_writer.
lo_worksheet = lo_excel->add_new_worksheet( ).
" Stream data in chunks
DATA: lv_offset TYPE i VALUE 0,
lv_chunk_size TYPE i VALUE 1000,
lv_current_row TYPE i VALUE 1.
DO.
" Read next chunk
DATA(lt_chunk) = read_data_chunk(
iv_offset = lv_offset
iv_size = lv_chunk_size
).
" Exit if no more data
IF lines( lt_chunk ) = 0.
EXIT.
ENDIF.
" Process chunk
LOOP AT lt_chunk INTO DATA(lv_data).
lo_worksheet->set_cell(
ip_column = 'A'
ip_row = lv_current_row
ip_value = lv_data
).
ADD 1 TO lv_current_row.
ENDLOOP.
" Update offset for next chunk
lv_offset = lv_offset + lv_chunk_size.
ENDDO.
rv_excel = lo_writer->write_file( lo_excel ).
ENDMETHOD.
METHOD read_data_chunk.
" Implementation to read data chunk from source
" Could be database, file system, or other data source
ENDMETHOD.
ENDCLASS.