Creating an Interactive Editable ALV in ABAP with Header-Item CRUD Functionality

Estimated read time 73 min read

In this blog post, we will explore a powerful ABAP implementation of an editable ALV using CL_GUI_ALV_GRID. This solution provides:

Interactive two-screen design (Header & Item)Double-click to header to itemField-level edit control via CELLTABFull CRUD operations (Create, Read, Update, Delete) for both header and item data

🏠 Scenario

We use two custom database tables:

Custom Table → Delivery Header Data (VBELN, ERNAM, ERDAT, VSTEL, VKORG)Custom Table → Delivery Item Data (VBELN, POSNR, MATNR, WERKS)

The goal is to allow users to edit only selected rows, protect primary key fields, and manage entries interactively.

1.      Table Declarations

TABLES?

 Custom transparent table containing delivery header data.Custom transparent table for delivery item data.These tables are used to fetch and store ALV grid data.

TABLES:ZDB_EDIT_ALV,ZDB_EDIT_ALV1.

🔷 2. Class Forward Declaration

CLASS DELIVERY DEFINITION DEFERRED.

Forward declares a class named DELIVERY used later to handle double-click events.This is necessary to register event handlers before the class is fully implemented.

🔷 3. Type Declarations

Defines a structure T_ZDB_EDIT_ALV to hold header data and editable styles.CELLTAB: Stores editable style info for ALV cell-level control.

Similarly, for item data:

🔷 4. Data Definitions

Internal tables and work areas for header (LT_LIKP, LS_LIKP) and item (LT_LIPS, LS_LIPS) records.Field catalog tables for header (LT_FCAT) and item (LT_FCAT1) ALVs.Layout configurations for header and item grids.Containers and ALV grid objects for screen 200 (header) and screen 100 (item).

5. Selection Screen Definition

 

 Purpose: Creates a selection screen block with delivery number as the input filter.S_VBELN: Allows users to input multiple values or ranges for VBELN.TEXT-000: Refers to a text element (defined in SE32 or SE38) for the frame title.

🔷 6. Field Catalog for Item ALV

Uses VALUE #( ) constructor to populate the field catalog for the item-level ALV (LT_LIPS).COL_POS: Column order in the ALV.FIELDNAME: Field to display.COLTEXT: Header text.TABNAME: Reference table used for dynamic assignment (not required in OO ALV, but used for clarity here).

🔷 7. Layout Configuration for Item ALV

GRID_TITLE: Title of the ALV.SEL_MODE = ‘A’: Allows multiple row selection.NO_TOOLBAR = ‘X’: Hides the standard ALV toolbar.STYLEFNAME = ‘CELLTAB’: Tells ALV to use the CELLTAB column to control editable styles per cell.

🔷 8. Start-of-Selection

START-OF-SELECTION.  CALL SCREEN 200.

Trigger point of the report after user input.It navigates to screen 200, which displays the header-level ALV.

9. Event Handler Class Definition

Defines a local class DELIVERY with method GET_DATA.The method is registered as an event handler for the double-click event of the ALV.

🔷 10. Class Implementation

 

 GET_DATA is triggered when the user double-clicks on a row in header ALV.It reads the delivery number (VBELN) of the clicked row.Then fetches all matching item-level records from ZDB_EDIT_ALV1 into LT_LIPS.Opens Screen 100, which shows the item ALV.

🔷 11. Screen 100 (Item ALV) – OUTPUT Module

 

 SET PF-STATUS ‘ZITEMS’: Sets the GUI status (button functions) for item screen.PERFORM CREATE_OBJECT_LIPS: Initializes the ALV Grid for item records.

🔷 12. Screen 100 – INPUT Module

 

 Handles user actions on screen 100:BACK: Return to header ALV.CREATE: Add a new item row.EDIT: Enable selected row for editing.UPDATE: Update modified item data.DELETE: Remove selected rows.SAVE: Insert/update item data into DB.FORM CREATE_OBJECT_LIPS – Initializes ALV on Screen 100 (Item).MODULE STATUS_0200 OUTPUT – Prepares header ALV on Screen 200.MODULE USER_COMMAND_0200 INPUT – Handles toolbar actions for header ALV.Then we’ll go deeper into the CRUD FORMs (CREATE/EDIT/UPDATE/DELETE/SAVE) for both header and item ALVs.FORM CREATE_OBJECT_LIPS – Create ALV Grid for Items

🔹

Explanation:

CLEAR O_CONTAINER2: Reset reference before ALV creation (safety check).CREATE OBJECT O_CONTAINER2: Creates a custom container placed on the screen (SCREEN 100) using element CONTAINER2.CREATE OBJECT O_GRID2: Binds an ALV Grid (CL_GUI_ALV_GRID) to the container.SET_TABLE_FOR_FIRST_DISPLAY:IS_LAYOUT = LS_LAYO1: Applies previously configured layout for item ALV.IT_OUTTAB = LT_LIPS: Data source for the ALV.IT_FIELDCATALOG = LT_FCAT1: Column settings for the ALV.

🔷 13. MODULE STATUS_0200 OUTPUT – Setup Header Screen (Screen 200)

Explanation:

SET PF-STATUS ‘ZHEADER’: Sets GUI status for header toolbar (buttons: CREATE, EDIT, SAVE, etc.).The SELECT pulls header records from ZDB_EDIT_ALV based on delivery numbers entered on the selection screen.

ALV Grid Initialization:

Creates the custom container and grid for header-level display.

Field Catalog (LT_FCAT):

Each field is appended individually to LT_FCAT with attributes:

 Layout for Header ALV:

 Final ALV Setup:

 

 Initializes header ALV with all settings and data.

Event Handler Registration:

 

 Double-click on any row in header ALV triggers GET_DATA, which fetches corresponding items.

🔷 14. MODULE USER_COMMAND_0200 INPUT – Header Screen Toolbar Actions

 

 Executes the relevant FORM based on user action on toolbar buttons:CREATE: Adds a new editable row.EDIT: Enables selected row for editing.SAVE: Inserts or updates data in DB.DELETE: Removes selected rows from ALV and DB.UPDATE: Commits modified data to DB.

15. FORM CHANGE_MODE – Enable Edit Mode for Selected Header Row

Purpose: Only the selected row becomes editable. All others stay read-only.LVC_T_ROID, LVC_S_STYL: Types for editable styles.CELLTAB is used for cell-level control.Gets the row(s) selected in the header ALV using LVC_ROWMARK.

  Loop over each header entry to determine which row to enable.  

Compares the current loop index with selected rows.If it’s selected, enable its editable fields.

🔹 If Selected Row → Enable ditable Fields

      IF SY-SUBRC = 0.        LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.        LS_STYLEROW-FIELDNAME = ‘VBELN’.        INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

VBELN is a primary key → disabled.Similarly disables ERNAM.

        LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.        LS_STYLEROW-FIELDNAME = ‘ERDAT’.        INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

Enables only non-primary key fields for editing: ERDAT, VSTEL, VKORG.

🔹 Assign Cell Styles to Entry

        CLEAR: LS_LIKP-CELLTAB.        INSERT LINES OF LT_STYLEROW INTO TABLE LS_LIKP-CELLTAB.        MODIFY LT_LIKP FROM LS_LIKP TRANSPORTING CELLTAB.        CLEAR: LT_STYLEROW.

Applies the style to the current line.

🔹 Else – Row not selected → Make it fully non-editable

      ELSE.        LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.        …        INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.        …        MODIFY LT_LIKP FROM LS_LIKP TRANSPORTING CELLTAB.

🔹 Toggle Grid Ready for Input

  IF O_GRID1->IS_READY_FOR_INPUT( ) EQ 0.    CALL METHOD O_GRID1->SET_READY_FOR_INPUT EXPORTING I_READY_FOR_INPUT = 1.  ELSE.    CALL METHOD O_GRID1->SET_READY_FOR_INPUT EXPORTING I_READY_FOR_INPUT = 0.  ENDIF.

Activates input mode if not already.

  O_GRID1->REFRESH_TABLE_DISPLAY( ).ENDFORM.

Refreshes the ALV to reflect the updated editable state. 

🔷 16. FORM CREATE_HEADER_DATA – Add New Editable Header Row

FORM CREATE_HEADER_DATA .  DATA: LS_NEW      TYPE T_ZDB_EDIT_ALV,        LT_STYLEROW TYPE STANDARD TABLE OF LVC_S_STYL WITH DEFAULT KEY,        LS_STYLEROW TYPE LVC_S_STYL.

Prepares a new structure and editable field style list.

🔹 Set Editable Fields

  LS_STYLEROW-FIELDNAME = ‘VBELN’.  LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.  APPEND LS_STYLEROW TO LT_STYLEROW.

All fields are enabled since it’s a new row. Even primary keys like VBELN, ERNAM.Repeats for: ERNAM, ERDAT, VSTEL, VKORG.

🔹 Assign Styles and Add New Entry

  LS_NEW-CELLTAB = LT_STYLEROW.  APPEND LS_NEW TO LT_LIKP.

Assigns the editable CELLTAB and appends the new row to the internal table.

  CALL METHOD O_GRID1->SET_READY_FOR_INPUT EXPORTING I_READY_FOR_INPUT = 1.  CALL METHOD O_GRID1->REFRESH_TABLE_DISPLAY.ENDFORM.

Turns on editable mode and refreshes ALV.

17. FORM DELETE_HEADER_DATA – Delete Selected Header Rows

FORM DELETE_HEADER_DATA .  DATA: LT_ROWS TYPE LVC_T_ROW,        LS_ROW  TYPE LVC_S_ROW,        LV_IDX  TYPE SY-TABIX.

LT_ROWS: Holds the list of selected row indexes.LS_ROW: Work area for current row index.LV_IDX: Integer used to track which row index is being processed.

🔹 Get Selected Rows

  CALL METHOD O_GRID1->GET_SELECTED_ROWS    IMPORTING ET_INDEX_ROWS = LT_ROWS.

Fetches the selected row indexes in the header ALV grid.

🔹 Loop and Delete from DB & Internal Table

  LOOP AT LT_ROWS INTO LS_ROW.    LV_IDX = LS_ROW-INDEX.     READ TABLE LT_LIKP INDEX LV_IDX INTO LS_LIKP.    IF SY-SUBRC = 0.      DELETE FROM ZDB_EDIT_ALV WHERE VBELN = LS_LIKP-VBELN.      DELETE LT_LIKP INDEX LV_IDX.    ENDIF.  ENDLOOP.

For each selected row:Reads that entry from LT_LIKP.Deletes corresponding record from DB table ZDB_EDIT_ALV.Deletes it from internal table LT_LIKP.

🔹 Refresh ALV & Commit

  CALL METHOD O_GRID1->REFRESH_TABLE_DISPLAY.  COMMIT WORK.  MESSAGE ‘Selected header(s) deleted’ TYPE ‘S’.ENDFORM.

Refreshes the ALV display.Saves DB changes using COMMIT WORK.Displays success message.

🔷 18. FORM SAVE_HEADER_DATA – Insert or Update Header Records

FORM SAVE_HEADER_DATA .

🔹 Flat Structure Definition

TYPES: BEGIN OF TY_ZDB_EDIT_ALV_FLAT,         VBELN TYPE ZDB_EDIT_ALV-VBELN,         ERNAM TYPE ZDB_EDIT_ALV-ERNAM,         ERDAT TYPE ZDB_EDIT_ALV-ERDAT,         VSTEL TYPE ZDB_EDIT_ALV-VSTEL,         VKORG TYPE ZDB_EDIT_ALV-VKORG,       END OF TY_ZDB_EDIT_ALV_FLAT. DATA: LS_DB_ALV_FLAT TYPE TY_ZDB_EDIT_ALV_FLAT.

This structure excludes CELLTAB and is used to write data into the DB. 

🔹 Ensure User Changes Are Captured

  CALL METHOD O_GRID1->CHECK_CHANGED_DATA.

Updates the internal table (LT_LIKP) with user input from the ALV grid.

🔹 Loop Through Header Table and Save to DB

   LOOP AT LT_LIKP INTO LS_LIKP.     LS_DB_ALV_FLAT-VBELN = LS_LIKP-VBELN.    LS_DB_ALV_FLAT-ERNAM = LS_LIKP-ERNAM.    LS_DB_ALV_FLAT-ERDAT = LS_LIKP-ERDAT.    LS_DB_ALV_FLAT-VSTEL = LS_LIKP-VSTEL.    LS_DB_ALV_FLAT-VKORG = LS_LIKP-VKORG.

Copies the values to a flat version to avoid CELLTAB structure issues.

🔹 Insert or Update Logic

    SELECT SINGLE VBELN      INTO @DATA(LV_VBELN)      FROM ZDB_EDIT_ALV      WHERE VBELN = @LS_DB_ALV_FLAT-VBELN        AND ERNAM = @LS_DB_ALV_FLAT-ERNAM.     IF SY-SUBRC = 0.      UPDATE ZDB_EDIT_ALV SET        ERDAT = @LS_DB_ALV_FLAT-ERDAT,        VSTEL = @LS_DB_ALV_FLAT-VSTEL,        VKORG = @LS_DB_ALV_FLAT-VKORG      WHERE VBELN = @LS_DB_ALV_FLAT-VBELN AND ERNAM = @LS_DB_ALV_FLAT-ERNAM.    ELSE.      INSERT ZDB_EDIT_ALV FROM LS_DB_ALV_FLAT.    ENDIF.   ENDLOOP.

If record exists (same VBELN & ERNAM) → UPDATE.Else → INSERT as new record.

  COMMIT WORK.  MESSAGE ‘Header data saved successfully’ TYPE ‘S’.ENDFORM.

Final commit and success message.

 

🔷 19. FORM UPDATE_HEADER_DATA – Update Header Records

FORM UPDATE_HEADER_DATA .  CALL METHOD O_GRID1->CHECK_CHANGED_DATA.

Reads current ALV data into LT_LIKP.

🔹 Loop and Upsert to DB

abapCopyEdit  LOOP AT LT_LIKP INTO LS_LIKP.     LS_DB_ALV_FLAT-VBELN = LS_LIKP-VBELN.    LS_DB_ALV_FLAT-ERNAM = LS_LIKP-ERNAM.    LS_DB_ALV_FLAT-ERDAT = LS_LIKP-ERDAT.    LS_DB_ALV_FLAT-VSTEL = LS_LIKP-VSTEL.    LS_DB_ALV_FLAT-VKORG = LS_LIKP-VKORG.

Maps data into a flat structure.

abapCopyEdit    SELECT SINGLE VBELN INTO @DATA(LV_VBELN)      FROM ZDB_EDIT_ALV      WHERE VBELN = @LS_DB_ALV_FLAT-VBELN AND ERNAM = @LS_DB_ALV_FLAT-ERNAM.     IF SY-SUBRC = 0.      UPDATE ZDB_EDIT_ALV SET        ERDAT = @LS_DB_ALV_FLAT-ERDAT,        VSTEL = @LS_DB_ALV_FLAT-VSTEL,        VKORG = @LS_DB_ALV_FLAT-VKORG      WHERE VBELN = @LS_DB_ALV_FLAT-VBELN AND ERNAM = @LS_DB_ALV_FLAT-ERNAM.    ELSE.      INSERT ZDB_EDIT_ALV FROM LS_DB_ALV_FLAT.    ENDIF.   ENDLOOP.

Same insert/update logic as SAVE

  COMMIT WORK.  MESSAGE ‘Header data Updated successfully’ TYPE ‘S’.ENDFORM.

✅ That completes the full documentation of header-level editable ALV with CRUD.

Next, I’ll begin the item-level ALV explanation starting with:

FORM CHANGE_ITEMS_MODEFORM CREATE_ITEMS_DATAFORM DELETE_ITEMS_DATAFORM SAVE_ITEMS_DATAFORM UPDATE_ITEMS_DATA

🔷 20. FORM CHANGE_ITEMS_MODE – Make Only Selected Item Row Editable

