Application Development 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: 

REUSE_ALV_GRID: change and save values

Former Member
0 Kudos

Hi Experts,

after I uploaded an csv-file into my reuse_alv_grid and made the values editable, I'd like to save the changed data in one internal table.

The point is that the saving should pe performed by pressing on the predifined button I have defined in my PF-Status (Button code: 'TEST' )

I've tried to perform that by using of this Function

FORM user_command USING p_ucomm LIKE sy-ucomm.

   DATA rf_csv TYPE REF TO cl_gui_alv_grid.

   CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'

     IMPORTING

       e_grid = rf_csv.

   CALL METHOD rf_csv->check_changed_data.

   CASE p_ucomm.

     WHEN 'TEST'.

   ENDCASE.

ENDFORM.  


But unfortunately it doesn't work.


Would you have some expirience with this?


BR


Denis

1 ACCEPTED SOLUTION

rajeshkothamasu
Active Participant
0 Kudos

Hi,

Try with below code.

TYPE-POOLS: SLIS.

DATA: X_FIELDCAT TYPE SLIS_FIELDCAT_ALV,

IT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,

L_LAYOUT TYPE SLIS_LAYOUT_ALV,

X_EVENTS TYPE SLIS_ALV_EVENT,

IT_EVENTS TYPE SLIS_T_EVENT.

DATA: BEGIN OF ITAB OCCURS 0,

VBELN LIKE VBAK-VBELN,

POSNR LIKE VBAP-POSNR,

CHK(1),

color(4),

END OF ITAB.

SELECT VBELN

POSNR

FROM VBAP

UP TO 20 ROWS

INTO TABLE ITAB.

X_FIELDCAT-FIELDNAME = 'CHK'.

X_FIELDCAT-TABNAME = 'ITAB'.

X_FIELDCAT-COL_POS = 1.

X_FIELDCAT-INPUT = 'X'.

X_FIELDCAT-EDIT = 'X'.

X_FIELDCAT-CHECKBOX = 'X'.

APPEND X_FIELDCAT TO IT_FIELDCAT.

CLEAR X_FIELDCAT.

X_FIELDCAT-FIELDNAME = 'VBELN'.

X_FIELDCAT-SELTEXT_L = 'VBELN'.

X_FIELDCAT-HOTSPOT = 'X'.

X_FIELDCAT-TABNAME = 'ITAB'.

X_FIELDCAT-COL_POS = 2.

APPEND X_FIELDCAT TO IT_FIELDCAT.

CLEAR X_FIELDCAT.

X_FIELDCAT-FIELDNAME = 'POSNR'.

X_FIELDCAT-SELTEXT_L = 'POSNR'.

X_FIELDCAT-TABNAME = 'ITAB'.

X_FIELDCAT-COL_POS = 3.

APPEND X_FIELDCAT TO IT_FIELDCAT.

CLEAR X_FIELDCAT.

L_LAYOUT-info_fieldname = 'COLOR'.

*L_LAYOUT-ZEBRA = 'X'.

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'

EXPORTING

I_CALLBACK_PROGRAM = SY-REPID

IS_LAYOUT = L_LAYOUT

I_CALLBACK_PF_STATUS_SET = 'STATUS'

I_CALLBACK_USER_COMMAND = 'USER_COMMAND'

IT_FIELDCAT = IT_FIELDCAT

TABLES

T_OUTTAB = ITAB

EXCEPTIONS

PROGRAM_ERROR = 1

OTHERS = 2.

IF SY-SUBRC 0.

MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

ENDIF.

&---------------------------------------------------------------------

*& Form STATUS

&---------------------------------------------------------------------

text

----------------------------------------------------------------------

-->P_EXTAB text

----------------------------------------------------------------------

FORM STATUS USING P_EXTAB TYPE SLIS_T_EXTAB.

Pf status

SET PF-STATUS 'STATUS'.

ENDFORM. " STATUS

&---------------------------------------------------------------------

*& Form USER_COMMAND

&---------------------------------------------------------------------

text

----------------------------------------------------------------------

-->R_UCOMM text

-->RS_SELFIELD text

