logo

Are you need IT Support Engineer? Free Consultant

Creating an Interactive Editable ALV in ABAP with …

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


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 drill down from header to item
  • Row-based editing using LVC_ROWMARK
  • Field-level edit control via CELLTAB
  • Full 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.

🔷 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

    TYPES: BEGIN OF T_ZDB_EDIT_ALV,         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,         CELLTAB TYPE LVC_T_STYL,       END OF T_ZDB_EDIT_ALV.

  • 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:

TYPES: BEGIN OF T_ZDB_EDIT_ALV1,         VBELN TYPE ZDB_EDIT_ALV1-VBELN,         POSNR TYPE ZDB_EDIT_ALV1-POSNR,         MATNR TYPE ZDB_EDIT_ALV1-MATNR,         WERKS TYPE ZDB_EDIT_ALV1-WERKS,         CELLTAB TYPE LVC_T_STYL,       END OF T_ZDB_EDIT_ALV1.

Naveennani8523_0-1749191172558.Png

🔷 4. Data Definitions

DATA: LT_LIKP TYPE TABLE OF T_ZDB_EDIT_ALV,      LS_LIKP TYPE T_ZDB_EDIT_ALV,       LT_LIPS TYPE TABLE OF T_ZDB_EDIT_ALV1,      LS_LIPS TYPE T_ZDB_EDIT_ALV1,

  • Internal tables and work areas for header (LT_LIKP, LS_LIKP) and item (LT_LIPS, LS_LIPS) records.

      LT_FCAT  TYPE LVC_T_FCAT,      LS_FCAT  TYPE LVC_S_FCAT,      LT_FCAT1 TYPE LVC_T_FCAT,      LS_FCAT1 TYPE LVC_S_FCAT,

  • Field catalog tables for header (LT_FCAT) and item (LT_FCAT1) ALVs.

      LS_LAYO  TYPE LVC_S_LAYO,      LS_LAYO1 TYPE LVC_S_LAYO,

  • Layout configurations for header and item grids.

      O_CONTAINER1 TYPE REF TO CL_GUI_CUSTOM_CONTAINER,      O_GRID1      TYPE REF TO CL_GUI_ALV_GRID,      O_CONTAINER2 TYPE REF TO CL_GUI_CUSTOM_CONTAINER,      O_GRID2      TYPE REF TO CL_GUI_ALV_GRID,

  • Containers and ALV grid objects for screen 200 (header) and screen 100 (item).

Naveennani8523_1-1749191172560.Png

5. Selection Screen Definition

  • Naveennani8523_2-1749191172561.Png 
  • 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.

Naveennani8523_3-1749191172563.Png

🔷 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

Naveennani8523_4-1749191172564.Png

  • 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

  • Naveennani8523_5-1749191172565.Png 
  • 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

  • Naveennani8523_6-1749191172565.Png 
  • 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

  • Naveennani8523_7-1749191172566.Png 
  • 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.
  1. FORM CREATE_OBJECT_LIPS – Initializes ALV on Screen 100 (Item).
  2. MODULE STATUS_0200 OUTPUT – Prepares header ALV on Screen 200.
  3. MODULE USER_COMMAND_0200 INPUT – Handles toolbar actions for header ALV.
  4. Then we’ll go deeper into the CRUD FORMs (CREATE/EDIT/UPDATE/DELETE/SAVE) for both header and item ALVs.
  5. FORM CREATE_OBJECT_LIPS – Create ALV Grid for Items

Naveennani8523_8-1749191172568.Png

🔹

Naveennani8523_9-1749191172569.Png

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)

Naveennani8523_10-1749191172570.Png

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:

Naveennani8523_11-1749191172571.Png

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

Field Catalog (LT_FCAT):

Each field is appended individually to LT_FCAT with attributes:

Naveennani8523_12-1749191172572.Png

 Layout for Header ALV:

Naveennani8523_13-1749191172572.Png

 Final ALV Setup:

  • Naveennani8523_14-1749191172573.Png 
  • Initializes header ALV with all settings and data.

Event Handler Registration:

Naveennani8523_15-1749191172574.Png

 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

  • Naveennani8523_16-1749191172575.Png 
  • 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.

Naveennani8523_17-1749191172578.Png

Naveennani8523_18-1749191172580.Png

Naveennani8523_19-1749191172582.Png

Naveennani8523_20-1749191172583.Png

🔹 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.
  • Naveennani8523_21-1749191172584.Png

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.
  • Naveennani8523_22-1749191172585.Png

🔷 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.
  • Naveennani8523_23-1749191172586.Png
  • Naveennani8523_24-1749191172587.Png

🔷 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

 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.

   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.

Naveennani8523_25-1749191172589.Png

 

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

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

  1. FORM CHANGE_ITEMS_MODE
  2. FORM CREATE_ITEMS_DATA
  3. FORM DELETE_ITEMS_DATA
  4. FORM SAVE_ITEMS_DATA
  5. FORM 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:

Naveennani8523_26-1749191172589.Png

 Header Output

Naveennani8523_27-1749191172591.Png

 When I was click on edit button

Naveennani8523_28-1749191172595.Png

 

Naveennani8523_29-1749191172596.Png

When I was click on create button

Naveennani8523_30-1749191172598.Png

When I was create a new row delete button

Naveennani8523_31-1749191172599.Png

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

Naveennani8523_32-1749191172600.Png

If I was save on empty row Its shows as

Naveennani8523_33-1749191172601.Png

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

Naveennani8523_34-1749191172601.Png

 

Naveennani8523_35-1749191172602.Png

 

Same actions performs in CURD operations in item level also:

Naveennani8523_36-1749191172603.Png

 

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    : 
*************************************************************************
*---------------------------------------------------------------------*
*                   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.

 



Source link

Leave a Reply

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