首页 > 其他分享 >外挂系统表查询器

外挂系统表查询器

时间:2022-11-22 09:11:57浏览次数:40  
标签:外挂 LIKE wa 查询器 系统 sy where table TYPE

************************************************************************
* Program Name      :  ZSDR025
* Descriptions      :  外掛表格資料上傳 有权限限制
* Updates Tables    :
* Input  Parameters :
* Output Parameters :
* Return Codes      :
* Special Logic     :
* Includes          :
************************************************************************
* Modification Log
************************************************************************
*   Date     Ver. Programmer   Descriptions
* ---------- ---- ------------ -------------------------------------------
* 2013/11/29      ALICE        New Create
*
************************************************************************
REPORT zsdr025 NO STANDARD PAGE HEADING
                MESSAGE-ID 00
                LINE-SIZE  500
                LINE-COUNT 65.

CLASS lcl_report DEFINITION.
  PUBLIC SECTION.
    DATA: t_data  TYPE STANDARD TABLE OF anep,  " Output dat
          r_bukrs TYPE RANGE OF anep-bukrs,
          r_gjahr TYPE RANGE OF  anep-gjahr.  " Select Option
    METHODS:
      get_data,
      generate_output.
ENDCLASS.                    "lcl_report DEFINITION

TABLES:zsdt015,dd03l,sscrfields.

TYPE-POOLS : abap.
FIELD-SYMBOLS: <dyn_table>  TYPE STANDARD TABLE,
               <dyn_wa>,
               <dyn_field>,
               <dyn_table2> TYPE STANDARD TABLE,
               <dyn_wa2>,
               <dyn_field2>.
DATA: dy_table  TYPE REF TO data,
      dy_table2 TYPE REF TO data,
      dy_line   TYPE REF TO data,
      dy_line2  TYPE REF TO data,
      xfc       TYPE lvc_s_fcat,
      xfc2      TYPE lvc_s_fcat,
      ifc       TYPE lvc_t_fcat,
      ifc2      TYPE lvc_t_fcat.
DATA:gt_tablefield LIKE TABLE OF dd03l WITH HEADER LINE.

DATA: BEGIN OF t_line OCCURS 0,
        text(3000) TYPE c,
      END OF t_line.



* 定义ALV相关
*--> ALV
TYPE-POOLS: slis, icon, truxs.
DATA: wa_layout   TYPE slis_layout_alv,
      wa_setting  TYPE lvc_s_glay,
      gt_fieldcat TYPE slis_t_fieldcat_alv,
      wa_fieldcat TYPE slis_fieldcat_alv.
DATA: wa_layout_ord   TYPE slis_layout_alv,
      wa_setting_ord  TYPE lvc_s_glay,
      gt_fieldcat_ord TYPE slis_t_fieldcat_alv,
      wa_fieldcat_ord TYPE slis_fieldcat_alv.

DATA:BEGIN OF gt_tab OCCURS 0,
       tabname TYPE dd02t-tabname, "字母
       ddtext  TYPE dd02t-ddtext,
     END OF gt_tab.

FIELD-SYMBOLS:<gt_table> TYPE STANDARD TABLE,
              <g_wa>,
              <g_comp>,
              <g_field>,
              <g_comp_f>.

DATA: gt_table     TYPE REF TO data,
      gt_structure TYPE lvc_t_fcat.


DATA: lo_report TYPE REF TO lcl_report.
DATA: w_bukrs TYPE anep-bukrs,
      w_gjahr TYPE anep-gjahr.

TYPES: BEGIN OF t_dd03l,
         tabname    LIKE dd03l-tabname, "Table Name
         fieldname  LIKE dd03l-fieldname, "Field Name
         keyflag    LIKE dd03l-keyflag, "Key Flag
         rollname   LIKE dd03l-rollname, "Roll Name
         position   LIKE dd03l-position, "Position
         ddtext(30), "Description
       END OF t_dd03l,
       BEGIN OF t_fields.
    INCLUDE STRUCTURE dd03l.
TYPES: END OF t_fields.
TYPES : BEGIN OF t_tabs. "To hold the table names
    INCLUDE STRUCTURE rsdstabs.
TYPES : END OF t_tabs.
TYPES : BEGIN OF t_flds. "To hold the field names
    INCLUDE STRUCTURE rsdsfields.
TYPES : END OF t_flds.
TYPES : BEGIN OF t_fname, "To hold the field names
          fld LIKE dd03l-fieldname,
        END OF t_fname.

*----------------------------------------------------------------------
DATA : it_dd03l  TYPE TABLE OF t_dd03l, "To hold the field names
       it_tabs   TYPE TABLE OF t_tabs, "To hold the table names
       it_flds   TYPE TABLE OF t_flds, "To hold the field names
       it_temp   TYPE TABLE OF t_flds, "Temp. table to hold field names
       it_fields TYPE TABLE OF t_fields, "To hold the field names
       it_cat    TYPE TABLE OF lvc_s_fcat, "To hold Field Catalog
       it_fname  TYPE TABLE OF t_fname.