FORM CHANGE_ITEMS_MODE .  DATA: LT_INDEX_ROWS TYPE LVC_T_ROW,        LT_ROW_NO     TYPE LVC_T_ROID,        LS_ROW_NO     TYPE LVC_S_ROID,        LS_STYLEROW   TYPE LVC_S_STYL,        LT_STYLEROW   TYPE TABLE OF LVC_S_STYL.

Similar to header edit logic.Used to control which single row in the item ALV becomes editable.

  CALL METHOD O_GRID2->GET_SELECTED_ROWS    IMPORTING ET_ROW_NO = LT_ROW_NO.

Retrieves the selected item rows using LVC_ROWMARK.

🔹 Loop Over All Rows and Toggle Editable Mode

  IF NOT LT_ROW_NO IS INITIAL.    LOOP AT LT_LIPS INTO LS_LIPS.       READ TABLE LT_ROW_NO INTO LS_ROW_NO WITH KEY ROW_ID = SY-TABIX.

For each item row in LT_LIPS, check if it’s selected.

🔹 If Selected: Enable Editable Fields

      IF SY-SUBRC = 0.        LS_STYLEROW-STYLE     = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.        LS_STYLEROW-FIELDNAME = ‘VBELN’.        INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.         LS_STYLEROW-FIELDNAME = ‘POSNR’.        INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.         LS_STYLEROW-STYLE     = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.        LS_STYLEROW-FIELDNAME = ‘MATNR’.        INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.         LS_STYLEROW-FIELDNAME = ‘WERKS’.        INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

VBELN and POSNR are primary keys → disabled.Only MATNR, WERKS are editable.

        CLEAR: LS_LIPS-CELLTAB.        INSERT LINES OF LT_STYLEROW INTO TABLE LS_LIPS-CELLTAB.        MODIFY LT_LIPS FROM LS_LIPS TRANSPORTING CELLTAB.        CLEAR: LT_STYLEROW.

Applies the cell-style configuration to the current row.

🔹 Else: Disable All Fields for Non-Selected Rows

      ELSE.        LOOP AT FIELDS: ‘VBELN’, ‘POSNR’, ‘MATNR’, ‘WERKS’.          LS_STYLEROW-FIELDNAME = FIELD.          LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.          INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.        ENDLOOP.         CLEAR: LS_LIPS-CELLTAB.        INSERT LINES OF LT_STYLEROW INTO TABLE LS_LIPS-CELLTAB.        MODIFY LT_LIPS FROM LS_LIPS TRANSPORTING CELLTAB.        CLEAR: LT_STYLEROW.

🔹 Toggle Edit Mode and Refresh ALV

  IF O_GRID2->IS_READY_FOR_INPUT( ) EQ 0.    CALL METHOD O_GRID2->SET_READY_FOR_INPUT EXPORTING I_READY_FOR_INPUT = 1.  ELSE.    CALL METHOD O_GRID2->SET_READY_FOR_INPUT EXPORTING I_READY_FOR_INPUT = 0.  ENDIF.   O_GRID2->REFRESH_TABLE_DISPLAY( ).ENDFORM.

🔷 21. FORM CREATE_ITEMS_DATA – Add New Editable Row in Item ALV

FORM CREATE_ITEMS_DATA .  DATA: LS_NEW      TYPE T_ZDB_EDIT_ALV1,        LT_STYLEROW TYPE STANDARD TABLE OF LVC_S_STYL WITH DEFAULT KEY,        LS_STYLEROW TYPE LVC_S_STYL.   CLEAR: LS_NEW, LT_STYLEROW.

Creates a blank work area and editable style table.

🔹 Enable All Fields (for Create)

  LS_STYLEROW-FIELDNAME = ‘VBELN’.  LS_STYLEROW-STYLE     = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.  APPEND LS_STYLEROW TO LT_STYLEROW.   … (Repeat for POSNR, MATNR, WERKS)

All fields are enabled so user can create new record from scratch.

  LS_NEW-CELLTAB = LT_STYLEROW.  APPEND LS_NEW TO LT_LIPS.   CALL METHOD O_GRID2->SET_READY_FOR_INPUT EXPORTING I_READY_FOR_INPUT = 1.  CALL METHOD O_GRID2->REFRESH_TABLE_DISPLAY.ENDFORM.

Appends the new row to ALV and switches to input mode.

🔷 22. FORM DELETE_ITEMS_DATA – Delete Selected Item Rows

FORM DELETE_ITEMS_DATA .  DATA: LT_ROWS TYPE LVC_T_ROW,        LS_ROW  TYPE LVC_S_ROW,        LV_IDX  TYPE SY-TABIX.   CALL METHOD O_GRID2->GET_SELECTED_ROWS IMPORTING ET_INDEX_ROWS = LT_ROWS.

Gets the selected item row indexes from ALV.

  LOOP AT LT_ROWS INTO LS_ROW.    LV_IDX = LS_ROW-INDEX.    READ TABLE LT_LIPS INDEX LV_IDX INTO LS_LIPS.    IF SY-SUBRC = 0.      DELETE FROM ZDB_EDIT_ALV1 WHERE VBELN = LS_LIPS-VBELN.      DELETE LT_LIPS INDEX LV_IDX.    ENDIF.  ENDLOOP.   CALL METHOD O_GRID2->REFRESH_TABLE_DISPLAY.  COMMIT WORK.  MESSAGE ‘Selected header(s) deleted’ TYPE ‘S’.ENDFORM.

Deletes item records from both DB and internal table.

🔷 23. FORM SAVE_ITEMS_DATA – Insert or Update Item Rows

FORM SAVE_ITEMS_DATA .  DATA: LS_DB_ALV1  TYPE TY_ZDB_EDIT_ALV1_FLAT,        LS_DB_FULL TYPE ZDB_EDIT_ALV1,        LV_VBELN   TYPE ZDB_EDIT_ALV1-VBELN.   CALL METHOD O_GRID2->CHECK_CHANGED_DATA.

Converts ALV changes to internal table.Flat structure is used to exclude CELLTAB.

🔹 Loop Through Item Table

  LOOP AT LT_LIPS INTO LS_LIPS.    LS_DB_ALV1-VBELN = LS_LIPS-VBELN.    LS_DB_ALV1-POSNR = LS_LIPS-POSNR.    LS_DB_ALV1-MATNR = LS_LIPS-MATNR.    LS_DB_ALV1-WERKS = LS_LIPS-WERKS.

Transfer values from ALV row to flat structure.

🔹 DB Insert/Update Logic

    SELECT SINGLE VBELN INTO @LV_VBELN      FROM ZDB_EDIT_ALV1      WHERE VBELN = @LS_DB_ALV1-VBELN AND POSNR = @LS_DB_ALV1-POSNR.     IF SY-SUBRC = 0.      UPDATE ZDB_EDIT_ALV1 SET        MATNR = @LS_DB_ALV1-MATNR,        WERKS = @LS_DB_ALV1-WERKS        WHERE VBELN = @LS_DB_ALV1-VBELN AND POSNR = @LS_DB_ALV1-POSNR.    ELSE.      CLEAR LS_DB_FULL.      MOVE-CORRESPONDING LS_DB_ALV1 TO LS_DB_FULL.      INSERT ZDB_EDIT_ALV1 FROM LS_DB_FULL.    ENDIF.  ENDLOOP.   COMMIT WORK.  MESSAGE ‘Item data saved successfully’ TYPE ‘S’.ENDFORM.

🔷 24. FORM UPDATE_ITEMS_DATA – Update Existing Item Records

FORM UPDATE_ITEMS_DATA .  DATA: LS_DB_ALV1  TYPE TY_ZDB_EDIT_ALV1_FLAT,        LS_DB_FULL TYPE ZDB_EDIT_ALV1,        LV_VBELN   TYPE ZDB_EDIT_ALV1-VBELN.   CALL METHOD O_GRID2->CHECK_CHANGED_DATA.

Same structure and update logic as SAVE.

  LOOP AT LT_LIPS INTO LS_LIPS.    LS_DB_ALV1-VBELN = LS_LIPS-VBELN.    LS_DB_ALV1-POSNR = LS_LIPS-POSNR.    LS_DB_ALV1-MATNR = LS_LIPS-MATNR.    LS_DB_ALV1-WERKS = LS_LIPS-WERKS.     SELECT SINGLE VBELN INTO @DATA(S_VBELN)      FROM ZDB_EDIT_ALV1      WHERE VBELN = @LS_DB_ALV1-VBELN AND POSNR = @LS_DB_ALV1-POSNR.     IF SY-SUBRC = 0.      UPDATE ZDB_EDIT_ALV1 SET        MATNR = @LS_DB_ALV1-MATNR,        WERKS = @LS_DB_ALV1-WERKS        WHERE VBELN = @LS_DB_ALV1-VBELN AND POSNR = @LS_DB_ALV1-POSNR.    ELSE.      CLEAR LS_DB_FULL.      MOVE-CORRESPONDING LS_DB_ALV1 TO LS_DB_FULL.      INSERT ZDB_EDIT_ALV1 FROM LS_DB_FULL.    ENDIF.  ENDLOOP.   COMMIT WORK.  MESSAGE ‘Item data Updated successfully’ TYPE ‘S’.ENDFORM.Output:

 

 Header Output

 When I was click on edit button

When I was click on create button

When I was create a new row delete button

When I was click on create buttom multiple append rows also created in both header and item also

If I was save on empty row Its shows as

If was double click on empty on no items was displayed and Header empty row it will not created on items details

 

Same actions performs in CURD operations in item level also:

Program :

REPORT ZEDITABLE_ALV_INT.

************************************************************************
* Program Name :
* Description : Editable ALV using CL_GUI_ALV_GRID with row-based edit
* control using LVC_ROWMARK. Only selected row becomes
* editable, primary keys remain non-editable and to perfrom a crud operations.
* Created by : <NRAJU>
*************************************************************************
*———————————————————————*
* Table Declarations
*———————————————————————*
TABLES:ZDB_EDIT_ALV,ZDB_EDIT_ALV1.
CLASS DELIVERY DEFINITION DEFERRED.
*———————————————————————*
* Type Declarations
*———————————————————————*
TYPES: BEGIN OF T_ZDB_EDIT_ALV,
VBELN TYPE ZDB_EDIT_ALV-VBELN, “Delivery Number
ERNAM TYPE ZDB_EDIT_ALV-ERNAM, “Name of Person who Created the Object
ERDAT TYPE ZDB_EDIT_ALV-ERDAT, “Date on Which Record Was Created
VSTEL TYPE ZDB_EDIT_ALV-VSTEL, “Shipping Point/Receiving Point
VKORG TYPE ZDB_EDIT_ALV-VKORG, “Sales Organization
CELLTAB TYPE LVC_T_STYL, “Editable style table
END OF T_ZDB_EDIT_ALV.
TYPES: BEGIN OF T_ZDB_EDIT_ALV1,
VBELN TYPE ZDB_EDIT_ALV1-VBELN, “Delivery Number
POSNR TYPE ZDB_EDIT_ALV1-POSNR, “Sales Document Item
ERNAM TYPE ZDB_EDIT_ALV1-ERNAM,
MATNR TYPE ZDB_EDIT_ALV1-MATNR, “Material Number
WERKS TYPE ZDB_EDIT_ALV1-WERKS, “Plant
CELLTAB TYPE LVC_T_STYL, “Editable style table
END OF T_ZDB_EDIT_ALV1.
DATA:LT_LIKP TYPE TABLE OF T_ZDB_EDIT_ALV, “Internal table for header
LS_LIKP TYPE T_ZDB_EDIT_ALV, “workarea for header
LT_LIPS TYPE TABLE OF T_ZDB_EDIT_ALV1, “Internal table for Item
LS_LIPS TYPE T_ZDB_EDIT_ALV1, “Workarea for item
LT_FCAT TYPE LVC_T_FCAT, “Filedcat
LS_FCAT TYPE LVC_S_FCAT,
LT_FCAT1 TYPE LVC_T_FCAT, “filedcatlog
LS_FCAT1 TYPE LVC_S_FCAT,
LS_LAYO TYPE LVC_S_LAYO, “Layout
LS_LAYO1 TYPE LVC_S_LAYO,
O_CONTAINER1 TYPE REF TO CL_GUI_CUSTOM_CONTAINER, “Container for Header
O_GRID1 TYPE REF TO CL_GUI_ALV_GRID, “Grid for Header
O_CONTAINER2 TYPE REF TO CL_GUI_CUSTOM_CONTAINER, “Container for item
O_GRID2 TYPE REF TO CL_GUI_ALV_GRID. “Grid for It
*———————————————————————*
* Selection Screen
*———————————————————————*
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-000.
SELECT-OPTIONS:S_VBELN FOR ZDB_EDIT_ALV-VBELN.
SELECTION-SCREEN END OF BLOCK B1.
*************fieldcatalog creation creation for item
LT_FCAT1 = VALUE #(
( COL_POS = 1 FIELDNAME = ‘VBELN’ COLTEXT = ‘Delivery Number’ )
( COL_POS = 2 FIELDNAME = ‘POSNR’ COLTEXT = ‘Item Number’ )
( COL_POS = 3 FIELDNAME = ‘ERNAM’ COLTEXT = ‘NAME’ )
( COL_POS = 4 FIELDNAME = ‘MATNR’ COLTEXT = ‘Material Number’ )
( COL_POS = 5 FIELDNAME = ‘WERKS’ COLTEXT = ‘Plant’ )
).

*************Layout creation for item
LS_LAYO1-GRID_TITLE = ‘Custom Table for Items’.
LS_LAYO1-SEL_MODE = ‘A’.
LS_LAYO1-NO_TOOLBAR = ‘X’.
LS_LAYO1-STYLEFNAME = ‘CELLTAB’.

“*************fieldcatalog creation creation
LS_FCAT-ROW_POS = 1.
LS_FCAT-COL_POS = 1.
LS_FCAT-FIELDNAME = ‘VBELN’.
LS_FCAT-COLTEXT = ‘Delivery Number’.
LS_FCAT-OUTPUTLEN = 20.
APPEND LS_FCAT TO LT_FCAT.
CLEAR LS_FCAT.

LS_FCAT-ROW_POS = 1.
LS_FCAT-COL_POS = 1.
LS_FCAT-FIELDNAME = ‘ERNAM’.
LS_FCAT-COLTEXT = ‘Name’.
LS_FCAT-OUTPUTLEN = 20.
APPEND LS_FCAT TO LT_FCAT.
CLEAR LS_FCAT.

LS_FCAT-ROW_POS = 1.
LS_FCAT-COL_POS = 1.
LS_FCAT-FIELDNAME = ‘ERDAT’.
LS_FCAT-COLTEXT = ‘Date’.
LS_FCAT-OUTPUTLEN = 20.
APPEND LS_FCAT TO LT_FCAT.
CLEAR LS_FCAT.

LS_FCAT-ROW_POS = 1.
LS_FCAT-COL_POS = 1.
LS_FCAT-FIELDNAME = ‘VSTEL’.
LS_FCAT-COLTEXT = ‘SALES’.
LS_FCAT-OUTPUTLEN = 20.
APPEND LS_FCAT TO LT_FCAT.
CLEAR LS_FCAT.
LS_FCAT-ROW_POS = 1.
LS_FCAT-COL_POS = 1.
LS_FCAT-FIELDNAME = ‘VKORG’.
LS_FCAT-COLTEXT = ‘Delivery Number’.
LS_FCAT-OUTPUTLEN = 20.
APPEND LS_FCAT TO LT_FCAT.
CLEAR LS_FCAT.

***********layout of fieldcat
LS_LAYO-GRID_TITLE = ‘Custom Table for Header’.
LS_LAYO-SEL_MODE = ‘A’.
LS_LAYO-NO_TOOLBAR = ‘X’.
LS_LAYO-STYLEFNAME = ‘CELLTAB’.

