Application Development and Automation Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

problem with save to db table

Former Member
0 Likes
29,131

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

https://oprsteny.com/?p=843

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

https://oprsteny.com/?p=843

34 REPLIES 34
Read only

Sandra_Rossi
Active Contributor
28,882

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?

Read only

Former Member
0 Likes
28,875

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>
Read only

balbinosoares
Active Participant
28,875

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.
Read only

Former Member
0 Likes
28,875

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>
Read only

Sandra_Rossi
Active Contributor
0 Likes
28,875

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.

Read only

Former Member
0 Likes
28,873

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

Read only

Sandra_Rossi
Active Contributor
0 Likes
28,873

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.

Read only

Former Member
0 Likes
28,873

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?

Read only

Sandra_Rossi
Active Contributor
0 Likes
28,873

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.

Read only

Former Member
0 Likes
28,873

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>
Read only

Sandra_Rossi
Active Contributor
0 Likes
28,873

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.

Read only

Former Member
0 Likes
28,873

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
Read only

Sandra_Rossi
Active Contributor
0 Likes
28,873

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 ????
Read only

Former Member
0 Likes
28,873

Some problem with the logic, I'm trying to think how to do it

Read only

Former Member
0 Likes
28,873

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

Read only

Sandra_Rossi
Active Contributor
0 Likes
28,873

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?

Read only

Former Member
0 Likes
28,873

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.
Read only

Sandra_Rossi
Active Contributor
28,873

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.

Read only

MateuszAdamus
Active Contributor
0 Likes
28,873

Hi

Do you execute a DB COMMIT after change is made to the DB table?

regards,

Mateusz

Read only

0 Likes
28,873

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

Read only

0 Likes
28,873

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.

Read only

0 Likes
28,873

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

Read only

0 Likes
28,873

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

Read only

0 Likes
28,873

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

Read only

0 Likes
28,873

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.

Read only

0 Likes
28,873

Correct me if im wrong, this is how i hardcoded by changing the INDEX to a decimal value. Heres debug result.

Appreciate your help

Read only

0 Likes
28,873

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

Read only

0 Likes
28,873

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

Read only

28,873

sandra.rossi Oh, okay...

arnold92 Can you please attach the whole report in one place?

regards,

Mateusz

Read only

0 Likes
28,873

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)

Read only

0 Likes
28,873

Please find source code for method and program for reference, thanks

https://www.mediafire.com/file/domjrojuuo053qh/ALV_Program.docx/file

Read only

28,873

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

Read only

0 Likes
28,873

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>
Read only

28,873

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