cancel
Showing results for 
Search instead for 
Did you mean: 

(Solved) Use Case: Bulk Clone SAP Domains and Data Elements from CSV

08-28-2025 4:53 PM
Sunil_Rajput60 Newcomer
2824 views 0 comments
0 Likes
SAP Managed Tags
Labels
Bulk Clone domainschange actual domain's name
Subscribe

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-POOLStruxs.
************************************************************************
* SELECTION SCREEN
************************************************************************
PARAMETERSp_path TYPE rlgrap-filename OBLIGATORY,
            p_doma AS CHECKBOX DEFAULT 'X',
            p_dtel AS CHECKBOX DEFAULT 'X'.

************************************************************************
* TYPES & VARIABLES
************************************************************************
TYPESBEGIN OF ty_mapping,
         old_name TYPE ddobjname,
         new_name TYPE ddobjname,
       END OF ty_mapping.

DATAlt_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.

DATAls_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 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.

      CLEARls_domals_doma_textlt_textsls_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.

      CLEARls_dtells_dtel_textlt_textsls_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).

0 Likes

Accepted Solutions (0)

Answers (0)