START-OF-SELECTION. “start-of-selection
CALL SCREEN 200. “Screen for Header
CLASS Delivery DEFINITION.
PUBLIC SECTION.
METHODS: GET_DATA FOR EVENT DOUBLE_CLICK OF CL_GUI_ALV_GRID
IMPORTING E_ROW.
ENDCLASS.
*&———————————————————————*
*& Class (Implementation) Delivery
*&———————————————————————*
* Text
*———————————————————————-*
CLASS DELIVERY IMPLEMENTATION.
METHOD: GET_DATA.
READ TABLE LT_LIKP INTO LS_LIKP INDEX E_ROW-INDEX.
SELECT VBELN
POSNR
ERNAM
MATNR
WERKS
FROM ZDB_EDIT_ALV1
INTO CORRESPONDING FIELDS OF TABLE LT_LIPS
WHERE VBELN = LS_LIKP-VBELN and ernam = ls_likp-ernam.

** Check if items exist
* IF lt_lips IS INITIAL.
* MESSAGE ‘No items exist for this header.’ TYPE ‘I’.
* RETURN.
* ENDIF.
CALL SCREEN 100.
* ” Refresh ALV to reflect changes
* CALL METHOD O_GRID1->REFRESH_TABLE_DISPLAY.
ENDMETHOD.
ENDCLASS. “Delivery
*&———————————————————————*
*& Module STATUS_0100 OUTPUT
*&———————————————————————*
* text
*———————————————————————-*
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS ‘ZITEMS’. “Creating buttons for items
PERFORM CREATE_OBJECT_LIPS. “perform for create item
ENDMODULE.
*&———————————————————————*
*& Module USER_COMMAND_0100 INPUT
*&———————————————————————*
* text
*———————————————————————-*
MODULE USER_COMMAND_0100 INPUT.
CASE SY-UCOMM.
WHEN ‘BACK’.
LEAVE TO SCREEN 200.
WHEN ‘CREATE’. “Createing new record for items
PERFORM CREATE_ITEMS_DATA.
WHEN ‘EDIT’. “Editable alv for items
PERFORM CHANGE_ITEMS_MODE.
WHEN ‘UPDATE’. “Updateing the records for items
PERFORM UPDATE_ITEMS_DATA.
WHEN ‘DELETE’. “Deleting the records for item tables
PERFORM DELETE_ITEMS_DATA.
WHEN ‘SAVE’. “Saveing the recording from db table in item records
PERFORM SAVE_ITEMS_DATA.
ENDCASE.
ENDMODULE.
*&———————————————————————*
*& Form CREATE_OBJECT_LIPS
FORM CREATE_OBJECT_LIPS .
CLEAR O_CONTAINER2.
IF O_CONTAINER2 IS INITIAL AND O_GRID2 IS INITIAL.
CREATE OBJECT O_CONTAINER2
EXPORTING
CONTAINER_NAME = ‘CONTAINER2’
EXCEPTIONS
CNTL_ERROR = 1
CNTL_SYSTEM_ERROR = 2
CREATE_ERROR = 3
LIFETIME_ERROR = 4
LIFETIME_DYNPRO_DYNPRO_LINK = 5
OTHERS = 6
.
CREATE OBJECT O_GRID2
EXPORTING
I_PARENT = O_CONTAINER2
EXCEPTIONS
ERROR_CNTL_CREATE = 1
ERROR_CNTL_INIT = 2
ERROR_CNTL_LINK = 3
ERROR_DP_CREATE = 4
OTHERS = 5
.
ENDIF.
CALL METHOD O_GRID2->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
IS_LAYOUT = LS_LAYO1
CHANGING
IT_OUTTAB = LT_LIPS
IT_FIELDCATALOG = LT_FCAT1
EXCEPTIONS
INVALID_PARAMETER_COMBINATION = 1
PROGRAM_ERROR = 2
TOO_MANY_LINES = 3
OTHERS = 4
.
call method O_GRID2->REFRESH_TABLE_DISPLAY( ).
ENDFORM.
*&———————————————————————*
*& Module STATUS_0200 OUTPUT
*&———————————————————————*
MODULE STATUS_0200 OUTPUT.
SET PF-STATUS ‘ZHEADER’.
” Only load header data from DB once
IF lt_likp IS INITIAL.
SELECT vbeln
ernam
erdat
vstel
vkorg
FROM zdb_edit_alv
INTO CORRESPONDING FIELDS OF TABLE lt_likp
WHERE vbeln IN s_vbeln.
ENDIF.
” Only create container and grid once
IF o_container1 IS INITIAL AND o_grid1 IS INITIAL.
” Create custom container
CREATE OBJECT o_container1
EXPORTING
container_name = ‘CONTAINER1’.
” Create ALV grid object
CREATE OBJECT o_grid1
EXPORTING
i_parent = o_container1.
” Set up field catalog and layout if needed (assuming lt_fcat and ls_layo are ready)
CALL METHOD o_grid1->set_table_for_first_display
EXPORTING
i_structure_name = ‘ZDB_EDIT_ALV’
is_layout = ls_layo
CHANGING
it_outtab = lt_likp
it_fieldcatalog = lt_fcat
EXCEPTIONS
invalid_parameter_combination = 1
program_error = 2
too_many_lines = 3
OTHERS = 4.
” Set event handler for item-level data retrieval
DATA(o_delivery) = NEW delivery( ).
SET HANDLER o_delivery->get_data FOR o_grid1.
ENDIF.
ENDMODULE.
*&———————————————————————*
*& Module USER_COMMAND_0200 INPUT
MODULE USER_COMMAND_0200 INPUT.
CASE SY-UCOMM.
WHEN ‘BACK’.
LEAVE PROGRAM. “Back to the program
WHEN ‘CREATE’. “Creating new record for header data
PERFORM CREATE_HEADER_DATA.
WHEN ‘EDIT’. “Editable alv for header data
PERFORM CHANGE_MODE.
WHEN ‘UPDATE’. “Updateing the record for header data
PERFORM UPDATE_HEADER_DATA.
WHEN ‘DELETE’. “deleteing for a record for header data
PERFORM DELETE_HEADER_DATA.
WHEN ‘SAVE’. “saveing the db table for header data
PERFORM SAVE_HEADER_DATA.
ENDCASE.
ENDMODULE.
*&———————————————————————*
*& Form CHANGE_MODE
*&———————————————————————*
FORM CHANGE_MODE .
DATA : LT_INDEX_ROWS TYPE LVC_T_ROW,
LT_ROW_NO TYPE LVC_T_ROID,
LS_ROW_NO TYPE LVC_S_ROID,
LS_STYLEROW TYPE LVC_S_STYL,
LT_STYLEROW TYPE TABLE OF LVC_S_STYL.
CALL METHOD O_GRID1->GET_SELECTED_ROWS
IMPORTING
* et_index_rows = lt_index_rows
ET_ROW_NO = LT_ROW_NO.
IF NOT LT_ROW_NO IS INITIAL.
LOOP AT LT_LIKP INTO LS_LIKP.
READ TABLE LT_ROW_NO INTO LS_ROW_NO WITH KEY ROW_ID = SY-TABIX.
IF SY-SUBRC = 0.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
LS_STYLEROW-FIELDNAME = ‘VBELN’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
LS_STYLEROW-FIELDNAME = ‘ERNAM’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
LS_STYLEROW-FIELDNAME = ‘ERDAT’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
LS_STYLEROW-FIELDNAME = ‘VSTEL’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
LS_STYLEROW-FIELDNAME = ‘VKORG’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

CLEAR: LS_LIKP-CELLTAB.
INSERT LINES OF LT_STYLEROW INTO TABLE LS_LIKP-CELLTAB.
MODIFY LT_LIKP FROM LS_LIKP TRANSPORTING CELLTAB.
CLEAR: LT_STYLEROW.
ELSE.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
LS_STYLEROW-FIELDNAME = ‘VBELN’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
LS_STYLEROW-FIELDNAME = ‘ERNAM’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
LS_STYLEROW-FIELDNAME = ‘ERDAT’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
LS_STYLEROW-FIELDNAME = ‘VSTEL’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
LS_STYLEROW-FIELDNAME = ‘VKORG’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

CLEAR: LS_LIKP-CELLTAB.
INSERT LINES OF LT_STYLEROW INTO TABLE LS_LIKP-CELLTAB.
MODIFY LT_LIKP FROM LS_LIKP TRANSPORTING CELLTAB.
CLEAR: LT_STYLEROW.
ENDIF.
ENDLOOP.
ENDIF.

CLEAR LT_ROW_NO.
CLEAR LS_ROW_NO.

IF O_GRID1->IS_READY_FOR_INPUT( ) EQ 0.
CALL METHOD O_GRID1->SET_READY_FOR_INPUT
EXPORTING
I_READY_FOR_INPUT = 1.

ELSE.
CALL METHOD O_GRID1->SET_READY_FOR_INPUT
EXPORTING
I_READY_FOR_INPUT = 0.
ENDIF.
CALL METHOD O_GRID1->REFRESH_TABLE_DISPLAY( ).

ENDFORM.
*&———————————————————————*
*& Form CREATE_HEADER_DATA
*&———————————————————————*
FORM CREATE_HEADER_DATA .
DATA: LS_NEW TYPE T_ZDB_EDIT_ALV,
LT_STYLEROW TYPE STANDARD TABLE OF LVC_S_STYL WITH DEFAULT KEY,
LS_STYLEROW TYPE LVC_S_STYL.

CLEAR: LS_NEW, LT_STYLEROW.

” Define editable fields

LS_STYLEROW-FIELDNAME = ‘VBELN’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

LS_STYLEROW-FIELDNAME = ‘ERNAM’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

LS_STYLEROW-FIELDNAME = ‘ERDAT’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

LS_STYLEROW-FIELDNAME = ‘VSTEL’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

LS_STYLEROW-FIELDNAME = ‘VKORG’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

” Assign celltab to new row
LS_NEW-CELLTAB = LT_STYLEROW.

” Insert new row at the beginning
APPEND LS_NEW TO LT_LIKP.

” Set grid to editable mode
CALL METHOD O_GRID1->SET_READY_FOR_INPUT
EXPORTING
I_READY_FOR_INPUT = 1.

” Refresh ALV to reflect changes
CALL METHOD O_GRID1->REFRESH_TABLE_DISPLAY.

ENDFORM.
*&———————————————————————*
*& Form DELETE_HEADER_DATA
*&———————————————————————
FORM DELETE_HEADER_DATA .
DATA: LT_ROWS TYPE LVC_T_ROW,
LS_ROW TYPE LVC_S_ROW,
LV_IDX TYPE SY-TABIX.
CALL METHOD O_GRID1->GET_SELECTED_ROWS
IMPORTING ET_INDEX_ROWS = LT_ROWS.
LOOP AT LT_ROWS INTO LS_ROW.
LV_IDX = LS_ROW-INDEX.
READ TABLE LT_LIKP INDEX LV_IDX INTO LS_LIKP.
IF SY-SUBRC = 0.
DELETE FROM ZDB_EDIT_ALV WHERE VBELN = LS_LIKP-VBELN and ERNAM = LS_LIKP-ERNAM.
DELETE LT_LIKP INDEX LV_IDX.
ENDIF.
ENDLOOP.
CALL METHOD O_GRID1->REFRESH_TABLE_DISPLAY.
COMMIT WORK.
MESSAGE ‘Selected header(s) deleted’ TYPE ‘S’.

ENDFORM.
*&———————————————————————*
*& Form SAVE_HEADER_DATA
*&———————————————————————*
TYPES: BEGIN OF TY_ZDB_EDIT_ALV_FLAT,
VBELN TYPE ZDB_EDIT_ALV-VBELN,
ERNAM TYPE ZDB_EDIT_ALV-ERNAM,
ERDAT TYPE ZDB_EDIT_ALV-ERDAT,
VSTEL TYPE ZDB_EDIT_ALV-VSTEL,
VKORG TYPE ZDB_EDIT_ALV-VKORG,
END OF TY_ZDB_EDIT_ALV_FLAT.

DATA: LS_DB_ALV_FLAT TYPE TY_ZDB_EDIT_ALV_FLAT.

FORM SAVE_HEADER_DATA .

DATA: LS_DB_ALV_FLAT TYPE TY_ZDB_EDIT_ALV_FLAT,
LV_VBELN TYPE ZDB_EDIT_ALV-VBELN,
LV_SKIPPED TYPE I VALUE 0,
LT_LIKP_CLEAN TYPE TABLE OF T_ZDB_EDIT_ALV,
LS_LIKP_CLEAN TYPE T_ZDB_EDIT_ALV,
LV_SAVED_ROWS TYPE I VALUE 0.

” Capture ALV changes
CALL METHOD O_GRID1->CHECK_CHANGED_DATA.

LOOP AT LT_LIKP INTO LS_LIKP.

” Skip empty header rows
IF LS_LIKP-VBELN IS INITIAL
AND LS_LIKP-ERNAM IS INITIAL
AND LS_LIKP-ERDAT IS INITIAL
AND LS_LIKP-VSTEL IS INITIAL
AND LS_LIKP-VKORG IS INITIAL.

LV_SKIPPED = LV_SKIPPED + 1.
CONTINUE.
ENDIF.

” Keep non-empty row for redisplay
LS_LIKP_CLEAN = LS_LIKP.
APPEND LS_LIKP_CLEAN TO LT_LIKP_CLEAN.

” Prepare structure for DB insert/update
CLEAR LS_DB_ALV_FLAT.
MOVE-CORRESPONDING LS_LIKP TO LS_DB_ALV_FLAT.

” Check if record exists
SELECT SINGLE VBELN
INTO @LV_VBELN
FROM ZDB_EDIT_ALV
WHERE VBELN = @LS_DB_ALV_FLAT-VBELN.

IF SY-SUBRC = 0.
” Record exists -> UPDATE
UPDATE ZDB_EDIT_ALV SET
ERNAM = @LS_DB_ALV_FLAT-ERNAM,
ERDAT = @LS_DB_ALV_FLAT-ERDAT,
VSTEL = @LS_DB_ALV_FLAT-VSTEL,
VKORG = @LS_DB_ALV_FLAT-VKORG
WHERE VBELN = @LS_DB_ALV_FLAT-VBELN.
ELSE.
” Record does not exist -> INSERT
INSERT ZDB_EDIT_ALV FROM LS_DB_ALV_FLAT.
ENDIF.

LV_SAVED_ROWS = LV_SAVED_ROWS + 1.

ENDLOOP.
” Replace the old internal table with the cleaned one (remove empty rows)
LT_LIKP = LT_LIKP_CLEAN.
COMMIT WORK.
*ENDIF.
” Message after save
IF LV_SKIPPED > 0.
MESSAGE |{ LV_SKIPPED } empty header record(s) were not saved and removed.| TYPE ‘I’.
ELSEIF LV_SAVED_ROWS < 0.
MESSAGE | { LV_SAVED_ROWS } without editing or creating anything were data not saved.| TYPE ‘I’.
ELSE.
MESSAGE ‘Header data saved successfully’ TYPE ‘S’.
ENDIF.
” Lock the grid after save
PERFORM DISABLE_ALL_CELLS_IN_HEADER.

CALL METHOD O_GRID1->SET_READY_FOR_INPUT
EXPORTING I_READY_FOR_INPUT = 0.

CALL METHOD O_GRID1->REFRESH_TABLE_DISPLAY.
ENDFORM.
*&———————————————————————*
*& Form UPDATE_HEADER_DATA
*&———————————————————————*
FORM UPDATE_HEADER_DATA .
CALL METHOD O_GRID1->CHECK_CHANGED_DATA.
LOOP AT LT_LIKP INTO LS_LIKP.
” Map to flat structure (exclude CELLTAB)
LS_DB_ALV_FLAT-VBELN = LS_LIKP-VBELN.
LS_DB_ALV_FLAT-ERNAM = LS_LIKP-ERNAM.
LS_DB_ALV_FLAT-ERDAT = LS_LIKP-ERDAT.
LS_DB_ALV_FLAT-VSTEL = LS_LIKP-VSTEL.
LS_DB_ALV_FLAT-VKORG = LS_LIKP-VKORG.
” Check if record exists
SELECT SINGLE VBELN
INTO @DATA(LV_VBELN)
FROM ZDB_EDIT_ALV
WHERE VBELN = @LS_DB_ALV_FLAT-VBELN
AND ERNAM = @LS_DB_ALV_FLAT-ERNAM.
IF SY-SUBRC = 0.
” Record exists -> UPDATE
UPDATE ZDB_EDIT_ALV SET
ERDAT = @LS_DB_ALV_FLAT-ERDAT,
VSTEL = @LS_DB_ALV_FLAT-VSTEL,
VKORG = @LS_DB_ALV_FLAT-VKORG
WHERE VBELN = @LS_DB_ALV_FLAT-VBELN AND ERNAM = @LS_DB_ALV_FLAT-ERNAM.
ELSE.
” Record does not exist -> INSERT
INSERT ZDB_EDIT_ALV FROM LS_DB_ALV_FLAT.
ENDIF.
ENDLOOP.
COMMIT WORK.
MESSAGE ‘Header data Updated successfully’ TYPE ‘S’.

