05-14-2020 5:46 PM
Hi, currently im trying to add some validation to my editable ALV report.
This is what i am trying to do:
1. Make EBELN field mandatory in header and line item
2. When append (method: CREATE_PURCHASE_ORDERS, in url below) a new record in header, once key in ebeln in header, press enter, it will auto populate sy-datum in header (bedat field) and ebeln in line item,
Any appropriate source for me to look into? couldnt find a suitable one
Looked through BCALV_EDIT_04
My source code can be seen in this url, in the comment section:
05-14-2020 6:00 PM
Hi,
You should be able to solve this by implementing logic in the data_changed event of the ALV.
An example can be found in following question:
https://answers.sap.com/questions/6638943/how-to-validate-editable-field-in-alv.html
Best regards,
Geert-Jan Klaps
05-15-2020 9:36 AM
Hi,
When Append (&LOCAL&APPEND), key in PO header details in a new entry.
If without entering ebeln field in PO header and click 'save' button, it will prompt error message 'Please enter PO number hdr'
How do i apply this data_change subroutine in PAI on the 'save', it prompts the following error when i added it on PAI 'save'.
05-15-2020 9:53 AM
This is the program source code with data_changed added
CLASS LCL_EVENTHANDLER DEFINITION DEFERRED.
DATA: GT_ZHEADER TYPE TABLE OF ZEKKO03, ""global variable for ZEKKO03
GT_ZITEMS TYPE TABLE OF ZEKPO03. ""global variable for ZEKPO03
DATA: GS_ZHEADER TYPE ZEKKO03,
GS_ZITEMS LIKE LINE OF GT_ZITEMS.
DATA: SPLITTER TYPE REF TO CL_GUI_SPLITTER_CONTAINER,
GRAPHIC_PARENT1 TYPE REF TO CL_GUI_CONTAINER,
GRAPHIC_PARENT2 TYPE REF TO CL_GUI_CONTAINER.
DATA: G_GRID_LEFT TYPE REF TO CL_GUI_ALV_GRID, "" instance for left grid
G_GRID_RIGHT TYPE REF TO CL_GUI_ALV_GRID, "" instance for right grid
GS_LAYOUT TYPE LVC_S_LAYO, "" global structure for layout
GT_FIELDCAT TYPE LVC_T_FCAT, "" global variable for fieldcat
GS_FIELDCAT TYPE LVC_S_FCAT, "" global structure for fieldcat
CHECK,
GT_SORT TYPE LVC_T_SORT,
GS_SORT TYPE LVC_S_SORT.
DATA: BAPIRET2 TYPE BAPIRET2.
CONSTANTS: IV_MAX_ROWS TYPE I VALUE 100.
*** Alv toolbar
DATA: EVENT_HANDLER TYPE REF TO LCL_EVENTHANDLER.
*---------------------------------------------------------------------*
* CLASS lcl_eventhandler DEFINITION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS LCL_EVENTHANDLER DEFINITION." class definition
PUBLIC SECTION.
CLASS-METHODS:
HANDLE_DOUBLE_CLICK FOR EVENT DOUBLE_CLICK OF CL_GUI_ALV_GRID
IMPORTING
E_ROW
E_COLUMN
ES_ROW_NO
SENDER.
******
METHODS handle_data_changed
FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING er_data_changed
e_onf4
e_onf4_before
e_onf4_after
e_ucomm.
******
ENDCLASS. "LCL_EVENT_RECEIVER DEFINITION
START-OF-SELECTION.
CALL SCREEN 100.
*&---------------------------------------------------------------------*
*& Form read_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM READ_DATA_HEADER.
DATA:
LT_ZHEADER TYPE TABLE OF ZEKKO03,
LS_ZHEADER TYPE ZEKKO03.
CALL METHOD ZCL_03_DATA_MODEL=>SELECT_PURCHASE_ORDERS
EXPORTING
IV_MAX_ROWS = IV_MAX_ROWS
IMPORTING
IT_ZHEADER = GT_ZHEADER.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form display_grid
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM DISPLAY_GRID.
DATA: SPLITTER TYPE REF TO CL_GUI_SPLITTER_CONTAINER,
GRAPHIC_PARENT1 TYPE REF TO CL_GUI_CONTAINER,
GRAPHIC_PARENT2 TYPE REF TO CL_GUI_CONTAINER.
*----------------------------------------------------------------------*
* FOR VARIANT
*----------------------------------------------------------------------*
DATA LS_VARIANT TYPE DISVARIANT .
DATA SAVE TYPE C.
SAVE = 'A'.
CREATE OBJECT SPLITTER
EXPORTING
PARENT = CL_GUI_CONTAINER=>DEFAULT_SCREEN
ROWS = 1
COLUMNS = 2
ALIGN = 15.
CALL METHOD SPLITTER->GET_CONTAINER
EXPORTING
ROW = 1
COLUMN = 1
RECEIVING
CONTAINER = GRAPHIC_PARENT1.
CALL METHOD SPLITTER->GET_CONTAINER
EXPORTING
ROW = 1
COLUMN = 2
RECEIVING
CONTAINER = GRAPHIC_PARENT2.
CREATE OBJECT G_GRID_LEFT
EXPORTING
I_PARENT = GRAPHIC_PARENT1.
CREATE OBJECT G_GRID_RIGHT
EXPORTING
I_PARENT = GRAPHIC_PARENT2.
LS_VARIANT-REPORT = SY-REPID.
PERFORM FIELDCAT.
PERFORM SORT.
GS_LAYOUT-EDIT = ABAP_TRUE.
gs_layout-sel_mode = 'D'.
CALL METHOD G_GRID_LEFT->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
IS_VARIANT = LS_VARIANT
I_STRUCTURE_NAME = 'ZEKKO03'
I_SAVE = SAVE
IS_LAYOUT = GS_LAYOUT
CHANGING
IT_OUTTAB = GT_ZHEADER
IT_FIELDCATALOG = GT_FIELDCAT
IT_SORT = GT_SORT
EXCEPTIONS
INVALID_PARAMETER_COMBINATION = 1
PROGRAM_ERROR = 2
TOO_MANY_LINES = 3
OTHERS = 4.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
PERFORM FIELDCAT.
CALL METHOD G_GRID_RIGHT->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
IS_VARIANT = LS_VARIANT
I_STRUCTURE_NAME = 'ZEKPO03'
IS_LAYOUT = GS_LAYOUT
I_SAVE = SAVE
CHANGING
IT_OUTTAB = GT_ZITEMS
IT_FIELDCATALOG = GT_FIELDCAT
IT_SORT = GT_SORT
EXCEPTIONS
INVALID_PARAMETER_COMBINATION = 1
PROGRAM_ERROR = 2
TOO_MANY_LINES = 3
OTHERS = 4.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDFORM. "display_grid
*&---------------------------------------------------------------------*
*& Form sort
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM FIELDCAT.
DATA: NO TYPE I VALUE 1.
IF G_GRID_LEFT IS NOT INITIAL.
CLEAR GT_FIELDCAT.
GS_FIELDCAT-ROW_POS = NO.
GS_FIELDCAT-FIELDNAME = 'EBELN'.
GS_FIELDCAT-TABNAME = 'ZEKKO03'.
GS_FIELDCAT-OUTPUTLEN = 20.
APPEND GS_FIELDCAT TO GT_FIELDCAT.
ELSEIF G_GRID_RIGHT IS NOT INITIAL.
APPEND GS_FIELDCAT TO GT_FIELDCAT.
ENDIF.
ENDFORM. "fieldname
FORM SORT.
DATA: NO TYPE I VALUE 1.
IF G_GRID_LEFT IS NOT INITIAL.
CLEAR gt_sort.
no = no + 1.
GS_SORT-SPOS = NO.
GS_SORT-FIELDNAME = 'EBELN'.
GS_SORT-DOWN = 'X'.
APPEND GS_SORT TO GT_SORT.
ELSEIF g_grid_right IS NOT INITIAL.
CLEAR gt_sort.
GS_SORT-SPOS = NO.
GS_SORT-FIELDNAME = 'EBELN'.
GS_SORT-DOWN = 'X'.
APPEND GS_SORT TO GT_SORT.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS 'MAIN'.
SET TITLEBAR 'ZPROJ03_ALV'.
IF G_GRID_LEFT IS INITIAL.
PERFORM READ_DATA_HEADER.
PERFORM DISPLAY_GRID.
PERFORM SWITCH_EDIT_MODE.
CREATE OBJECT EVENT_HANDLER.
SET HANDLER EVENT_HANDLER->HANDLE_DOUBLE_CLICK FOR G_GRID_LEFT.
ENDIF.
ENDMODULE. " STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
CALL METHOD CL_GUI_CFW=>DISPATCH.
CASE SY-UCOMM.
WHEN 'BACK'.
SET SCREEN 0. LEAVE SCREEN.
WHEN 'EXIT'.
SET SCREEN 0. LEAVE SCREEN.
WHEN 'CANCEL'.
LEAVE PROGRAM. LEAVE SCREEN.
WHEN 'DELETE'.
PERFORM SAVE_DATABASE_DELETE.
WHEN 'SAVE'.
PERFORM SAVE_DATABASE_UPDATE.
PERFORM data_changed.
WHEN '&LOCAL&APPEND'.
PERFORM SAVE_DATABASE_APPEND.
WHEN 'SWITCH'.
PERFORM SWITCH_EDIT_MODE.
WHEN OTHERS.
* do nothing
ENDCASE.
ENDMODULE. " USER_COMMAND_0100 INPUT
* ===============================================================
* LOCAL CLASSES: IMPLEMENTATION
* ===============================================================
CLASS LCL_EVENTHANDLER IMPLEMENTATION." implementation
METHOD HANDLE_DOUBLE_CLICK.
* define local data
DATA:
LT_ZHEADER TYPE TABLE OF ZEKKO03,
LT_ZITEMS2 TYPE TABLE OF ZEKPO03,
LS_ZHEADER TYPE ZEKKO03,
LS_ZITEMS2 LIKE LINE OF LT_ZITEMS2. """ like line of applicable to structure for ztables
IF e_row-index gt 0.
READ TABLE GT_ZHEADER INDEX e_row-index INTO LS_ZHEADER. """use ALV internal table to perform read data
CALL METHOD ZCL_03_DATA_MODEL=>SELECT_PURCHASE_ORDERS """""select line items based on header
EXPORTING
IV_KEY = LS_Zheader-EBELN
* IV_MAX_ROWS =
IMPORTING
* IT_ZHEADER =
IT_ZITEMS = LT_ZITEMS2
* ES_BAPIRET2 =
.
ENDIF.
GT_ZITEMS = LT_ZITEMS2.
G_GRID_RIGHT->REFRESH_TABLE_DISPLAY( ).
ENDMETHOD.
******
METHOD handle_data_changed.
PERFORM data_changed USING er_data_changed.
ENDMETHOD.
*
*******
ENDCLASS. "LCL_EVENT_RECEIVER IMPLEMENTATION
<br>
05-15-2020 10:02 AM
Continuing program source code, Ive attached respective methods
Sorry for the trouble
FORM data_changed USING p_er_data_changed TYPE REF TO cl_alv_changed_data_protocol.
DATA: ls_mod_cells TYPE lvc_s_modi,
lv_ebeln TYPE zebeln_emnt.
DATA:
LT_ZHEADER_MOD TYPE TABLE OF ZEKKO03,
LT_ZITEMS_mod TYPE TABLE OF ZEKPO03,
LS_ZHEADER_mod TYPE ZEKKO03,
LS_ZITEMS_mod LIKE LINE OF LT_ZITEMS_mod.
loop at p_er_data_changed->mt_good_cells INTO ls_mod_cells.
CASE ls_mod_cells-fieldname.
WHEN 'EBELN'.
CALL METHOD p_er_data_changed->get_cell_value
EXPORTING
i_row_id = ls_mod_cells-row_id
i_fieldname = 'EBELN'
IMPORTING
e_value = lv_ebeln.
CALL METHOD ZCL_03_DATA_MODEL=>SELECT_PURCHASE_ORDERS
EXPORTING
* IV_KEY =
IV_MAX_ROWS = IV_MAX_ROWS
IMPORTING
IT_ZHEADER = lt_zheader_mod .
CALL METHOD ZCL_03_DATA_MODEL=>SELECT_PURCHASE_ORDERS
EXPORTING
IV_KEY = lv_ebeln
* IV_MAX_ROWS = 0
IMPORTING
IT_ZHEADER = lt_zheader_mod
.
gt_zheader = lt_zheader_mod.
PERFORM save_database_update.
if lv_ebeln IS INITIAL.
CALL METHOD p_er_data_changed->add_protocol_entry
EXPORTING
i_msgid = 'ZMM'
i_msgno = '999'
i_msgty = 'E'
i_msgv1 = 'Please enter PO number hdr'
i_fieldname = ls_mod_cells-fieldname
i_row_id = ls_mod_cells-row_id.
EXIT.
endif.
g_grid_left->refresh_table_display( ).
ENDCASE.
ENDLOOP.
ENDFORM.
*****
FORM SWITCH_EDIT_MODE.
IF G_GRID_LEFT->IS_READY_FOR_INPUT( ) EQ 0.
CALL METHOD G_GRID_LEFT->SET_READY_FOR_INPUT
EXPORTING
I_READY_FOR_INPUT = 1.
ELSE.
CALL METHOD G_GRID_LEFT->SET_READY_FOR_INPUT
EXPORTING
I_READY_FOR_INPUT = 0.
ENDIF.
ENDFORM. " SWITCH_EDIT_MODE
*&---------------------------------------------------------------------*
*& Form SAVE TO DB
*&---------------------------------------------------------------------*
* text : saving into DDIC from internal table
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM SAVE_DATABASE_APPEND.
DATA:
LT_ZHEADER_APP TYPE TABLE OF ZEKKO03,
LT_ZITEMS_APP TYPE TABLE OF ZEKPO03,
LS_ZHEADER_APP TYPE ZEKKO03,
LS_ZITEMS_APP LIKE LINE OF LT_ZITEMS_APP.
CALL METHOD G_GRID_LEFT->CHECK_CHANGED_DATA
IMPORTING
E_VALID = CHECK.
CALL METHOD G_GRID_RIGHT->CHECK_CHANGED_DATA
IMPORTING
E_VALID = CHECK.
CALL METHOD ZCL_03_DATA_MODEL=>CREATE_PURCHASE_ORDERS
EXPORTING
IT_ZHEADER = LT_ZHEADER_APP
IT_ZITEMS = LT_ZITEMS_APP.
GT_ZHEADER = LT_ZHEADER_APP.
GT_ZITEMS = LT_ZITEMS_APP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form SAVE TO DB
*&---------------------------------------------------------------------*
* text : saving into DDIC from internal table
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM SAVE_DATABASE_UPDATE.
CALL METHOD G_GRID_LEFT->CHECK_CHANGED_DATA
IMPORTING
E_VALID = CHECK.
CALL METHOD G_GRID_RIGHT->CHECK_CHANGED_DATA
IMPORTING
E_VALID = CHECK.
CALL METHOD ZCL_03_DATA_MODEL=>UPDATE_PURCHASE_ORDERS
EXPORTING
IT_ZHEADER = GT_ZHEADER
IT_ZITEMS = GT_ZITEMS
IMPORTING
ES_BAPIRET2 = BAPIRET2.
ENDFORM.
FORM SAVE_DATABASE_DELETE.
DATA:
LT_ZHEADER_DEL TYPE TABLE OF ZEKKO03,
LT_ZITEMS2_DEL TYPE TABLE OF ZEKPO03,
LS_ZHEADER_DEL TYPE ZEKKO03,
LS_ZITEMS2_DEL LIKE LINE OF LT_ZITEMS2_DEL.
DATA:
LT_ZHEADER_DEL_01 TYPE TABLE OF ZEKKO03,
LT_ZITEMS2_DEL_01 TYPE TABLE OF ZEKPO03.
DATA: LT_ROWID_DEL TYPE LVC_T_ROID,
LS_ROWIN_DEL LIKE LINE OF LT_ROWID_DEL.
CALL METHOD G_GRID_LEFT->GET_SELECTED_ROWS
IMPORTING
ET_ROW_NO = LT_ROWID_DEL.
*--- Through the index capturing the values of selected rows
LOOP AT LT_ROWID_DEL INTO LS_ROWIN_DEL. """" to get a row
CALL METHOD ZCL_03_DATA_MODEL=>SELECT_PURCHASE_ORDERS """get all data for header
EXPORTING
* IV_KEY =
IV_MAX_ROWS = IV_MAX_ROWS
IMPORTING
IT_ZHEADER = LT_ZHEADER_DEL .
READ TABLE gt_zheader INDEX LS_ROWIN_DEL-ROW_ID INTO LS_ZHEADER_DEL.
CLEAR LT_ZHEADER_DEL.
CALL METHOD ZCL_03_DATA_MODEL=>SELECT_PURCHASE_ORDERS
EXPORTING
IV_KEY = LS_ZHEADER_DEL-EBELN
* IV_MAX_ROWS = 0
IMPORTING
IT_ZHEADER = LT_ZHEADER_DEL
* IT_ZITEMS =
* ES_BAPIRET2 =
.
CALL METHOD ZCL_03_DATA_MODEL=>SELECT_PURCHASE_ORDERS """get a row of line item based on key
EXPORTING
IV_KEY = LS_ZHEADER_DEL-EBELN
* IV_MAX_ROWS =
IMPORTING
* IT_ZHEADER =
IT_ZITEMS = LT_ZITEMS2_DEL
* ES_BAPIRET2 =
.
CALL METHOD ZCL_03_DATA_MODEL=>DELETE_PURCHASE_ORDERS
EXPORTING
IT_ZHEADER = LT_ZHEADER_DEL
IT_ZITEMS = LT_ZITEMS2_DEL .
ENDLOOP.
CALL METHOD ZCL_03_DATA_MODEL=>SELECT_PURCHASE_ORDERS
EXPORTING
IV_MAX_ROWS = IV_MAX_ROWS
IMPORTING
IT_ZHEADER = LT_ZHEADER_DEL_01 .
CALL METHOD ZCL_03_DATA_MODEL=>SELECT_PURCHASE_ORDERS
EXPORTING
IV_KEY = LS_ZHEADER_DEL-EBELN
* IV_MAX_ROWS =
IMPORTING
* IT_ZHEADER =
IT_ZITEMS = LT_ZITEMS2_DEL_01
* ES_BAPIRET2 =
.
GT_ZHEADER = LT_ZHEADER_DEL_01.
GT_ZITEMS = LT_ZITEMS2_DEL_01.
G_GRID_LEFT->REFRESH_TABLE_DISPLAY( ).
G_GRID_RIGHT->REFRESH_TABLE_DISPLAY( ).
CLEAR LT_ZITEMS2_DEL.
CLEAR LT_ZHEADER_DEL_01.
CLEAR LT_ZITEMS2_DEL_01.
ENDFORM. " SAVE_DATABASE<br>
05-15-2020 10:14 AM
05-15-2020 5:23 AM
I wanted to add the error in SAVE_DATABASE_APPEND subroutine in my program to make ebeln as mandatory field, anything that i have missed?
05-15-2020 10:06 AM
Hi
In your METHOD UPDATE_PURCHASE_ORDERS., you may add a validation routine
Perform Validate - in that loop through it_header table and if any ebeln is initial set the flag ok_to_save to 'N'.
In the method put if statement as IF ok_to_save = 'Y'......
else display the message.
05-15-2020 11:41 AM
Hi sorry dont get you
Is it something like this? Please correct me
value( IT_ZHEADER ) TYPE ZEKKO03_TT PO Header Table Type
value( IT_ZITEMS ) TYPE ZEKPO03_TT PO Item Table Type
IV_SAVE TYPE BOOLEAN Boolean Variable (X = True, - = False, Space = Unknown)
value( ES_BAPIRET2 ) TYPE BAPIRET2 Return Parameter
METHOD UPDATE_PURCHASE_ORDERS.
DATA: ls_zheader LIKE LINE OF it_zheader,
lv_ebeln TYPE zekko03-ebeln.
if it_zheader IS NOT INITIAL.
modify zekko03 FROM TABLE it_zheader .
IF SY-SUBRC = 0.
COMMIT WORK.
ES_BAPIRET2-TYPE = 'S'.
ES_BAPIRET2-MESSAGE = 'Successfully updated for table ZEKKO03'.
ELSE.
ROLLBACK WORK.
ES_BAPIRET2-TYPE = 'E'.
ES_BAPIRET2-MESSAGE = 'Error updating table ZEKKO03'.
ENDIF.
modify zekpo03 FROM TABLE it_zitems .
IF SY-SUBRC = 0.
COMMIT WORK.
ES_BAPIRET2-TYPE = 'S'.
ES_BAPIRET2-MESSAGE = 'Successfully updated for table ZEKKO03'.
ELSE.
ROLLBACK WORK.
ES_BAPIRET2-TYPE = 'E'.
ES_BAPIRET2-MESSAGE = 'Error updating table ZEKKO03'.
ENDIF.
endif.
LOOP AT it_zheader INTO ls_zheader.
IF lv_ebeln IS INITIAL.
if iv_save = '-'.
MESSAGE 'Please enter PO number' TYPE 'E'.
elseif iv_save = 'X'.
endif.
ENDIF.
ENDLOOP.<br>
05-15-2020 12:21 PM
Hi
Please as below
Declare a global variable iv_save type c length 1 default space.
In your method, include statement as below
METHOD UPDATE_PURCHASE_ORDERS.
DATA: ls_zheader LIKE LINE OF it_zheader,
lv_ebeln TYPE zekko03-ebeln.
PERFORM VALIDATE_IT. <===== ADD STATEMENT LINE HERE
IF IV_SAVE = 'Y' <== add if statement to validate if the flag is okay
if it_zheader IS NOT INITIAL.
....
.....
ENDIF.
ELSE.
MESSAGE 'IN INTERNAL TABLE PO NUMBER IS MISSING'.. TYPE 'S' DISPLAY LIKE 'S'.
ENDIF<br>
and in the subroutine
FORM VALIDATE_IT.
IV_SAVE = 'Y'.
LOOP IT_HEADER INTO LS_HEADER.
IF LS_HEADER-EBELN = ''.
IV_SAVE = 'N'.
ENDIF.
ENDLOOP.
ENDFORM
05-15-2020 3:35 PM
Hi sir, cant actually include perform in method, perform can only be included in program, else it will prompt this error
Im doing it this way instead, not sure if its correct logically. When the code is added, it affects the update, meaning update not reflected
value( IT_ZHEADER ) TYPE ZEKKO03_TT PO Header Table Type
value( IT_ZITEMS ) TYPE ZEKPO03_TT PO Item Table Type
value( IV_SAVE ) TYPE C OPTIONAL
value( ES_BAPIRET2 ) TYPE BAPIRET2 Return Parameter
METHOD UPDATE_PURCHASE_ORDERS.
DATA: ls_zheader LIKE LINE OF it_zheader,
lv_ebeln TYPE zekko03-ebeln.
if iv_save = 'Y'.
if it_zheader IS NOT INITIAL.
modify zekko03 FROM TABLE it_zheader .
IF SY-SUBRC = 0.
COMMIT WORK.
ES_BAPIRET2-TYPE = 'S'.
ES_BAPIRET2-MESSAGE = 'Successfully updated for table ZEKKO03'.
ELSE.
ROLLBACK WORK.
ES_BAPIRET2-TYPE = 'E'.
ES_BAPIRET2-MESSAGE = 'Error updating table ZEKKO03'.
ENDIF.
modify zekpo03 FROM TABLE it_zitems .
IF SY-SUBRC = 0.
COMMIT WORK.
ES_BAPIRET2-TYPE = 'S'.
ES_BAPIRET2-MESSAGE = 'Successfully updated for table ZEKKO03'.
ELSE.
ROLLBACK WORK.
ES_BAPIRET2-TYPE = 'E'.
ES_BAPIRET2-MESSAGE = 'Error updating table ZEKKO03'.
ENDIF.
endif.
else.
MESSAGE 'Please enter PO number' TYPE 'S' DISPLAY LIKE 'S'.
endif.
ENDMETHOD.
<br>
DATA: GT_ZHEADER TYPE TABLE OF ZEKKO03, ""global variable for ZEKKO03
GT_ZITEMS TYPE TABLE OF ZEKPO03. ""global variable for ZEKPO03
DATA: GS_ZHEADER TYPE ZEKKO03,
GS_ZITEMS LIKE LINE OF GT_ZITEMS,
gv_save TYPE c LENGTH 1 VALUE ' '.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
CASE SY-UCOMM.
WHEN 'SAVE'.
PERFORM SAVE_DATABASE_UPDATE.
PERFORM validate_update.
ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form SAVE TO DB
*&---------------------------------------------------------------------*
* text : saving into DDIC from internal table
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM SAVE_DATABASE_UPDATE.
CALL METHOD G_GRID_LEFT->CHECK_CHANGED_DATA
IMPORTING
E_VALID = CHECK.
CALL METHOD G_GRID_RIGHT->CHECK_CHANGED_DATA
IMPORTING
E_VALID = CHECK.
* CALL METHOD ZCL_03_DATA_MODEL=>UPDATE_PURCHASE_ORDERS
* EXPORTING
* IT_ZHEADER = GT_ZHEADER
* IT_ZITEMS = GT_ZITEMS
* IMPORTING
* ES_BAPIRET2 = BAPIRET2.
CALL METHOD ZCL_03_DATA_MODEL=>UPDATE_PURCHASE_ORDERS
EXPORTING
IT_ZHEADER = gt_zheader
IT_ZITEMS = gt_zitems
IV_SAVE = gv_save
* IMPORTING
* ES_BAPIRET2 =
.
ENDFORM.
FORM validate_update.
gv_save = 'Y'.
LOOP AT gt_zheader INTO gs_zheader.
IF gs_zheader-ebeln = ' '.
gv_save = 'N'.
ENDIF.
endloop.
ENDFORM.
05-15-2020 8:58 PM
Hi
You need to swap as below
MODULE USER_COMMAND_0100 INPUT.
CASE SY-UCOMM.
WHEN 'SAVE'.
PERFORM validate_update. <===== first line is this validate
IF GV_SAVE = 'Y'. <== Add line as below
PERFORM SAVE_DATABASE_UPDATE.
ELSE.
MESSAGE 'Please fillin the PO numbers in the table...' TYPE 'S' DISPLAY LIKE 'S'.
ENDIF.
ENDCASE.
ENDMODULE.
05-18-2020 5:24 PM
Hi sir
Thank you , it worked with all your logic inserted in the update method.