Use Case: Bulk Clone SAP Domains and Data Elements from CSV with Description Retention
This ABAP program automates the cloning of multiple SAP domains and data elements by reading old and new names from a CSV file. It not only creates new objects but also copies their short text descriptions seamlessly using the SAP text management function modules READ_TEXT and SAVE_TEXT. The program supports both domains and data elements, offers file selection with F4 help, and activates newly created objects automatically. This solution significantly speeds up mass cloning tasks in SAP development, ensuring consistency and saving manual effort.
🚀 How to Use the Bulk Clone Tool for Domains & Data Elements
✨ **Prepare Your CSV File** ✨
- No headers, just clean comma-separated values (.csv)
- Keep it simple: use **ONE file at a time** for either **Domains** or **Data Elements** (don’t mix!)
- Format example:
* OLD_DOMAIN_NAME_1,NEW_DOMAIN_NAME_1
* OLD_DATAELEMENT_1,NEW_DATAELEMENT_1
🚀 **Run the Program** 🚀
- Hit **F4** to open the file browser & pick your CSV
- Check the boxes for **Domains** and/or **Data Elements** to match your file
- Press **Execute** and watch the magic happen!
- Keep an eye on the screen logs for ✔️ success messages or ⚠️ warnings
abap program -
REPORT zclone_doma_dtel_from_csv1.
TYPE-POOLS: truxs.
************************************************************************
* SELECTION SCREEN
************************************************************************
PARAMETERS: p_path TYPE rlgrap-filename OBLIGATORY,
p_doma AS CHECKBOX DEFAULT 'X',
p_dtel AS CHECKBOX DEFAULT 'X'.
************************************************************************
* TYPES & VARIABLES
************************************************************************
TYPES: BEGIN OF ty_mapping,
old_name TYPE ddobjname,
new_name TYPE ddobjname,
END OF ty_mapping.
DATA: lt_mapping TYPE STANDARD TABLE OF ty_mapping,
ls_mapping TYPE ty_mapping,
lt_raw TYPE STANDARD TABLE OF string,
lv_line TYPE string,
lt_files TYPE filetable,
lv_rc TYPE i,
lv_file TYPE string,
lv_fname TYPE string,
lv_name TYPE thead-tdname.
DATA: ls_doma TYPE dd01v,
ls_doma_text TYPE dd01t,
ls_dtel TYPE dd04v,
ls_dtel_text TYPE dd04t,
lt_texts TYPE STANDARD TABLE OF itctc,
ls_text TYPE itctc.
************************************************************************
* F4 HELP FOR FILE PATH
************************************************************************
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path.
CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
window_title = 'Select CSV File'
default_extension = 'csv'
file_filter = 'CSV Files (*.csv)|*.csv|All Files (*.*)|*.*'
CHANGING
file_table = lt_files
rc = lv_rc
EXCEPTIONS
OTHERS = 1.
IF sy-subrc = 0 AND lv_rc > 0.
READ TABLE lt_files INTO lv_file INDEX 1.
p_path = lv_file.
ENDIF.
************************************************************************
* START OF SELECTION
************************************************************************
START-OF-SELECTION.
lv_fname = p_path.
" Upload CSV
CALL METHOD cl_gui_frontend_services=>gui_upload
EXPORTING
filename = lv_fname
filetype = 'ASC'
CHANGING
data_tab = lt_raw
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
MESSAGE 'Error uploading file' TYPE 'E'.
ENDIF.
" Parse CSV
LOOP AT lt_raw INTO lv_line.
SPLIT lv_line AT ',' INTO ls_mapping-old_name ls_mapping-new_name.
APPEND ls_mapping TO lt_mapping.
ENDLOOP.
************************************************************************
* COPY DOMAINS
************************************************************************
IF p_doma = abap_true.
LOOP AT lt_mapping INTO ls_mapping.
CLEAR: ls_doma, ls_doma_text, lt_texts, ls_text.
" Get original domain definition
CALL FUNCTION 'DDIF_DOMA_GET'
EXPORTING
name = ls_mapping-old_name
IMPORTING
dd01v_wa = ls_doma
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
WRITE: / '❌ Domain not found:', ls_mapping-old_name.
CONTINUE.
ENDIF.
" Change name
ls_doma-domname = ls_mapping-new_name.
" Put new domain
CALL FUNCTION 'DDIF_DOMA_PUT'
EXPORTING
name = ls_mapping-new_name
dd01v_wa = ls_doma
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
WRITE: / '❌ Error creating domain:', ls_mapping-new_name.
CONTINUE.
ENDIF.
" Copy long texts
CLEAR ls_text.
ls_text-destobject = 'DD01T'.
ls_text-destname = ls_mapping-new_name.
ls_text-destid = 'DOMA'.
ls_text-destlang = sy-langu.
ls_text-srcobject = 'DD01T'.
ls_text-srcname = ls_mapping-old_name.
ls_text-srcid = 'DOMA'.
ls_text-srclang = sy-langu.
APPEND ls_text TO lt_texts.
CALL FUNCTION 'COPY_TEXTS'
EXPORTING
savemode_direct = 'X'
insert = 'X'
TABLES
texts = lt_texts
EXCEPTIONS
OTHERS = 1.
" Copy short description (DD01T)
SELECT SINGLE * FROM dd01t INTO ls_doma_text
WHERE domname = ls_mapping-old_name AND ddlanguage = sy-langu.
IF sy-subrc = 0.
ls_doma_text-domname = ls_mapping-new_name.
INSERT dd01t FROM ls_doma_text.
ENDIF.
" Activate domain
CALL FUNCTION 'DDIF_DOMA_ACTIVATE'
EXPORTING
name = ls_mapping-new_name
EXCEPTIONS
OTHERS = 1.
IF sy-subrc = 0.
WRITE: / '✅ Domain created:', ls_mapping-new_name.
ELSE.
WRITE: / '⚠️ Domain activation failed:', ls_mapping-new_name.
ENDIF.
ENDLOOP.
ENDIF.
************************************************************************
* COPY DATA ELEMENTS
************************************************************************
IF p_dtel = abap_true.
LOOP AT lt_mapping INTO ls_mapping.
CLEAR: ls_dtel, ls_dtel_text, lt_texts, ls_text.
" Get original data element
CALL FUNCTION 'DDIF_DTEL_GET'
EXPORTING
name = ls_mapping-old_name
IMPORTING
dd04v_wa = ls_dtel
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
WRITE: / '❌ Data element not found:', ls_mapping-old_name.
CONTINUE.
ENDIF.
" Change name
ls_dtel-rollname = ls_mapping-new_name.
" Put new data element
CALL FUNCTION 'DDIF_DTEL_PUT'
EXPORTING
name = ls_mapping-new_name
dd04v_wa = ls_dtel
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
WRITE: / '❌ Error creating data element:', ls_mapping-new_name.
CONTINUE.
ENDIF.
" Copy long text
CLEAR ls_text.
ls_text-destobject = 'DD04T'.
ls_text-destname = ls_mapping-new_name.
ls_text-destid = 'DTEL'.
ls_text-destlang = sy-langu.
ls_text-srcobject = 'DD04T'.
ls_text-srcname = ls_mapping-old_name.
ls_text-srcid = 'DTEL'.
ls_text-srclang = sy-langu.
APPEND ls_text TO lt_texts.
CALL FUNCTION 'COPY_TEXTS'
EXPORTING
savemode_direct = 'X'
insert = 'X'
TABLES
texts = lt_texts
EXCEPTIONS
OTHERS = 1.
" Copy short description (DD04T)
SELECT SINGLE * FROM dd04t INTO ls_dtel_text
WHERE rollname = ls_mapping-old_name AND ddlanguage = sy-langu.
IF sy-subrc = 0.
ls_dtel_text-rollname = ls_mapping-new_name.
INSERT dd04t FROM ls_dtel_text.
ENDIF.
" Activate
CALL FUNCTION 'DDIF_DTEL_ACTIVATE'
EXPORTING
name = ls_mapping-new_name
EXCEPTIONS
OTHERS = 1.
IF sy-subrc = 0.
WRITE: / '✅ Data element created:', ls_mapping-new_name.
ELSE.
WRITE: / '⚠️ Data element activation failed:', ls_mapping-new_name.
ENDIF.
ENDLOOP.
ENDIF.
💡 Tips for Creating Large Numbers
✅ Test with 5–10 entries first to ensure structure and naming is correct.
⏳ For large uploads, consider running it as a background job (via SM36).
Request clarification before answering.
| User | Count |
|---|---|
| 5 | |
| 4 | |
| 4 | |
| 3 | |
| 2 | |
| 2 | |
| 2 | |
| 2 | |
| 2 | |
| 2 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.