” Make all fields non-editable after save
PERFORM DISABLE_ALL_CELLS_IN_HEADER.

” Set ALV to non-edit mode
CALL METHOD O_GRID1->SET_READY_FOR_INPUT
EXPORTING I_READY_FOR_INPUT = 0.

” Refresh ALV display
CALL METHOD O_GRID1->REFRESH_TABLE_DISPLAY.

ENDFORM.
*&———————————————————————*
*& Form CHANGE_ITEMS_MODE
*&———————————————————————*
FORM CHANGE_ITEMS_MODE .
DATA : LT_INDEX_ROWS TYPE LVC_T_ROW,
LT_ROW_NO TYPE LVC_T_ROID,
LS_ROW_NO TYPE LVC_S_ROID,
LS_STYLEROW TYPE LVC_S_STYL,
LT_STYLEROW TYPE TABLE OF LVC_S_STYL.

CALL METHOD O_GRID2->GET_SELECTED_ROWS
IMPORTING
* et_index_rows = lt_index_rows
ET_ROW_NO = LT_ROW_NO.

IF NOT LT_ROW_NO IS INITIAL.

LOOP AT LT_LIPS INTO LS_LIPS.

READ TABLE LT_ROW_NO INTO LS_ROW_NO WITH KEY ROW_ID = SY-TABIX.
IF SY-SUBRC = 0.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
LS_STYLEROW-FIELDNAME = ‘VBELN’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
LS_STYLEROW-FIELDNAME = ‘POSNR’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
LS_STYLEROW-FIELDNAME = ‘ERNAM’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
LS_STYLEROW-FIELDNAME = ‘MATNR’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
LS_STYLEROW-FIELDNAME = ‘WERKS’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

CLEAR: LS_LIPS-CELLTAB.
INSERT LINES OF LT_STYLEROW INTO TABLE LS_LIPS-CELLTAB.
MODIFY LT_LIPS FROM LS_LIPS TRANSPORTING CELLTAB.
CLEAR: LT_STYLEROW.
ELSE.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
LS_STYLEROW-FIELDNAME = ‘VBELN’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
LS_STYLEROW-FIELDNAME = ‘POSNR’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
LS_STYLEROW-FIELDNAME = ‘ERNAM’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
LS_STYLEROW-FIELDNAME = ‘MATNR’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
LS_STYLEROW-FIELDNAME = ‘WERKS’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

CLEAR: LS_LIPS-CELLTAB.
INSERT LINES OF LT_STYLEROW INTO TABLE LS_LIPS-CELLTAB.
MODIFY LT_LIPS FROM LS_LIPS TRANSPORTING CELLTAB.
CLEAR: LT_STYLEROW.
ENDIF.
ENDLOOP.

ENDIF.

CLEAR LT_ROW_NO.
CLEAR LS_ROW_NO.

IF O_GRID2->IS_READY_FOR_INPUT( ) EQ 0.
CALL METHOD O_GRID2->SET_READY_FOR_INPUT
EXPORTING
I_READY_FOR_INPUT = 1.

ELSE.
CALL METHOD O_GRID2->SET_READY_FOR_INPUT
EXPORTING
I_READY_FOR_INPUT = 0.
ENDIF.
O_GRID2->REFRESH_TABLE_DISPLAY( ).

ENDFORM.
*&———————————————————————*
*& Form CREATE_ITEMS_DATA
*&———————————————————————
FORM CREATE_ITEMS_DATA .
DATA: LS_NEW TYPE T_ZDB_EDIT_ALV1,
LT_STYLEROW TYPE STANDARD TABLE OF LVC_S_STYL WITH DEFAULT KEY,
LS_STYLEROW TYPE LVC_S_STYL.

CLEAR: LS_NEW, LT_STYLEROW.

” Define editable fields

LS_STYLEROW-FIELDNAME = ‘VBELN’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

LS_STYLEROW-FIELDNAME = ‘POSNR’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

LS_STYLEROW-FIELDNAME = ‘ERNAM’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

LS_STYLEROW-FIELDNAME = ‘MATNR’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

LS_STYLEROW-FIELDNAME = ‘WERKS’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

” Assign celltab to new row
LS_NEW-CELLTAB = LT_STYLEROW.

” Insert new row at the beginning
APPEND LS_NEW TO LT_LIPS.

” Set grid to editable mode
CALL METHOD O_GRID2->SET_READY_FOR_INPUT
EXPORTING
I_READY_FOR_INPUT = 1.

” Refresh ALV to reflect changes
CALL METHOD O_GRID2->REFRESH_TABLE_DISPLAY.

ENDFORM.

TYPES: BEGIN OF TY_ZDB_EDIT_ALV1_FLAT,
VBELN TYPE ZDB_EDIT_ALV1-VBELN,
POSNR TYPE ZDB_EDIT_ALV1-POSNR,
ERNAM TYPE ZDB_EDIT_ALV1-ERNAM,
MATNR TYPE ZDB_EDIT_ALV1-MATNR,
WERKS TYPE ZDB_EDIT_ALV1-WERKS,
END OF TY_ZDB_EDIT_ALV1_FLAT.

DATA: LS_DB_ALV1 TYPE TY_ZDB_EDIT_ALV1_FLAT.
*&———————————————————————*
*& Form SAVE_ITEMS_DATA
*&———————————————————————
FORM SAVE_ITEMS_DATA .
DATA: LS_DB_ALV1 TYPE TY_ZDB_EDIT_ALV1_FLAT,
LS_DB_FULL TYPE ZDB_EDIT_ALV1,
LV_VBELN TYPE ZDB_EDIT_ALV1-VBELN,
LV_SKIPPED TYPE I VALUE 0,
LT_LIPS_CLEAN TYPE TABLE OF T_ZDB_EDIT_ALV1,
LS_LIPS_CLEAN TYPE T_ZDB_EDIT_ALV1,
LV_SAVED_ROWS TYPE I VALUE 0,
LV_HEADER_CHECK TYPE ZDB_EDIT_ALV-VBELN.

CALL METHOD O_GRID2->CHECK_CHANGED_DATA.

LOOP AT LT_LIPS INTO LS_LIPS.

” Skip empty item rows
IF LS_LIPS-VBELN IS INITIAL
AND LS_LIPS-POSNR IS INITIAL
AND LS_LIPS-ERNAM IS INITIAL
AND LS_LIPS-MATNR IS INITIAL
AND LS_LIPS-WERKS IS INITIAL.
LV_SKIPPED = LV_SKIPPED + 1.
CONTINUE.
ENDIF.

” # Check if header exists
SELECT SINGLE VBELN
INTO @LV_HEADER_CHECK
FROM ZDB_EDIT_ALV
WHERE VBELN = @LS_LIPS-VBELN AND ERNAM = @LS_LIPS-ERNAM.

IF SY-SUBRC <> 0.
LV_SKIPPED = LV_SKIPPED + 1.
CONTINUE. ” Don’t allow saving item without header
ENDIF.

” Keep non-empty row
LS_LIPS_CLEAN = LS_LIPS.
APPEND LS_LIPS_CLEAN TO LT_LIPS_CLEAN.

” Prepare flat structure
CLEAR LS_DB_ALV1.
MOVE-CORRESPONDING LS_LIPS TO LS_DB_ALV1.

” Check if item record exists
SELECT SINGLE VBELN
INTO @LV_VBELN
FROM ZDB_EDIT_ALV1
WHERE VBELN = @LS_DB_ALV1-VBELN
AND POSNR = @LS_DB_ALV1-POSNR
AND ERNAM = @LS_DB_ALV1-ERNAM.

IF SY-SUBRC = 0.
” UPDATE
UPDATE ZDB_EDIT_ALV1 SET
MATNR = @LS_DB_ALV1-MATNR,
WERKS = @LS_DB_ALV1-WERKS
WHERE VBELN = @LS_DB_ALV1-VBELN
AND POSNR = @LS_DB_ALV1-POSNR
AND ERNAM = @LS_DB_ALV1-ERNAM.
ELSE.
” INSERT
CLEAR LS_DB_FULL.
MOVE-CORRESPONDING LS_DB_ALV1 TO LS_DB_FULL.
INSERT ZDB_EDIT_ALV1 FROM LS_DB_FULL.
ENDIF.

LV_SAVED_ROWS = LV_SAVED_ROWS + 1.

ENDLOOP.

LT_LIPS = LT_LIPS_CLEAN.

COMMIT WORK.

” Final messaging
IF LV_SAVED_ROWS > 0.
MESSAGE ‘Item data saved successfully’ TYPE ‘S’.
ELSEIF LV_SKIPPED > 0.
MESSAGE |{ LV_SKIPPED } item row(s) were skipped – empty or missing header.| TYPE ‘I’.
ELSE.
MESSAGE ‘No item data saved.’ TYPE ‘I’.
ENDIF.

” Make all fields non-editable after save
PERFORM DISABLE_ALL_CELLS_IN_ITEMS.

” Set ALV to non-edit mode
CALL METHOD O_GRID2->SET_READY_FOR_INPUT
EXPORTING I_READY_FOR_INPUT = 0.

” Refresh ALV display
CALL METHOD O_GRID2->REFRESH_TABLE_DISPLAY.

ENDFORM.

*&———————————————————————*
*& Form UPDATE_ITEMS_DATA
*&———————————————————————*
FORM UPDATE_ITEMS_DATA .

DATA: LS_DB_ALV1 TYPE TY_ZDB_EDIT_ALV1_FLAT,
LS_DB_FULL TYPE ZDB_EDIT_ALV1,
LV_VBELN TYPE ZDB_EDIT_ALV1-VBELN.

” Ensure ALV changes are captured
CALL METHOD O_GRID2->CHECK_CHANGED_DATA.

LOOP AT LT_LIPS INTO LS_LIPS.

” Map to flat structure (exclude CELLTAB)
CLEAR LS_DB_ALV1.
LS_DB_ALV1-VBELN = LS_LIPS-VBELN.
LS_DB_ALV1-POSNR = LS_LIPS-POSNR.
LS_DB_ALV1-ERNAM = LS_LIPS-ERNAM.
LS_DB_ALV1-MATNR = LS_LIPS-MATNR.
LS_DB_ALV1-WERKS = LS_LIPS-WERKS.

” Check if record exists in DB
SELECT SINGLE VBELN
INTO @S_VBELN
FROM ZDB_EDIT_ALV1
WHERE VBELN = @LS_DB_ALV1-VBELN
AND POSNR = @LS_DB_ALV1-POSNR AND ERNAM = @LS_DB_ALV1-ERNAM.

IF SY-SUBRC = 0.
” Record exists -> UPDATE
UPDATE ZDB_EDIT_ALV1 SET
MATNR = @LS_DB_ALV1-MATNR,
WERKS = @LS_DB_ALV1-WERKS
WHERE VBELN = @LS_DB_ALV1-VBELN
AND POSNR = @LS_DB_ALV1-POSNR AND ERNAM = @LS_DB_ALV1-ERNAM.
ELSE.
” Record does not exist -> INSERT
CLEAR LS_DB_FULL.
MOVE-CORRESPONDING LS_DB_ALV1 TO LS_DB_FULL.
INSERT ZDB_EDIT_ALV1 FROM LS_DB_FULL.
ENDIF.

ENDLOOP.

COMMIT WORK.
IF SY-SUBRC <> 0.
MESSAGE ‘Item data saved successfully’ TYPE ‘S’.
ELSE.
MESSAGE ‘Created new row but empty record not saved’ type ‘I’.
ENDIF.

” Make all fields non-editable after save
PERFORM DISABLE_ALL_CELLS_IN_ITEMS.

” Set ALV to non-edit mode
CALL METHOD O_GRID2->SET_READY_FOR_INPUT
EXPORTING I_READY_FOR_INPUT = 0.

” Refresh ALV display
CALL METHOD O_GRID2->REFRESH_TABLE_DISPLAY.

ENDFORM.
*&———————————————————————*
*& Form DELETE_ITEMS_DATA
*&———————————————————————*
* text
*———————————————————————-*
* –> p1 text
* <– p2 text
*———————————————————————-*
FORM DELETE_ITEMS_DATA .

DATA: LT_ROWS TYPE LVC_T_ROW,
LS_ROW TYPE LVC_S_ROW,
LV_IDX TYPE SY-TABIX.

CALL METHOD O_GRID2->GET_SELECTED_ROWS
IMPORTING ET_INDEX_ROWS = LT_ROWS.

LOOP AT LT_ROWS INTO LS_ROW.
LV_IDX = LS_ROW-INDEX.
READ TABLE LT_LIPS INDEX LV_IDX INTO LS_LIPS.
IF SY-SUBRC = 0.
” Corrected DELETE to use both VBELN and POSNR
DELETE FROM ZDB_EDIT_ALV1 WHERE VBELN = LS_LIPS-VBELN AND POSNR = LS_LIPS-POSNR AND ERNAM = LS_LIPS-ERNAM.
DELETE LT_LIPS INDEX LV_IDX.
ENDIF.
ENDLOOP.

CALL METHOD O_GRID2->REFRESH_TABLE_DISPLAY.
COMMIT WORK.

MESSAGE ‘Selected item(s) deleted’ TYPE ‘S’.

ENDFORM.
*&———————————————————————*
*& Form DISABLE_ALL_CELLS_IN_HEADER
*&———————————————————————*
FORM DISABLE_ALL_CELLS_IN_HEADER .

DATA: LT_STYLEROW TYPE STANDARD TABLE OF LVC_S_STYL WITH DEFAULT KEY,
LS_STYLEROW TYPE LVC_S_STYL.

LOOP AT LT_LIKP INTO LS_LIKP.

CLEAR LT_STYLEROW.

LS_STYLEROW-FIELDNAME = ‘VBELN’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

LS_STYLEROW-FIELDNAME = ‘ERNAM’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

LS_STYLEROW-FIELDNAME = ‘ERDAT’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

LS_STYLEROW-FIELDNAME = ‘VSTEL’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

LS_STYLEROW-FIELDNAME = ‘VKORG’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

” Apply to current row
LS_LIKP-CELLTAB = LT_STYLEROW.
MODIFY LT_LIKP FROM LS_LIKP TRANSPORTING CELLTAB.

ENDLOOP.

ENDFORM.
*&———————————————————————*
*& Form DISABLE_ALL_CELLS_IN_ITEMS
*&———————————————————————*
FORM DISABLE_ALL_CELLS_IN_ITEMS .

DATA: LT_STYLEROW TYPE STANDARD TABLE OF LVC_S_STYL WITH DEFAULT KEY,
LS_STYLEROW TYPE LVC_S_STYL.

LOOP AT LT_LIPS INTO LS_LIPS.

CLEAR LT_STYLEROW.

LS_STYLEROW-FIELDNAME = ‘VBELN’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

LS_STYLEROW-FIELDNAME = ‘POSNR’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

LS_STYLEROW-FIELDNAME = ‘ERNAM’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

LS_STYLEROW-FIELDNAME = ‘MATNR’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

LS_STYLEROW-FIELDNAME = ‘WERKS’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

” Apply to current row
LS_LIKP-CELLTAB = LT_STYLEROW.
MODIFY LT_LIPS FROM LS_LIPS TRANSPORTING CELLTAB.

