logo

Are you need IT Support Engineer? Free Consultant

Create an Editable ALV Grid with CRUD Functionalit…

  • By Sanjay
  • 09/05/2026
  • 5 Views


Objective

This program displays data from a custom table ZDB_SALES_CRUD in an editable ALV Grid. Based on user input, it allows creating new records, editing existing ones, and deleting selected entries from the table.

  1. Data Declarations

Naveennani8523_0-1747205741796.Png

 

  • Declares the DB table from which we will retrieve and update data.

Naveennani8523_1-1747205741797.Png

 

  • Defines a structure TY_VBAK_ALV that mirrors the structure of ZDB_SALES_CRUD. This is used for internal data handling.

Naveennani8523_2-1747205741798.Png

 

Declares global data:

  • GT_DATA: Internal table for ALV display.
  • GS_DATA: Work area for processing one record at a time.
  • GT_FIELDCAT: ALV field catalog table.
  • GR_ALV_GRID: ALV Grid instance.
  • GV_OK_CODE: Captures user commands.

🖥️ 2. Selection Screen

Naveennani8523_3-1747205741799.Png

 

  • Provides a simple UI for the user to choose between display or edit mode.

▶️3. Program Execution Starts

Naveennani8523_4-1747205741800.Png

 

  • Fetches data using GET_DATA and navigates to screen 100 which contains the ALV Grid.

🧩 4. Screen 100 – Module Pool

Module: STATUS_0100 (OUTPUT)

Naveennani8523_5-1747205741801.Png

 

  • Sets the GUI status (menu buttons like Create, Update, etc.)

Naveennani8523_6-1747205741801.Png

 

  • Instantiates the ALV Grid object.

Naveennani8523_7-1747205741802.Png

 

  • Builds the field catalog and populates the grid for the first time.

Naveennani8523_8-1747205741802.Png

 

  • Makes the grid editable if user chose “Edit” mode.

Naveennani8523_9-1747205741804.Png

 

  • Handles user interactions and maps them to specific FORM routines.

📥5. FORM: GET_DATA

  • Naveennani8523_10-1747205741804.Png

     

    Fetches all records from the database table into the internal table GT_DATA.

📊6. FORM: BUILD_FIELDCATALOG

Naveennani8523_11-1747205741805.Png

  • Dynamically builds the field catalog required by the ALV grid using a macro.

✏️7. FORM: ENABLE_EDITING

Naveennani8523_12-1747205741806.Png

  • Enables edit mode on the ALV grid.

8. FORM: CREATE_RECORD

  • Naveennani8523_13-1747205741807.Png
  •  

    Notifies the user to fill in data and save.

🔄9. FORM: UPDATE_RECORDS

CALL METHOD GR_ALV_GRID->CHECK_CHANGED_DATA.SELECT * FROM ZDB_SALES_CRUD INTO TABLE LT_EXISTING.

  • Checks ALV for changes and fetches existing records from DB into a sorted table.

LOOP AT GT_DATA INTO GS_DATA.  READ TABLE LT_EXISTING … WITH KEY VBELN POSNR.

  • Compares input data with existing DB entries based on key fields.

IF SY-SUBRC = 0.  UPDATE ZDB_SALES_CRUD FROM LS_EXISTING.ELSE.  INSERT ZDB_SALES_CRUD FROM LS_EXISTING.ENDIF.

  • Updates existing record or inserts a new one.

COMMIT WORK.REFRESH_TABLE_DISPLAY.MESSAGE ‘Records updated in database.' TYPE ‘S'.

  • Saves changes and refreshes the grid.

Naveennani8523_14-1747205741810.Png

10. FORM: DELETE_RECORDS

CALL METHOD GR_ALV_GRID->GET_SELECTED_ROWS IMPORTING ET_INDEX_ROWS = LT_INDICES.

  • Gets user-selected rows for deletion.

LOOP AT LT_INDICES INTO LS_INDEX.  READ TABLE GT_DATA INTO GS_DATA INDEX LV_TABIX.  DELETE FROM ZDB_SALES_CRUD WHERE VBELN = … AND POSNR = .

  • Deletes the record from the database and internal table.

COMMIT WORK.REFRESH_TABLE_DISPLAY.MESSAGE |{ LV_DELETED } record(s) deleted successfully.| TYPE ‘S'.

  • Commits and informs the user of deleted rows.

Naveennani8523_15-1747205741812.Png

