ABAP 修改,删除,显示,下载任意表格任意指定字段数据

*&---------------------------------------------------------------------*
*& 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.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值