DATA: d_ref     TYPE REF TO data , "Data reference
      wa_dd03l  LIKE LINE OF it_dd03l, "Workarea for IT_DD03L
      wa_tabs   LIKE LINE OF it_tabs, "Workarea for IT_TABS
      wa_flds   LIKE LINE OF it_flds, "Workarea for IT_FLDS
      wa_temp   LIKE LINE OF it_temp, "Workarea for IT_TEMP
      wa_fields LIKE LINE OF it_fields, "Workarea for IT_FIELDS
      wa_cat    LIKE LINE OF it_cat , "Workarea for IT_CAT
      wa_fname  LIKE LINE OF it_fname. "Workarea for IT_FNAME

DATA: gx_texpr         TYPE rsds_texpr, "Variable to hold Expression
      gx_twhere        TYPE rsds_twhere, "Variable to hold Where Clause
      gv_selid         LIKE rsdynsel-selid, "Variable to hold Selid
      gv_actnum        LIKE sy-tfill, "Variable to hold no of fields
      gv_title         LIKE sy-title, "Variable to hold Title
      gv_where_cl(100) TYPE c, "Variable to hold Where clause
      gv_tbname        LIKE dd03l-tabname,
      gv_temp.

DATA: ref_grid TYPE REF TO cl_gui_alv_grid,
      ls_stbl  TYPE lvc_s_stbl.

CONSTANTS: gc_i     TYPE c VALUE 'I',
           gc_eq(2) TYPE c VALUE 'EQ'.


SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.
*  SELECTION-SCREEN BEGIN OF LINE.
*      "查询table内容
*      PARAMETERS: c_sel RADIOBUTTON GROUP up default 'X'.
*      SELECTION-SCREEN COMMENT (9) TEXT-001.
"修改table资料
PARAMETERS: c_up AS CHECKBOX .
*      SELECTION-SCREEN COMMENT (9) TEXT-002.



SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (4) TEXT-003.
PARAMETERS: p_table TYPE dd02l-tabname OBLIGATORY.
SELECTION-SCREEN : PUSHBUTTON 45(8) p_btn USER-COMMAND clk1.
SELECTION-SCREEN END OF LINE.

PARAMETERS:p_fname LIKE rlgrap-filename DEFAULT 'c:\temp\tab.csv'
OBLIGATORY.

SELECT-OPTIONS:
s_selop FOR dd03l-fieldname NO-DISPLAY, "To hold fields for creating dyn. select-options
s_where FOR gv_where_cl NO-DISPLAY. "To hold where condition

SELECTION-SCREEN END OF BLOCK b1.


INITIALIZATION.
  p_btn = '查询或修改'(004).

* CREATE OBJECT lo_report.
* generate output
*  lo_report->generate_output( ).
** Start of Selection
*START-OF-SELECTION.
** Get data
**  lo_report->r_BUKRS = s_BUKRS[].
**  lo_report->r_GJAHR = s_GJAHR[].
**  lo_report->get_data( ).

AT SELECTION-SCREEN.
*--Select the fields of the input table
  PERFORM select_flds.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_table.
  PERFORM frm_help.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_fname.
  CALL FUNCTION 'F4_FILENAME'
    IMPORTING
      file_name = p_fname.

START-OF-SELECTION.

END-OF-SELECTION.
* CALL SCREEN 1000.
*  PERFORM check_screen.
*  PERFORM get_structure.
*  PERFORM create_dynamic_itab.
************Creates a dyanamic internal table**********
*  PERFORM get_data.
*  PERFORM display_date.


*&---------------------------------------------------------------------*
*&      Form  get_structure
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM get_structure.

  DATA: idetails TYPE abap_compdescr_tab,
        xdetails TYPE abap_compdescr.
  DATA : ref_table_des TYPE REF TO cl_abap_structdescr.
  DATA : ef_is_unicode LIKE  /bdl/tasks-status.

* Check the system is UNICODE or NONUNICODE
  CALL FUNCTION '/BDL/CHECK_UNICODE'
    IMPORTING
      ef_is_unicode = ef_is_unicode.
* get the structure of the table.
  ref_table_des ?=
      cl_abap_typedescr=>describe_by_name( p_table ).
  idetails[] = ref_table_des->components[].

  wa_layout-colwidth_optimize = 'X'.
  wa_layout-box_fieldname    ='SEL'.

  xfc-tabname = p_table.
  xfc-fieldname =  'SEL'.
  xfc-datatype =  'C'.
  xfc-inttype = 'C'.
  xfc-intlen = '1'.
  xfc-decimals = '0'.
  APPEND xfc TO ifc.

  LOOP AT idetails INTO xdetails.
    CLEAR xfc.
    xfc-tabname = p_table.
    xfc-fieldname = xdetails-name .
    xfc-datatype = xdetails-type_kind.
    xfc-inttype = xdetails-type_kind.
    CASE xfc-datatype.
      WHEN 'C' OR 'D' OR 'N'.
        IF ef_is_unicode EQ 'X'.
          xfc-intlen = xdetails-length / 2. " Unicdoe
        ELSE.
          xfc-intlen = xdetails-length.     " nonunicode
        ENDIF.
      WHEN OTHERS.                          " For Type P
        xfc-intlen = xdetails-length.
    ENDCASE.
    xfc-decimals = xdetails-decimals.
    APPEND xfc TO ifc.
  ENDLOOP.