Naveennani8523_16-1747205741813.Png

CODE:

REPORT ZINSERT_SD_CUSTOM.

TABLES: ZDB_SALES_CRUD.

TYPES: BEGIN OF TY_VBAK_ALV,
         VBELN TYPE ZDB_SALES_CRUD-VBELN,
         POSNR TYPE ZDB_SALES_CRUD-POSNR,
         ERNAM TYPE ZDB_SALES_CRUD-ERNAM,
         AUART TYPE ZDB_SALES_CRUD-AUART,
         VKORG TYPE ZDB_SALES_CRUD-VKORG,
         MATNR TYPE ZDB_SALES_CRUD-MATNR,
         ARKTX TYPE ZDB_SALES_CRUD-ARKTX,
         WAERK TYPE ZDB_SALES_CRUD-WAERK,
       END OF TY_VBAK_ALV.

DATA: GT_DATA     TYPE STANDARD TABLE OF TY_VBAK_ALV,
      GS_DATA     TYPE TY_VBAK_ALV,
      GT_FIELDCAT TYPE LVC_T_FCAT,
      GS_FIELDCAT TYPE LVC_S_FCAT,
      GR_ALV_GRID TYPE REF TO CL_GUI_ALV_GRID,
      GV_OK_CODE  TYPE SY-UCOMM.


SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-002.

  PARAMETERS: P_DISP RADIOBUTTON GROUP GRP1 DEFAULT 'X',
              P_EDIT RADIOBUTTON GROUP GRP1.

SELECTION-SCREEN END OF BLOCK B1.

START-OF-SELECTION.
  PERFORM GET_DATA.
  CALL SCREEN 100.
*---------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
  SET PF-STATUS 'ZALV_STATUS'.
  IF GR_ALV_GRID IS INITIAL.
    CREATE OBJECT GR_ALV_GRID
      EXPORTING
        I_PARENT = CL_GUI_CONTAINER=>SCREEN0.
    PERFORM BUILD_FIELDCATALOG.
    CALL METHOD GR_ALV_GRID->SET_TABLE_FOR_FIRST_DISPLAY
      EXPORTING
        IS_LAYOUT       = VALUE LVC_S_LAYO( EDIT = ABAP_TRUE )
      CHANGING
        IT_OUTTAB       = GT_DATA
        IT_FIELDCATALOG = GT_FIELDCAT.
    IF P_EDIT = 'X'.
      CALL METHOD GR_ALV_GRID->SET_READY_FOR_INPUT
        EXPORTING
          I_READY_FOR_INPUT = 1.
    ENDIF.
  ENDIF.
ENDMODULE.
*---------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
  GV_OK_CODE = SY-UCOMM.
  CASE GV_OK_CODE.
    WHEN 'CREATE'.
      PERFORM CREATE_RECORD.
    WHEN 'EDIT'.
      PERFORM ENABLE_EDITING.
    WHEN 'UPDATE'.
      PERFORM UPDATE_RECORDS.
    WHEN 'DELETE'.
      PERFORM DELETE_RECORDS.
    WHEN 'BACK' OR 'EXIT' OR 'CANCEL'.
      LEAVE PROGRAM.
  ENDCASE.
ENDMODULE.
*---------------------------------------------------------------------*
FORM GET_DATA.
  CLEAR GT_DATA.
  SELECT VBELN POSNR ERNAM AUART VKORG  MATNR ARKTX WAERK
    FROM ZDB_SALES_CRUD
    INTO TABLE GT_DATA.
ENDFORM.
*---------------------------------------------------------------------*
FORM BUILD_FIELDCATALOG.
  CLEAR GT_FIELDCAT.
  DEFINE ADD_FIELD.
    CLEAR gs_fieldcat.
    gs_fieldcat-fieldname = &1.
    gs_fieldcat-coltext   = &2.
    APPEND gs_fieldcat TO gt_fieldcat.
  END-OF-DEFINITION.

  ADD_FIELD 'VBELN'  'Sales Document'.
  ADD_FIELD 'POSNR'  'Item No'.
  ADD_FIELD 'ERNAM'  'Created By'.
  ADD_FIELD 'AUART'  'Sales Doc Type'.
  ADD_FIELD 'VKORG'  'Sales Org'.
  ADD_FIELD 'MATNR'  'Material'.
  ADD_FIELD 'ARKTX'  'Description'.
  ADD_FIELD 'WAERK'  'Currency'.
