Objective
This program displays data from a custom table ZDB_SALES_CRUD in an editable ALV Grid. Based on user input, it allows creating new records, editing existing ones, and deleting selected entries from the table.
- Data Declarations
- Declares the DB table from which we will retrieve and update data.
- Defines a structure TY_VBAK_ALV that mirrors the structure of ZDB_SALES_CRUD. This is used for internal data handling.
Declares global data:
- GT_DATA: Internal table for ALV display.
- GS_DATA: Work area for processing one record at a time.
- GT_FIELDCAT: ALV field catalog table.
- GR_ALV_GRID: ALV Grid instance.
- GV_OK_CODE: Captures user commands.
🖥️ 2. Selection Screen
- Provides a simple UI for the user to choose between display or edit mode.
▶️3. Program Execution Starts
- Fetches data using GET_DATA and navigates to screen 100 which contains the ALV Grid.
🧩 4. Screen 100 – Module Pool
Module: STATUS_0100 (OUTPUT)
- Sets the GUI status (menu buttons like Create, Update, etc.)
- Instantiates the ALV Grid object.
- Builds the field catalog and populates the grid for the first time.
- Makes the grid editable if user chose “Edit” mode.
- Handles user interactions and maps them to specific FORM routines.
📥5. FORM: GET_DATA
Fetches all records from the database table into the internal table GT_DATA.
📊6. FORM: BUILD_FIELDCATALOG
- Dynamically builds the field catalog required by the ALV grid using a macro.
✏️7. FORM: ENABLE_EDITING
- Enables edit mode on the ALV grid.
➕8. FORM: CREATE_RECORD
-
Notifies the user to fill in data and save.
🔄9. FORM: UPDATE_RECORDS
CALL METHOD GR_ALV_GRID->CHECK_CHANGED_DATA.SELECT * FROM ZDB_SALES_CRUD INTO TABLE LT_EXISTING.
- Checks ALV for changes and fetches existing records from DB into a sorted table.
LOOP AT GT_DATA INTO GS_DATA. READ TABLE LT_EXISTING … WITH KEY VBELN POSNR.
- Compares input data with existing DB entries based on key fields.
IF SY-SUBRC = 0. UPDATE ZDB_SALES_CRUD FROM LS_EXISTING.ELSE. INSERT ZDB_SALES_CRUD FROM LS_EXISTING.ENDIF.
- Updates existing record or inserts a new one.
COMMIT WORK.REFRESH_TABLE_DISPLAY.MESSAGE ‘Records updated in database.' TYPE ‘S'.
- Saves changes and refreshes the grid.
❌10. FORM: DELETE_RECORDS
CALL METHOD GR_ALV_GRID->GET_SELECTED_ROWS IMPORTING ET_INDEX_ROWS = LT_INDICES.
- Gets user-selected rows for deletion.
LOOP AT LT_INDICES INTO LS_INDEX. READ TABLE GT_DATA INTO GS_DATA INDEX LV_TABIX. DELETE FROM ZDB_SALES_CRUD WHERE VBELN = … AND POSNR = .
- Deletes the record from the database and internal table.
COMMIT WORK.REFRESH_TABLE_DISPLAY.MESSAGE |{ LV_DELETED } record(s) deleted successfully.| TYPE ‘S'.
- Commits and informs the user of deleted rows.
CODE:
REPORT ZINSERT_SD_CUSTOM.
TABLES: ZDB_SALES_CRUD.
TYPES: BEGIN OF TY_VBAK_ALV,
VBELN TYPE ZDB_SALES_CRUD-VBELN,
POSNR TYPE ZDB_SALES_CRUD-POSNR,
ERNAM TYPE ZDB_SALES_CRUD-ERNAM,
AUART TYPE ZDB_SALES_CRUD-AUART,
VKORG TYPE ZDB_SALES_CRUD-VKORG,
MATNR TYPE ZDB_SALES_CRUD-MATNR,
ARKTX TYPE ZDB_SALES_CRUD-ARKTX,
WAERK TYPE ZDB_SALES_CRUD-WAERK,
END OF TY_VBAK_ALV.
DATA: GT_DATA TYPE STANDARD TABLE OF TY_VBAK_ALV,
GS_DATA TYPE TY_VBAK_ALV,
GT_FIELDCAT TYPE LVC_T_FCAT,
GS_FIELDCAT TYPE LVC_S_FCAT,
GR_ALV_GRID TYPE REF TO CL_GUI_ALV_GRID,
GV_OK_CODE TYPE SY-UCOMM.
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-002.
PARAMETERS: P_DISP RADIOBUTTON GROUP GRP1 DEFAULT 'X',
P_EDIT RADIOBUTTON GROUP GRP1.
SELECTION-SCREEN END OF BLOCK B1.
START-OF-SELECTION.
PERFORM GET_DATA.
CALL SCREEN 100.
*---------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS 'ZALV_STATUS'.
IF GR_ALV_GRID IS INITIAL.
CREATE OBJECT GR_ALV_GRID
EXPORTING
I_PARENT = CL_GUI_CONTAINER=>SCREEN0.
PERFORM BUILD_FIELDCATALOG.
CALL METHOD GR_ALV_GRID->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
IS_LAYOUT = VALUE LVC_S_LAYO( EDIT = ABAP_TRUE )
CHANGING
IT_OUTTAB = GT_DATA
IT_FIELDCATALOG = GT_FIELDCAT.
IF P_EDIT = 'X'.
CALL METHOD GR_ALV_GRID->SET_READY_FOR_INPUT
EXPORTING
I_READY_FOR_INPUT = 1.
ENDIF.
ENDIF.
ENDMODULE.
*---------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
GV_OK_CODE = SY-UCOMM.
CASE GV_OK_CODE.
WHEN 'CREATE'.
PERFORM CREATE_RECORD.
WHEN 'EDIT'.
PERFORM ENABLE_EDITING.
WHEN 'UPDATE'.
PERFORM UPDATE_RECORDS.
WHEN 'DELETE'.
PERFORM DELETE_RECORDS.
WHEN 'BACK' OR 'EXIT' OR 'CANCEL'.
LEAVE PROGRAM.
ENDCASE.
ENDMODULE.
*---------------------------------------------------------------------*
FORM GET_DATA.
CLEAR GT_DATA.
SELECT VBELN POSNR ERNAM AUART VKORG MATNR ARKTX WAERK
FROM ZDB_SALES_CRUD
INTO TABLE GT_DATA.
ENDFORM.
*---------------------------------------------------------------------*
FORM BUILD_FIELDCATALOG.
CLEAR GT_FIELDCAT.
DEFINE ADD_FIELD.
CLEAR gs_fieldcat.
gs_fieldcat-fieldname = &1.
gs_fieldcat-coltext = &2.
APPEND gs_fieldcat TO gt_fieldcat.
END-OF-DEFINITION.
ADD_FIELD 'VBELN' 'Sales Document'.
ADD_FIELD 'POSNR' 'Item No'.
ADD_FIELD 'ERNAM' 'Created By'.
ADD_FIELD 'AUART' 'Sales Doc Type'.
ADD_FIELD 'VKORG' 'Sales Org'.
ADD_FIELD 'MATNR' 'Material'.
ADD_FIELD 'ARKTX' 'Description'.
ADD_FIELD 'WAERK' 'Currency'.
ENDFORM.
*---------------------------------------------------------------------*
FORM ENABLE_EDITING.
CALL METHOD GR_ALV_GRID->SET_READY_FOR_INPUT
EXPORTING
I_READY_FOR_INPUT = 1.
ENDFORM.
*---------------------------------------------------------------------*
FORM CREATE_RECORD.
DATA: LS_NEW TYPE TY_VBAK_ALV.
CLEAR LS_NEW.
APPEND LS_NEW TO GT_DATA.
CALL METHOD GR_ALV_GRID->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = VALUE LVC_S_STBL( ROW = 'X' COL = 'X' ).
CALL METHOD GR_ALV_GRID->SET_READY_FOR_INPUT
EXPORTING
I_READY_FOR_INPUT = 1.
MESSAGE 'Enter new row data and press UPDATE.' TYPE 'S'.
ENDFORM.
*---------------------------------------------------------------------*
FORM UPDATE_RECORDS.
CALL METHOD GR_ALV_GRID->CHECK_CHANGED_DATA.
DATA: LT_EXISTING TYPE SORTED TABLE OF ZDB_SALES_CRUD
WITH UNIQUE KEY VBELN POSNR,
LS_EXISTING TYPE ZDB_SALES_CRUD.
" Fetch all existing records
SELECT * FROM ZDB_SALES_CRUD INTO TABLE LT_EXISTING.
LOOP AT GT_DATA INTO GS_DATA.
READ TABLE LT_EXISTING INTO LS_EXISTING
WITH KEY VBELN = GS_DATA-VBELN
POSNR = GS_DATA-POSNR.
IF SY-SUBRC = 0.
" Update existing
MOVE-CORRESPONDING GS_DATA TO LS_EXISTING.
UPDATE ZDB_SALES_CRUD FROM LS_EXISTING.
ELSE.
" Insert new
MOVE-CORRESPONDING GS_DATA TO LS_EXISTING.
INSERT ZDB_SALES_CRUD FROM LS_EXISTING.
ENDIF.
ENDLOOP.
COMMIT WORK.
PERFORM GET_DATA.
CALL METHOD GR_ALV_GRID->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = VALUE LVC_S_STBL( ROW = 'X' COL = 'X' ).
MESSAGE 'Records updated in database.' TYPE 'S'.
ENDFORM.
*---------------------------------------------------------------------*
FORM DELETE_RECORDS.
DATA: LT_INDICES TYPE LVC_T_ROW,
LS_INDEX TYPE LVC_S_ROW,
LV_TABIX TYPE SY-TABIX,
LV_DELETED TYPE I VALUE 0.
CALL METHOD GR_ALV_GRID->GET_SELECTED_ROWS
IMPORTING
ET_INDEX_ROWS = LT_INDICES.
SORT LT_INDICES BY INDEX DESCENDING.
LOOP AT LT_INDICES INTO LS_INDEX.
LV_TABIX = LS_INDEX-INDEX.
READ TABLE GT_DATA INTO GS_DATA INDEX LV_TABIX.
IF SY-SUBRC = 0.
DELETE FROM ZDB_SALES_CRUD
WHERE VBELN = _DATA-VBELN AND POSNR = _DATA-POSNR.
IF SY-SUBRC = 0.
DELETE GT_DATA INDEX LV_TABIX.
LV_DELETED = LV_DELETED + 1.
ENDIF.
ENDIF.
ENDLOOP.
COMMIT WORK.
CALL METHOD GR_ALV_GRID->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = VALUE LVC_S_STBL( ROW = 'X' COL = 'X' ).
IF LV_DELETED > 0.
MESSAGE |{ LV_DELETED } record(s) deleted successfully.| TYPE 'S'.
ELSE.
MESSAGE 'No records were deleted. Please check keys.' TYPE 'I'.
ENDIF.
ENDFORM.