ENDFORM.                    "get_structure
*&---------------------------------------------------------------------*
*&      Form  create_dynamic_itab
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM create_dynamic_itab.
* Create dynamic internal table and assign to FS
  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      i_length_in_byte = 'X'
      it_fieldcatalog  = ifc
    IMPORTING
      ep_table         = dy_table.
  ASSIGN dy_table->* TO <dyn_table>.
* Create dynamic work area and assign to FS
  CREATE DATA dy_line LIKE LINE OF <dyn_table>.
  ASSIGN dy_line->* TO <dyn_wa>.

  ifc2[] = ifc[].

  DELETE ifc2 WHERE fieldname = 'SEL'.
  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      i_length_in_byte = 'X'
      it_fieldcatalog  = ifc2
    IMPORTING
      ep_table         = dy_table2.
  ASSIGN dy_table2->* TO <dyn_table2>.
* Create dynamic work area and assign to FS
  CREATE DATA dy_line2 LIKE LINE OF <dyn_table2>.
  ASSIGN dy_line2->* TO <dyn_wa2>.

ENDFORM.                    "create_dynamic_itab

*&---------------------------------------------------------------------*
*&      Form  get_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM get_data.
  DATA:g_p       TYPE p DECIMALS 3,
       g_c       TYPE c LENGTH 20,
       g_error   TYPE REF TO cx_root,
       g_message TYPE string.

* DATA:wa_structure type ref to cl_abap_structdescr.
  DATA:wa_structure TYPE lvc_s_fcat.
  DATA:l_new_line   TYPE REF TO data.
  CREATE DATA l_new_line LIKE LINE OF <dyn_table>.
  ASSIGN l_new_line->* TO <dyn_wa> .

  DATA : filename LIKE rlgrap-filename.

  DATA:l_text   TYPE string,
       itab     TYPE TABLE OF string,
       l2_index LIKE sy-tabix.

  filename = p_fname.

*  DATA: LT_UPLOAD  LIKE ALSMEX_TABLINE OCCURS 0 WITH HEADER LINE.
*--因為有超過長度50所以複製一個一樣的TABLE
*  DATA: lt_upload  LIKE zalsmex_tabline OCCURS 0 WITH HEADER LINE.

  DATA: l_index  TYPE i,
        l_num    TYPE i,
        l_number TYPE i.

  SELECT SINGLE *
  INTO  zsdt015
  FROM zsdt015
  WHERE usdid = sy-uname
   AND    table_name  = p_table.

  IF sy-subrc = 0 AND
      c_up = 'X' AND
      zsdt015-zupdate EQ 'N'.

    MESSAGE s001 WITH '此表只能做查询,不能做修改动作' DISPLAY LIKE 'E'.
    STOP.
  ENDIF.

  "批量上传档案
  IF c_up = 'X' AND p_table(1) = 'Z' .


    DATA: p_path TYPE string.
    p_path = filename.
    CALL FUNCTION 'GUI_UPLOAD'
      EXPORTING
        filename                = p_path
        filetype                = 'ASC'
*       HAS_FIELD_SEPARATOR     = 'X'
        codepage                = '8400'
      TABLES
        data_tab                = t_line
      EXCEPTIONS
        file_open_error         = 1
        file_read_error         = 2
        no_batch                = 3
        gui_refuse_filetransfer = 4
        invalid_type            = 5
        no_authority            = 6
        unknown_error           = 7
        bad_data_format         = 8
        header_not_allowed      = 9
        separator_not_allowed   = 10
        header_too_long         = 11
        unknown_dp_error        = 12
        access_denied           = 13
        dp_out_of_memory        = 14
        disk_full               = 15
        dp_timeout              = 16
        OTHERS                  = 17.
    IF sy-subrc <> 0.
      MESSAGE s000(zmsg) WITH '上傳失敗' DISPLAY LIKE 'E'.
      EXIT.
    ENDIF.
    IF t_line[] IS INITIAL.
      MESSAGE s000(zmsg) WITH '上傳檔案中無資料'
      DISPLAY LIKE 'E'.
      EXIT.
    ENDIF.



    DELETE t_line INDEX 1.

    LOOP AT t_line.
      l2_index = sy-tabix.
      SPLIT t_line-text AT ',' INTO TABLE itab.
      LOOP AT itab INTO l_text.
        l_index = sy-tabix.
        "检查表格是否包含客户端栏位,
        "①若存在且导入未写入客户端栏位值时,那么剔除客户端栏位
        "②若存在且导入写入客户端栏位值,那么不剔除客户端栏位
        "③若不存客户端栏位值,那么不剔除第一列数据
        IF l2_index = 1 AND l_index = 1.
          READ TABLE ifc2  INTO wa_structure WITH KEY fieldname = 'MANDT'.
          IF sy-subrc = 0 AND NOT
             ( l_text = 888 OR l_text = 200 OR
                l_text = 201 OR l_text = 202 OR
                l_text = 206 OR l_text = 230 OR
                l_text = 250 OR l_text = 280 ) .
            l_num = l_index + 1.
            l_number = '1'.
          ELSEIF sy-subrc <> 0 OR (
                      sy-subrc = 0 AND
                      ( l_text = 888 OR l_text = 200 OR
                        l_text = 201 OR l_text = 202 OR
                        l_text = 206 OR l_text = 230 OR
                        l_text = 250 OR l_text = 280 ) ).

            l_num = l_index.
            l_number = '0'.
          ENDIF.
        ELSE.
          l_num = l_index + l_number.
        ENDIF.

