*&---------------------------------------------------------------------*
*& Report ZDISPLAY_TABLE
*&---------------------------------------------------------------------*
*&程序功能描述:
*&*1---ALV显示指定表中的数据
*&*2---删除指定Z表内容
*REPORT zdisplay_table NO STANDARD PAGE HEADING LINE-SIZE 255.
CONSTANTS lv_option(50) TYPE c VALUE 'EQ=NE<>><LT<LE<=GT>GE>='.
*----------------------------------------------------------------------*
* Variable
*----------------------------------------------------------------------*
DATA:gv_dname TYPE ddobjname,
strsq1(200) TYPE c,
strsq2(200) TYPE c,
strsq3(200) TYPE c,
convert_err TYPE REF TO cx_root,
mess(200) TYPE c.
DATA: BEGIN OF gs_itab,
fieldname TYPE fieldname,
fieldtext TYPE as4text,
datatype TYPE dynptype,
leng TYPE ddleng,
END OF gs_itab.
DATA: gt_itab LIKE gs_itab OCCURS 0 WITH HEADER LINE.
*----------------------------------------------------------------------*
* Selection screen
*----------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.
SELECTION-SCREEN: BEGIN OF LINE.
SELECTION-SCREEN: COMMENT 1(20) text001.
PARAMETERS: pt_dname TYPE tabname16 OBLIGATORY.
SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN: BEGIN OF LINE.
PARAMETERS: c_box TYPE char1 AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN: COMMENT 4(20) c_name.
SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text000.
*1---ALV显示指定表数据
SELECTION-SCREEN: BEGIN OF LINE.
PARAMETERS : pr_act1 TYPE c RADIOBUTTON GROUP g1 DEFAULT 'X' USER-COMMAND a.
SELECTION-SCREEN: COMMENT 4(40) pr1_name.
SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN SKIP.
*2---删除指定Z表内容
SELECTION-SCREEN: BEGIN OF LINE.
PARAMETERS : pr_act2 TYPE c RADIOBUTTON GROUP g1.
SELECTION-SCREEN: COMMENT 4(20) pr2_name.
SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN SKIP.
*3-----更新指定自建表字段值(慎用)
SELECTION-SCREEN: BEGIN OF LINE.
PARAMETERS : pr_act3 TYPE c RADIOBUTTON GROUP g1.
SELECTION-SCREEN: COMMENT 4(20) pr3_name.
SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE text008.
SELECTION-SCREEN: BEGIN OF LINE.
SELECTION-SCREEN COMMENT 20(10) text009.
PARAMETERS:pc_fname TYPE name_feld.
SELECTION-SCREEN COMMENT 65(10) text010.
PARAMETERS:pc_value(250) TYPE c VISIBLE LENGTH 25.
SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN END OF BLOCK b3.
SELECTION-SCREEN BEGIN OF BLOCK b4 WITH FRAME TITLE text002.
SELECTION-SCREEN: COMMENT 40(12) f_name.
SELECTION-SCREEN: COMMENT 70(30) f_value.
SELECTION-SCREEN: BEGIN OF LINE.
SELECTION-SCREEN COMMENT 20(10) text003.
PARAMETERS:p_df1 TYPE name_feld,
p_opt1 TYPE char2 DEFAULT '=',
p_delv1(250) TYPE c VISIBLE LENGTH 25.
SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN: BEGIN OF LINE.
SELECTION-SCREEN COMMENT 20(10) text004.
PARAMETERS:p_df2 TYPE name_feld,
p_opt2 TYPE char2 DEFAULT '=',
p_delv2(250) TYPE c VISIBLE LENGTH 25.
SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN: BEGIN OF LINE.
SELECTION-SCREEN COMMENT 20(10) text005.
PARAMETERS:p_df3 TYPE name_feld,
p_opt3 TYPE char2 DEFAULT '=',
p_delv3(250) TYPE c VISIBLE LENGTH 25.
SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (70) text006.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (70) text007.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK b4.
SELECTION-SCREEN END OF BLOCK b2.
SELECTION-SCREEN SKIP.
*--------------------------------------------------------------------------------*
*AT SELECTION-SCREEN.
*---------------------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.
IF gv_dname NE pt_dname.
CLEAR:p_df1,p_df2,p_df3,p_delv1,p_delv2,p_delv3.
p_opt1 = p_opt2 = p_opt3 = '='.
ENDIF.
IF pr_act1 EQ 'X'.
LOOP AT SCREEN.
IF screen-name CP '*PC_*'.
screen-input = 0.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
CLEAR:pc_fname,pc_value.
ELSEIF pr_act2 EQ 'X'.
LOOP AT SCREEN.
IF screen-name CP '*PC_*' OR screen-name CP '*P_OPT*'.
screen-input = 0.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
CLEAR:pc_fname,pc_value.
ELSEIF pr_act3 EQ 'X'.
p_opt1 = p_opt2 = p_opt3 = '='.
LOOP AT SCREEN.
IF screen-name CP '*P_OPT*'.
screen-input = 0.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
ENDIF.
*--------------------------------------------------------------------------
* AT SELECTION-SCREEN ON VALUE-REQUEST
*--------------------------------------------------------------------------
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_df1.
IF pt_dname IS NOT INITIAL.
PERFORM sub_get_fildname USING 'P_DF1'.
ELSE.
CLEAR:gt_itab[].
ENDIF.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_df2.
IF pt_dname IS NOT INITIAL.
PERFORM sub_get_fildname USING 'P_DF2'.
ELSE.
CLEAR:gt_itab[].
ENDIF.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_df3.
IF pt_dname IS NOT INITIAL.
PERFORM sub_get_fildname USING 'P_DF3'.
ELSE.
CLEAR:gt_itab[].
ENDIF.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR pc_fname.
IF pt_dname IS NOT INITIAL.
PERFORM sub_get_fildname USING 'PC_FNAME'.
ELSE.
CLEAR:gt_itab[].
ENDIF.
*---------------------------------------------------------------------------------*
*INITIALIZATION.
*---------------------------------------------------------------------------------*
INITIALIZATION.
pr1_name = 'Diapaly & Download Table Data'.
pr2_name = 'Delete Table Data'.
pr3_name = 'Update Table Data'.
c_name = 'Only change Z table'.
f_name = 'Field Name'.
f_value = 'Field Value (Uppercase)'.
text000 = 'Operation'.
text001 = 'Table Name'.
text002 = 'WHERE conditions'.
text003 = ' '.
text004 = 'AND'.
text005 = 'AND'.
text006 = '提示: Where限定条件要从上往下依次填入,且最少填入一组'.
text007 = ' 可用运算符: EQ =,NE <> ><,LT <,LE <=,GT >,GE >='.
text008 = 'Update Field Name & Field Value'.
text009 = 'Field Name'.
text010 = 'Field Value (Uppercase)'.
*---------------------------------------------------------------------------------*
*START-OF-SELECTION.
*---------------------------------------------------------------------------------*
START-OF-SELECTION.
IF pr_act1 IS NOT INITIAL.
IF p_df1 IS INITIAL AND p_df2 IS INITIAL AND p_df3 IS INITIAL.
MESSAGE i000(oo) WITH '至少给出一组限定条件'.
RETURN.
ENDIF.
IF p_opt1 IS INITIAL OR p_opt2 IS INITIAL OR p_opt3 IS INITIAL.
MESSAGE i000(oo) WITH '请出入逻辑运算符'.
RETURN.
ENDIF.
TRANSLATE p_opt1 TO UPPER CASE.
TRANSLATE p_opt2 TO UPPER CASE.
TRANSLATE p_opt3 TO UPPER CASE.
IF lv_option NS p_opt1 OR
lv_option NS p_opt2 OR
lv_option NS p_opt3.
MESSAGE i000(oo) WITH '请出入正确的逻辑运算符'.
RETURN.
ENDIF.
PERFORM show_progress_indicator USING '数据查询中...'.
CLEAR:strsq1,strsq2.
CONCATENATE '''' pt_dname '''' INTO strsq1.
IF p_df1 IS NOT INITIAL.
CONCATENATE '''' p_delv1 '''' INTO strsq2.
CONCATENATE '' p_df1 p_opt1 strsq2 INTO strsq2 SEPARATED BY space.
CONCATENATE ' ' strsq2 INTO strsq2 SEPARATED BY space.
ENDIF.
IF p_df1 IS NOT INITIAL AND p_df2 IS NOT INITIAL.
CLEAR: strsq3.
CONCATENATE '''' p_delv2 '''' INTO strsq3.
CONCATENATE strsq2 'AND' p_df2 p_opt2 strsq3 INTO strsq2 SEPARATED BY space.
ENDIF.
IF p_df1 IS NOT INITIAL AND p_df2 IS NOT INITIAL AND p_df3 IS NOT INITIAL.
CLEAR: strsq3.
CONCATENATE '''' p_delv3 '''' INTO strsq3.
CONCATENATE strsq2 'AND' p_df3 p_opt3 strsq3 INTO strsq2 SEPARATED BY space.
ENDIF.
TRANSLATE strsq1 TO UPPER CASE.
TRANSLATE strsq2 TO UPPER CASE.
PERFORM get_data_dispaly_alv.
ENDIF.
IF pr_act2 IS NOT INITIAL. "删除指定Z表内容
CLEAR:strsq2,convert_err,mess.
IF pt_dname(1) NE 'Z' AND c_box = 'X'.
MESSAGE i000(oo) WITH '只能删除Z表内容'.
RETURN.
ENDIF.
IF p_df1 IS INITIAL AND p_df2 IS INITIAL AND p_df3 IS INITIAL.
MESSAGE i000(oo) WITH '至少给出一组限定条件'.
RETURN.
ENDIF.
PERFORM show_progress_indicator USING '数据删除中...'.
IF p_df1 IS NOT INITIAL.
CONCATENATE '''' p_delv1 '''' INTO strsq2.
CONCATENATE '' p_df1 p_opt1 strsq2 INTO strsq2 SEPARATED BY space.
CONCATENATE ' ' strsq2 INTO strsq2 SEPARATED BY space.
ENDIF.
IF p_df1 IS NOT INITIAL AND p_df2 IS NOT INITIAL.
CLEAR: strsq3.
CONCATENATE '''' p_delv2 '''' INTO strsq3.
CONCATENATE strsq2 'AND' p_df2 p_opt2 strsq3 INTO strsq2 SEPARATED BY space.
ENDIF.
IF p_df1 IS NOT INITIAL AND p_df2 IS NOT INITIAL AND p_df3 IS NOT INITIAL.
CLEAR: strsq3.
CONCATENATE '''' p_delv3 '''' INTO strsq3.
CONCATENATE strsq2 'AND' p_df3 p_opt3 strsq3 INTO strsq2 SEPARATED BY space.
ENDIF.
TRY .
TRANSLATE strsq2 TO UPPER CASE.
DELETE FROM (pt_dname) WHERE (strsq2).
CATCH cx_root INTO convert_err.
mess = convert_err->get_text( ).
ENDTRY.
IF mess IS INITIAL.
MESSAGE s000(oo) WITH '指定表数据删除成功!'.
ELSE.
CONCATENATE '指定表数据删除失败' mess INTO mess.
MESSAGE i000(oo) WITH mess DISPLAY LIKE 'E'.
RETURN.
ENDIF.
ENDIF.
IF pr_act3 IS NOT INITIAL."按指定条件更新字段值
CLEAR:strsq1,strsq2,convert_err,mess.
IF pt_dname(1) NE 'Z' AND c_box = 'X'.
MESSAGE i000(oo) WITH '只能更新Z表字段值'.
RETURN.
ENDIF.
IF p_df1 IS INITIAL AND p_df2 IS INITIAL AND p_df3 IS INITIAL.
MESSAGE i000(oo) WITH '至少给出一组限定条件'.
RETURN.
ENDIF.
*-------按指定条件更新字段值
PERFORM show_progress_indicator USING '数据更新中...'.
CONCATENATE '''' pc_value '''' INTO strsq1.
CONCATENATE '' pc_fname ' = ' strsq1 INTO strsq1 SEPARATED BY space.
CONCATENATE ' ' strsq1 INTO strsq1 SEPARATED BY space.
IF p_df1 IS NOT INITIAL.
CONCATENATE '''' p_delv1 '''' INTO strsq2.
CONCATENATE '' p_df1 p_opt1 strsq2 INTO strsq2 SEPARATED BY space.
CONCATENATE ' ' strsq2 INTO strsq2 SEPARATED BY space.
ENDIF.
IF p_df1 IS NOT INITIAL AND p_df2 IS NOT INITIAL.
CLEAR: strsq3.
CONCATENATE '''' p_delv2 '''' INTO strsq3.
CONCATENATE strsq2 'AND' p_df2 p_opt2 strsq3 INTO strsq2 SEPARATED BY space.
ENDIF.
IF p_df1 IS NOT INITIAL AND p_df2 IS NOT INITIAL AND p_df3 IS NOT INITIAL.
CLEAR: strsq3.
CONCATENATE '''' p_delv3 '''' INTO strsq3.
CONCATENATE strsq2 'AND' p_df3 p_opt3 strsq3 INTO strsq2 SEPARATED BY space.
ENDIF.
TRY .
TRANSLATE strsq1 TO UPPER CASE.
TRANSLATE strsq2 TO UPPER CASE.
UPDATE (pt_dname) SET (strsq1) WHERE (strsq2).
CATCH cx_root INTO convert_err.
mess = convert_err->get_text( ).
ENDTRY.
IF mess IS INITIAL.
MESSAGE s000(oo) WITH '指定表字段更新成功!'.
ELSE.
CONCATENATE '指定表字段更新失败' mess INTO mess.
MESSAGE i000(oo) WITH mess DISPLAY LIKE 'E'.
RETURN.
ENDIF.
ENDIF.
*---------------------------------------------------------------------------------*
*END-OF-SELECTION.
*---------------------------------------------------------------------------------*
END-OF-SELECTION.
*&---------------------------------------------------------------------*
*& Form SUB_GET_FILDNAME
*&---------------------------------------------------------------------*
FORM sub_get_fildname USING p_name TYPE dynfnam.
DATA: it_dfies_tab LIKE TABLE OF dfies,
is_dfies_tab LIKE dfies,
ls_return_tab LIKE ddshretval,
return_tab LIKE ddshretval OCCURS 0.
IF gv_dname NE pt_dname.
gv_dname = pt_dname.
CLEAR:gt_itab,gt_itab[],it_dfies_tab.
CALL FUNCTION 'DDIF_FIELDINFO_GET'
EXPORTING
tabname = gv_dname
TABLES
dfies_tab = it_dfies_tab
EXCEPTIONS
not_found = 1
internal_error = 2
OTHERS = 3.
LOOP AT it_dfies_tab INTO is_dfies_tab.
CLEAR:gt_itab.
gt_itab-fieldname = is_dfies_tab-fieldname.
gt_itab-fieldtext = is_dfies_tab-fieldtext.
gt_itab-datatype = is_dfies_tab-datatype.
gt_itab-leng = is_dfies_tab-leng.
APPEND gt_itab.
ENDLOOP.
ENDIF.
IF gt_itab[] IS NOT INITIAL.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'FIELDNAME'
dynpprog = sy-repid
dynpnr = sy-dynnr
dynprofield = p_name
value_org = 'S'
TABLES
value_tab = gt_itab[]
return_tab = return_tab
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form SHOW_PROGRESS_INDICATOR
*&---------------------------------------------------------------------*
FORM show_progress_indicator USING ls_text TYPE c.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = 100
text = ls_text.
ENDFORM. " SHOW_PROGRESS_INDICATOR
*&---------------------------------------------------------------------*
*& Form GET_DATA_DISPALY_ALV
*&---------------------------------------------------------------------*
FORM get_data_dispaly_alv .
DATA: struct_type TYPE REF TO cl_abap_structdescr,
comp_tab TYPE cl_abap_structdescr=>component_table,
itab_type TYPE REF TO cl_abap_tabledescr,
* comp_des_tab TYPE abap_compdescr_tab,
* wa_comp_des_tab TYPE abap_compdescr,
* comp_fld TYPE cl_abap_structdescr=>component,
dref TYPE REF TO data.
FIELD-SYMBOLS : <lt_outtab> TYPE STANDARD TABLE,
<ls_outtab> TYPE any.
struct_type ?= cl_abap_typedescr=>describe_by_name( pt_dname ).
* comp_des_tab[] = struct_type->components[].
comp_tab = struct_type->get_components( ).
struct_type = cl_abap_structdescr=>create( comp_tab ).
itab_type = cl_abap_tabledescr=>create( struct_type ).
CREATE DATA dref TYPE HANDLE itab_type.
ASSIGN dref->* TO <lt_outtab>.
CREATE DATA dref TYPE HANDLE struct_type.
ASSIGN dref->* TO <ls_outtab>.
SELECT * FROM (pt_dname) INTO CORRESPONDING FIELDS OF TABLE <lt_outtab> WHERE (strsq2).
IF sy-subrc = 0.
DATA: gr_table TYPE REF TO cl_salv_table,
gr_columns TYPE REF TO cl_salv_columns_table,
gr_column TYPE REF TO cl_salv_column_table,
gr_functions TYPE REF TO cl_salv_functions_list,
gr_display TYPE REF TO cl_salv_display_settings.
TRY.
CALL METHOD cl_salv_table=>factory
IMPORTING
r_salv_table = gr_table
CHANGING
t_table = <lt_outtab>.
CATCH cx_salv_msg .
ENDTRY.
gr_functions = gr_table->get_functions( ).
* gr_functions->set_default( ).
gr_functions->set_all( abap_true ).
gr_columns = gr_table->get_columns( ).
gr_columns->set_optimize( 'X' ).
* gr_display = gr_table->get_display_settings( ).
* gr_display->set_striped_pattern( cl_salv_display_settings=>true ).
* gr_display->set_list_header('Header Test').
gr_table->display( ).
ELSE.
MESSAGE i000(oo) WITH '没有查到符合条件的值,请重新查找.' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
ENDFORM.
*& Report ZDISPLAY_TABLE
*&---------------------------------------------------------------------*
*&程序功能描述:
*&*1---ALV显示指定表中的数据
*&*2---删除指定Z表内容
*&*3---更新指定自建表字段值(慎用)
*&---"author: lijq21@qq.com
*REPORT zdisplay_table NO STANDARD PAGE HEADING LINE-SIZE 255.
CONSTANTS lv_option(50) TYPE c VALUE 'EQ=NE<>><LT<LE<=GT>GE>='.
*----------------------------------------------------------------------*
* Variable
*----------------------------------------------------------------------*
DATA:gv_dname TYPE ddobjname,
strsq1(200) TYPE c,
strsq2(200) TYPE c,
strsq3(200) TYPE c,
convert_err TYPE REF TO cx_root,
mess(200) TYPE c.
DATA: BEGIN OF gs_itab,
fieldname TYPE fieldname,
fieldtext TYPE as4text,
datatype TYPE dynptype,
leng TYPE ddleng,
END OF gs_itab.
DATA: gt_itab LIKE gs_itab OCCURS 0 WITH HEADER LINE.
*----------------------------------------------------------------------*
* Selection screen
*----------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.
SELECTION-SCREEN: BEGIN OF LINE.
SELECTION-SCREEN: COMMENT 1(20) text001.
PARAMETERS: pt_dname TYPE tabname16 OBLIGATORY.
SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN: BEGIN OF LINE.
PARAMETERS: c_box TYPE char1 AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN: COMMENT 4(20) c_name.
SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text000.
*1---ALV显示指定表数据
SELECTION-SCREEN: BEGIN OF LINE.
PARAMETERS : pr_act1 TYPE c RADIOBUTTON GROUP g1 DEFAULT 'X' USER-COMMAND a.
SELECTION-SCREEN: COMMENT 4(40) pr1_name.
SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN SKIP.
*2---删除指定Z表内容
SELECTION-SCREEN: BEGIN OF LINE.
PARAMETERS : pr_act2 TYPE c RADIOBUTTON GROUP g1.
SELECTION-SCREEN: COMMENT 4(20) pr2_name.
SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN SKIP.
*3-----更新指定自建表字段值(慎用)
SELECTION-SCREEN: BEGIN OF LINE.
PARAMETERS : pr_act3 TYPE c RADIOBUTTON GROUP g1.
SELECTION-SCREEN: COMMENT 4(20) pr3_name.
SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE text008.
SELECTION-SCREEN: BEGIN OF LINE.
SELECTION-SCREEN COMMENT 20(10) text009.
PARAMETERS:pc_fname TYPE name_feld.
SELECTION-SCREEN COMMENT 65(10) text010.
PARAMETERS:pc_value(250) TYPE c VISIBLE LENGTH 25.
SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN END OF BLOCK b3.
SELECTION-SCREEN BEGIN OF BLOCK b4 WITH FRAME TITLE text002.
SELECTION-SCREEN: COMMENT 40(12) f_name.
SELECTION-SCREEN: COMMENT 70(30) f_value.
SELECTION-SCREEN: BEGIN OF LINE.
SELECTION-SCREEN COMMENT 20(10) text003.
PARAMETERS:p_df1 TYPE name_feld,
p_opt1 TYPE char2 DEFAULT '=',
p_delv1(250) TYPE c VISIBLE LENGTH 25.
SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN: BEGIN OF LINE.
SELECTION-SCREEN COMMENT 20(10) text004.
PARAMETERS:p_df2 TYPE name_feld,
p_opt2 TYPE char2 DEFAULT '=',
p_delv2(250) TYPE c VISIBLE LENGTH 25.
SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN: BEGIN OF LINE.
SELECTION-SCREEN COMMENT 20(10) text005.
PARAMETERS:p_df3 TYPE name_feld,
p_opt3 TYPE char2 DEFAULT '=',
p_delv3(250) TYPE c VISIBLE LENGTH 25.
SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (70) text006.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (70) text007.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK b4.
SELECTION-SCREEN END OF BLOCK b2.
SELECTION-SCREEN SKIP.
*--------------------------------------------------------------------------------*
*AT SELECTION-SCREEN.
*---------------------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.
IF gv_dname NE pt_dname.
CLEAR:p_df1,p_df2,p_df3,p_delv1,p_delv2,p_delv3.
p_opt1 = p_opt2 = p_opt3 = '='.
ENDIF.
IF pr_act1 EQ 'X'.
LOOP AT SCREEN.
IF screen-name CP '*PC_*'.
screen-input = 0.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
CLEAR:pc_fname,pc_value.
ELSEIF pr_act2 EQ 'X'.
LOOP AT SCREEN.
IF screen-name CP '*PC_*' OR screen-name CP '*P_OPT*'.
screen-input = 0.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
CLEAR:pc_fname,pc_value.
ELSEIF pr_act3 EQ 'X'.
p_opt1 = p_opt2 = p_opt3 = '='.
LOOP AT SCREEN.
IF screen-name CP '*P_OPT*'.
screen-input = 0.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
ENDIF.
*--------------------------------------------------------------------------
* AT SELECTION-SCREEN ON VALUE-REQUEST
*--------------------------------------------------------------------------
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_df1.
IF pt_dname IS NOT INITIAL.
PERFORM sub_get_fildname USING 'P_DF1'.
ELSE.
CLEAR:gt_itab[].
ENDIF.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_df2.
IF pt_dname IS NOT INITIAL.
PERFORM sub_get_fildname USING 'P_DF2'.
ELSE.
CLEAR:gt_itab[].
ENDIF.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_df3.
IF pt_dname IS NOT INITIAL.
PERFORM sub_get_fildname USING 'P_DF3'.
ELSE.
CLEAR:gt_itab[].
ENDIF.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR pc_fname.
IF pt_dname IS NOT INITIAL.
PERFORM sub_get_fildname USING 'PC_FNAME'.
ELSE.
CLEAR:gt_itab[].
ENDIF.
*---------------------------------------------------------------------------------*
*INITIALIZATION.
*---------------------------------------------------------------------------------*
INITIALIZATION.
pr1_name = 'Diapaly & Download Table Data'.
pr2_name = 'Delete Table Data'.
pr3_name = 'Update Table Data'.
c_name = 'Only change Z table'.
f_name = 'Field Name'.
f_value = 'Field Value (Uppercase)'.
text000 = 'Operation'.
text001 = 'Table Name'.
text002 = 'WHERE conditions'.
text003 = ' '.
text004 = 'AND'.
text005 = 'AND'.
text006 = '提示: Where限定条件要从上往下依次填入,且最少填入一组'.
text007 = ' 可用运算符: EQ =,NE <> ><,LT <,LE <=,GT >,GE >='.
text008 = 'Update Field Name & Field Value'.
text009 = 'Field Name'.
text010 = 'Field Value (Uppercase)'.
*---------------------------------------------------------------------------------*
*START-OF-SELECTION.
*---------------------------------------------------------------------------------*
START-OF-SELECTION.
IF pr_act1 IS NOT INITIAL.
IF p_df1 IS INITIAL AND p_df2 IS INITIAL AND p_df3 IS INITIAL.
MESSAGE i000(oo) WITH '至少给出一组限定条件'.
RETURN.
ENDIF.
IF p_opt1 IS INITIAL OR p_opt2 IS INITIAL OR p_opt3 IS INITIAL.
MESSAGE i000(oo) WITH '请出入逻辑运算符'.
RETURN.
ENDIF.
TRANSLATE p_opt1 TO UPPER CASE.
TRANSLATE p_opt2 TO UPPER CASE.
TRANSLATE p_opt3 TO UPPER CASE.
IF lv_option NS p_opt1 OR
lv_option NS p_opt2 OR
lv_option NS p_opt3.
MESSAGE i000(oo) WITH '请出入正确的逻辑运算符'.
RETURN.
ENDIF.
PERFORM show_progress_indicator USING '数据查询中...'.
CLEAR:strsq1,strsq2.
CONCATENATE '''' pt_dname '''' INTO strsq1.
IF p_df1 IS NOT INITIAL.
CONCATENATE '''' p_delv1 '''' INTO strsq2.
CONCATENATE '' p_df1 p_opt1 strsq2 INTO strsq2 SEPARATED BY space.
CONCATENATE ' ' strsq2 INTO strsq2 SEPARATED BY space.
ENDIF.
IF p_df1 IS NOT INITIAL AND p_df2 IS NOT INITIAL.
CLEAR: strsq3.
CONCATENATE '''' p_delv2 '''' INTO strsq3.
CONCATENATE strsq2 'AND' p_df2 p_opt2 strsq3 INTO strsq2 SEPARATED BY space.
ENDIF.
IF p_df1 IS NOT INITIAL AND p_df2 IS NOT INITIAL AND p_df3 IS NOT INITIAL.
CLEAR: strsq3.
CONCATENATE '''' p_delv3 '''' INTO strsq3.
CONCATENATE strsq2 'AND' p_df3 p_opt3 strsq3 INTO strsq2 SEPARATED BY space.
ENDIF.
TRANSLATE strsq1 TO UPPER CASE.
TRANSLATE strsq2 TO UPPER CASE.
PERFORM get_data_dispaly_alv.
ENDIF.
IF pr_act2 IS NOT INITIAL. "删除指定Z表内容
CLEAR:strsq2,convert_err,mess.
IF pt_dname(1) NE 'Z' AND c_box = 'X'.
MESSAGE i000(oo) WITH '只能删除Z表内容'.
RETURN.
ENDIF.
IF p_df1 IS INITIAL AND p_df2 IS INITIAL AND p_df3 IS INITIAL.
MESSAGE i000(oo) WITH '至少给出一组限定条件'.
RETURN.
ENDIF.
PERFORM show_progress_indicator USING '数据删除中...'.
IF p_df1 IS NOT INITIAL.
CONCATENATE '''' p_delv1 '''' INTO strsq2.
CONCATENATE '' p_df1 p_opt1 strsq2 INTO strsq2 SEPARATED BY space.
CONCATENATE ' ' strsq2 INTO strsq2 SEPARATED BY space.
ENDIF.
IF p_df1 IS NOT INITIAL AND p_df2 IS NOT INITIAL.
CLEAR: strsq3.
CONCATENATE '''' p_delv2 '''' INTO strsq3.
CONCATENATE strsq2 'AND' p_df2 p_opt2 strsq3 INTO strsq2 SEPARATED BY space.
ENDIF.
IF p_df1 IS NOT INITIAL AND p_df2 IS NOT INITIAL AND p_df3 IS NOT INITIAL.
CLEAR: strsq3.
CONCATENATE '''' p_delv3 '''' INTO strsq3.
CONCATENATE strsq2 'AND' p_df3 p_opt3 strsq3 INTO strsq2 SEPARATED BY space.
ENDIF.
TRY .
TRANSLATE strsq2 TO UPPER CASE.
DELETE FROM (pt_dname) WHERE (strsq2).
CATCH cx_root INTO convert_err.
mess = convert_err->get_text( ).
ENDTRY.
IF mess IS INITIAL.
MESSAGE s000(oo) WITH '指定表数据删除成功!'.
ELSE.
CONCATENATE '指定表数据删除失败' mess INTO mess.
MESSAGE i000(oo) WITH mess DISPLAY LIKE 'E'.
RETURN.
ENDIF.
ENDIF.
IF pr_act3 IS NOT INITIAL."按指定条件更新字段值
CLEAR:strsq1,strsq2,convert_err,mess.
IF pt_dname(1) NE 'Z' AND c_box = 'X'.
MESSAGE i000(oo) WITH '只能更新Z表字段值'.
RETURN.
ENDIF.
IF p_df1 IS INITIAL AND p_df2 IS INITIAL AND p_df3 IS INITIAL.
MESSAGE i000(oo) WITH '至少给出一组限定条件'.
RETURN.
ENDIF.
*-------按指定条件更新字段值
PERFORM show_progress_indicator USING '数据更新中...'.
CONCATENATE '''' pc_value '''' INTO strsq1.
CONCATENATE '' pc_fname ' = ' strsq1 INTO strsq1 SEPARATED BY space.
CONCATENATE ' ' strsq1 INTO strsq1 SEPARATED BY space.
IF p_df1 IS NOT INITIAL.
CONCATENATE '''' p_delv1 '''' INTO strsq2.
CONCATENATE '' p_df1 p_opt1 strsq2 INTO strsq2 SEPARATED BY space.
CONCATENATE ' ' strsq2 INTO strsq2 SEPARATED BY space.
ENDIF.
IF p_df1 IS NOT INITIAL AND p_df2 IS NOT INITIAL.
CLEAR: strsq3.
CONCATENATE '''' p_delv2 '''' INTO strsq3.
CONCATENATE strsq2 'AND' p_df2 p_opt2 strsq3 INTO strsq2 SEPARATED BY space.
ENDIF.
IF p_df1 IS NOT INITIAL AND p_df2 IS NOT INITIAL AND p_df3 IS NOT INITIAL.
CLEAR: strsq3.
CONCATENATE '''' p_delv3 '''' INTO strsq3.
CONCATENATE strsq2 'AND' p_df3 p_opt3 strsq3 INTO strsq2 SEPARATED BY space.
ENDIF.
TRY .
TRANSLATE strsq1 TO UPPER CASE.
TRANSLATE strsq2 TO UPPER CASE.
UPDATE (pt_dname) SET (strsq1) WHERE (strsq2).
CATCH cx_root INTO convert_err.
mess = convert_err->get_text( ).
ENDTRY.
IF mess IS INITIAL.
MESSAGE s000(oo) WITH '指定表字段更新成功!'.
ELSE.
CONCATENATE '指定表字段更新失败' mess INTO mess.
MESSAGE i000(oo) WITH mess DISPLAY LIKE 'E'.
RETURN.
ENDIF.
ENDIF.
*---------------------------------------------------------------------------------*
*END-OF-SELECTION.
*---------------------------------------------------------------------------------*
END-OF-SELECTION.
*&---------------------------------------------------------------------*
*& Form SUB_GET_FILDNAME
*&---------------------------------------------------------------------*
FORM sub_get_fildname USING p_name TYPE dynfnam.
DATA: it_dfies_tab LIKE TABLE OF dfies,
is_dfies_tab LIKE dfies,
ls_return_tab LIKE ddshretval,
return_tab LIKE ddshretval OCCURS 0.
IF gv_dname NE pt_dname.
gv_dname = pt_dname.
CLEAR:gt_itab,gt_itab[],it_dfies_tab.
CALL FUNCTION 'DDIF_FIELDINFO_GET'
EXPORTING
tabname = gv_dname
TABLES
dfies_tab = it_dfies_tab
EXCEPTIONS
not_found = 1
internal_error = 2
OTHERS = 3.
LOOP AT it_dfies_tab INTO is_dfies_tab.
CLEAR:gt_itab.
gt_itab-fieldname = is_dfies_tab-fieldname.
gt_itab-fieldtext = is_dfies_tab-fieldtext.
gt_itab-datatype = is_dfies_tab-datatype.
gt_itab-leng = is_dfies_tab-leng.
APPEND gt_itab.
ENDLOOP.
ENDIF.
IF gt_itab[] IS NOT INITIAL.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'FIELDNAME'
dynpprog = sy-repid
dynpnr = sy-dynnr
dynprofield = p_name
value_org = 'S'
TABLES
value_tab = gt_itab[]
return_tab = return_tab
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form SHOW_PROGRESS_INDICATOR
*&---------------------------------------------------------------------*
FORM show_progress_indicator USING ls_text TYPE c.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = 100
text = ls_text.
ENDFORM. " SHOW_PROGRESS_INDICATOR
*&---------------------------------------------------------------------*
*& Form GET_DATA_DISPALY_ALV
*&---------------------------------------------------------------------*
FORM get_data_dispaly_alv .
DATA: struct_type TYPE REF TO cl_abap_structdescr,
comp_tab TYPE cl_abap_structdescr=>component_table,
itab_type TYPE REF TO cl_abap_tabledescr,
* comp_des_tab TYPE abap_compdescr_tab,
* wa_comp_des_tab TYPE abap_compdescr,
* comp_fld TYPE cl_abap_structdescr=>component,
dref TYPE REF TO data.
FIELD-SYMBOLS : <lt_outtab> TYPE STANDARD TABLE,
<ls_outtab> TYPE any.
struct_type ?= cl_abap_typedescr=>describe_by_name( pt_dname ).
* comp_des_tab[] = struct_type->components[].
comp_tab = struct_type->get_components( ).
struct_type = cl_abap_structdescr=>create( comp_tab ).
itab_type = cl_abap_tabledescr=>create( struct_type ).
CREATE DATA dref TYPE HANDLE itab_type.
ASSIGN dref->* TO <lt_outtab>.
CREATE DATA dref TYPE HANDLE struct_type.
ASSIGN dref->* TO <ls_outtab>.
SELECT * FROM (pt_dname) INTO CORRESPONDING FIELDS OF TABLE <lt_outtab> WHERE (strsq2).
IF sy-subrc = 0.
DATA: gr_table TYPE REF TO cl_salv_table,
gr_columns TYPE REF TO cl_salv_columns_table,
gr_column TYPE REF TO cl_salv_column_table,
gr_functions TYPE REF TO cl_salv_functions_list,
gr_display TYPE REF TO cl_salv_display_settings.
TRY.
CALL METHOD cl_salv_table=>factory
IMPORTING
r_salv_table = gr_table
CHANGING
t_table = <lt_outtab>.
CATCH cx_salv_msg .
ENDTRY.
gr_functions = gr_table->get_functions( ).
* gr_functions->set_default( ).
gr_functions->set_all( abap_true ).
gr_columns = gr_table->get_columns( ).
gr_columns->set_optimize( 'X' ).
* gr_display = gr_table->get_display_settings( ).
* gr_display->set_striped_pattern( cl_salv_display_settings=>true ).
* gr_display->set_list_header('Header Test').
gr_table->display( ).
ELSE.
MESSAGE i000(oo) WITH '没有查到符合条件的值,请重新查找.' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
ENDFORM.