ENDFORM.
*---------------------------------------------------------------------*
FORM ENABLE_EDITING.
  CALL METHOD GR_ALV_GRID->SET_READY_FOR_INPUT
    EXPORTING
      I_READY_FOR_INPUT = 1.
ENDFORM.
*---------------------------------------------------------------------*
FORM CREATE_RECORD.
  DATA: LS_NEW TYPE TY_VBAK_ALV.
  CLEAR LS_NEW.
  APPEND LS_NEW TO GT_DATA.
  CALL METHOD GR_ALV_GRID->REFRESH_TABLE_DISPLAY
    EXPORTING
      IS_STABLE = VALUE LVC_S_STBL( ROW = 'X' COL = 'X' ).
  CALL METHOD GR_ALV_GRID->SET_READY_FOR_INPUT
    EXPORTING
      I_READY_FOR_INPUT = 1.
  MESSAGE 'Enter new row data and press UPDATE.' TYPE 'S'.
ENDFORM.
*---------------------------------------------------------------------*
FORM UPDATE_RECORDS.
  CALL METHOD GR_ALV_GRID->CHECK_CHANGED_DATA.
  DATA: LT_EXISTING TYPE SORTED TABLE OF ZDB_SALES_CRUD
                        WITH UNIQUE KEY VBELN POSNR,
        LS_EXISTING TYPE ZDB_SALES_CRUD.
  " Fetch all existing records
  SELECT * FROM ZDB_SALES_CRUD INTO TABLE LT_EXISTING.
  LOOP AT GT_DATA INTO GS_DATA.
    READ TABLE LT_EXISTING INTO LS_EXISTING
         WITH KEY VBELN = GS_DATA-VBELN
                  POSNR = GS_DATA-POSNR.
    IF SY-SUBRC = 0.
      " Update existing
      MOVE-CORRESPONDING GS_DATA TO LS_EXISTING.
      UPDATE ZDB_SALES_CRUD FROM LS_EXISTING.
    ELSE.
      " Insert new
      MOVE-CORRESPONDING GS_DATA TO LS_EXISTING.
      INSERT ZDB_SALES_CRUD FROM LS_EXISTING.
    ENDIF.
  ENDLOOP.
  COMMIT WORK.
  PERFORM GET_DATA.
  CALL METHOD GR_ALV_GRID->REFRESH_TABLE_DISPLAY
    EXPORTING
      IS_STABLE = VALUE LVC_S_STBL( ROW = 'X' COL = 'X' ).
  MESSAGE 'Records updated in database.' TYPE 'S'.
ENDFORM.
*---------------------------------------------------------------------*
FORM DELETE_RECORDS.
  DATA: LT_INDICES TYPE LVC_T_ROW,
        LS_INDEX   TYPE LVC_S_ROW,
        LV_TABIX   TYPE SY-TABIX,
        LV_DELETED TYPE I VALUE 0.
  CALL METHOD GR_ALV_GRID->GET_SELECTED_ROWS
    IMPORTING
      ET_INDEX_ROWS = LT_INDICES.
  SORT LT_INDICES BY INDEX DESCENDING.
  LOOP AT LT_INDICES INTO LS_INDEX.
    LV_TABIX = LS_INDEX-INDEX.
    READ TABLE GT_DATA INTO GS_DATA INDEX LV_TABIX.
    IF SY-SUBRC = 0.
      DELETE FROM ZDB_SALES_CRUD
        WHERE VBELN = _DATA-VBELN AND POSNR = _DATA-POSNR.
      IF SY-SUBRC = 0.
        DELETE GT_DATA INDEX LV_TABIX.
        LV_DELETED = LV_DELETED + 1.
      ENDIF.
    ENDIF.
  ENDLOOP.
  COMMIT WORK.
  CALL METHOD GR_ALV_GRID->REFRESH_TABLE_DISPLAY
    EXPORTING
      IS_STABLE = VALUE LVC_S_STBL( ROW = 'X' COL = 'X' ).
  IF LV_DELETED > 0.
    MESSAGE |{ LV_DELETED } record(s) deleted successfully.| TYPE 'S'.
  ELSE.
    MESSAGE 'No records were deleted. Please check keys.' TYPE 'I'.
  ENDIF.
ENDFORM.



Source link

Leave a Reply

Your email address will not be published. Required fields are marked *