*--->第二筆是 MANDT所以都從第二筆開始
        READ TABLE ifc2  INTO wa_structure INDEX l_num.


        ASSIGN COMPONENT wa_structure-fieldname OF STRUCTURE
        <dyn_wa>  TO <dyn_field>.
        CONDENSE l_text.

        "检查非数值栏位是否包含非数字字符
        READ TABLE gt_tablefield WITH KEY
                           fieldname = wa_structure-fieldname.
        IF sy-subrc = 0 AND gt_tablefield-inttype <> 'C'.
          g_c = l_text.
          TRY .
              g_p = g_c .
            CATCH  cx_sy_conversion_no_number INTO g_error.
              g_message = g_error->get_longtext( ).

              MESSAGE s001 WITH g_message DISPLAY LIKE 'E'.
              STOP.
          ENDTRY.
        ENDIF.
        IF gt_tablefield-inttype = 'D' AND
            gt_tablefield-keyflag = 'X' AND
            gt_tablefield-fieldname = 'ERDAT'.
            zsdt015-zautom = 'Y'.

          l_text = sy-datum.
        ELSEIF gt_tablefield-inttype = 'T' AND
                   gt_tablefield-keyflag = 'X' AND
                   zsdt015-zautom = 'Y'.

          sy-uzeit = sy-uzeit + l2_index.
          l_text = sy-uzeit.
        ENDIF.
        <dyn_field> = l_text.
        "最后一行执行代码.
        AT LAST.
          APPEND <dyn_wa> TO <dyn_table>.
          CLEAR:<dyn_wa>.
        ENDAT.
      ENDLOOP.

    ENDLOOP.

*  清空需要导入的TABLE
    IF zsdt015-zddelete = 'Y'.
      DELETE FROM (p_table).
    ENDIF.

    CLEAR:<dyn_table2>[].
    MOVE-CORRESPONDING <dyn_table>[] TO <dyn_table2>[].
*select * from   (P_TABLE).
    "插入数据
    PERFORM write_out.

  ELSE.
    DATA: lv_where TYPE string.
    LOOP AT s_where.
      CONCATENATE lv_where s_where-low INTO lv_where SEPARATED BY space.
    ENDLOOP.

    SELECT * FROM (p_table)
    INTO CORRESPONDING FIELDS OF TABLE <dyn_table>
    WHERE (lv_where) .
  ENDIF.

ENDFORM.                    "get_data

**Write out data from table.
FORM write_out.
  DATA:l_suce TYPE i,
       l_str  TYPE c LENGTH 20,
       l_fail TYPE i,
       l_str1 TYPE c LENGTH 20.

  DATA:BEGIN OF lt_str OCCURS 0,
         str TYPE string,
         num TYPE c,
       END OF lt_str.

  CLEAR:l_suce,l_fail,lt_str[],lt_str,l_str,l_str1.

  LOOP AT <dyn_table2> INTO <dyn_wa2>.
    DO.
      ASSIGN COMPONENT  sy-index
         OF STRUCTURE <dyn_wa2> TO <dyn_field2>.
      IF sy-subrc <> 0.
        EXIT.
      ENDIF.
    ENDDO.

    INSERT (p_table) FROM <dyn_wa2>.
    IF sy-subrc <> 0.
      l_fail = l_fail + 1.

      lt_str-str = <dyn_wa2>.
      APPEND lt_str.
      CLEAR: lt_str.

    ELSE.
      l_suce = l_suce + 1.

    ENDIF.

    AT LAST.
      l_str  = l_suce.
      l_str1 = l_fail.

      CONCATENATE '成功' l_str  '筆,失敗' l_str1  '筆'
      INTO lt_str-str.
      lt_str-num = 'X'.
      APPEND lt_str.
      CLEAR: lt_str.
*      WRITE:/ '成功',L_SUCE ,'筆,失敗',L_FAIL, '筆'.
    ENDAT.

  ENDLOOP.

  SORT lt_str BY num DESCENDING.

ENDFORM.                    "write_out

*&---------------------------------------------------------------------*
*& Form DISPLAY_DATE
*&---------------------------------------------------------------------*
*& ALV显示
*&---------------------------------------------------------------------*

FORM  display_date.