----------------------------------------------------------------------

FORM USER_COMMAND USING R_UCOMM LIKE SY-UCOMM

RS_SELFIELD TYPE SLIS_SELFIELD.

DATA: GD_REPID LIKE SY-REPID, "Exists

REF_GRID TYPE REF TO CL_GUI_ALV_GRID.

IF REF_GRID IS INITIAL.

CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'

IMPORTING

E_GRID = REF_GRID.

ENDIF.

IF NOT REF_GRID IS INITIAL.

CALL METHOD REF_GRID->CHECK_CHANGED_DATA .

ENDIF.

loop at itab where chk = 'X'.

itab-color = 'C300'.

modify itab index sy-tabix transporting color.

endloop.

RS_SELFIELD-refresh = 'X'.

break-point.

ENDFORM. "USER_COMMAND

Hope this will help you

9 REPLIES 9

rajeshkothamasu
Active Participant
0 Kudos

Hi,

Try with below code.

TYPE-POOLS: SLIS.

DATA: X_FIELDCAT TYPE SLIS_FIELDCAT_ALV,

IT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,

L_LAYOUT TYPE SLIS_LAYOUT_ALV,

X_EVENTS TYPE SLIS_ALV_EVENT,

IT_EVENTS TYPE SLIS_T_EVENT.

DATA: BEGIN OF ITAB OCCURS 0,

VBELN LIKE VBAK-VBELN,

POSNR LIKE VBAP-POSNR,

CHK(1),

color(4),

END OF ITAB.

SELECT VBELN

POSNR

FROM VBAP

UP TO 20 ROWS

INTO TABLE ITAB.

X_FIELDCAT-FIELDNAME = 'CHK'.

X_FIELDCAT-TABNAME = 'ITAB'.

X_FIELDCAT-COL_POS = 1.

X_FIELDCAT-INPUT = 'X'.

X_FIELDCAT-EDIT = 'X'.

X_FIELDCAT-CHECKBOX = 'X'.

APPEND X_FIELDCAT TO IT_FIELDCAT.

CLEAR X_FIELDCAT.

X_FIELDCAT-FIELDNAME = 'VBELN'.

X_FIELDCAT-SELTEXT_L = 'VBELN'.

X_FIELDCAT-HOTSPOT = 'X'.

X_FIELDCAT-TABNAME = 'ITAB'.

X_FIELDCAT-COL_POS = 2.

APPEND X_FIELDCAT TO IT_FIELDCAT.

CLEAR X_FIELDCAT.

X_FIELDCAT-FIELDNAME = 'POSNR'.

X_FIELDCAT-SELTEXT_L = 'POSNR'.

X_FIELDCAT-TABNAME = 'ITAB'.

X_FIELDCAT-COL_POS = 3.

APPEND X_FIELDCAT TO IT_FIELDCAT.

CLEAR X_FIELDCAT.

L_LAYOUT-info_fieldname = 'COLOR'.

*L_LAYOUT-ZEBRA = 'X'.

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'

EXPORTING

I_CALLBACK_PROGRAM = SY-REPID

IS_LAYOUT = L_LAYOUT

I_CALLBACK_PF_STATUS_SET = 'STATUS'

I_CALLBACK_USER_COMMAND = 'USER_COMMAND'

IT_FIELDCAT = IT_FIELDCAT

TABLES

T_OUTTAB = ITAB

EXCEPTIONS

PROGRAM_ERROR = 1

OTHERS = 2.

IF SY-SUBRC 0.

MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

ENDIF.

&---------------------------------------------------------------------

*& Form STATUS

&---------------------------------------------------------------------

text

----------------------------------------------------------------------

-->P_EXTAB text

----------------------------------------------------------------------

FORM STATUS USING P_EXTAB TYPE SLIS_T_EXTAB.

Pf status

SET PF-STATUS 'STATUS'.

ENDFORM. " STATUS

&---------------------------------------------------------------------

*& Form USER_COMMAND

&---------------------------------------------------------------------

text

----------------------------------------------------------------------

-->R_UCOMM text

-->RS_SELFIELD text

