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