**--> dynamic table structure and generate ALV fieldcat 构造fieldcat
  PERFORM create_structure.

  CLEAR:wa_layout.
  wa_layout-box_fieldname  = 'SEL'.  " 指定紀錄選取與否的欄位

**--> ALV Layout Setting
  wa_layout-colwidth_optimize = 'X'. " 最佳欄寬
  wa_layout-zebra = 'X'.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program       = sy-repid
      is_layout                = wa_layout
      it_fieldcat              = gt_fieldcat
      i_callback_pf_status_set = 'ALV_PF_STATUS'
      i_callback_user_command  = 'ALV_USER_COMMAND'
      i_save                   = 'A'
    TABLES
      t_outtab                 = <dyn_table>.

ENDFORM.

FORM alv_pf_status USING rt_extab TYPE slis_t_extab.
  SET  PF-STATUS  'STATUS_PRINT' .               "自定义按钮
ENDFORM.                    " ALV_PF_STATUS

FORM alv_user_command USING  in_ucomm LIKE  sy-ucomm
                         in_selfield TYPE slis_selfield.

  DATA:l_where       TYPE c LENGTH 12, "alv 选择数据条件
       l2_where      TYPE string , "主键条件
       l_field_value TYPE string, "栏位及值
       l_vlaue       TYPE string, "栏位值
       l_index       LIKE sy-tabix,
       l_datum       LIKE sy-datum. "日期

  FIELD-SYMBOLS:<f_fs1>,<f_out_wa>.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = ref_grid.
  CALL METHOD ref_grid->check_changed_data.

*--->核实权限
  SELECT SINGLE *
  INTO  zsdt015
  FROM zsdt015
  WHERE usdid = sy-uname
   AND    table_name  = p_table.

  IF  in_ucomm = '&UPDATE'
   AND zsdt015-zupdate <> 'Y'.

    MESSAGE s001 WITH '没有更改权限' DISPLAY LIKE 'E'.

    RETURN.

  ELSEIF in_ucomm = '&DELETE'
     AND zsdt015-zdelete <> 'Y'.

    MESSAGE s001 WITH '没有删除权限' DISPLAY LIKE 'E'.

    RETURN.

  ENDIF.

  READ TABLE <dyn_table> ASSIGNING <f_out_wa> WITH KEY ('SEL') = 'X'.
  IF sy-subrc <> 0.
    MESSAGE s001 WITH '请选择....需要更改或删除的数据' DISPLAY LIKE 'E'.
    RETURN.
  ENDIF.

  CONCATENATE 'SEL' ' EQ '''  'X' '''' INTO l_where.

  CASE in_ucomm.
    WHEN '&UPDATE'.
*--->修改数据
      LOOP AT <dyn_table> ASSIGNING <f_out_wa> WHERE (l_where).
        CLEAR:l2_where,l_where,l_field_value.
        "栏位名称
        LOOP AT gt_tablefield.

          ASSIGN COMPONENT gt_tablefield-fieldname OF STRUCTURE
                                           <f_out_wa> TO <f_fs1>.
          l_vlaue = <f_fs1>.
          "主键栏位
          IF  gt_tablefield-keyflag = 'X'.
            IF l2_where IS INITIAL .
              CONCATENATE gt_tablefield-fieldname ' = '''
                                   l_vlaue ''''
              INTO l2_where.
            ELSE.
              CONCATENATE l2_where ' AND and'''
                                 gt_tablefield-fieldname ' = '''
                                  l_vlaue ''''
              INTO l2_where.
            ENDIF.

          ELSE.
            IF l_field_value IS INITIAL.
              CONCATENATE gt_tablefield-fieldname ' = '''
                                   l_vlaue ''''
              INTO l_field_value.
            ELSE.

              CONCATENATE l_field_value ' AND '''
                                    gt_tablefield-fieldname ' = '''
                                    l_vlaue ''''
              INTO l_field_value.

            ENDIF.

          ENDIF.
        ENDLOOP.
        REPLACE  ALL  OCCURRENCES  OF 'and''' IN  l2_where WITH  ''.
        REPLACE  ALL  OCCURRENCES  OF 'AND ''' IN  l_field_value WITH  ' ' .
        IF  l_field_value IS INITIAL.
          MESSAGE s001 WITH '不允许修改主键栏位' DISPLAY LIKE 'E'.
          RETURN.
        ENDIF.

        UPDATE (p_table) SET (l_field_value)  WHERE (l2_where).
      ENDLOOP.
      MESSAGE s001 WITH '更新成功!' DISPLAY LIKE 'S'.
    WHEN '&DELETE'.
*--->删除数据
      IF zsdt015-zdelday IS NOT INITIAL.
        CALL FUNCTION 'FIMA_DATE_CREATE'
          EXPORTING
            i_date             = sy-datum "输入日期
            i_flg_end_of_month = ' '
*           I_YEARS            = L_YEAR   "两年后的日期. 即输入日期的年加2所得日期,可为负数,表示前两年
*           I_MONTHS           = L_MONTH  "一个月后的日期.即输入日期的月加1所得日期,可为负数,表示前一个月
            i_days             = - zsdt015-zdelday "23天后的日期。可为负数
