2020 May 08 5:37 PM
Hi, i cant seem to save my modified data into my database table (zekko03) after changes made. Im doing saving header for now.
the sample programs dont really apply to my situation as i have tried.
Should be logic issue, possible to list out/show how it should work logically sequentially for the save_database_update subroutine and what syntax to use?
DATA: G_GRID_LEFT TYPE REF TO CL_GUI_ALV_GRID,
G_GRID_RIGHT TYPE REF TO CL_GUI_ALV_GRID,
GS_LAYOUT TYPE LVC_S_LAYO.
PERFORM FIELDCAT.
GS_LAYOUT-EDIT = ABAP_TRUE.
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
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.
MODULE USER_COMMAND_0100 INPUT.
CALL METHOD CL_GUI_CFW=>DISPATCH.
CASE SY-UCOMM.
WHEN 'UPDATE'.
PERFORM SAVE_DATABASE_UPDATE.
WHEN 'SWITCH'.
PERFORM SWITCH_EDIT_MODE.
WHEN OTHERS.
ENDCASE.
ENDMODULE.
Update method is working, meaning record gets updated. However when called into alv program, the header zekko03 record is not being updated.
When i debugged, modified field gets updated at first (changed from YNB to ZNB)

Later on it takes only one record (the very first record), once done executing the debug mode, record doesnt get updated

FORM SAVE_DATABASE_UPDATE.
LOOP AT gt_zheader INTO gs_zheader.
CALL METHOD ZCL_03_DATA_MODEL=>SELECT_PURCHASE_ORDERS
EXPORTING
IV_KEY = gs_zheader-ebeln
IV_MAX_ROWS = IV_MAX_ROWS
IMPORTING
IT_ZHEADER = gt_zheader
.
CALL METHOD ZCL_03_DATA_MODEL=>UPDATE_PURCHASE_ORDERS
EXPORTING
IT_ZHEADER = GT_ZHEADER
IT_ZITEMS = GT_ZITEMS
IMPORTING
ES_BAPIRET2 = BAPIRET2.
ENDLOOP.
ENDFORM.
These are some of the references i used
http://saptechnical.com/Tutorials/ALV/Edit/demo.htm
https://answers.sap.com/questions/5294394/problem-with-alv-edit-and-save.html
Hi, i cant seem to save my modified data into my database table (zekko03) after changes made. Im doing saving header for now.
the sample programs dont really apply to my situation as i have tried.
Should be logic issue, possible to list out/show how it should work logically sequentially for the save_database_update subroutine and what syntax to use?
DATA: G_GRID_LEFT TYPE REF TO CL_GUI_ALV_GRID,
G_GRID_RIGHT TYPE REF TO CL_GUI_ALV_GRID,
GS_LAYOUT TYPE LVC_S_LAYO.
PERFORM FIELDCAT.
GS_LAYOUT-EDIT = ABAP_TRUE.
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
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.
MODULE USER_COMMAND_0100 INPUT.
CALL METHOD CL_GUI_CFW=>DISPATCH.
CASE SY-UCOMM.
WHEN 'UPDATE'.
PERFORM SAVE_DATABASE_UPDATE.
WHEN 'SWITCH'.
PERFORM SWITCH_EDIT_MODE.
WHEN OTHERS.
ENDCASE.
ENDMODULE.
Update method is working, meaning record gets updated. However when called into alv program, the header zekko03 record is not being updated.
When i debugged, modified field gets updated at first (changed from YNB to ZNB)

Later on it takes only one record (the very first record), once done executing the debug mode, record doesnt get updated

FORM SAVE_DATABASE_UPDATE.
LOOP AT gt_zheader INTO gs_zheader.
CALL METHOD ZCL_03_DATA_MODEL=>SELECT_PURCHASE_ORDERS
EXPORTING
IV_KEY = gs_zheader-ebeln
IV_MAX_ROWS = IV_MAX_ROWS
IMPORTING
IT_ZHEADER = gt_zheader
.
CALL METHOD ZCL_03_DATA_MODEL=>UPDATE_PURCHASE_ORDERS
EXPORTING
IT_ZHEADER = GT_ZHEADER
IT_ZITEMS = GT_ZITEMS
IMPORTING
ES_BAPIRET2 = BAPIRET2.
ENDLOOP.
ENDFORM.
These are some of the references i used
http://saptechnical.com/Tutorials/ALV/Edit/demo.htm
https://answers.sap.com/questions/5294394/problem-with-alv-edit-and-save.html
2020 May 08 6:20 PM
The most important parts, how ZEKKO03 is updated, the contents of variables to update ZEKKO03, the key of ZEKKO03, are missing. How can we help?
2020 May 08 7:16 PM
Hi Sandra, the code for updates/save to db its all there, attached in images update-method.png in conversation above
These are the variables for program
DATA: GT_ZHEADER TYPE TABLE OF ZEKKO03, ""global variable for ZEKKO03
GS_ZHEADER LIKE LINE OF GT_ZHEADER
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.
DATA: BAPIRET2 TYPE BAPIRET2.<br>Zekko table