----------------------------------------------------------------------

FORM USER_COMMAND USING R_UCOMM LIKE SY-UCOMM

RS_SELFIELD TYPE SLIS_SELFIELD.

DATA: GD_REPID LIKE SY-REPID, "Exists

REF_GRID TYPE REF TO CL_GUI_ALV_GRID.

IF REF_GRID IS INITIAL.

CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'

IMPORTING

E_GRID = REF_GRID.

ENDIF.

IF NOT REF_GRID IS INITIAL.

CALL METHOD REF_GRID->CHECK_CHANGED_DATA .

ENDIF.

loop at itab where chk = 'X'.

itab-color = 'C300'.

modify itab index sy-tabix transporting color.

endloop.

RS_SELFIELD-refresh = 'X'.

break-point.

ENDFORM. "USER_COMMAND

Hope this will help you

0 Kudos

I'm sorry but I don't see the part with the button, or am I wrong?

0 Kudos

Hi

What doesn't work?

There's no code for TEST

CASE p_ucomm.

     WHEN 'TEST'.      <-----Where's the code?

ENDCASE.

Max

0 Kudos

Sorry Max, what I try to implement for this case is this code:

FORM user_command USING r_ucomm LIKE sy-ucomm.

   DATA rf_csv TYPE REF TO cl_gui_alv_grid.

   IF rf_csv IS INITIAL.

     CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'

       IMPORTING

         e_grid = rf_csv.

   ENDIF.

   IF rf_csv IS NOT INITIAL.

     CALL METHOD rf_csv->check_changed_data.

   ENDIF.

ENDFORM


But this should be executed by pressing on the button 'TEST'. I made a misstake in my first message.


Or is there better solution to save the changed  data in an internal table?


Denis

0 Kudos

Ok so

I suppose your program loads a csv file and shows the records by ALV GRID editable, here the user can change the data from file and then save them in a table, is it correct?

Max

0 Kudos

yes, exactly. After the user changes data and press the button 'TEST' the data should be saved in other internal table

0 Kudos

Ok

The following lines:

CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'

     IMPORTING

       e_grid = rf_csv.

   CALL METHOD rf_csv->check_changed_data.


are not to store the data, but it's to move the modifications from GRID to your internal table, I mean the table you're moving to GRID.


It's not important you run those line after pressing TEST, but it's important you run them before saving data, so your code is ok now, but the code to save the data is missing:



FORM user_command USING r_ucomm LIKE sy-ucomm.

   DATA rf_csv TYPE REF TO cl_gui_alv_grid.

* this lnes are to be sure the modifications are saved in table for output

   IF rf_csv IS INITIAL.

     CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'

       IMPORTING

         e_grid = rf_csv.

   ENDIF.

   IF rf_csv IS NOT INITIAL.

     CALL METHOD rf_csv->check_changed_data.

   ENDIF.

   CASE R_UCOMM.

     WHEN 'TEST'.

         LOOP AT <ITAB>.

            .........................................

             Here you should save your data from ITAB to Z<table>.

        ENDLOOP.

ENDFORM.



of course you can place the first lines in TEST:



FORM user_command USING r_ucomm LIKE sy-ucomm.

   CASE R_UCOMM.

     WHEN 'TEST'.

* this lnes are to be sure the modifications are saved in table for output

         IF rf_csv IS INITIAL.

            CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'

               IMPORTING

                   e_grid = rf_csv.

         ENDIF.

         IF rf_csv IS NOT INITIAL.

          CALL METHOD rf_csv->check_changed_data.

         ENDIF.

         LOOP AT <ITAB>.

            .........................................

             Here you should save your data from ITAB to Z<table>.

        ENDLOOP.

ENDFORM.

It's very important you run those line before the code to save the data.....but you want to do it?

Max

0 Kudos

Thank you very much, Max!

Former Member
0 Kudos

Hello ,

The internal table that you passed to the SET_TABLE_FOR_FIRST_DISPLAY will be updated automatically...after calling the check changed data method :

CALL METHOD REF_GRID->CHECK_CHANGED_DATA .

Hope it helps.