*           I_CALENDAR_DAYS    = 10      "10天后的日历。同I_DAYS参数。
*           I_SET_LAST_DAY_OF_MONTH = 'X'     "返回的日期为当前月份的最后一天
          IMPORTING
            e_date             = l_datum.   "返回的日期为当前月份的最后一天
      ENDIF.


      LOOP AT <dyn_table> ASSIGNING <f_out_wa> WHERE (l_where).
        l_index = sy-tabix.
        CLEAR:l2_where,l_where.
        "栏位名称
        LOOP AT gt_tablefield.

          ASSIGN COMPONENT gt_tablefield-fieldname OF STRUCTURE
                                           <f_out_wa> TO <f_fs1>.
          l_vlaue = <f_fs1>.

          IF  gt_tablefield-keyflag = 'X' AND
               gt_tablefield-inttype = 'D' AND
               gt_tablefield-fieldname = 'ERDAT' AND
               l_vlaue < l_datum.
            MESSAGE s001 WITH '删除失败!,日期版本已超出可删除范围内,请选择数据其他数据.'
            DISPLAY LIKE 'E'.
            RETURN.
          ENDIF.

          IF l2_where IS INITIAL .
            CONCATENATE gt_tablefield-fieldname ' = '''
                                  l_vlaue ''''
            INTO l2_where.
          ELSE.
            CONCATENATE l2_where
                               ' AND and'''
                               gt_tablefield-fieldname ' = '''
                                l_vlaue ''''
             INTO l2_where.
          ENDIF.

*          ENDIF.
        ENDLOOP.
        REPLACE  ALL  OCCURRENCES  OF 'and''' IN  l2_where WITH  ''.
        DELETE FROM (p_table)  WHERE (l2_where).

        DELETE <dyn_table> INDEX l_index.
        CONTINUE.
      ENDLOOP.

      MESSAGE s001 WITH '删除成功!' DISPLAY LIKE 'S'.

*-->刷新 Alv
*       in_selfield-refresh = 'X'.
      CALL METHOD ref_grid->refresh_table_display.
  ENDCASE.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form CREATE_STRUCTURE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM create_structure.
  DATA: l_count TYPE i.

  LOOP AT gt_tablefield.
    ADD 1 TO l_count.
    IF  gt_tablefield-keyflag <> 'X'.
      wa_fieldcat-edit = 'X'.
    ENDIF.
    wa_fieldcat-col_pos    = l_count.
    wa_fieldcat-fieldname  = gt_tablefield-fieldname.
    wa_fieldcat-ref_fieldname = gt_tablefield-fieldname.
    wa_fieldcat-ref_tabname = gt_tablefield-tabname.
    APPEND wa_fieldcat TO  gt_fieldcat.CLEAR:wa_fieldcat.
  ENDLOOP.
ENDFORM.


FORM check_screen.
  CLEAR:gt_tablefield[].
  SELECT *
  FROM dd03l
  INTO  TABLE gt_tablefield
  WHERE dd03l~tabname EQ p_table.

  IF sy-subrc <> 0.
    MESSAGE s001 WITH '不存在' && p_table && '表请重新输入,或联系开发人员' DISPLAY LIKE 'E'.
    STOP.
  ENDIF.

  SELECT SINGLE zsdt015~table_name
   INTO zsdt015
   FROM zsdt015
   INNER JOIN dd02t ON dd02t~tabname = zsdt015~table_name
   WHERE sdate <= sy-datum
    AND    edate >= sy-datum
    AND    usdid = sy-uname
    AND zsdt015~table_name = p_table.

  IF sy-subrc <> 0.
    MESSAGE s001 WITH '很抱歉,您没有查询此表权限' DISPLAY LIKE 'E'.
    STOP.
  ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  FRM_HELP
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_help .


  SELECT zsdt015~table_name AS tabname dd02t~ddtext
  INTO TABLE gt_tab
  FROM zsdt015
  INNER JOIN dd02t ON dd02t~tabname = zsdt015~table_name
  WHERE sdate <= sy-datum
   AND    edate >= sy-datum
   AND    usdid = sy-uname.
  IF sy-subrc <> 0.
    MESSAGE s001 WITH '很抱歉,您没有查询或更改权限' DISPLAY LIKE 'E'.
    STOP.
  ENDIF.

  "调用展示函数
  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield    = 'TABNAME'          "表格要显示的字段
      dynpprog    = sy-repid        "返回才程序
      dynpnr      = sy-dynnr        "屏幕
      dynprofield = 'P_TABLE'  "往页面回填值的地方
      value_org   = 'S'             "显示类型
    TABLES
      value_tab   = gt_tab.     "传进去的表格 帮助的内表
  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.
CLASS lcl_report IMPLEMENTATION.
  METHOD get_data.
    SELECT * FROM anep
           INTO  TABLE t_data.