Variables for update_purchase_orders method
DATA: LS_ZHEADER TYPE ZEKKO03,
LS_ZITEMS TYPE ZEKPO03.<br>
2020 May 08 7:46 PM
What Sandra is saying is the more import part is the update/insert/modify command... and the values that you are passing to it command. All the other things are complementary for this command.
What the code of the code below?
CALL METHOD ZCL_03_DATA_MODEL=>UPDATE_PURCHASE_ORDERS
EXPORTING
IT_ZHEADER = GT_ZHEADER
IT_ZITEMS = GT_ZITEMS
IMPORTING
ES_BAPIRET2 = BAPIRET2.
2020 May 09 6:10 AM
Select method
iv_key type zebeln_emnt (data element for ebeln) - import
value( IV_MAX_ROWS ) type i default 0 - import
IT_ZHEADER TYPE ZEKKO03_TT (table type) - import
IT_ZITEMS TYPE ZEKPO03_TT (table type) - import
ES_BAPIRET2 TYPE BAPIRET2 - export
METHOD SELECT_PURCHASE_ORDERS.
DATA: LS_ZHEADER TYPE ZEKKO03.
IF IV_KEY IS INITIAL .
SELECT MANDT EBELN BEDAT BSART LIFNR WAERS KNUMV
INTO TABLE IT_ZHEADER
FROM ZEKKO03
WHERE EBELN EQ IV_KEY.
IF SY-SUBRC = 0.
IF IV_MAX_ROWS GT 0.
SELECT MANDT EBELN BEDAT BSART LIFNR WAERS KNUMV
FROM ZEKKO03 INTO TABLE IT_ZHEADER
UP TO IV_MAX_ROWS ROWS.
SELECT MANDT EBELN EBELP BUKRS WERKS MATNR MENGE MEINS NETPR
FROM ZEKPO03 INTO TABLE IT_ZITEMS UP TO IV_MAX_ROWS ROWS
WHERE EBELN EQ IV_KEY.
ES_BAPIRET2-TYPE = 'S'.
ES_BAPIRET2-MESSAGE = 'Record with input rows found'.
ELSEIF IV_MAX_ROWS EQ 0.
SELECT MANDT EBELN EBELP BUKRS WERKS MATNR MENGE MEINS NETPR
FROM ZEKPO03 INTO TABLE IT_ZITEMS
WHERE EBELN EQ IV_KEY.
ES_BAPIRET2-TYPE = 'S'.
ES_BAPIRET2-MESSAGE = 'All records found'.
ELSE .
ES_BAPIRET2-TYPE = 'E'.
ES_BAPIRET2-MESSAGE = 'No record found'.
ENDIF.
ELSE. "this statement belongs to sy-subrc (all above are fulfilled)
SELECT MANDT EBELN BEDAT BSART LIFNR WAERS KNUMV
FROM ZEKKO03 INTO TABLE IT_ZHEADER
UP TO IV_MAX_ROWS ROWS.
LOOP AT IT_ZHEADER INTO LS_ZHEADER. ""join line item to header
SELECT MANDT EBELN EBELP BUKRS WERKS MATNR MENGE MEINS NETPR
FROM ZEKPO03 APPENDING TABLE IT_ZITEMS
WHERE EBELN EQ LS_ZHEADER-EBELN.
ENDLOOP.
ENDIF.
ELSE.
SELECT MANDT EBELN EBELP BUKRS WERKS MATNR MENGE MEINS NETPR """added for ALV program
INTO TABLE IT_ZITEMS
FROM ZEKPO03
WHERE EBELN EQ IV_KEY.
SELECT MANDT EBELN BEDAT BSART LIFNR WAERS KNUMV """" added for ALV program
INTO TABLE IT_ZHEADER
FROM ZEKKO03
WHERE EBELN EQ IV_KEY.
ENDIF.
ENDMETHOD.
Update (modify) method
IT_ZHEADER TYPE ZEKKO03_TT (table type) - import
IT_ZITEMS TYPE ZEKPO03_TT (table type) - import
ES_BAPIRET2 TYPE BAPIRET2 - export
METHOD UPDATE_PURCHASE_ORDERS.
DATA: LS_ZHEADER TYPE ZEKKO03,
LS_ZITEMS TYPE ZEKPO03.
if it_zheader IS NOT INITIAL.
loop at it_zheader INTO ls_zheader.
modify zekko03 FROM ls_zheader .
IF SY-SUBRC = 0.
ES_BAPIRET2-TYPE = 'S'.
ES_BAPIRET2-MESSAGE = 'Successfully updated for table ZEKKO03'.
ELSE.
ES_BAPIRET2-TYPE = 'E'.
ES_BAPIRET2-MESSAGE = 'Error updating table ZEKKO03'.
ENDIF.
endloop.
endif.
ENDMETHOD.<br>Insert method
IT_ZHEADER TYPE ZEKKO03_TT (table type) - import
IT_ZITEMS TYPE ZEKPO03_TT (table type) - import
ES_BAPIRET2 TYPE BAPIRET2 - export
METHOD CREATE_PURCHASE_ORDERS.
IF IT_ZHEADER IS NOT INITIAL.
INSERT ZEKKO03 FROM TABLE IT_ZHEADER.
IF SY-SUBRC = 0.
ES_BAPIRET2-TYPE = 'S'.
ES_BAPIRET2-MESSAGE = 'Row ZEKKO03 inserted'.
ELSE.
ES_BAPIRET2-TYPE = 'E'.
ES_BAPIRET2-MESSAGE = 'Error for ZEKKO03'.
ENDIF.
ENDIF.
IF IT_ZHEADER IS NOT INITIAL AND IT_ZITEMS IS NOT INITIAL.
INSERT ZEKPO03 FROM TABLE IT_ZITEMS.
IF SY-SUBRC = 0.
ES_BAPIRET2-TYPE = 'S'.
CONCATENATE ES_BAPIRET2-MESSAGE 'Row ZEKPO03 inserted' INTO ES_BAPIRET2-MESSAGE.
ELSE.
ES_BAPIRET2-TYPE = 'E'.
CONCATENATE ES_BAPIRET2-MESSAGE 'Error for ZEKPO03' INTO ES_BAPIRET2-MESSAGE.
ENDIF.
ENDIF.
ENDMETHOD.<br>Delete method
IT_ZHEADER TYPE ZEKKO03_TT (table type) - import
IT_ZITEMS TYPE ZEKPO03_TT (table type) - import
value( IV_IS_DELETE_ALL ) TYPE TYPE BOOLEAN OPTIONAL - import
ES_BAPIRET2 TYPE BAPIRET2 - export
METHOD DELETE_PURCHASE_ORDERS.
DATA: LS_ZHEADER TYPE ZEKKO03,
LS_ZITEMS TYPE ZEKPO03,
LV_COUNT_HDR TYPE I,
LV_COUNT_ITEMS TYPE I.
IF IV_IS_DELETE_ALL = 'X' OR IV_IS_DELETE_ALL = 'x' .
DELETE FROM ZEKKO03.
DELETE FROM ZEKPO03.
IF SY-SUBRC = 0.
ES_BAPIRET2-TYPE = 'S'.
ES_BAPIRET2-MESSAGE = 'All records deleted'.
ENDIF.
ELSE.
LOOP AT IT_ZHEADER INTO LS_ZHEADER.
SELECT COUNT(*) INTO LV_COUNT_HDR FROM ZEKPO03
WHERE EBELN = LS_ZHEADER-EBELN.
ENDLOOP.
IF LV_COUNT_HDR = 1.
DELETE FROM ZEKPO03 WHERE EBELN EQ LS_ZHEADER-EBELN.
DELETE FROM ZEKKO03 WHERE EBELN EQ LS_ZHEADER-EBELN.
IF SY-SUBRC = 0.
ES_BAPIRET2-TYPE = 'S'.
ES_BAPIRET2-MESSAGE = 'Record successfully deleted'.
ELSE.
ES_BAPIRET2-TYPE = 'E'.
ES_BAPIRET2-MESSAGE = 'Error deleting record'.
ENDIF.
ENDIF.
ENDIF.
ENDMETHOD.<br>
2020 May 09 6:49 AM
Everything should be straight forward. If you debug your code, you see that MODIFY, INSERT or DELETE do update correctly the database (SY-SUBRC = 0, except if internal table is empty). So, no doubt that it updates the database. You must also use COMMIT WORK and ROLLBACK WORK to commit or roll back the changes. Where are they?
If you say that it doesn't update the database, maybe you mean that the DISPLAY doesn't reflect the changes. Then it's another question, not that the database is not updated, but that the screen is not refreshed correctly. Leave the transaction and call it again, if it displays the database table correctly, that confirms the refresh issue.
2020 May 09 7:31 AM
I have added the commit and rollback work. Same as before, when called into alv program, modified values dont reflect
if it_zheader IS NOT INITIAL.
loop at it_zheader INTO ls_zheader.
modify zekko03 FROM ls_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.
endloop.
endif.<br>When i added refresh_table_display, it is taking the very first record whenever value change update is performed and excludes other records, update is not reflected as well.
Original output:

LOOP AT gt_zheader INTO gs_zheader.
CALL METHOD ZCL_03_DATA_MODEL=>SELECT_PURCHASE_ORDERS
EXPORTING
IV_KEY = gs_zheader-ebeln
IV_MAX_ROWS = IV_MAX_ROWS
IMPORTING
IT_ZHEADER = gt_zheader
.
CALL METHOD ZCL_03_DATA_MODEL=>UPDATE_PURCHASE_ORDERS
EXPORTING
IT_ZHEADER = GT_ZHEADER
IT_ZITEMS = GT_ZITEMS
IMPORTING
ES_BAPIRET2 = BAPIRET2.
ENDLOOP.
g_grid_left->refresh_table_display( ).<br>Output once refresh_table_display inserted in program source code:

Once removed refresh_table_display, it will revert back to the original output.
Kindly advise
Whenever update changes made by pressing update button (even if value not reflected), it keeps on looping, meaning the first record (example: 4500000015) will appear in the last record, and the next record (example: 4500000021) appear as first record
2020 May 09 8:07 AM
Did you restart the program? So you see that the database updates are okay, right? So, you understand that it's only a screen refresh problem, right?
Based on this evidence, that would be more simple to say it immediately instead of spending useless time on discussing about the updates.
Your refresh issue is probably the same as usual: you instantiate the grid again and again, but in that case only the first instance is always displayed. More information here.
2020 May 09 8:32 AM
Hi Sandra, should be refresh problem, the third paragraph of your statement, Im not sure know how to apply it to my program, can you guide through?
2020 May 09 9:40 AM
I'm sorry but you didn't post any code related to how you instantiate your grid control so I can't answer. But can't you debug yourself: do you instantiate the grid control several times, do you free it, etc. Sorry, I don't do spoon feeding. Good luck.
2020 May 09 12:41 PM
The FREE method is only applicable to custom container, which means i might need to re-do everything, the one i used is not type compatible with FREE method
Is there an alternative way?
ORM 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.
* ST_VAR-REPORT = 'YKC_ALV_OOPS'.
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.
GS_LAYOUT-EDIT = ABAP_TRUE. """" to add edit layout function
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
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
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<br>
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS 'MAIN'.
SET TITLEBAR 'ZPROJ03_ALV'.
DATA: rs_selfield type slis_selfield,
l_valid type c.
IF G_GRID_LEFT IS INITIAL.
PERFORM READ_DATA_HEADER.
PERFORM DISPLAY_GRID.
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 'RELOAD'.
* PERFORM SAVE_DATABASE_RELOAD.
WHEN 'UPDATE'.
PERFORM SAVE_DATABASE_UPDATE.
WHEN 'SWITCH'.
PERFORM SWITCH_EDIT_MODE.
WHEN OTHERS.
ENDCASE.
ENDMODULE. " USER_COMMAND_0100 INPUT<br>
2020 May 09 3:19 PM
In your code, I see that you have a condition IF g_grid_left IS INITIAL so it shouldn't be instantiated several times. I asked questions ("do you instantiate the grid control several times") but I don't get answers. So maybe you should post the complete code so that people can review and analyze it, I hope additional questions won't be needed.
2020 May 09 4:40 PM
Noted Im looking into it, sorry for inconvenience
Due to limit of characters in comment box, ive attached the rest of the alv program source code here subroutines-update-and-delete.txt
All the select, update(modify), delete and insert methods i have shared in txt file methods-for-z-class.txt
Program source code:
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 LIKE LINE OF GT_ZHEADER,
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.
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.
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.
* ST_VAR-REPORT = 'YKC_ALV_OOPS'.
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.
GS_LAYOUT-EDIT = ABAP_TRUE. """" to add edit layout function
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
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
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 fieldcat
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM FIELDCAT.
DATA: NO TYPE I VALUE 1.
IF G_GRID_LEFT IS NOT INITIAL.
CLEAR GT_FIELDCAT.
* NO = NO + 1.
* 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
*&---------------------------------------------------------------------*
*& 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 'RELOAD'.
* PERFORM SAVE_DATABASE_RELOAD.
WHEN 'UPDATE'.
PERFORM SAVE_DATABASE_UPDATE.
WHEN 'SWITCH'.
PERFORM SWITCH_EDIT_MODE.
WHEN OTHERS.
* do nothing
ENDCASE.
ENDMODULE. " USER_COMMAND_0100 INPUT
""" Source: DEMO_GUI_ALV_GRID_EXT
* ===============================================================
* 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
DATA: LT_INDEX TYPE LVC_T_ROW,
LT_ROWID TYPE LVC_T_ROID,
LS_ROWIN LIKE LINE OF LT_ROWID.
CASE SENDER.
WHEN G_GRID_LEFT.
CALL METHOD G_GRID_LEFT->GET_SELECTED_ROWS
IMPORTING
ET_INDEX_ROWS = LT_INDEX """ comes with 10 digits start with 0, not recommended as the index only read the first 2 digits
ET_ROW_NO = LT_ROWID. """ Integer data type with 4 digits, recommended as index for read table the system will only read first 2 digits
LOOP AT LT_ROWID INTO LS_ROWIN.
CALL METHOD ZCL_03_DATA_MODEL=>SELECT_PURCHASE_ORDERS """ PO selection to get total number of record on header in the db table
EXPORTING
* IV_KEY =
IV_MAX_ROWS = IV_MAX_ROWS
IMPORTING
IT_ZHEADER = LT_ZHEADER
* IT_ZITEMS =
* ES_BAPIRET2 =
.
READ TABLE LT_ZHEADER INDEX LS_ROWIN-ROW_ID INTO LS_ZHEADER.
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 =
.
ENDLOOP.
GT_ZITEMS = LT_ZITEMS2.
G_GRID_RIGHT->REFRESH_TABLE_DISPLAY( ). """ refresh table
ENDCASE.
ENDMETHOD.
ENDCLASS. "LCL_EVENT_RECEIVER IMPLEMENTATION
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
2020 May 09 7:01 PM
I don't see anything wrong in the display. You don't instantiate the control again and again, you do it once, and you simply refresh the screen each time. No issue. Can't you just say it when I ask?
So it seems that your updates are wrong. But you should see that in debug !? Why don't you see it?
I don't understand your code here, why do you replace GT_ZHEADER at each iteration of GT_ZHEADER, it's non sense, I don't understand what you want to achieve:
LOOP AT gt_zheader INTO gs_zheader.
CALL METHOD ZCL_03_DATA_MODEL=>SELECT_PURCHASE_ORDERS
EXPORTING
IV_KEY = gs_zheader-ebeln
IV_MAX_ROWS = IV_MAX_ROWS
IMPORTING
IT_ZHEADER = gt_zheader. " <============ WHY ????
2020 May 10 5:58 AM
Some problem with the logic, I'm trying to think how to do it
2020 May 10 6:47 PM
Logic:
1. Loop with row_id from LVC_T_ROID
2. Get all row IV_MAX_ROWS of header data LT_ZHEADER_UPD for internal table LT_ZHEADER_UPD
3. read table LT_ZHEADER_UPD with index row_id
4. Get a row of data with header LT_ZHEADER_UPD and line item LT_ZITEMS_UPD based on key ebeln
5. Delete Header and line item data
Outside loop - refresh table so new data gets updated when modified, another internal table LT_ZHEADER_UPD_N and LT_ZITEMS_UPD_N are used
Kindly advise if any issue with logic
FORM SAVE_DATABASE_UPDATE.
DATA: LT_ZHEADER_UPD TYPE TABLE OF ZEKKO03,
LT_ZITEMS_UPD TYPE TABLE OF ZEKPO03,
LS_ZHEADER_UPD TYPE ZEKKO03,
LS_ZITEMS_UPD LIKE LINE OF LT_ZITEMS_UPD.
DATA: LT_ZHEADER_UPD_N TYPE TABLE OF ZEKKO03,
LT_ZITEMS_UPD_N TYPE TABLE OF ZEKPO03,
LS_ZHEADER_UPD_N LIKE LINE OF LT_ZHEADER_UPD_N,
LS_ZITEMS_UPD_N LIKE LINE OF LT_ZITEMS_UPD_N.
DATA: LT_INDEX_UPD TYPE LVC_T_ROW,
LT_ROWID_UPD TYPE LVC_T_ROID,
LS_ROWID_UPD LIKE LINE OF LT_ROWID_UPD.
CALL METHOD g_grid_left->check_changed_data
IMPORTING
e_valid = check.
*******--- Getting the selected rows index
CALL METHOD G_GRID_LEFT->GET_SELECTED_ROWS
IMPORTING
ET_INDEX_ROWS = LT_INDEX_UPD
ET_ROW_NO = LT_ROWID_UPD.
******--- Through the index capturing the values of selected rows
LOOP AT LT_ROWID_UPD INTO LS_ROWID_UPD.
CALL METHOD ZCL_03_DATA_MODEL=>SELECT_PURCHASE_ORDERS
EXPORTING
* IV_KEY =
IV_MAX_ROWS = IV_MAX_ROWS
IMPORTING
IT_ZHEADER = LT_ZHEADER_UPD .
READ TABLE LT_ZHEADER_UPD INDEX LS_ROWID_UPD-ROW_ID INTO LS_ZHEADER_UPD.
CLEAR LT_ZHEADER_UPD.
CALL METHOD ZCL_03_DATA_MODEL=>SELECT_PURCHASE_ORDERS
EXPORTING
IV_KEY = LS_ZHEADER_UPD-EBELN
* IV_MAX_ROWS = 0
IMPORTING
IT_ZHEADER = LT_ZHEADER_UPD
* IT_ZITEMS =
* ES_BAPIRET2 =
.
*
CALL METHOD ZCL_03_DATA_MODEL=>SELECT_PURCHASE_ORDERS
EXPORTING
IV_KEY = LS_ZHEADER_UPD-EBELN
* IV_MAX_ROWS = 0
IMPORTING
* IT_ZHEADER =
IT_ZITEMS = LT_ZITEMS_UPD
* ES_BAPIRET2 =
.
CALL METHOD ZCL_03_DATA_MODEL=>UPDATE_PURCHASE_ORDERS
EXPORTING
IT_ZHEADER = LT_ZHEADER_UPD
IT_ZITEMS = LT_ZITEMS_UPD
IMPORTING
ES_BAPIRET2 = BAPIRET2.
.
ENDLOOP.
CALL METHOD ZCL_03_DATA_MODEL=>SELECT_PURCHASE_ORDERS
EXPORTING
* IV_KEY =
IV_MAX_ROWS = IV_MAX_ROWS
IMPORTING
IT_ZHEADER = LT_ZHEADER_UPD_N
* IT_ZITEMS =
* ES_BAPIRET2 =
.
CALL METHOD ZCL_03_DATA_MODEL=>SELECT_PURCHASE_ORDERS
EXPORTING
IV_KEY = LS_ZHEADER_UPD-EBELN
* IV_MAX_ROWS = 0
IMPORTING
* IT_ZHEADER =
IT_ZITEMS = LT_ZITEMS_UPD_N
* ES_BAPIRET2 =
.
GT_ZHEADER = LT_ZHEADER_UPD_N.
GT_ZITEMS = LT_ZITEMS_UPD_N.
G_GRID_LEFT->REFRESH_TABLE_DISPLAY( ).
G_GRID_RIGHT->REFRESH_TABLE_DISPLAY( ).
* CALL METHOD g_grid_left->free. << not applicable
* CALL METHOD g_grid_right->free. << not applicable
*
* CALL METHOD cl_gui_cfw=>flush. << not applicable
CLEAR LT_ZITEMS_UPD_N.
CLEAR LT_ZHEADER_UPD_N.
CLEAR LT_ZITEMS_UPD.
ENDFORM.<br>I tried to debug, cannot get selected row_id during loop (screenshot), therefore no value in internal table, stuck here
2020 May 10 8:25 PM
Do you mean that the call to G_GRID_LEFT->GET_SELECTED_ROWS returns empty parameters ET_INDEX_ROWS and ET_ROW_NO ?
It's normal that they are empty if the user didn't select explicitly any row. But do you really want to save only the rows marked by the user?
Moreover, I think you didn't understand the concept of selected rows, because GET_SELECTED_ROWS can maximum return one line by default, because you didn't set the layout option SEL_MODE (must be 'A', 'C' or 'D' to allow several rows to be selected).
Anyway, why are you updating database tables inside a loop? Why don't you call UPDATE_PURCHASE_ORDERS once, with the internal table containing the lines to update?
2020 May 11 3:24 AM
call to G_GRID_LEFT->GET_SELECTED_ROWS ET_ROW_NO
Actually get_selected_row code above i used for delete subroutine, when switched to non-editable mode (switch_mode), select a row and delete.
I tried to apply the same with update see if modified value gets updated for the selected row
As long as table updated will do even without selected row, problem is without selected rows. In debug mode, the modified record doesnt even get reflected and no updates being performed.
I couldnt think of other ways to code otherwise for updates to reflect in alv
In debug mode (screenshot), no updated value reflected in internal table
FORM SAVE_DATABASE_UPDATE.
DATA: LT_ZHEADER_UPD TYPE TABLE OF ZEKKO03,
LT_ZITEMS_UPD TYPE TABLE OF ZEKPO03,
LS_ZHEADER_UPD TYPE ZEKKO03,
LS_ZITEMS_UPD LIKE LINE OF LT_ZITEMS_UPD.
DATA: LT_ZHEADER_UPD_N TYPE TABLE OF ZEKKO03,
LT_ZITEMS_UPD_N TYPE TABLE OF ZEKPO03,
LS_ZHEADER_UPD_N LIKE LINE OF LT_ZHEADER_UPD_N,
LS_ZITEMS_UPD_N LIKE LINE OF LT_ZITEMS_UPD_N.
DATA: LT_INDEX_UPD TYPE LVC_T_ROW,
LT_ROWID_UPD TYPE LVC_T_ROID,
LS_ROWID_UPD LIKE LINE OF LT_ROWID_UPD.
CALL METHOD ZCL_03_DATA_MODEL=>SELECT_PURCHASE_ORDERS
EXPORTING
* IV_KEY =
IV_MAX_ROWS = IV_MAX_ROWS
IMPORTING
IT_ZHEADER = LT_ZHEADER_UPD_N
* IT_ZITEMS =
* ES_BAPIRET2 =
.
CALL METHOD ZCL_03_DATA_MODEL=>SELECT_PURCHASE_ORDERS
EXPORTING
IV_KEY = LS_ZHEADER_UPD-EBELN
* IV_MAX_ROWS = 0
IMPORTING
* IT_ZHEADER =
IT_ZITEMS = LT_ZITEMS_UPD_N
* ES_BAPIRET2 =
.
CALL METHOD ZCL_03_DATA_MODEL=>UPDATE_PURCHASE_ORDERS
EXPORTING
IT_ZHEADER = LT_ZHEADER_UPD_N
IT_ZITEMS = LT_ZITEMS_UPD_N
IMPORTING
ES_BAPIRET2 = BAPIRET2.
GT_ZHEADER = LT_ZHEADER_UPD_N.
GT_ZITEMS = LT_ZITEMS_UPD_N.
G_GRID_LEFT->REFRESH_TABLE_DISPLAY( ).
G_GRID_RIGHT->REFRESH_TABLE_DISPLAY( ).
CLEAR LT_ZITEMS_UPD_N.
CLEAR LT_ZHEADER_UPD_N.
CLEAR LT_ZITEMS_UPD.
ENDFORM.
2020 May 11 9:19 AM
The last comments are no more related to the original question, which is no more useful for future visitors. Anyway, I don't think anyone understands what's going on here.
Your previous comment was about GET_SELECTED_ROWS, and now you're talking about delete and data not reflected, without giving feedback on my last comment. It's difficult to understand if you did anything, changed your mind, and if your last comment is related in any way to my last comment.
Let's answer one of your concerns: you say that the user inputs in the screen are not reflected. That's normal. You have to call the method CHECK_CHANGED_DATA to transfer the input values to the internal table.
2020 May 11 9:55 AM
Hi
Do you execute a DB COMMIT after change is made to the DB table?
regards,
Mateusz
2020 May 11 9:58 AM
Look at all the comments and you'll see that it's the whole program which is buggy. The OP has so many problems with the algorithm...
2020 May 11 11:05 AM
Sorry for the confusion, as long as modified data is reflected in the zekko03 db table then its fine. This is my overall program source code with selection mode and check_data_changed applied, and yes Database commit is in the UPDATE_PURCHASE_ORDER method
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 LIKE LINE OF GT_ZHEADER,
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.
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.
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,
g_custom_container TYPE REF TO cl_gui_custom_container.
*----------------------------------------------------------------------*
* FOR VARIANT
*----------------------------------------------------------------------*
DATA LS_VARIANT TYPE DISVARIANT .
DATA SAVE TYPE C.
* ST_VAR-REPORT = 'YKC_ALV_OOPS'.
SAVE = 'A'.
CREATE OBJECT SPLITTER
EXPORTING
PARENT = CL_GUI_CONTAINER=>DEFAULT_SCREEN
* PARENT = g_custom_container
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.
GS_LAYOUT-sel_mode = 'A'.
GS_LAYOUT-EDIT = ABAP_TRUE. """" to add edit layout function
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
EXCEPTIONS
INVALID_PARAMETER_COMBINATION = 1
PROGRAM_ERROR = 2
TOO_MANY_LINES = 3
OTHERS = 4.
IF SY-SUBRC = 0.
.
ENDIF.
* 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
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 fieldcat
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM FIELDCAT.
DATA: NO TYPE I VALUE 1.
IF G_GRID_LEFT IS NOT INITIAL.
CLEAR GT_FIELDCAT.
* NO = NO + 1.
* 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
*&---------------------------------------------------------------------*
*& 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 'RELOAD'.
* PERFORM SAVE_DATABASE_RELOAD.
WHEN 'SAVE'.
MESSAGE 'Data Updated' TYPE 'S' DISPLAY LIKE 'E'.
PERFORM SAVE_DATABASE_UPDATE.
WHEN 'SWITCH'.
PERFORM SWITCH_EDIT_MODE.
WHEN OTHERS.
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
DATA: LT_INDEX TYPE LVC_T_ROW,
LT_ROWID TYPE LVC_T_ROID,
LS_ROWIN LIKE LINE OF LT_ROWID.
CASE SENDER.
WHEN G_GRID_LEFT.
CALL METHOD G_GRID_LEFT->GET_SELECTED_ROWS
IMPORTING
ET_INDEX_ROWS = LT_INDEX """ comes with 10 digits start with 0, not recommended as the index only read the first 2 digits
ET_ROW_NO = LT_ROWID. """ Integer data type with 4 digits, recommended as index for read table the system will only read first 2 digits
LOOP AT LT_ROWID INTO LS_ROWIN.
CALL METHOD ZCL_03_DATA_MODEL=>SELECT_PURCHASE_ORDERS """ PO selection to get total number of record on header in the db table
EXPORTING
IV_MAX_ROWS = IV_MAX_ROWS
IMPORTING
IT_ZHEADER = LT_ZHEADER .
READ TABLE LT_ZHEADER INDEX LS_ROWIN-ROW_ID INTO LS_ZHEADER.
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 =
.
ENDLOOP.
GT_ZITEMS = LT_ZITEMS2.
G_GRID_RIGHT->REFRESH_TABLE_DISPLAY( ). """ refresh table
ENDCASE.
ENDMETHOD.
ENDCLASS. "LCL_EVENT_RECEIVER IMPLEMENTATION
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.
2020 May 11 12:07 PM
From what I see you're refreshing the ALV grids in the PAI event of the screen.
Try refreshing them in the PBO, after the data has been changed in the PAI event.
regards,
Mateusz
2020 May 11 12:37 PM
Hi, ive removed G_GRID_LEFT->REFRESH_TABLE_DISPLAY( ) in the subroutine (PAI) and inserted in PBO
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.
CREATE OBJECT EVENT_HANDLER.
SET HANDLER EVENT_HANDLER->HANDLE_DOUBLE_CLICK FOR G_GRID_LEFT.
ENDIF.
G_GRID_LEFT->REFRESH_TABLE_DISPLAY( ).
ENDMODULE.
The problem actually originated from update subroutine (update_purchase_order method is working when tested in method itself) but not when called into program as shown in the debug result.debug.png
2020 May 11 12:43 PM
GET_SELECTED_ROWS is meant to return information about rows selected in the grid, not the changed rows.
Do you have any rows selected?
Maybe try hardcoding the row ID in the code and see if this helps. Just for the test, to see where the issue is.
regards,
Mateusz
2020 May 11 1:01 PM
mateuszadamus REFRESH_TABLE_DISPLAY can be done in the PAI, no need to move it to the PBO.
arnold92 Concerning the full code posted last, can you explain what is the exact problem (how to reproduce, symptom, what you expect)? Thank you.
2020 May 11 1:03 PM
Correct me if im wrong, this is how i hardcoded by changing the INDEX to a decimal value. Heres debug result.