ENDLOOP.

ENDFORM.

 

 

​ In this blog post, we will explore a powerful ABAP implementation of an editable ALV using CL_GUI_ALV_GRID. This solution provides:Interactive two-screen design (Header & Item)Double-click to header to itemField-level edit control via CELLTABFull CRUD operations (Create, Read, Update, Delete) for both header and item data🏠 ScenarioWe use two custom database tables:Custom Table → Delivery Header Data (VBELN, ERNAM, ERDAT, VSTEL, VKORG)Custom Table → Delivery Item Data (VBELN, POSNR, MATNR, WERKS)The goal is to allow users to edit only selected rows, protect primary key fields, and manage entries interactively.1.      Table DeclarationsTABLES? Custom transparent table containing delivery header data.Custom transparent table for delivery item data.These tables are used to fetch and store ALV grid data.TABLES:ZDB_EDIT_ALV,ZDB_EDIT_ALV1.🔷 2. Class Forward DeclarationCLASS DELIVERY DEFINITION DEFERRED.Forward declares a class named DELIVERY used later to handle double-click events.This is necessary to register event handlers before the class is fully implemented.🔷 3. Type DeclarationsDefines a structure T_ZDB_EDIT_ALV to hold header data and editable styles.CELLTAB: Stores editable style info for ALV cell-level control.Similarly, for item data:🔷 4. Data DefinitionsInternal tables and work areas for header (LT_LIKP, LS_LIKP) and item (LT_LIPS, LS_LIPS) records.Field catalog tables for header (LT_FCAT) and item (LT_FCAT1) ALVs.Layout configurations for header and item grids.Containers and ALV grid objects for screen 200 (header) and screen 100 (item).5. Selection Screen Definition  Purpose: Creates a selection screen block with delivery number as the input filter.S_VBELN: Allows users to input multiple values or ranges for VBELN.TEXT-000: Refers to a text element (defined in SE32 or SE38) for the frame title.🔷 6. Field Catalog for Item ALVUses VALUE #( ) constructor to populate the field catalog for the item-level ALV (LT_LIPS).COL_POS: Column order in the ALV.FIELDNAME: Field to display.COLTEXT: Header text.TABNAME: Reference table used for dynamic assignment (not required in OO ALV, but used for clarity here).🔷 7. Layout Configuration for Item ALVGRID_TITLE: Title of the ALV.SEL_MODE = ‘A’: Allows multiple row selection.NO_TOOLBAR = ‘X’: Hides the standard ALV toolbar.STYLEFNAME = ‘CELLTAB’: Tells ALV to use the CELLTAB column to control editable styles per cell.🔷 8. Start-of-SelectionSTART-OF-SELECTION.  CALL SCREEN 200.Trigger point of the report after user input.It navigates to screen 200, which displays the header-level ALV.9. Event Handler Class DefinitionDefines a local class DELIVERY with method GET_DATA.The method is registered as an event handler for the double-click event of the ALV.🔷 10. Class Implementation  GET_DATA is triggered when the user double-clicks on a row in header ALV.It reads the delivery number (VBELN) of the clicked row.Then fetches all matching item-level records from ZDB_EDIT_ALV1 into LT_LIPS.Opens Screen 100, which shows the item ALV.🔷 11. Screen 100 (Item ALV) – OUTPUT Module  SET PF-STATUS ‘ZITEMS’: Sets the GUI status (button functions) for item screen.PERFORM CREATE_OBJECT_LIPS: Initializes the ALV Grid for item records.🔷 12. Screen 100 – INPUT Module  Handles user actions on screen 100:BACK: Return to header ALV.CREATE: Add a new item row.EDIT: Enable selected row for editing.UPDATE: Update modified item data.DELETE: Remove selected rows.SAVE: Insert/update item data into DB.FORM CREATE_OBJECT_LIPS – Initializes ALV on Screen 100 (Item).MODULE STATUS_0200 OUTPUT – Prepares header ALV on Screen 200.MODULE USER_COMMAND_0200 INPUT – Handles toolbar actions for header ALV.Then we’ll go deeper into the CRUD FORMs (CREATE/EDIT/UPDATE/DELETE/SAVE) for both header and item ALVs.FORM CREATE_OBJECT_LIPS – Create ALV Grid for Items🔹Explanation:CLEAR O_CONTAINER2: Reset reference before ALV creation (safety check).CREATE OBJECT O_CONTAINER2: Creates a custom container placed on the screen (SCREEN 100) using element CONTAINER2.CREATE OBJECT O_GRID2: Binds an ALV Grid (CL_GUI_ALV_GRID) to the container.SET_TABLE_FOR_FIRST_DISPLAY:IS_LAYOUT = LS_LAYO1: Applies previously configured layout for item ALV.IT_OUTTAB = LT_LIPS: Data source for the ALV.IT_FIELDCATALOG = LT_FCAT1: Column settings for the ALV.🔷 13. MODULE STATUS_0200 OUTPUT – Setup Header Screen (Screen 200)Explanation:SET PF-STATUS ‘ZHEADER’: Sets GUI status for header toolbar (buttons: CREATE, EDIT, SAVE, etc.).The SELECT pulls header records from ZDB_EDIT_ALV based on delivery numbers entered on the selection screen.ALV Grid Initialization:Creates the custom container and grid for header-level display.Field Catalog (LT_FCAT):Each field is appended individually to LT_FCAT with attributes: Layout for Header ALV: Final ALV Setup:  Initializes header ALV with all settings and data.Event Handler Registration:  Double-click on any row in header ALV triggers GET_DATA, which fetches corresponding items.🔷 14. MODULE USER_COMMAND_0200 INPUT – Header Screen Toolbar Actions  Executes the relevant FORM based on user action on toolbar buttons:CREATE: Adds a new editable row.EDIT: Enables selected row for editing.SAVE: Inserts or updates data in DB.DELETE: Removes selected rows from ALV and DB.UPDATE: Commits modified data to DB.15. FORM CHANGE_MODE – Enable Edit Mode for Selected Header RowPurpose: Only the selected row becomes editable. All others stay read-only.LVC_T_ROID, LVC_S_STYL: Types for editable styles.CELLTAB is used for cell-level control.Gets the row(s) selected in the header ALV using LVC_ROWMARK.  Loop over each header entry to determine which row to enable.  Compares the current loop index with selected rows.If it’s selected, enable its editable fields.🔹 If Selected Row → Enable ditable Fields      IF SY-SUBRC = 0.        LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.        LS_STYLEROW-FIELDNAME = ‘VBELN’.        INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.VBELN is a primary key → disabled.Similarly disables ERNAM.        LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.        LS_STYLEROW-FIELDNAME = ‘ERDAT’.        INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.Enables only non-primary key fields for editing: ERDAT, VSTEL, VKORG.🔹 Assign Cell Styles to Entry        CLEAR: LS_LIKP-CELLTAB.        INSERT LINES OF LT_STYLEROW INTO TABLE LS_LIKP-CELLTAB.        MODIFY LT_LIKP FROM LS_LIKP TRANSPORTING CELLTAB.        CLEAR: LT_STYLEROW.Applies the style to the current line.🔹 Else – Row not selected → Make it fully non-editable      ELSE.        LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.        …        INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.        …        MODIFY LT_LIKP FROM LS_LIKP TRANSPORTING CELLTAB.🔹 Toggle Grid Ready for Input  IF O_GRID1->IS_READY_FOR_INPUT( ) EQ 0.    CALL METHOD O_GRID1->SET_READY_FOR_INPUT EXPORTING I_READY_FOR_INPUT = 1.  ELSE.    CALL METHOD O_GRID1->SET_READY_FOR_INPUT EXPORTING I_READY_FOR_INPUT = 0.  ENDIF.Activates input mode if not already.  O_GRID1->REFRESH_TABLE_DISPLAY( ).ENDFORM.Refreshes the ALV to reflect the updated editable state. 🔷 16. FORM CREATE_HEADER_DATA – Add New Editable Header RowFORM CREATE_HEADER_DATA .  DATA: LS_NEW      TYPE T_ZDB_EDIT_ALV,        LT_STYLEROW TYPE STANDARD TABLE OF LVC_S_STYL WITH DEFAULT KEY,        LS_STYLEROW TYPE LVC_S_STYL.Prepares a new structure and editable field style list.🔹 Set Editable Fields  LS_STYLEROW-FIELDNAME = ‘VBELN’.  LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.  APPEND LS_STYLEROW TO LT_STYLEROW.All fields are enabled since it’s a new row. Even primary keys like VBELN, ERNAM.Repeats for: ERNAM, ERDAT, VSTEL, VKORG.🔹 Assign Styles and Add New Entry  LS_NEW-CELLTAB = LT_STYLEROW.  APPEND LS_NEW TO LT_LIKP.Assigns the editable CELLTAB and appends the new row to the internal table.  CALL METHOD O_GRID1->SET_READY_FOR_INPUT EXPORTING I_READY_FOR_INPUT = 1.  CALL METHOD O_GRID1->REFRESH_TABLE_DISPLAY.ENDFORM.Turns on editable mode and refreshes ALV.17. FORM DELETE_HEADER_DATA – Delete Selected Header RowsFORM DELETE_HEADER_DATA .  DATA: LT_ROWS TYPE LVC_T_ROW,        LS_ROW  TYPE LVC_S_ROW,        LV_IDX  TYPE SY-TABIX.LT_ROWS: Holds the list of selected row indexes.LS_ROW: Work area for current row index.LV_IDX: Integer used to track which row index is being processed.🔹 Get Selected Rows  CALL METHOD O_GRID1->GET_SELECTED_ROWS    IMPORTING ET_INDEX_ROWS = LT_ROWS.Fetches the selected row indexes in the header ALV grid.🔹 Loop and Delete from DB & Internal Table  LOOP AT LT_ROWS INTO LS_ROW.    LV_IDX = LS_ROW-INDEX.     READ TABLE LT_LIKP INDEX LV_IDX INTO LS_LIKP.    IF SY-SUBRC = 0.      DELETE FROM ZDB_EDIT_ALV WHERE VBELN = LS_LIKP-VBELN.      DELETE LT_LIKP INDEX LV_IDX.    ENDIF.  ENDLOOP.For each selected row:Reads that entry from LT_LIKP.Deletes corresponding record from DB table ZDB_EDIT_ALV.Deletes it from internal table LT_LIKP.🔹 Refresh ALV & Commit  CALL METHOD O_GRID1->REFRESH_TABLE_DISPLAY.  COMMIT WORK.  MESSAGE ‘Selected header(s) deleted’ TYPE ‘S’.ENDFORM.Refreshes the ALV display.Saves DB changes using COMMIT WORK.Displays success message.🔷 18. FORM SAVE_HEADER_DATA – Insert or Update Header RecordsFORM SAVE_HEADER_DATA .🔹 Flat Structure DefinitionTYPES: BEGIN OF TY_ZDB_EDIT_ALV_FLAT,         VBELN TYPE ZDB_EDIT_ALV-VBELN,         ERNAM TYPE ZDB_EDIT_ALV-ERNAM,         ERDAT TYPE ZDB_EDIT_ALV-ERDAT,         VSTEL TYPE ZDB_EDIT_ALV-VSTEL,         VKORG TYPE ZDB_EDIT_ALV-VKORG,       END OF TY_ZDB_EDIT_ALV_FLAT. DATA: LS_DB_ALV_FLAT TYPE TY_ZDB_EDIT_ALV_FLAT.This structure excludes CELLTAB and is used to write data into the DB. 🔹 Ensure User Changes Are Captured  CALL METHOD O_GRID1->CHECK_CHANGED_DATA.Updates the internal table (LT_LIKP) with user input from the ALV grid.🔹 Loop Through Header Table and Save to DB   LOOP AT LT_LIKP INTO LS_LIKP.     LS_DB_ALV_FLAT-VBELN = LS_LIKP-VBELN.    LS_DB_ALV_FLAT-ERNAM = LS_LIKP-ERNAM.    LS_DB_ALV_FLAT-ERDAT = LS_LIKP-ERDAT.    LS_DB_ALV_FLAT-VSTEL = LS_LIKP-VSTEL.    LS_DB_ALV_FLAT-VKORG = LS_LIKP-VKORG.Copies the values to a flat version to avoid CELLTAB structure issues.🔹 Insert or Update Logic    SELECT SINGLE VBELN      INTO @DATA(LV_VBELN)      FROM ZDB_EDIT_ALV      WHERE VBELN = @LS_DB_ALV_FLAT-VBELN        AND ERNAM = @LS_DB_ALV_FLAT-ERNAM.     IF SY-SUBRC = 0.      UPDATE ZDB_EDIT_ALV SET        ERDAT = @LS_DB_ALV_FLAT-ERDAT,        VSTEL = @LS_DB_ALV_FLAT-VSTEL,        VKORG = @LS_DB_ALV_FLAT-VKORG      WHERE VBELN = @LS_DB_ALV_FLAT-VBELN AND ERNAM = @LS_DB_ALV_FLAT-ERNAM.    ELSE.      INSERT ZDB_EDIT_ALV FROM LS_DB_ALV_FLAT.    ENDIF.   ENDLOOP.If record exists (same VBELN & ERNAM) → UPDATE.Else → INSERT as new record.  COMMIT WORK.  MESSAGE ‘Header data saved successfully’ TYPE ‘S’.ENDFORM.Final commit and success message. 🔷 19. FORM UPDATE_HEADER_DATA – Update Header RecordsFORM UPDATE_HEADER_DATA .  CALL METHOD O_GRID1->CHECK_CHANGED_DATA.Reads current ALV data into LT_LIKP.🔹 Loop and Upsert to DBabapCopyEdit  LOOP AT LT_LIKP INTO LS_LIKP.     LS_DB_ALV_FLAT-VBELN = LS_LIKP-VBELN.    LS_DB_ALV_FLAT-ERNAM = LS_LIKP-ERNAM.    LS_DB_ALV_FLAT-ERDAT = LS_LIKP-ERDAT.    LS_DB_ALV_FLAT-VSTEL = LS_LIKP-VSTEL.    LS_DB_ALV_FLAT-VKORG = LS_LIKP-VKORG.Maps data into a flat structure.abapCopyEdit    SELECT SINGLE VBELN INTO @DATA(LV_VBELN)      FROM ZDB_EDIT_ALV      WHERE VBELN = @LS_DB_ALV_FLAT-VBELN AND ERNAM = @LS_DB_ALV_FLAT-ERNAM.     IF SY-SUBRC = 0.      UPDATE ZDB_EDIT_ALV SET        ERDAT = @LS_DB_ALV_FLAT-ERDAT,        VSTEL = @LS_DB_ALV_FLAT-VSTEL,        VKORG = @LS_DB_ALV_FLAT-VKORG      WHERE VBELN = @LS_DB_ALV_FLAT-VBELN AND ERNAM = @LS_DB_ALV_FLAT-ERNAM.    ELSE.      INSERT ZDB_EDIT_ALV FROM LS_DB_ALV_FLAT.    ENDIF.   ENDLOOP.Same insert/update logic as SAVE  COMMIT WORK.  MESSAGE ‘Header data Updated successfully’ TYPE ‘S’.ENDFORM.✅ That completes the full documentation of header-level editable ALV with CRUD.Next, I’ll begin the item-level ALV explanation starting with:FORM CHANGE_ITEMS_MODEFORM CREATE_ITEMS_DATAFORM DELETE_ITEMS_DATAFORM SAVE_ITEMS_DATAFORM UPDATE_ITEMS_DATA🔷 20. FORM CHANGE_ITEMS_MODE – Make Only Selected Item Row EditableFORM CHANGE_ITEMS_MODE .  DATA: LT_INDEX_ROWS TYPE LVC_T_ROW,        LT_ROW_NO     TYPE LVC_T_ROID,        LS_ROW_NO     TYPE LVC_S_ROID,        LS_STYLEROW   TYPE LVC_S_STYL,        LT_STYLEROW   TYPE TABLE OF LVC_S_STYL.Similar to header edit logic.Used to control which single row in the item ALV becomes editable.  CALL METHOD O_GRID2->GET_SELECTED_ROWS    IMPORTING ET_ROW_NO = LT_ROW_NO.Retrieves the selected item rows using LVC_ROWMARK.🔹 Loop Over All Rows and Toggle Editable Mode  IF NOT LT_ROW_NO IS INITIAL.    LOOP AT LT_LIPS INTO LS_LIPS.       READ TABLE LT_ROW_NO INTO LS_ROW_NO WITH KEY ROW_ID = SY-TABIX.For each item row in LT_LIPS, check if it’s selected.🔹 If Selected: Enable Editable Fields      IF SY-SUBRC = 0.        LS_STYLEROW-STYLE     = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.        LS_STYLEROW-FIELDNAME = ‘VBELN’.        INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.         LS_STYLEROW-FIELDNAME = ‘POSNR’.        INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.         LS_STYLEROW-STYLE     = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.        LS_STYLEROW-FIELDNAME = ‘MATNR’.        INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.         LS_STYLEROW-FIELDNAME = ‘WERKS’.        INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.VBELN and POSNR are primary keys → disabled.Only MATNR, WERKS are editable.        CLEAR: LS_LIPS-CELLTAB.        INSERT LINES OF LT_STYLEROW INTO TABLE LS_LIPS-CELLTAB.        MODIFY LT_LIPS FROM LS_LIPS TRANSPORTING CELLTAB.        CLEAR: LT_STYLEROW.Applies the cell-style configuration to the current row.🔹 Else: Disable All Fields for Non-Selected Rows      ELSE.        LOOP AT FIELDS: ‘VBELN’, ‘POSNR’, ‘MATNR’, ‘WERKS’.          LS_STYLEROW-FIELDNAME = FIELD.          LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.          INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.        ENDLOOP.         CLEAR: LS_LIPS-CELLTAB.        INSERT LINES OF LT_STYLEROW INTO TABLE LS_LIPS-CELLTAB.        MODIFY LT_LIPS FROM LS_LIPS TRANSPORTING CELLTAB.        CLEAR: LT_STYLEROW.🔹 Toggle Edit Mode and Refresh ALV  IF O_GRID2->IS_READY_FOR_INPUT( ) EQ 0.    CALL METHOD O_GRID2->SET_READY_FOR_INPUT EXPORTING I_READY_FOR_INPUT = 1.  ELSE.    CALL METHOD O_GRID2->SET_READY_FOR_INPUT EXPORTING I_READY_FOR_INPUT = 0.  ENDIF.   O_GRID2->REFRESH_TABLE_DISPLAY( ).ENDFORM.🔷 21. FORM CREATE_ITEMS_DATA – Add New Editable Row in Item ALVFORM CREATE_ITEMS_DATA .  DATA: LS_NEW      TYPE T_ZDB_EDIT_ALV1,        LT_STYLEROW TYPE STANDARD TABLE OF LVC_S_STYL WITH DEFAULT KEY,        LS_STYLEROW TYPE LVC_S_STYL.   CLEAR: LS_NEW, LT_STYLEROW.Creates a blank work area and editable style table.🔹 Enable All Fields (for Create)  LS_STYLEROW-FIELDNAME = ‘VBELN’.  LS_STYLEROW-STYLE     = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.  APPEND LS_STYLEROW TO LT_STYLEROW.   … (Repeat for POSNR, MATNR, WERKS)All fields are enabled so user can create new record from scratch.  LS_NEW-CELLTAB = LT_STYLEROW.  APPEND LS_NEW TO LT_LIPS.   CALL METHOD O_GRID2->SET_READY_FOR_INPUT EXPORTING I_READY_FOR_INPUT = 1.  CALL METHOD O_GRID2->REFRESH_TABLE_DISPLAY.ENDFORM.Appends the new row to ALV and switches to input mode.🔷 22. FORM DELETE_ITEMS_DATA – Delete Selected Item RowsFORM DELETE_ITEMS_DATA .  DATA: LT_ROWS TYPE LVC_T_ROW,        LS_ROW  TYPE LVC_S_ROW,        LV_IDX  TYPE SY-TABIX.   CALL METHOD O_GRID2->GET_SELECTED_ROWS IMPORTING ET_INDEX_ROWS = LT_ROWS.Gets the selected item row indexes from ALV.  LOOP AT LT_ROWS INTO LS_ROW.    LV_IDX = LS_ROW-INDEX.    READ TABLE LT_LIPS INDEX LV_IDX INTO LS_LIPS.    IF SY-SUBRC = 0.      DELETE FROM ZDB_EDIT_ALV1 WHERE VBELN = LS_LIPS-VBELN.      DELETE LT_LIPS INDEX LV_IDX.    ENDIF.  ENDLOOP.   CALL METHOD O_GRID2->REFRESH_TABLE_DISPLAY.  COMMIT WORK.  MESSAGE ‘Selected header(s) deleted’ TYPE ‘S’.ENDFORM.Deletes item records from both DB and internal table.🔷 23. FORM SAVE_ITEMS_DATA – Insert or Update Item RowsFORM SAVE_ITEMS_DATA .  DATA: LS_DB_ALV1  TYPE TY_ZDB_EDIT_ALV1_FLAT,        LS_DB_FULL TYPE ZDB_EDIT_ALV1,        LV_VBELN   TYPE ZDB_EDIT_ALV1-VBELN.   CALL METHOD O_GRID2->CHECK_CHANGED_DATA.Converts ALV changes to internal table.Flat structure is used to exclude CELLTAB.🔹 Loop Through Item Table  LOOP AT LT_LIPS INTO LS_LIPS.    LS_DB_ALV1-VBELN = LS_LIPS-VBELN.    LS_DB_ALV1-POSNR = LS_LIPS-POSNR.    LS_DB_ALV1-MATNR = LS_LIPS-MATNR.    LS_DB_ALV1-WERKS = LS_LIPS-WERKS.Transfer values from ALV row to flat structure.🔹 DB Insert/Update Logic    SELECT SINGLE VBELN INTO @LV_VBELN      FROM ZDB_EDIT_ALV1      WHERE VBELN = @LS_DB_ALV1-VBELN AND POSNR = @LS_DB_ALV1-POSNR.     IF SY-SUBRC = 0.      UPDATE ZDB_EDIT_ALV1 SET        MATNR = @LS_DB_ALV1-MATNR,        WERKS = @LS_DB_ALV1-WERKS        WHERE VBELN = @LS_DB_ALV1-VBELN AND POSNR = @LS_DB_ALV1-POSNR.    ELSE.      CLEAR LS_DB_FULL.      MOVE-CORRESPONDING LS_DB_ALV1 TO LS_DB_FULL.      INSERT ZDB_EDIT_ALV1 FROM LS_DB_FULL.    ENDIF.  ENDLOOP.   COMMIT WORK.  MESSAGE ‘Item data saved successfully’ TYPE ‘S’.ENDFORM.🔷 24. FORM UPDATE_ITEMS_DATA – Update Existing Item RecordsFORM UPDATE_ITEMS_DATA .  DATA: LS_DB_ALV1  TYPE TY_ZDB_EDIT_ALV1_FLAT,        LS_DB_FULL TYPE ZDB_EDIT_ALV1,        LV_VBELN   TYPE ZDB_EDIT_ALV1-VBELN.   CALL METHOD O_GRID2->CHECK_CHANGED_DATA.Same structure and update logic as SAVE.  LOOP AT LT_LIPS INTO LS_LIPS.    LS_DB_ALV1-VBELN = LS_LIPS-VBELN.    LS_DB_ALV1-POSNR = LS_LIPS-POSNR.    LS_DB_ALV1-MATNR = LS_LIPS-MATNR.    LS_DB_ALV1-WERKS = LS_LIPS-WERKS.     SELECT SINGLE VBELN INTO @DATA(S_VBELN)      FROM ZDB_EDIT_ALV1      WHERE VBELN = @LS_DB_ALV1-VBELN AND POSNR = @LS_DB_ALV1-POSNR.     IF SY-SUBRC = 0.      UPDATE ZDB_EDIT_ALV1 SET        MATNR = @LS_DB_ALV1-MATNR,        WERKS = @LS_DB_ALV1-WERKS        WHERE VBELN = @LS_DB_ALV1-VBELN AND POSNR = @LS_DB_ALV1-POSNR.    ELSE.      CLEAR LS_DB_FULL.      MOVE-CORRESPONDING LS_DB_ALV1 TO LS_DB_FULL.      INSERT ZDB_EDIT_ALV1 FROM LS_DB_FULL.    ENDIF.  ENDLOOP.   COMMIT WORK.  MESSAGE ‘Item data Updated successfully’ TYPE ‘S’.ENDFORM.Output:  Header Output When I was click on edit buttonWhen I was click on create buttonWhen I was create a new row delete buttonWhen I was click on create buttom multiple append rows also created in both header and item alsoIf I was save on empty row Its shows asIf was double click on empty on no items was displayed and Header empty row it will not created on items details Same actions performs in CURD operations in item level also:Program :REPORT ZEDITABLE_ALV_INT.