*           WHERE BUKRS IN s_BUKRS AND GJAHR IN S_GJAHR.
    IF sy-dbcnt IS INITIAL.
      MESSAGE s398(00) WITH 'No data selected'.
    ENDIF.
    EXPORT data = me->t_data TO MEMORY ID sy-cprog.
  ENDMETHOD.                    "get_data

  METHOD generate_output.
    DATA: lo_dock       TYPE REF TO cl_gui_docking_container,
          lo_cont       TYPE REF TO cl_gui_container,
          lt_fcat       TYPE lvc_t_fcat,
          gr_grid_d1001 TYPE REF TO cl_gui_alv_grid.
    IMPORT data = me->t_data FROM MEMORY ID sy-cprog.
    FREE MEMORY ID sy-cprog.
    CHECK me->t_data IS NOT INITIAL.
    CHECK lo_dock IS INITIAL.
    CREATE OBJECT lo_dock
      EXPORTING
        repid = sy-cprog
        dynnr = sy-dynnr
        ratio = 80
        side  = cl_gui_docking_container=>dock_at_bottom.
  ENDMETHOD.                    "generate_output
ENDCLASS.                    "lcl_report IMPLEMENTATION

*&---------------------------------------------------------------------
*& Form SELECT_FLDS
*&---------------------------------------------------------------------
* Select fields from the table
*----------------------------------------------------------------------
FORM select_flds .
  DATA: lv_txt TYPE string.
  CASE sscrfields-ucomm.
    WHEN 'CLK1'.
      lv_txt = 'Selection Paramters List'(008).
      SET PF-STATUS 'DIALOG'.
*      LEAVE TO LIST-PROCESSING AND RETURN TO SCREEN 0.
*      SUPPRESS DIALOG.
      MOVE lv_txt TO sy-title.
**--Get field names for given table
      SELECT tabname
             fieldname
             keyflag
             rollname
             position
        FROM dd03l
        INTO TABLE it_dd03l
       WHERE tabname EQ p_table
         AND fieldname NE 'MANDT'.
      IF sy-subrc = 0.
        SORT it_dd03l BY position.
        DELETE it_dd03l WHERE fieldname CP '.INCLU*'.
      ENDIF.
**--Get the description of the fields
      LOOP AT it_dd03l INTO wa_dd03l.
        IF NOT wa_dd03l-rollname IS INITIAL.
          SELECT SINGLE ddtext
          FROM dd04t
          INTO wa_dd03l-ddtext
          WHERE rollname EQ wa_dd03l-rollname
          AND ddlanguage = sy-langu
          AND as4local = 'A'.
          MODIFY it_dd03l FROM wa_dd03l.
        ELSE.
          SELECT SINGLE ddtext
          FROM dd03t
          INTO wa_dd03l-ddtext
          WHERE tabname EQ wa_dd03l-tabname
          AND ddlanguage = sy-langu
          AND as4local = 'A'
          AND fieldname = wa_dd03l-fieldname.
          MODIFY it_dd03l FROM wa_dd03l.
        ENDIF.
      ENDLOOP.

      MOVE 'S' TO wa_temp-type.
*    MOVE gv_tbname TO wa_temp-tablename.
      MOVE p_table TO wa_temp-tablename.
      CLEAR:sy-index.
      DO.
        sy-index = sy-index.
        READ TABLE it_dd03l INTO wa_dd03l INDEX sy-index.
        IF sy-subrc = 0.
          MOVE wa_dd03l-fieldname TO wa_temp-fieldname.
          APPEND wa_temp TO it_temp.
          CLEAR gv_temp.
        ELSE.
          EXIT.
        ENDIF.
      ENDDO.
      DESCRIBE TABLE it_temp.
      it_flds[] = it_temp[].
      CLEAR : it_temp, it_temp[].

      CLEAR : it_tabs, wa_tabs.
      wa_tabs-prim_tab = p_table.
      APPEND wa_tabs TO it_tabs.

      PERFORM set_values.

**--Generate Expression from Where clause
      CALL FUNCTION 'FREE_SELECTIONS_WHERE_2_EX'
        EXPORTING
          where_clauses        = gx_twhere
        IMPORTING
          expressions          = gx_texpr
        EXCEPTIONS
          incorrect_expression = 1
          OTHERS               = 2.

**--Display screen with the fields listed
      IF gv_selid IS NOT INITIAL.
        PERFORM call_screen.
      ENDIF.
      "执行按钮
    WHEN 'ONLI'.
      PERFORM check_screen.
      PERFORM get_structure.
      PERFORM create_dynamic_itab.
*  **********Creates a dyanamic internal table**********
      PERFORM get_data.
      PERFORM display_date.
  ENDCASE.

ENDFORM. " SELECT_FLDS

*&---------------------------------------------------------------------
*& Form SET_VALUES
*&---------------------------------------------------------------------
* Set the values to the select-options
*----------------------------------------------------------------------
FORM set_values.

