Hello,
Within my company, we have implemented some custom ABAP SLT transformation logic to concatenate the text lines. For this, we have change 2 setting in LTRS transaction:
- Table structure change, see below screenshot
- rule assignment
Here is the ABAP logic:
TYPES: BEGIN OF ty_stxl_raw,
clustr TYPE stxl-clustr,
clustd TYPE stxl-clustd,
END OF ty_stxl_raw.
DATA: lt_stxl_raw TYPE STANDARD TABLE OF ty_stxl_raw,
lt_stxl_raw_tmp TYPE STANDARD TABLE OF ty_stxl_raw,
wa_stxl_raw TYPE ty_stxl_raw,
lt_tline TYPE STANDARD TABLE OF tline,
wa_tline TYPE tline.
DATA : lv_append TYPE flag.
DATA : ls_stxl TYPE stxl.
DATA : lt_stxl_tmp TYPE TABLE OF stxl.
DATA : lv_lines TYPE int4.
DATA : lv_srtf2 TYPE srtf2.
DATA : lv_where_clause TYPE string.
DATA : ls_zstxl TYPE zstxl. " Used only for tracking
DATA : lv_string_line TYPE string.
CONSTANTS : c_clust_len TYPE sybin2 VALUE '7902'.
**********************************************************************
FIELD-SYMBOLS : <fs_operation> TYPE any.
DATA lv_load_only TYPE flag.
DATA lv_operation TYPE flag.
ASSIGN '<wa_s_stxl>-iuuc_operat_flag' TO <fs_operation>.
IF sy-subrc <> 0.
lv_load_only = 'X'.
ELSE.
CLEAR lv_load_only .
ENDIF.
lv_operation = <fs_operation>.
**********************************************************************
* PROCESS ***
**Filter out text records that we don't need[To be UnCOMMENT to TRACK Multiline]
*MOVE-CORRESPONDING ls_stxl TO ls_zstxl.
*ls_zstxl-relid = _mt_id+1 + 1.
*CALL FUNCTION 'IUUC_DATE_GET_TIMESTAMP'
* IMPORTING
* e_timestamp = ls_zstxl-timestamp.
*MODIFY zstxl FROM ls_zstxl .
*COMMIT WORK.
IF <wa_s_stxl>-relid = 'TX' .
* AND <wa_s_stxl>-tdobject = 'QMEL'. """ !!! FILTER TO BE MANAGED FOR PERFORMANCE
lv_srtf2 = <wa_s_stxl>-srtf2.
REFRESH lt_stxl_tmp.
MOVE-CORRESPONDING <wa_s_stxl> TO ls_stxl.
IF lv_operation = 'D'.
* Clear ALl lines on HANA side, to delete ( And Replace if Update ).
CONCATENATE
'RELID = ''' <wa_s_stxl>-relid
''' AND TDOBJECT = ''' <wa_s_stxl>-tdobject
''' AND TDNAME = ''' <wa_s_stxl>-tdname
''' AND TDID = ''' <wa_s_stxl>-tdid
''' AND TDSPRAS = ''' <wa_s_stxl>-tdspras ''''
INTO lv_where_clause.
CALL METHOD zcl_slt_utilities=>delete_target_records
EXPORTING
i_mtid = _mt_id
i_tabname = 'ZSTXL_TX_BLOB'
i_where_clause = lv_where_clause
EXCEPTIONS
mtid_not_found = 1
table_not_found = 2
where_clause_error = 3
sql_connection = 4
OTHERS = 5.
IF sy-subrc <> 0.
* Implement suitable error handling here
MESSAGE e398(00) WITH 'Error to delete STXL Records' <wa_s_stxl>-tdobject <wa_s_stxl>-tdname <wa_s_stxl>-tdid.
ENDIF.
EXIT.
ENDIF.
IF <wa_s_stxl>-clustr >= c_clust_len OR <wa_s_stxl>-srtf2 <> 0. " we have to manage several lines in LT_STXL_RAW
** Track Updates for Multi Lines [To be UnCOMMENT to TRACK Multiline]
* MOVE-CORRESPONDING ls_stxl TO ls_zstxl.
* ls_zstxl-relid = _mt_id+1.
* CALL FUNCTION 'IUUC_DATE_GET_TIMESTAMP'
* IMPORTING
* e_timestamp = ls_zstxl-timestamp.
* MODIFY zstxl FROM ls_zstxl .
* Get temporary lines sorted in memory with same key (except SRTF2)
ls_stxl-relid = _mt_id+1.
SELECT * FROM stxl
INTO TABLE lt_stxl_tmp
WHERE
relid = ls_stxl-relid
AND tdobject = ls_stxl-tdobject
AND tdname = ls_stxl-tdname
AND tdid = ls_stxl-tdid
AND tdspras = ls_stxl-tdspras.
APPEND ls_stxl TO lt_stxl_tmp.
SORT lt_stxl_tmp BY srtf2.
DESCRIBE TABLE lt_stxl_tmp LINES lv_lines.
READ TABLE lt_stxl_tmp INTO ls_stxl INDEX lv_lines.
IF lv_lines = ( ls_stxl-srtf2 + 1 ) AND ls_stxl-clustr <> c_clust_len.
* The last line number correspond to the number of lines in STXL; so table is complete
DELETE FROM stxl
WHERE
relid = ls_stxl-relid
AND tdobject = ls_stxl-tdobject
AND tdname = ls_stxl-tdname
AND tdid = ls_stxl-tdid
AND tdspras = ls_stxl-tdspras.
COMMIT WORK.
ELSE.
* Export the current retrived parts of STXL
MOVE-CORRESPONDING <wa_s_stxl> TO ls_stxl.
ls_stxl-relid = _mt_id+1.
MODIFY stxl FROM ls_stxl.
COMMIT WORK AND WAIT.
skip_record.
EXIT.
ENDIF.
ELSE.
APPEND ls_stxl TO lt_stxl_tmp.
ENDIF.
IF <wa_s_stxl>-clustd IS NOT INITIAL.
LOOP AT lt_stxl_tmp INTO ls_stxl.
**Put Source fields into internal table for IMPORT statement to work on
wa_stxl_raw-clustr = ls_stxl-clustr.
wa_stxl_raw-clustd = ls_stxl-clustd.
APPEND wa_stxl_raw TO lt_stxl_raw.
ENDLOOP.
* Unclusterize data with IMPORT
TRY.
IMPORT tline = lt_tline FROM INTERNAL TABLE lt_stxl_raw ACCEPTING TRUNCATION IGNORING CONVERSION ERRORS.
* CATCH SYSTEM-EXCEPTIONS cx_sy_import_format_error = 1 OTHERS = 2.
CATCH cx_sy_import_mismatch_error.
MOVE-CORRESPONDING ls_stxl TO ls_zstxl.
ls_zstxl-error = 'I'.
GET TIME STAMP FIELD ls_zstxl-timestamp.
MODIFY zstxl FROM ls_zstxl.
* MESSAGE i398(00) WITH 'Error Declusturization' ls_stxl-tdobject ls_stxl-tdname.
CATCH cx_sy_compression_error.
MOVE-CORRESPONDING ls_stxl TO ls_zstxl.
ls_zstxl-error = 'E'.
GET TIME STAMP FIELD ls_zstxl-timestamp.
MODIFY zstxl FROM ls_zstxl.
* MESSAGE i398(00) WITH 'Error Declusturization : Compression' ls_stxl-tdobject ls_stxl-tdname.
*
ENDTRY.
LOOP AT lt_tline INTO wa_tline .
* CONCATENATE lv_string_line wa_tline-tdline INTO lv_string_line SEPARATED BY space.
IF wa_tline-tdformat IS INITIAL.
CONCATENATE lv_string_line wa_tline-tdline INTO lv_string_line SEPARATED BY space.
ELSE.
CONCATENATE lv_string_line cl_abap_char_utilities=>cr_lf wa_tline-tdline INTO lv_string_line SEPARATED BY space.
ENDIF.
ENDLOOP.
IF sy-subrc <> 0.
* No Text Found
skip_record.
ELSE.
<wa_r_stxl>-srtf2_max = ls_stxl-srtf2. " Force it to have always the same key for line1
* <wa_r_stxl>-clustr = ls_stxl-srtf2. " SAVE the VAlue from Oringal Key into non used field
<wa_r_stxl>-blob_line = lv_string_line.
ENDIF.
ENDIF.
ELSE.
* OUT of FILTER
skip_record.
ENDIF.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.