************************************************************************
* Program Name :
* Description : Editable ALV using CL_GUI_ALV_GRID with row-based edit
* control using LVC_ROWMARK. Only selected row becomes
* editable, primary keys remain non-editable and to perfrom a crud operations.
* Created by : <NRAJU>
*************************************************************************
*———————————————————————*
* Table Declarations
*———————————————————————*
TABLES:ZDB_EDIT_ALV,ZDB_EDIT_ALV1.
CLASS DELIVERY DEFINITION DEFERRED.
*———————————————————————*
* Type Declarations
*———————————————————————*
TYPES: BEGIN OF T_ZDB_EDIT_ALV,
VBELN TYPE ZDB_EDIT_ALV-VBELN, “Delivery Number
ERNAM TYPE ZDB_EDIT_ALV-ERNAM, “Name of Person who Created the Object
ERDAT TYPE ZDB_EDIT_ALV-ERDAT, “Date on Which Record Was Created
VSTEL TYPE ZDB_EDIT_ALV-VSTEL, “Shipping Point/Receiving Point
VKORG TYPE ZDB_EDIT_ALV-VKORG, “Sales Organization
CELLTAB TYPE LVC_T_STYL, “Editable style table
END OF T_ZDB_EDIT_ALV.
TYPES: BEGIN OF T_ZDB_EDIT_ALV1,
VBELN TYPE ZDB_EDIT_ALV1-VBELN, “Delivery Number
POSNR TYPE ZDB_EDIT_ALV1-POSNR, “Sales Document Item
ERNAM TYPE ZDB_EDIT_ALV1-ERNAM,
MATNR TYPE ZDB_EDIT_ALV1-MATNR, “Material Number
WERKS TYPE ZDB_EDIT_ALV1-WERKS, “Plant
CELLTAB TYPE LVC_T_STYL, “Editable style table
END OF T_ZDB_EDIT_ALV1.
DATA:LT_LIKP TYPE TABLE OF T_ZDB_EDIT_ALV, “Internal table for header
LS_LIKP TYPE T_ZDB_EDIT_ALV, “workarea for header
LT_LIPS TYPE TABLE OF T_ZDB_EDIT_ALV1, “Internal table for Item
LS_LIPS TYPE T_ZDB_EDIT_ALV1, “Workarea for item
LT_FCAT TYPE LVC_T_FCAT, “Filedcat
LS_FCAT TYPE LVC_S_FCAT,
LT_FCAT1 TYPE LVC_T_FCAT, “filedcatlog
LS_FCAT1 TYPE LVC_S_FCAT,
LS_LAYO TYPE LVC_S_LAYO, “Layout
LS_LAYO1 TYPE LVC_S_LAYO,
O_CONTAINER1 TYPE REF TO CL_GUI_CUSTOM_CONTAINER, “Container for Header
O_GRID1 TYPE REF TO CL_GUI_ALV_GRID, “Grid for Header
O_CONTAINER2 TYPE REF TO CL_GUI_CUSTOM_CONTAINER, “Container for item
O_GRID2 TYPE REF TO CL_GUI_ALV_GRID. “Grid for It
*———————————————————————*
* Selection Screen
*———————————————————————*
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-000.
SELECT-OPTIONS:S_VBELN FOR ZDB_EDIT_ALV-VBELN.
SELECTION-SCREEN END OF BLOCK B1.
*************fieldcatalog creation creation for item
LT_FCAT1 = VALUE #(
( COL_POS = 1 FIELDNAME = ‘VBELN’ COLTEXT = ‘Delivery Number’ )
( COL_POS = 2 FIELDNAME = ‘POSNR’ COLTEXT = ‘Item Number’ )
( COL_POS = 3 FIELDNAME = ‘ERNAM’ COLTEXT = ‘NAME’ )
( COL_POS = 4 FIELDNAME = ‘MATNR’ COLTEXT = ‘Material Number’ )
( COL_POS = 5 FIELDNAME = ‘WERKS’ COLTEXT = ‘Plant’ )
).

*************Layout creation for item
LS_LAYO1-GRID_TITLE = ‘Custom Table for Items’.
LS_LAYO1-SEL_MODE = ‘A’.
LS_LAYO1-NO_TOOLBAR = ‘X’.
LS_LAYO1-STYLEFNAME = ‘CELLTAB’.

“*************fieldcatalog creation creation
LS_FCAT-ROW_POS = 1.
LS_FCAT-COL_POS = 1.
LS_FCAT-FIELDNAME = ‘VBELN’.
LS_FCAT-COLTEXT = ‘Delivery Number’.
LS_FCAT-OUTPUTLEN = 20.
APPEND LS_FCAT TO LT_FCAT.
CLEAR LS_FCAT.

LS_FCAT-ROW_POS = 1.
LS_FCAT-COL_POS = 1.
LS_FCAT-FIELDNAME = ‘ERNAM’.
LS_FCAT-COLTEXT = ‘Name’.
LS_FCAT-OUTPUTLEN = 20.
APPEND LS_FCAT TO LT_FCAT.
CLEAR LS_FCAT.

LS_FCAT-ROW_POS = 1.
LS_FCAT-COL_POS = 1.
LS_FCAT-FIELDNAME = ‘ERDAT’.
LS_FCAT-COLTEXT = ‘Date’.
LS_FCAT-OUTPUTLEN = 20.
APPEND LS_FCAT TO LT_FCAT.
CLEAR LS_FCAT.

LS_FCAT-ROW_POS = 1.
LS_FCAT-COL_POS = 1.
LS_FCAT-FIELDNAME = ‘VSTEL’.
LS_FCAT-COLTEXT = ‘SALES’.
LS_FCAT-OUTPUTLEN = 20.
APPEND LS_FCAT TO LT_FCAT.
CLEAR LS_FCAT.
LS_FCAT-ROW_POS = 1.
LS_FCAT-COL_POS = 1.
LS_FCAT-FIELDNAME = ‘VKORG’.
LS_FCAT-COLTEXT = ‘Delivery Number’.
LS_FCAT-OUTPUTLEN = 20.
APPEND LS_FCAT TO LT_FCAT.
CLEAR LS_FCAT.

***********layout of fieldcat
LS_LAYO-GRID_TITLE = ‘Custom Table for Header’.
LS_LAYO-SEL_MODE = ‘A’.
LS_LAYO-NO_TOOLBAR = ‘X’.
LS_LAYO-STYLEFNAME = ‘CELLTAB’.

START-OF-SELECTION. “start-of-selection
CALL SCREEN 200. “Screen for Header
CLASS Delivery DEFINITION.
PUBLIC SECTION.
METHODS: GET_DATA FOR EVENT DOUBLE_CLICK OF CL_GUI_ALV_GRID
IMPORTING E_ROW.
ENDCLASS.
*&———————————————————————*
*& Class (Implementation) Delivery
*&———————————————————————*
* Text
*———————————————————————-*
CLASS DELIVERY IMPLEMENTATION.
METHOD: GET_DATA.
READ TABLE LT_LIKP INTO LS_LIKP INDEX E_ROW-INDEX.
SELECT VBELN
POSNR
ERNAM
MATNR
WERKS
FROM ZDB_EDIT_ALV1
INTO CORRESPONDING FIELDS OF TABLE LT_LIPS
WHERE VBELN = LS_LIKP-VBELN and ernam = ls_likp-ernam.