Appreciate your help
2020 May 11 1:22 PM
I can't tell if this is the cause of the issue or not, because I'm not able to see clearly the whole logic of the report.
However, what I've noticed is that in procedure SAVE_DATABASE_UPDATE you're overwriting the GT_ZHEADER internal table.
There is a LOOP over it, you read the first record, get the POs for that one record and you put these POs back into the GT_ZHEADER table, which overwrites any other records from that table.
LOOP AT gt_zheader INTO gs_zheader.
CALL METHOD ZCL_03_DATA_MODEL=>SELECT_PURCHASE_ORDERS
EXPORTING
IV_KEY = gs_zheader-ebeln
IV_MAX_ROWS = IV_MAX_ROWS
IMPORTING
IT_ZHEADER = gt_zheader
.
regards,
Mateusz
2020 May 11 1:31 PM
Mateusz Adamus You're not looking at the last code. The code you show is something already discussed and solved. The whole up-to-date code is there.
A S It's impossible to help, your whole program/algorithm is buggy/illogical. Can't you ask an experienced developer in your company to spend time with you to peer review the code? I really think he/she should spend a whole day with you to understand what you want to achieve, to correct the program, to explain what you need to know...
2020 May 11 1:35 PM
sandra.rossi Oh, okay...
arnold92 Can you please attach the whole report in one place?
regards,
Mateusz
2020 May 11 1:38 PM
this is actually self learning and Im wfh due to lockdown, would like to learn as much as possible during this time before being assigned to project (senior to guide)
2020 May 11 2:28 PM
Please find source code for method and program for reference, thanks
https://www.mediafire.com/file/domjrojuuo053qh/ALV_Program.docx/file
2020 May 11 2:59 PM
Hi arnold92
A few comments from my side related to the source code you've attached.
1. Method HANDLE_DOUBLE_CLICK - move the ZCL_03_DATA_MODEL=>SELECT_PURCHASE_ORDERS method call out of the LOOP, probably just before the LOOP AT LT_ROWID. It's always good to have performance in mind and reading DB records in a LOOP is never good on performance.
2. Method HANDLE_DOUBLE_CLICK - is there going to be maximum one row selected on the left grid? If yes, then fine, but if not, then LT_ZITEMS2 will have items for the last row selected only. Because it is inside of the LOOP AT LT_ROWID and it reads the LT_ZITEMS2 records for each of the PO documents, one by one.
3. Same two comments go for the SAVE_DATABASE_UPDATE procedure. There are the same errors.
4. Actually, the SAVE_DATABASE_UPDATE does not change anything in the DB, as far as I can tell from the code. It reads the records for the selected headers first, into LT_ZHEADER_UPD and LT_ZITEMS_UPD tables (read from DB, so not the changes values) and then reads the same data into LT_ZHEADER_UPD_N and LT_ZITEMS_UPD_N tables. Afterwards, it updates the DB with the information just read from the DB. You have to have a look at this logic again.
5. The records read from DB into LT_ZITEMS_UPD_N are read for the last header read into LT_ZHEADER_UPD internal table. This is because you read these for value from LS_ZHEADER_UPD-EBELN. Which is updated in a LOOP. Have a look at this one, too.
Overall, you need to have a look at the logic of the report again. Maybe have a break, clear your mind, and look at it from the beginning. Seems like you're chasing your own tail in a few places there.
regards,
Mateusz
2020 May 11 3:52 PM
For question number 4, in order for change value to occur, logic aside, am i using the right syntax. In the Update_purchase_order method, im using modify ztable from ls_zheader
if it_zheader IS NOT INITIAL.
loop at it_zheader INTO ls_zheader.
modify zekko03 FROM ls_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.
endloop.
endif.<br>
2020 May 11 4:11 PM
It would be better if you modified the table in one go. Not record by record, but using the whole IT_ZHEADER table.
MODIFY zekko03 FROM TABLE it_zheader.regards,
Mateusz
| User | Count |
|---|---|
| 5 | |
| 3 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 |