08-28-2014 1:08 PM
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
08-28-2014 1:29 PM
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
08-28-2014 1:29 PM
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
08-28-2014 2:03 PM
I'm sorry but I don't see the part with the button, or am I wrong?
08-28-2014 2:13 PM
Hi
What doesn't work?
There's no code for TEST
CASE p_ucomm.
WHEN 'TEST'. <-----Where's the code?
ENDCASE.
Max
08-28-2014 2:38 PM
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
08-28-2014 2:49 PM
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
08-28-2014 3:13 PM
yes, exactly. After the user changes data and press the button 'TEST' the data should be saved in other internal table
08-28-2014 3:26 PM
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
08-28-2014 4:05 PM
08-28-2014 3:30 PM
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.