** Check if items exist
* IF lt_lips IS INITIAL.
* MESSAGE ‘No items exist for this header.’ TYPE ‘I’.
* RETURN.
* ENDIF.
CALL SCREEN 100.
* ” Refresh ALV to reflect changes
* CALL METHOD O_GRID1->REFRESH_TABLE_DISPLAY.
ENDMETHOD.
ENDCLASS. “Delivery
*&———————————————————————*
*& Module STATUS_0100 OUTPUT
*&———————————————————————*
* text
*———————————————————————-*
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS ‘ZITEMS’. “Creating buttons for items
PERFORM CREATE_OBJECT_LIPS. “perform for create item
ENDMODULE.
*&———————————————————————*
*& Module USER_COMMAND_0100 INPUT
*&———————————————————————*
* text
*———————————————————————-*
MODULE USER_COMMAND_0100 INPUT.
CASE SY-UCOMM.
WHEN ‘BACK’.
LEAVE TO SCREEN 200.
WHEN ‘CREATE’. “Createing new record for items
PERFORM CREATE_ITEMS_DATA.
WHEN ‘EDIT’. “Editable alv for items
PERFORM CHANGE_ITEMS_MODE.
WHEN ‘UPDATE’. “Updateing the records for items
PERFORM UPDATE_ITEMS_DATA.
WHEN ‘DELETE’. “Deleting the records for item tables
PERFORM DELETE_ITEMS_DATA.
WHEN ‘SAVE’. “Saveing the recording from db table in item records
PERFORM SAVE_ITEMS_DATA.
ENDCASE.
ENDMODULE.
*&———————————————————————*
*& Form CREATE_OBJECT_LIPS
FORM CREATE_OBJECT_LIPS .
CLEAR O_CONTAINER2.
IF O_CONTAINER2 IS INITIAL AND O_GRID2 IS INITIAL.
CREATE OBJECT O_CONTAINER2
EXPORTING
CONTAINER_NAME = ‘CONTAINER2’
EXCEPTIONS
CNTL_ERROR = 1
CNTL_SYSTEM_ERROR = 2
CREATE_ERROR = 3
LIFETIME_ERROR = 4
LIFETIME_DYNPRO_DYNPRO_LINK = 5
OTHERS = 6
.
CREATE OBJECT O_GRID2
EXPORTING
I_PARENT = O_CONTAINER2
EXCEPTIONS
ERROR_CNTL_CREATE = 1
ERROR_CNTL_INIT = 2
ERROR_CNTL_LINK = 3
ERROR_DP_CREATE = 4
OTHERS = 5
.
ENDIF.
CALL METHOD O_GRID2->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
IS_LAYOUT = LS_LAYO1
CHANGING
IT_OUTTAB = LT_LIPS
IT_FIELDCATALOG = LT_FCAT1
EXCEPTIONS
INVALID_PARAMETER_COMBINATION = 1
PROGRAM_ERROR = 2
TOO_MANY_LINES = 3
OTHERS = 4
.
call method O_GRID2->REFRESH_TABLE_DISPLAY( ).
ENDFORM.
*&———————————————————————*
*& Module STATUS_0200 OUTPUT
*&———————————————————————*
MODULE STATUS_0200 OUTPUT.
SET PF-STATUS ‘ZHEADER’.
” Only load header data from DB once
IF lt_likp IS INITIAL.
SELECT vbeln
ernam
erdat
vstel
vkorg
FROM zdb_edit_alv
INTO CORRESPONDING FIELDS OF TABLE lt_likp
WHERE vbeln IN s_vbeln.
ENDIF.
” Only create container and grid once
IF o_container1 IS INITIAL AND o_grid1 IS INITIAL.
” Create custom container
CREATE OBJECT o_container1
EXPORTING
container_name = ‘CONTAINER1’.
” Create ALV grid object
CREATE OBJECT o_grid1
EXPORTING
i_parent = o_container1.
” Set up field catalog and layout if needed (assuming lt_fcat and ls_layo are ready)
CALL METHOD o_grid1->set_table_for_first_display
EXPORTING
i_structure_name = ‘ZDB_EDIT_ALV’
is_layout = ls_layo
CHANGING
it_outtab = lt_likp
it_fieldcatalog = lt_fcat
EXCEPTIONS
invalid_parameter_combination = 1
program_error = 2
too_many_lines = 3
OTHERS = 4.
” Set event handler for item-level data retrieval
DATA(o_delivery) = NEW delivery( ).
SET HANDLER o_delivery->get_data FOR o_grid1.
ENDIF.
ENDMODULE.
*&———————————————————————*
*& Module USER_COMMAND_0200 INPUT
MODULE USER_COMMAND_0200 INPUT.
CASE SY-UCOMM.
WHEN ‘BACK’.
LEAVE PROGRAM. “Back to the program
WHEN ‘CREATE’. “Creating new record for header data
PERFORM CREATE_HEADER_DATA.
WHEN ‘EDIT’. “Editable alv for header data
PERFORM CHANGE_MODE.
WHEN ‘UPDATE’. “Updateing the record for header data
PERFORM UPDATE_HEADER_DATA.
WHEN ‘DELETE’. “deleteing for a record for header data
PERFORM DELETE_HEADER_DATA.
WHEN ‘SAVE’. “saveing the db table for header data
PERFORM SAVE_HEADER_DATA.
ENDCASE.
ENDMODULE.
*&———————————————————————*
*& Form CHANGE_MODE
*&———————————————————————*
FORM CHANGE_MODE .
DATA : LT_INDEX_ROWS TYPE LVC_T_ROW,
LT_ROW_NO TYPE LVC_T_ROID,
LS_ROW_NO TYPE LVC_S_ROID,
LS_STYLEROW TYPE LVC_S_STYL,
LT_STYLEROW TYPE TABLE OF LVC_S_STYL.
CALL METHOD O_GRID1->GET_SELECTED_ROWS
IMPORTING
* et_index_rows = lt_index_rows
ET_ROW_NO = LT_ROW_NO.
IF NOT LT_ROW_NO IS INITIAL.
LOOP AT LT_LIKP INTO LS_LIKP.
READ TABLE LT_ROW_NO INTO LS_ROW_NO WITH KEY ROW_ID = SY-TABIX.
IF SY-SUBRC = 0.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
LS_STYLEROW-FIELDNAME = ‘VBELN’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
LS_STYLEROW-FIELDNAME = ‘ERNAM’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
LS_STYLEROW-FIELDNAME = ‘ERDAT’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
LS_STYLEROW-FIELDNAME = ‘VSTEL’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
LS_STYLEROW-FIELDNAME = ‘VKORG’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

CLEAR: LS_LIKP-CELLTAB.
INSERT LINES OF LT_STYLEROW INTO TABLE LS_LIKP-CELLTAB.
MODIFY LT_LIKP FROM LS_LIKP TRANSPORTING CELLTAB.
CLEAR: LT_STYLEROW.
ELSE.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
LS_STYLEROW-FIELDNAME = ‘VBELN’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
LS_STYLEROW-FIELDNAME = ‘ERNAM’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
LS_STYLEROW-FIELDNAME = ‘ERDAT’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
LS_STYLEROW-FIELDNAME = ‘VSTEL’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
LS_STYLEROW-FIELDNAME = ‘VKORG’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

CLEAR: LS_LIKP-CELLTAB.
INSERT LINES OF LT_STYLEROW INTO TABLE LS_LIKP-CELLTAB.
MODIFY LT_LIKP FROM LS_LIKP TRANSPORTING CELLTAB.
CLEAR: LT_STYLEROW.
ENDIF.
ENDLOOP.
ENDIF.

CLEAR LT_ROW_NO.
CLEAR LS_ROW_NO.

IF O_GRID1->IS_READY_FOR_INPUT( ) EQ 0.
CALL METHOD O_GRID1->SET_READY_FOR_INPUT
EXPORTING
I_READY_FOR_INPUT = 1.

ELSE.
CALL METHOD O_GRID1->SET_READY_FOR_INPUT
EXPORTING
I_READY_FOR_INPUT = 0.
ENDIF.
CALL METHOD O_GRID1->REFRESH_TABLE_DISPLAY( ).

ENDFORM.
*&———————————————————————*
*& Form CREATE_HEADER_DATA
*&———————————————————————*
FORM CREATE_HEADER_DATA .
DATA: LS_NEW TYPE T_ZDB_EDIT_ALV,
LT_STYLEROW TYPE STANDARD TABLE OF LVC_S_STYL WITH DEFAULT KEY,
LS_STYLEROW TYPE LVC_S_STYL.

CLEAR: LS_NEW, LT_STYLEROW.

” Define editable fields

LS_STYLEROW-FIELDNAME = ‘VBELN’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

LS_STYLEROW-FIELDNAME = ‘ERNAM’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

LS_STYLEROW-FIELDNAME = ‘ERDAT’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

LS_STYLEROW-FIELDNAME = ‘VSTEL’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

LS_STYLEROW-FIELDNAME = ‘VKORG’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

” Assign celltab to new row
LS_NEW-CELLTAB = LT_STYLEROW.

” Insert new row at the beginning
APPEND LS_NEW TO LT_LIKP.

” Set grid to editable mode
CALL METHOD O_GRID1->SET_READY_FOR_INPUT
EXPORTING
I_READY_FOR_INPUT = 1.

” Refresh ALV to reflect changes
CALL METHOD O_GRID1->REFRESH_TABLE_DISPLAY.

ENDFORM.
*&———————————————————————*
*& Form DELETE_HEADER_DATA
*&———————————————————————
FORM DELETE_HEADER_DATA .
DATA: LT_ROWS TYPE LVC_T_ROW,
LS_ROW TYPE LVC_S_ROW,
LV_IDX TYPE SY-TABIX.
CALL METHOD O_GRID1->GET_SELECTED_ROWS
IMPORTING ET_INDEX_ROWS = LT_ROWS.
LOOP AT LT_ROWS INTO LS_ROW.
LV_IDX = LS_ROW-INDEX.
READ TABLE LT_LIKP INDEX LV_IDX INTO LS_LIKP.
IF SY-SUBRC = 0.
DELETE FROM ZDB_EDIT_ALV WHERE VBELN = LS_LIKP-VBELN and ERNAM = LS_LIKP-ERNAM.
DELETE LT_LIKP INDEX LV_IDX.
ENDIF.
ENDLOOP.
CALL METHOD O_GRID1->REFRESH_TABLE_DISPLAY.
COMMIT WORK.
MESSAGE ‘Selected header(s) deleted’ TYPE ‘S’.

ENDFORM.
*&———————————————————————*
*& Form SAVE_HEADER_DATA
*&———————————————————————*
TYPES: BEGIN OF TY_ZDB_EDIT_ALV_FLAT,
VBELN TYPE ZDB_EDIT_ALV-VBELN,
ERNAM TYPE ZDB_EDIT_ALV-ERNAM,
ERDAT TYPE ZDB_EDIT_ALV-ERDAT,
VSTEL TYPE ZDB_EDIT_ALV-VSTEL,
VKORG TYPE ZDB_EDIT_ALV-VKORG,
END OF TY_ZDB_EDIT_ALV_FLAT.

DATA: LS_DB_ALV_FLAT TYPE TY_ZDB_EDIT_ALV_FLAT.

FORM SAVE_HEADER_DATA .

DATA: LS_DB_ALV_FLAT TYPE TY_ZDB_EDIT_ALV_FLAT,
LV_VBELN TYPE ZDB_EDIT_ALV-VBELN,
LV_SKIPPED TYPE I VALUE 0,
LT_LIKP_CLEAN TYPE TABLE OF T_ZDB_EDIT_ALV,
LS_LIKP_CLEAN TYPE T_ZDB_EDIT_ALV,
LV_SAVED_ROWS TYPE I VALUE 0.

” Capture ALV changes
CALL METHOD O_GRID1->CHECK_CHANGED_DATA.

LOOP AT LT_LIKP INTO LS_LIKP.

” Skip empty header rows
IF LS_LIKP-VBELN IS INITIAL
AND LS_LIKP-ERNAM IS INITIAL
AND LS_LIKP-ERDAT IS INITIAL
AND LS_LIKP-VSTEL IS INITIAL
AND LS_LIKP-VKORG IS INITIAL.

LV_SKIPPED = LV_SKIPPED + 1.
CONTINUE.
ENDIF.

” Keep non-empty row for redisplay
LS_LIKP_CLEAN = LS_LIKP.
APPEND LS_LIKP_CLEAN TO LT_LIKP_CLEAN.

” Prepare structure for DB insert/update
CLEAR LS_DB_ALV_FLAT.
MOVE-CORRESPONDING LS_LIKP TO LS_DB_ALV_FLAT.

” Check if record exists
SELECT SINGLE VBELN
INTO @LV_VBELN
FROM ZDB_EDIT_ALV
WHERE VBELN = @LS_DB_ALV_FLAT-VBELN.

IF SY-SUBRC = 0.
” Record exists -> UPDATE
UPDATE ZDB_EDIT_ALV SET
ERNAM = @LS_DB_ALV_FLAT-ERNAM,
ERDAT = @LS_DB_ALV_FLAT-ERDAT,
VSTEL = @LS_DB_ALV_FLAT-VSTEL,
VKORG = @LS_DB_ALV_FLAT-VKORG
WHERE VBELN = @LS_DB_ALV_FLAT-VBELN.
ELSE.
” Record does not exist -> INSERT
INSERT ZDB_EDIT_ALV FROM LS_DB_ALV_FLAT.
ENDIF.

LV_SAVED_ROWS = LV_SAVED_ROWS + 1.

ENDLOOP.
” Replace the old internal table with the cleaned one (remove empty rows)
LT_LIKP = LT_LIKP_CLEAN.
COMMIT WORK.
*ENDIF.
” Message after save
IF LV_SKIPPED > 0.
MESSAGE |{ LV_SKIPPED } empty header record(s) were not saved and removed.| TYPE ‘I’.
ELSEIF LV_SAVED_ROWS < 0.
MESSAGE | { LV_SAVED_ROWS } without editing or creating anything were data not saved.| TYPE ‘I’.
ELSE.
MESSAGE ‘Header data saved successfully’ TYPE ‘S’.
ENDIF.
” Lock the grid after save
PERFORM DISABLE_ALL_CELLS_IN_HEADER.

CALL METHOD O_GRID1->SET_READY_FOR_INPUT
EXPORTING I_READY_FOR_INPUT = 0.

CALL METHOD O_GRID1->REFRESH_TABLE_DISPLAY.
ENDFORM.
*&———————————————————————*
*& Form UPDATE_HEADER_DATA
*&———————————————————————*
FORM UPDATE_HEADER_DATA .
CALL METHOD O_GRID1->CHECK_CHANGED_DATA.
LOOP AT LT_LIKP INTO LS_LIKP.
” Map to flat structure (exclude CELLTAB)
LS_DB_ALV_FLAT-VBELN = LS_LIKP-VBELN.
LS_DB_ALV_FLAT-ERNAM = LS_LIKP-ERNAM.
LS_DB_ALV_FLAT-ERDAT = LS_LIKP-ERDAT.
LS_DB_ALV_FLAT-VSTEL = LS_LIKP-VSTEL.
LS_DB_ALV_FLAT-VKORG = LS_LIKP-VKORG.
” Check if record exists
SELECT SINGLE VBELN
INTO @DATA(LV_VBELN)
FROM ZDB_EDIT_ALV
WHERE VBELN = @LS_DB_ALV_FLAT-VBELN
AND ERNAM = @LS_DB_ALV_FLAT-ERNAM.
IF SY-SUBRC = 0.
” Record exists -> UPDATE
UPDATE ZDB_EDIT_ALV SET
ERDAT = @LS_DB_ALV_FLAT-ERDAT,
VSTEL = @LS_DB_ALV_FLAT-VSTEL,
VKORG = @LS_DB_ALV_FLAT-VKORG
WHERE VBELN = @LS_DB_ALV_FLAT-VBELN AND ERNAM = @LS_DB_ALV_FLAT-ERNAM.
ELSE.
” Record does not exist -> INSERT
INSERT ZDB_EDIT_ALV FROM LS_DB_ALV_FLAT.
ENDIF.
ENDLOOP.
COMMIT WORK.
MESSAGE ‘Header data Updated successfully’ TYPE ‘S’.