*   gv_selid = 'DS000001'.
  CALL FUNCTION 'FREE_SELECTIONS_INIT'
    EXPORTING
      kind                     = 'T'
      expressions              = gx_texpr
    IMPORTING
      selection_id             = gv_selid
      number_of_active_fields  = gv_actnum
    TABLES
      tables_tab               = it_tabs
      fields_tab               = it_flds
    EXCEPTIONS
      fields_incomplete        = 01
      fields_no_join           = 02
      field_not_found          = 03
      no_tables                = 04
      table_not_found          = 05
      expression_not_supported = 06
      incorrect_expression     = 07
      illegal_kind             = 08
      area_not_found           = 09
      inconsistent_area        = 10
      kind_f_no_fields_left    = 11
      kind_f_no_fields         = 12
      too_many_fields          = 13.
ENDFORM. " SET_VALUES

FORM call_screen.
  DATA : wa_where LIKE LINE OF gx_twhere,
         lv_txt   TYPE string.
  lv_txt = 'Dynamic Selections Parameters for'(007).
  CONCATENATE lv_txt p_table
  INTO gv_title SEPARATED BY space.

*  SET PF-STATUS '0001'
  CALL FUNCTION 'FREE_SELECTIONS_DIALOG'
    EXPORTING
      selection_id            = gv_selid
      title                   = gv_title
      tree_visible            = ' '
*      status                  = '0001'
    IMPORTING
      where_clauses           = gx_twhere
      expressions             = gx_texpr
      number_of_active_fields = gv_actnum
    TABLES
      fields_tab              = it_flds
    EXCEPTIONS
      internal_error          = 01
      no_action               = 02
      no_fields_selected      = 03
      no_tables_selected      = 04
      selid_not_found         = 05.
  IF sy-subrc EQ 0.
    REFRESH: s_where, s_selop.
**--Populate the Where clause with selected values
    s_where-sign = gc_i.
    s_where-option = gc_eq.
    CLEAR wa_where.
    READ TABLE gx_twhere INDEX 1 INTO wa_where.
    LOOP AT wa_where-where_tab INTO s_where-low.
      APPEND s_where.
    ENDLOOP.
**--Populate all the fields
    s_selop-sign = gc_i.
    s_selop-option = gc_eq.
    CLEAR : wa_flds.
    LOOP AT it_flds INTO wa_flds.
      s_selop-low = wa_flds-fieldname.
      APPEND s_selop.
    ENDLOOP.
  ENDIF.

*  CALL SCREEN 1000.
ENDFORM. " CALL_SCREEN
*zsdt015 表结构

 


 


参考案例:http://t.zoukankan.com/datie-p-11433965.html

 点击查询或修改筛选界面

 执行的效果

标签:外挂,LIKE,wa,查询器,系统,sy,where,table,TYPE
From: https://www.cnblogs.com/Brokenshelltao/p/16914088.html

相关文章

  • python flask实战订餐系统微信小程序-59flask部署单进程启动服务
    欢迎关注原创Python微信订餐小程序课程视频Python实战量化交易理财系统​​python​​​​flask​​实战订餐系统微信小程序-60nginx+uwsgi实现多进程访问​​​B站配套......
  • node.js安装及环境配置超详细教程【Windows系统安装包方式】
    文章目录Step1:下载安装包Step2:安装程序Step3:查看Step4:环境配置最后补充:Step1:下载安装包https://nodejs.org/zh-cn/download/根据自己电脑系统及位数选择,我的电......
  • 操作系统在访问快表时的问题
    今天突然想到一个问题,就是操作系统在访问快表时,是以虚拟地址还是以物理地址访问快表的?这个问题答案应该是以虚拟地址访问的,因为如果还是以物理地址来访问快表,那么还需要进......
  • oa项目-系统通知实现
    1,采用的是mongdB存储,普通的mysql难以支撑2,mongdB搞冷热分离,但是考虑到大型web项目也难以支撑一条公告发送百万数据,采用消息队列细睡长流慢慢的写入mongdb3,使用异步线程的......
  • 嵌入式可配置实时操作系统eCos
    ​​​​eCos是为嵌入式应用设计的无版税开放源代码的实时操作系统。eCos的高度可配置性,允许对操作系统进行定制,以精确地匹配应用需求,提供最佳运行时性能和最少硬件资源占用......
  • 业务系统的稳定性建设
    在当下微服务、分布式架构的背景下,一次简单的接口调用背后可能涉及到了多个业务服务单元和服务器。如何才能在当前架构下准确、高效、即时地了解业务系统的运行情况、保......
  • C/C++校运动会成绩管理系统
    C/C++校运动会成绩管理系统该系统可以记录校运动会全部运动项目的成绩、得分和排名情况,系统功能项以菜单形式显示。项目包括50米、100米、200米、400米、1500米、各接力项......
  • 17.多线程并发在电商系统下的追本溯源(4)
           ......
  • C/C++仓库管理系统
    C/C++仓库管理系统四、仓库管理系统问题描述:1.问题描述:已知一工厂有5个仓库(仓库编号、仓库规格),用于保存公司生产的10类产品(产品编号、产品名称、产品规格),任何--......
  • 16.多线程并发在电商系统下的追本溯源(3)
      用读写锁可以优化此处代码                                           ......