” Make all fields non-editable after save
PERFORM DISABLE_ALL_CELLS_IN_HEADER.

” Set ALV to non-edit mode
CALL METHOD O_GRID1->SET_READY_FOR_INPUT
EXPORTING I_READY_FOR_INPUT = 0.

” Refresh ALV display
CALL METHOD O_GRID1->REFRESH_TABLE_DISPLAY.

ENDFORM.
*&———————————————————————*
*& Form CHANGE_ITEMS_MODE
*&———————————————————————*
FORM CHANGE_ITEMS_MODE .
DATA : LT_INDEX_ROWS TYPE LVC_T_ROW,
LT_ROW_NO TYPE LVC_T_ROID,
LS_ROW_NO TYPE LVC_S_ROID,
LS_STYLEROW TYPE LVC_S_STYL,
LT_STYLEROW TYPE TABLE OF LVC_S_STYL.

CALL METHOD O_GRID2->GET_SELECTED_ROWS
IMPORTING
* et_index_rows = lt_index_rows
ET_ROW_NO = LT_ROW_NO.

IF NOT LT_ROW_NO IS INITIAL.

LOOP AT LT_LIPS INTO LS_LIPS.

READ TABLE LT_ROW_NO INTO LS_ROW_NO WITH KEY ROW_ID = SY-TABIX.
IF SY-SUBRC = 0.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
LS_STYLEROW-FIELDNAME = ‘VBELN’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
LS_STYLEROW-FIELDNAME = ‘POSNR’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
LS_STYLEROW-FIELDNAME = ‘ERNAM’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
LS_STYLEROW-FIELDNAME = ‘MATNR’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
LS_STYLEROW-FIELDNAME = ‘WERKS’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

CLEAR: LS_LIPS-CELLTAB.
INSERT LINES OF LT_STYLEROW INTO TABLE LS_LIPS-CELLTAB.
MODIFY LT_LIPS FROM LS_LIPS TRANSPORTING CELLTAB.
CLEAR: LT_STYLEROW.
ELSE.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
LS_STYLEROW-FIELDNAME = ‘VBELN’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
LS_STYLEROW-FIELDNAME = ‘POSNR’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
LS_STYLEROW-FIELDNAME = ‘ERNAM’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
LS_STYLEROW-FIELDNAME = ‘MATNR’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
LS_STYLEROW-FIELDNAME = ‘WERKS’.
INSERT LS_STYLEROW INTO TABLE LT_STYLEROW.

CLEAR: LS_LIPS-CELLTAB.
INSERT LINES OF LT_STYLEROW INTO TABLE LS_LIPS-CELLTAB.
MODIFY LT_LIPS FROM LS_LIPS TRANSPORTING CELLTAB.
CLEAR: LT_STYLEROW.
ENDIF.
ENDLOOP.

ENDIF.

CLEAR LT_ROW_NO.
CLEAR LS_ROW_NO.

IF O_GRID2->IS_READY_FOR_INPUT( ) EQ 0.
CALL METHOD O_GRID2->SET_READY_FOR_INPUT
EXPORTING
I_READY_FOR_INPUT = 1.

ELSE.
CALL METHOD O_GRID2->SET_READY_FOR_INPUT
EXPORTING
I_READY_FOR_INPUT = 0.
ENDIF.
O_GRID2->REFRESH_TABLE_DISPLAY( ).

ENDFORM.
*&———————————————————————*
*& Form CREATE_ITEMS_DATA
*&———————————————————————
FORM CREATE_ITEMS_DATA .
DATA: LS_NEW TYPE T_ZDB_EDIT_ALV1,
LT_STYLEROW TYPE STANDARD TABLE OF LVC_S_STYL WITH DEFAULT KEY,
LS_STYLEROW TYPE LVC_S_STYL.

CLEAR: LS_NEW, LT_STYLEROW.

” Define editable fields

LS_STYLEROW-FIELDNAME = ‘VBELN’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

LS_STYLEROW-FIELDNAME = ‘POSNR’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

LS_STYLEROW-FIELDNAME = ‘ERNAM’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

LS_STYLEROW-FIELDNAME = ‘MATNR’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

LS_STYLEROW-FIELDNAME = ‘WERKS’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

” Assign celltab to new row
LS_NEW-CELLTAB = LT_STYLEROW.

” Insert new row at the beginning
APPEND LS_NEW TO LT_LIPS.

” Set grid to editable mode
CALL METHOD O_GRID2->SET_READY_FOR_INPUT
EXPORTING
I_READY_FOR_INPUT = 1.

” Refresh ALV to reflect changes
CALL METHOD O_GRID2->REFRESH_TABLE_DISPLAY.

ENDFORM.

TYPES: BEGIN OF TY_ZDB_EDIT_ALV1_FLAT,
VBELN TYPE ZDB_EDIT_ALV1-VBELN,
POSNR TYPE ZDB_EDIT_ALV1-POSNR,
ERNAM TYPE ZDB_EDIT_ALV1-ERNAM,
MATNR TYPE ZDB_EDIT_ALV1-MATNR,
WERKS TYPE ZDB_EDIT_ALV1-WERKS,
END OF TY_ZDB_EDIT_ALV1_FLAT.

DATA: LS_DB_ALV1 TYPE TY_ZDB_EDIT_ALV1_FLAT.
*&———————————————————————*
*& Form SAVE_ITEMS_DATA
*&———————————————————————
FORM SAVE_ITEMS_DATA .
DATA: LS_DB_ALV1 TYPE TY_ZDB_EDIT_ALV1_FLAT,
LS_DB_FULL TYPE ZDB_EDIT_ALV1,
LV_VBELN TYPE ZDB_EDIT_ALV1-VBELN,
LV_SKIPPED TYPE I VALUE 0,
LT_LIPS_CLEAN TYPE TABLE OF T_ZDB_EDIT_ALV1,
LS_LIPS_CLEAN TYPE T_ZDB_EDIT_ALV1,
LV_SAVED_ROWS TYPE I VALUE 0,
LV_HEADER_CHECK TYPE ZDB_EDIT_ALV-VBELN.

CALL METHOD O_GRID2->CHECK_CHANGED_DATA.

LOOP AT LT_LIPS INTO LS_LIPS.

” Skip empty item rows
IF LS_LIPS-VBELN IS INITIAL
AND LS_LIPS-POSNR IS INITIAL
AND LS_LIPS-ERNAM IS INITIAL
AND LS_LIPS-MATNR IS INITIAL
AND LS_LIPS-WERKS IS INITIAL.
LV_SKIPPED = LV_SKIPPED + 1.
CONTINUE.
ENDIF.

” # Check if header exists
SELECT SINGLE VBELN
INTO @LV_HEADER_CHECK
FROM ZDB_EDIT_ALV
WHERE VBELN = @LS_LIPS-VBELN AND ERNAM = @LS_LIPS-ERNAM.

IF SY-SUBRC <> 0.
LV_SKIPPED = LV_SKIPPED + 1.
CONTINUE. ” Don’t allow saving item without header
ENDIF.

” Keep non-empty row
LS_LIPS_CLEAN = LS_LIPS.
APPEND LS_LIPS_CLEAN TO LT_LIPS_CLEAN.

” Prepare flat structure
CLEAR LS_DB_ALV1.
MOVE-CORRESPONDING LS_LIPS TO LS_DB_ALV1.

” Check if item record exists
SELECT SINGLE VBELN
INTO @LV_VBELN
FROM ZDB_EDIT_ALV1
WHERE VBELN = @LS_DB_ALV1-VBELN
AND POSNR = @LS_DB_ALV1-POSNR
AND ERNAM = @LS_DB_ALV1-ERNAM.

IF SY-SUBRC = 0.
” UPDATE
UPDATE ZDB_EDIT_ALV1 SET
MATNR = @LS_DB_ALV1-MATNR,
WERKS = @LS_DB_ALV1-WERKS
WHERE VBELN = @LS_DB_ALV1-VBELN
AND POSNR = @LS_DB_ALV1-POSNR
AND ERNAM = @LS_DB_ALV1-ERNAM.
ELSE.
” INSERT
CLEAR LS_DB_FULL.
MOVE-CORRESPONDING LS_DB_ALV1 TO LS_DB_FULL.
INSERT ZDB_EDIT_ALV1 FROM LS_DB_FULL.
ENDIF.

LV_SAVED_ROWS = LV_SAVED_ROWS + 1.

ENDLOOP.

LT_LIPS = LT_LIPS_CLEAN.

COMMIT WORK.

” Final messaging
IF LV_SAVED_ROWS > 0.
MESSAGE ‘Item data saved successfully’ TYPE ‘S’.
ELSEIF LV_SKIPPED > 0.
MESSAGE |{ LV_SKIPPED } item row(s) were skipped – empty or missing header.| TYPE ‘I’.
ELSE.
MESSAGE ‘No item data saved.’ TYPE ‘I’.
ENDIF.

” Make all fields non-editable after save
PERFORM DISABLE_ALL_CELLS_IN_ITEMS.

” Set ALV to non-edit mode
CALL METHOD O_GRID2->SET_READY_FOR_INPUT
EXPORTING I_READY_FOR_INPUT = 0.

” Refresh ALV display
CALL METHOD O_GRID2->REFRESH_TABLE_DISPLAY.

ENDFORM.

*&———————————————————————*
*& Form UPDATE_ITEMS_DATA
*&———————————————————————*
FORM UPDATE_ITEMS_DATA .

DATA: LS_DB_ALV1 TYPE TY_ZDB_EDIT_ALV1_FLAT,
LS_DB_FULL TYPE ZDB_EDIT_ALV1,
LV_VBELN TYPE ZDB_EDIT_ALV1-VBELN.

” Ensure ALV changes are captured
CALL METHOD O_GRID2->CHECK_CHANGED_DATA.

LOOP AT LT_LIPS INTO LS_LIPS.

” Map to flat structure (exclude CELLTAB)
CLEAR LS_DB_ALV1.
LS_DB_ALV1-VBELN = LS_LIPS-VBELN.
LS_DB_ALV1-POSNR = LS_LIPS-POSNR.
LS_DB_ALV1-ERNAM = LS_LIPS-ERNAM.
LS_DB_ALV1-MATNR = LS_LIPS-MATNR.
LS_DB_ALV1-WERKS = LS_LIPS-WERKS.

” Check if record exists in DB
SELECT SINGLE VBELN
INTO @S_VBELN
FROM ZDB_EDIT_ALV1
WHERE VBELN = @LS_DB_ALV1-VBELN
AND POSNR = @LS_DB_ALV1-POSNR AND ERNAM = @LS_DB_ALV1-ERNAM.

IF SY-SUBRC = 0.
” Record exists -> UPDATE
UPDATE ZDB_EDIT_ALV1 SET
MATNR = @LS_DB_ALV1-MATNR,
WERKS = @LS_DB_ALV1-WERKS
WHERE VBELN = @LS_DB_ALV1-VBELN
AND POSNR = @LS_DB_ALV1-POSNR AND ERNAM = @LS_DB_ALV1-ERNAM.
ELSE.
” Record does not exist -> INSERT
CLEAR LS_DB_FULL.
MOVE-CORRESPONDING LS_DB_ALV1 TO LS_DB_FULL.
INSERT ZDB_EDIT_ALV1 FROM LS_DB_FULL.
ENDIF.

ENDLOOP.

COMMIT WORK.
IF SY-SUBRC <> 0.
MESSAGE ‘Item data saved successfully’ TYPE ‘S’.
ELSE.
MESSAGE ‘Created new row but empty record not saved’ type ‘I’.
ENDIF.

” Make all fields non-editable after save
PERFORM DISABLE_ALL_CELLS_IN_ITEMS.

” Set ALV to non-edit mode
CALL METHOD O_GRID2->SET_READY_FOR_INPUT
EXPORTING I_READY_FOR_INPUT = 0.

” Refresh ALV display
CALL METHOD O_GRID2->REFRESH_TABLE_DISPLAY.

ENDFORM.
*&———————————————————————*
*& Form DELETE_ITEMS_DATA
*&———————————————————————*
* text
*———————————————————————-*
* –> p1 text
* <– p2 text
*———————————————————————-*
FORM DELETE_ITEMS_DATA .

DATA: LT_ROWS TYPE LVC_T_ROW,
LS_ROW TYPE LVC_S_ROW,
LV_IDX TYPE SY-TABIX.

CALL METHOD O_GRID2->GET_SELECTED_ROWS
IMPORTING ET_INDEX_ROWS = LT_ROWS.

LOOP AT LT_ROWS INTO LS_ROW.
LV_IDX = LS_ROW-INDEX.
READ TABLE LT_LIPS INDEX LV_IDX INTO LS_LIPS.
IF SY-SUBRC = 0.
” Corrected DELETE to use both VBELN and POSNR
DELETE FROM ZDB_EDIT_ALV1 WHERE VBELN = LS_LIPS-VBELN AND POSNR = LS_LIPS-POSNR AND ERNAM = LS_LIPS-ERNAM.
DELETE LT_LIPS INDEX LV_IDX.
ENDIF.
ENDLOOP.

CALL METHOD O_GRID2->REFRESH_TABLE_DISPLAY.
COMMIT WORK.

MESSAGE ‘Selected item(s) deleted’ TYPE ‘S’.

ENDFORM.
*&———————————————————————*
*& Form DISABLE_ALL_CELLS_IN_HEADER
*&———————————————————————*
FORM DISABLE_ALL_CELLS_IN_HEADER .

DATA: LT_STYLEROW TYPE STANDARD TABLE OF LVC_S_STYL WITH DEFAULT KEY,
LS_STYLEROW TYPE LVC_S_STYL.

LOOP AT LT_LIKP INTO LS_LIKP.

CLEAR LT_STYLEROW.

LS_STYLEROW-FIELDNAME = ‘VBELN’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

LS_STYLEROW-FIELDNAME = ‘ERNAM’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

LS_STYLEROW-FIELDNAME = ‘ERDAT’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

LS_STYLEROW-FIELDNAME = ‘VSTEL’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

LS_STYLEROW-FIELDNAME = ‘VKORG’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

” Apply to current row
LS_LIKP-CELLTAB = LT_STYLEROW.
MODIFY LT_LIKP FROM LS_LIKP TRANSPORTING CELLTAB.

ENDLOOP.

ENDFORM.
*&———————————————————————*
*& Form DISABLE_ALL_CELLS_IN_ITEMS
*&———————————————————————*
FORM DISABLE_ALL_CELLS_IN_ITEMS .

DATA: LT_STYLEROW TYPE STANDARD TABLE OF LVC_S_STYL WITH DEFAULT KEY,
LS_STYLEROW TYPE LVC_S_STYL.

LOOP AT LT_LIPS INTO LS_LIPS.

CLEAR LT_STYLEROW.

LS_STYLEROW-FIELDNAME = ‘VBELN’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

LS_STYLEROW-FIELDNAME = ‘POSNR’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

LS_STYLEROW-FIELDNAME = ‘ERNAM’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

LS_STYLEROW-FIELDNAME = ‘MATNR’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

LS_STYLEROW-FIELDNAME = ‘WERKS’.
LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
APPEND LS_STYLEROW TO LT_STYLEROW.

” Apply to current row
LS_LIKP-CELLTAB = LT_STYLEROW.
MODIFY LT_LIPS FROM LS_LIPS TRANSPORTING CELLTAB.

ENDLOOP.

ENDFORM.    Read More Application Development and Automation Blog Posts articles 

#SAP

You May Also Like

More From Author