abap 动态价格条件报表

*&---------------------------------------------------------------------*
*& Report ZMIGR_SDPRICE
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zmigr_sdprice.

* 要使用到的表  (选择屏幕定义所需参照表)
TABLES:t685t.
* ALV使用到的库类
TYPE-POOLS: slis.
*----------------------------------------------------------------------*
*   数据类型定义
*----------------------------------------------------------------------*
TYPES:

*ALV
  BEGIN OF ty_data,
    sel     TYPE checkbox,
    kvewe   LIKE t682i-kvewe,
    kappl   LIKE t682i-kappl,
    kozgf   LIKE t682i-kozgf,
    kolnr   LIKE t682i-kolnr,
    kotabnr LIKE t682i-kotabnr,
    kkidx   LIKE t682i-kkidx,
    kzexl   LIKE t682i-kzexl,
    kkmod   LIKE t682i-kkmod,
    kobed   LIKE t682i-kobed,
    kkopf   LIKE t682i-kkopf,
    gzugr   LIKE t682i-gzugr,
    ddtext  LIKE dd02t-ddtext,
    tabname LIKE dd02t-tabname,
    kschl   LIKE t685-kschl,

  END OF ty_data.

*----------------------------------------------------------------------*
*   内表定义
*----------------------------------------------------------------------*
DATA:
  gt_data      TYPE TABLE OF ty_data.    "ALV显示
FIELD-SYMBOLS:
  <fs_tab>        TYPE table.
*----------------------------------------------------------------------*
*   全局变量
*----------------------------------------------------------------------*
DATA: gr_grid TYPE REF TO cl_gui_alv_grid,
      gt_fcat TYPE lvc_t_fcat,
      lt_fcat TYPE lvc_t_fcat,
      gs_layo TYPE lvc_s_layo,
      ls_layo TYPE lvc_s_layo.

DATA: g_alv     TYPE REF TO cl_gui_alv_grid, "用于表单输出
      g_tab     TYPE REF TO cl_gui_alv_grid, "用于表单输出
      g_stable  TYPE lvc_s_stbl,
      l_stable  TYPE lvc_s_stbl,
      g_variant TYPE  disvariant,   "是否保存变式
      g_con     TYPE REF TO cl_gui_custom_container, "用于定义容器
      go_con    TYPE REF TO cl_gui_custom_container. "用于定义容器
DATA: ok_code      TYPE sy-ucomm,
      ok_code_9000 TYPE sy-ucomm.
DATA: gs_variant TYPE disvariant,
      ls_variant TYPE disvariant.

CLASS zcl_alv DEFINITION.

  PUBLIC SECTION.
    METHODS:
*     设定工具条
      handle_toolbar      FOR EVENT toolbar OF cl_gui_alv_grid
        IMPORTING
          e_object e_interactive,
*     设定用户命令
      handle_user_command FOR EVENT user_command OF cl_gui_alv_grid
        IMPORTING
          e_ucomm.

ENDCLASS.                    "zcl_alv DEFINITION

CLASS zcl_alv IMPLEMENTATION.
* 修改工具栏
  METHOD handle_toolbar.
    DATA ls_toolbar TYPE stb_button.
    CLEAR ls_toolbar.
    ls_toolbar-butn_type = 3.
    APPEND ls_toolbar TO e_object->mt_toolbar.

    CLEAR ls_toolbar.
    ls_toolbar-function = 'POST'.
    ls_toolbar-icon = icon_execute_object.
    ls_toolbar-quickinfo = '选 择'.
    ls_toolbar-text = '选 择'.
    ls_toolbar-disabled = ''.
    APPEND ls_toolbar TO e_object->mt_toolbar.
  ENDMETHOD.                    "HANDLE_TOOLBAR
* 响应用户命令
  METHOD handle_user_command.
*屏幕ALV中的数据刷新至内表
    CALL METHOD g_alv->check_changed_data.

    CASE e_ucomm.
      WHEN 'POST'.
        PERFORM frm_post.
    ENDCASE.
  ENDMETHOD.                    "HANDLE_USER_COMMAND

ENDCLASS.                    "zcl_alv IMPLEMENTATION

CLASS zcl_tab DEFINITION.

  PUBLIC SECTION.
    METHODS:
*     设定工具条
      handle_toolbar      FOR EVENT toolbar OF cl_gui_alv_grid
        IMPORTING
          e_object e_interactive,
*     设定用户命令
      handle_user_command FOR EVENT user_command OF cl_gui_alv_grid
        IMPORTING
          e_ucomm.

ENDCLASS.                    "zcl_tab DEFINITION

CLASS zcl_tab IMPLEMENTATION.
* 修改工具栏
  METHOD handle_toolbar.
*    DATA ls_toolbar TYPE stb_button.
*    CLEAR ls_toolbar.
*    ls_toolbar-butn_type = 3.
*    APPEND ls_toolbar TO e_object->mt_toolbar.
*
*    CLEAR ls_toolbar.
*    ls_toolbar-function = 'POST'.
*    ls_toolbar-icon = icon_execute_object.
*    ls_toolbar-quickinfo = '选 择'.
*    ls_toolbar-text = '选 择'.
*    ls_toolbar-disabled = ''.
*    APPEND ls_toolbar TO e_object->mt_toolbar.
  ENDMETHOD.                    "HANDLE_TOOLBAR
* 响应用户命令
  METHOD handle_user_command.
*屏幕ALV中的数据刷新至内表
*    CALL METHOD g_tab->check_changed_data.
*
*    CASE e_ucomm.
*      WHEN 'POST'.
**        PERFORM frm_post.
*    ENDCASE.
  ENDMETHOD.                    "HANDLE_USER_COMMAND

ENDCLASS.                    "zcl_tab IMPLEMENTATION
DATA cl_3000_event TYPE REF TO zcl_alv.
DATA cl_9000_event TYPE REF TO zcl_tab.

*----------------------------------------------------------------------*
*   初始化
*----------------------------------------------------------------------*
INITIALIZATION.
* 程序初始化
  PERFORM frm_initprogm.
*----------------------------------------------------------------------*
*   屏幕检查
*----------------------------------------------------------------------*
AT SELECTION-SCREEN.
* 权限检查
*  PERFORM frm_check_screen.

AT SELECTION-SCREEN OUTPUT.
*----------------------------------------------------------------------*
*  主程序
*----------------------------------------------------------------------*
START-OF-SELECTION.
* 主处理
  PERFORM frm_main_process.
*&---------------------------------------------------------------------*
*&      Form  FRM_INITPROGM
*&---------------------------------------------------------------------*
*       程序初始化
*----------------------------------------------------------------------*
FORM frm_initprogm .
* 清空数据
  REFRESH : gt_data,
            gt_fcat.

ENDFORM.                    " FRM_INITPROGM
*&---------------------------------------------------------------------*
*&      FORM  FRM_CHECK_SCREEN
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      FORM  FRM_MAIN_PROCESS
*&---------------------------------------------------------------------*
*       主程序
*----------------------------------------------------------------------*
FORM frm_main_process .

  CALL SCREEN 3000.

ENDFORM.                    " FRM_MAIN_PROCESS
*&---------------------------------------------------------------------*
*& Module STATUS_3000 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_3000 OUTPUT.
  DATA: BEGIN OF excltab OCCURS 0,
          fcode LIKE sy-ucomm,
        END OF excltab.

  SET PF-STATUS 'PF_3000' EXCLUDING excltab.
  SET TITLEBAR 'T_3000'.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module ALV_3000_DISPLAY OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE alv_3000_display OUTPUT.
  PERFORM frm_build_3000fieldfat.
  PERFORM frm_build_3000layout.

  IF g_alv IS INITIAL.
    CREATE OBJECT g_con
      EXPORTING
        container_name = 'G_CON'.

    CREATE OBJECT g_alv
      EXPORTING
        i_parent = g_con.

    gs_variant-report = '3000'.

    CALL METHOD g_alv->set_table_for_first_display
      EXPORTING
        is_variant                    = g_variant
        i_save                        = 'A'
        i_default                     = 'X'
        is_layout                     = gs_layo
      CHANGING
        it_outtab                     = gt_data[]
        it_fieldcatalog               = gt_fcat[]
      EXCEPTIONS
        invalid_parameter_combination = 1
        program_error                 = 2
        too_many_lines                = 3
        OTHERS                        = 4.

    CREATE OBJECT cl_3000_event.
    SET HANDLER cl_3000_event->handle_toolbar FOR g_alv.
    SET HANDLER cl_3000_event->handle_user_command FOR g_alv.

    CALL METHOD g_alv->register_edit_event
      EXPORTING
        i_event_id = cl_gui_alv_grid=>mc_evt_enter.    "回车事件

    CALL METHOD g_alv->register_edit_event
      EXPORTING
        i_event_id = cl_gui_alv_grid=>mc_evt_modified.

    CALL METHOD g_alv->set_ready_for_input
      EXPORTING
        i_ready_for_input = 1.

  ELSE.
    PERFORM frm_refresh_alv.
  ENDIF.

ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_3000  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_3000 INPUT.
  CALL METHOD g_alv->check_changed_data.
  DATA(lv_code) = ok_code  .
  CLEAR:ok_code.

  CASE lv_code.
    WHEN 'BUTTON_OPEN'. "
      PERFORM frm_button_open.
    WHEN 'BACK' OR 'CANCEL'.
      LEAVE TO SCREEN 0.
    WHEN 'EXIT'.
      LEAVE PROGRAM.
    WHEN OTHERS.
  ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form frm_build_3000fieldfat
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_build_3000fieldfat .
  REFRESH:gt_fcat.
  gt_fcat = VALUE #( BASE gt_fcat ( fieldname = 'KOTABNR'   reptext = '条件表编号' )
                                          ( fieldname = 'DDTEXT'    reptext = '条件表的简短描述'   )
                                          ( fieldname = 'KVEWE'    reptext = '条件表的用途'   )
                                          ( fieldname = 'KAPPL'   reptext = '应用程序' )
                                          ( fieldname = 'KOZGF'  reptext = '存取顺序'   )
                                          ( fieldname = 'KOLNR' reptext = '访问顺序 - 访问编号'  )
                                          ( fieldname = 'KKIDX'  reptext = '''执行构造'' 条件关键字的索引编号' )
                                          ( fieldname = 'KZEXL'     reptext = '标识:排除条件访问'  )
                                          ( fieldname = 'KKMOD'   reptext = '模块库用于条件存取'  )
                                          ( fieldname = 'KOBED'   reptext = '需求'  )
                                          ( fieldname = 'KKOPF'   reptext = '抬头适用的条件'  )
                                          ( fieldname = 'GZUGR'   reptext = '指示:处理存取字段'  )
                       ).
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_build_3000layout
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_build_3000layout .
  CLEAR gs_layo.
  gs_layo-cwidth_opt = 'X'.
  gs_layo-zebra      = 'X'.
  gs_layo-sel_mode = 'D'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_refresh_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_refresh_alv .
  g_stable-row = 'X'.
  g_stable-col = 'X'.

  IF g_alv IS NOT INITIAL.
    CALL METHOD g_alv->set_frontend_layout
      EXPORTING
        is_layout = gs_layo.

    CALL METHOD g_alv->set_frontend_fieldcatalog
      EXPORTING
        it_fieldcatalog = gt_fcat[].

    CALL METHOD g_alv->refresh_table_display
      EXPORTING
        is_stable = g_stable
      EXCEPTIONS
        finished  = 1
        OTHERS    = 2.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_refresh_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_refresh_tab .
  l_stable-row = 'X'.
  l_stable-col = 'X'.

  IF g_tab IS NOT INITIAL.
    CALL METHOD g_tab->set_frontend_layout
      EXPORTING
        is_layout = ls_layo.

    CALL METHOD g_tab->set_frontend_fieldcatalog
      EXPORTING
        it_fieldcatalog = lt_fcat[].

    CALL METHOD g_tab->refresh_table_display
      EXPORTING
        is_stable = l_stable
      EXCEPTIONS
        finished  = 1
        OTHERS    = 2.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_button_open
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_button_open .

*  DATA: dynpfields TYPE TABLE OF dynpread WITH HEADER LINE,
*        l_kschl    LIKE t685t-kschl.
*
*  CLEAR: dynpfields, dynpfields[],l_kschl.
*
*  dynpfields-fieldname = 'T685T-KSCHL'.
*  APPEND dynpfields.
*
*  CALL FUNCTION 'DYNP_VALUES_READ'
*    EXPORTING
*      dyname             = sy-repid
*      dynumb             = sy-dynnr
*      translate_to_upper = 'X'
*    TABLES
*      dynpfields         = dynpfields
*    EXCEPTIONS
*      OTHERS             = 9.
*  IF sy-subrc = 0.
*    READ TABLE dynpfields WITH KEY fieldname = 'T685T-KSCHL'.
*    l_kschl = dynpfields-fieldvalue.
*  ENDIF.
  DATA:lt_data TYPE TABLE OF ty_data.

  REFRESH:gt_data,lt_data.
  SELECT a~kvewe,a~kappl,a~kschl,a~kozgf,b~kolnr,b~kotabnr,
    b~kkidx,b~kzexl,b~kkmod,b~kobed,b~kkopf,b~gzugr
    FROM t685 AS a
    INNER JOIN t682i AS b ON b~kvewe = a~kvewe
    AND b~kappl = a~kappl AND b~kozgf = a~kozgf
    INTO CORRESPONDING FIELDS OF TABLE @lt_data
    WHERE a~kvewe = 'A'
      AND a~kappl IN ( 'V','M' )
      AND a~kschl = @t685t-kschl.

  IF lt_data IS INITIAL .
    MESSAGE e001(00) WITH '没有满足条件的数据,请检查!'.
  ELSE.

    LOOP AT lt_data ASSIGNING FIELD-SYMBOL(<fs_data>).
      <fs_data>-tabname = |A{ <fs_data>-kotabnr }|.
    ENDLOOP.

    SELECT a~*
      FROM dd02t AS a
      INNER JOIN @lt_data AS b ON b~tabname = a~tabname
      WHERE a~ddlanguage EQ '1'
        AND a~ddtext NOT LIKE '%停用%'
      INTO TABLE @DATA(lt_dd02t).
    SORT lt_dd02t BY tabname.

    LOOP AT lt_data ASSIGNING <fs_data>.

      DATA(lv_tabix) = sy-tabix.
      READ TABLE lt_dd02t INTO DATA(ls_dd02t) WITH KEY tabname = <fs_data>-tabname BINARY SEARCH.
      IF sy-subrc EQ 0.
        <fs_data>-ddtext = ls_dd02t-ddtext.
      ELSE.
        DELETE lt_data INDEX lv_tabix.
        CONTINUE.
      ENDIF.

    ENDLOOP.

    gt_data = CORRESPONDING #( lt_data ).
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_post
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_post.
  DATA: lv_title    TYPE sy-title,
        lv_selid    TYPE rsdynsel-selid,
        lv_actnum   TYPE sy-tfill,
        ls_expr     TYPE rsds_expr,
        lt_texpr    TYPE rsds_texpr,
        ls_rsdsexpr TYPE rsdsexpr,
        lv_datum    TYPE sy-datum.

  DATA:mt_tabs   TYPE TABLE OF rsdstabs,
       mt_flds   TYPE TABLE OF rsdsfields,
       ms_flds   TYPE rsdsfields,
       mt_twhere TYPE rsds_twhere,
       lt_twhere TYPE TABLE OF rsds_where,
       lv_where  TYPE string.

  TYPES:
    BEGIN OF mty_fname,
      fldnm TYPE dd03l-fieldname,
    END   OF mty_fname.

  TYPES:
    BEGIN OF ty_dd03l.
      INCLUDE STRUCTURE dd03l.
  TYPES:
      reptext TYPE dd04t-reptext,
    END   OF ty_dd03l.

  TYPES:
    BEGIN OF ty_tab,
      knumh TYPE konh-knumh,
    END   OF ty_tab.

  DATA: lv_cnt   TYPE i,
        ld_ref   TYPE REF TO data,
        lt_fname TYPE TABLE OF mty_fname,
        ls_fname TYPE mty_fname,
        ls_fcat  TYPE lvc_s_fcat,
        lt_tab   TYPE TABLE OF ty_tab,
        lt_dd03l TYPE TABLE OF ty_dd03l.

  DATA: lt_rows TYPE lvc_t_row.

  FIELD-SYMBOLS:<lv_str> TYPE any.

  CALL METHOD g_alv->get_selected_rows
    IMPORTING
      et_index_rows = lt_rows.

  DATA(line) = lines( lt_rows ).

  IF line > 1.
    MESSAGE '每次只能选取一条数据!' TYPE 'S' DISPLAY LIKE 'E'.
    EXIT.
  ENDIF.

  LOOP AT lt_rows INTO DATA(ls_rows).
    READ TABLE gt_data ASSIGNING FIELD-SYMBOL(<fs_data>) INDEX ls_rows-index.
    IF sy-subrc EQ 0.
      <fs_data>-sel = 'X'.
    ENDIF.
    CLEAR:ls_rows.
  ENDLOOP.

  READ TABLE gt_data INTO DATA(ls_data) WITH KEY sel = 'X'.
  IF sy-subrc EQ 0.
    DATA(kotabnr) = |A{ ls_data-kotabnr }|.

    ls_expr-tablename    = kotabnr.
    APPEND ls_expr TO lt_texpr.

    SELECT a~*,
           b~reptext
      FROM dd03l AS a
      INNER JOIN dd02t AS c ON c~tabname = a~tabname AND c~as4local = a~as4local
      AND c~as4vers = a~as4vers AND c~ddlanguage EQ '1'
      LEFT JOIN dd04t AS b ON b~rollname = a~rollname AND b~as4local = a~as4local
      AND b~as4vers = a~as4vers AND b~ddlanguage EQ '1'
      INTO CORRESPONDING FIELDS OF TABLE @lt_dd03l
     WHERE a~tabname EQ @kotabnr
       AND a~fieldname NE 'MANDT'
       AND c~ddtext NOT LIKE '%停用%'.
*       AND keyflag EQ 'X'.

    SORT lt_dd03l BY position.
    DELETE lt_dd03l WHERE fieldname CP '.INCLU*'.

    LOOP AT lt_dd03l INTO DATA(ls_dd03l) WHERE keyflag EQ 'X'.
      MOVE ls_dd03l-tabname TO ms_flds-tablename.
      MOVE ls_dd03l-fieldname TO ms_flds-fieldname.
      APPEND ms_flds TO mt_flds.
      CLEAR:ms_flds.
    ENDLOOP.

    mt_tabs = VALUE #( ( prim_tab = kotabnr ) ).
  ENDIF.

  CALL FUNCTION 'FREE_SELECTIONS_INIT'
    EXPORTING
      kind                     = 'T'
      expressions              = lt_texpr
    IMPORTING
      selection_id             = lv_selid
    TABLES
      tables_tab               = mt_tabs
      fields_tab               = mt_flds
    EXCEPTIONS
      fields_incomplete        = 1
      fields_no_join           = 2
      field_not_found          = 3
      no_tables                = 4
      table_not_found          = 5
      expression_not_supported = 6
      incorrect_expression     = 7
      illegal_kind             = 8
      area_not_found           = 9
      inconsistent_area        = 10
      kind_f_no_fields_left    = 11
      kind_f_no_fields         = 12
      too_many_fields          = 13
      dup_field                = 14
      field_no_type            = 15
      field_ill_type           = 16
      dup_event_field          = 17
      node_not_in_ldb          = 18
      area_no_field            = 19
      OTHERS                   = 20.

  SELECT SINGLE ddtext FROM dd02t INTO lv_title WHERE tabname = kotabnr AND ddlanguage EQ '1'.

  CALL FUNCTION 'FREE_SELECTIONS_DIALOG'
    EXPORTING
      selection_id    = lv_selid
      title           = lv_title
      status          = 1
    IMPORTING
      where_clauses   = mt_twhere
    TABLES
      fields_tab      = mt_flds
    EXCEPTIONS
      internal_error  = 1
      no_action       = 2
      selid_not_found = 3
      illegal_status  = 4
      OTHERS          = 5.
  CASE sy-subrc.
    WHEN 1 OR 3 OR 4 OR 5.
      MESSAGE '选取异常!' TYPE 'S' DISPLAY LIKE 'E'.
    WHEN 2.
    WHEN 0.
      APPEND LINES OF mt_twhere TO lt_twhere.
    WHEN OTHERS.
  ENDCASE.

  CLEAR:lt_fcat[],ls_fcat,lv_cnt,lt_fname[],ls_fname.
  LOOP AT lt_dd03l ASSIGNING FIELD-SYMBOL(<fs_dd031>).

    lv_cnt = lv_cnt + 1.
*      ls_fcat-tabname     = ms_if-iftabnm.
    ls_fcat-fieldname   = <fs_dd031>-fieldname.
    ls_fcat-col_pos     = lv_cnt.
    ls_fcat-inttype     = <fs_dd031>-inttype.
    ls_fcat-datatype    = <fs_dd031>-datatype.
    ls_fcat-intlen      = <fs_dd031>-intlen.
    ls_fcat-seltext     = <fs_dd031>-fieldname.
    ls_fcat-decimals    = <fs_dd031>-decimals.
    ls_fcat-ref_field   = <fs_dd031>-fieldname.
    ls_fcat-ref_table   = <fs_dd031>-tabname.
    ls_fcat-reptext   = <fs_dd031>-reptext.
    APPEND ls_fcat TO lt_fcat.
    CLEAR ls_fcat.

    ls_fname-fldnm = <fs_dd031>-fieldname.
    APPEND ls_fname TO lt_fname.
    CLEAR ls_fname.
  ENDLOOP.

  lt_fcat = VALUE #( BASE lt_fcat ( fieldname = 'KBETR'    reptext = '不存在等级的条件金额或百分比' col_pos = lv_cnt + 1
                                   inttype = 'P' seltext = 'KBETR' intlen = 6 ref_field = 'KBETR' ref_table = 'KONP' datatype = 'CURR' decimals = 2 )
                                  ( fieldname = 'KONWA'    reptext = '条件单位(货币或百分比)' col_pos = lv_cnt + 2
                                   inttype = 'C' seltext = 'KONWA' intlen = 10 ref_field = 'KONWA' ref_table = 'KONP' datatype = 'CUKY' )
                                  ( fieldname = 'KPEIN'    reptext = '条件定价单位' col_pos = lv_cnt + 3
                                   inttype = 'P' seltext = 'KPEIN' intlen = 3 ref_field = 'KPEIN' ref_table = 'KONP' datatype = 'DEC' )
                                  ( fieldname = 'KMEIN'    reptext = '条件单位' col_pos = lv_cnt + 4
                                   inttype = 'C' seltext = 'KMEIN' intlen = 6 ref_field = 'KMEIN' ref_table = 'KONP' datatype = 'UNIT' )
                                  ( fieldname = 'LOEVM_KO'    reptext = '条件记录的删除标识' col_pos = lv_cnt + 5
                                   inttype = 'C' seltext = 'LOEVM_KO' intlen = 2 ref_field = 'LOEVM_KO' ref_table = 'KONP' datatype = 'CHAR' )
                                  ( fieldname = 'ERNAM'    reptext = '负责创建对象的人员姓名' col_pos = lv_cnt + 6
                                   inttype = 'C' seltext = 'ERNAM' intlen = 24 ref_field = 'ERNAM' ref_table = 'KONH' datatype = 'CHAR' )
                                  ( fieldname = 'ERDAT'    reptext = '记录创建日期' col_pos = lv_cnt + 7
                                   inttype = 'D' seltext = 'ERDAT' intlen = 16 ref_field = 'ERDAT' ref_table = 'KONH' datatype = 'DATS' )
                                  ( fieldname = 'KSTBM'    reptext = '条件等级数量' col_pos = lv_cnt + 8
                                   inttype = 'P' seltext = 'KSTBM' intlen = 8 ref_field = 'KSTBM' ref_table = 'KONP' datatype = 'QUAN' decimals = 3 )
                                  ( fieldname = 'KBETR_Q'    reptext = '不存在等级的条件金额或百分比' col_pos = lv_cnt + 9
                                   inttype = 'P' seltext = 'KBETR' intlen = 6 ref_field = 'KBETR' ref_table = 'KONP' datatype = 'CURR' decimals = 2 )
                       ).


  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog = lt_fcat
    IMPORTING
      ep_table        = ld_ref.
  UNASSIGN <fs_tab>.
  ASSIGN ld_ref->* TO <fs_tab>.

  READ TABLE lt_twhere INTO DATA(ls_where) INDEX 1.
  IF sy-subrc = 0..
    LOOP AT ls_where-where_tab INTO DATA(wa_where).
      CONCATENATE lv_where wa_where INTO lv_where SEPARATED BY space.
    ENDLOOP.
  ENDIF.

  SELECT (lt_fname)
    FROM (kotabnr)
    INTO CORRESPONDING FIELDS OF TABLE <fs_tab>
    WHERE (lv_where).

  lt_tab = CORRESPONDING #( <fs_tab> ).

  SELECT a~knumh,a~ernam,a~erdat,b~kbetr,b~kbetr AS kbetr_q
    ,b~konwa,b~kpein,b~kmein,b~loevm_ko,b~kstbm
    FROM konh AS a
    INNER JOIN konp AS b ON b~knumh = a~knumh
    INNER JOIN @lt_tab AS c ON c~knumh = b~knumh
    INTO TABLE @DATA(lt_konh).

  SORT lt_konh BY knumh.
  LOOP AT <fs_tab> ASSIGNING FIELD-SYMBOL(<lfs_tab>).

    ASSIGN COMPONENT 'KNUMH' OF STRUCTURE <lfs_tab> TO <lv_str>.
    READ TABLE lt_konh INTO DATA(ls_konh) WITH KEY knumh = <lv_str>.
    IF sy-subrc EQ 0.
      ASSIGN COMPONENT 'ERNAM' OF STRUCTURE <lfs_tab> TO <lv_str>.
      <lv_str> = ls_konh-ernam.
      ASSIGN COMPONENT 'ERDAT' OF STRUCTURE <lfs_tab> TO <lv_str>.
      <lv_str> = ls_konh-erdat.
      ASSIGN COMPONENT 'KBETR' OF STRUCTURE <lfs_tab> TO <lv_str>.
      <lv_str> = ls_konh-kbetr.
      ASSIGN COMPONENT 'KBETR_Q' OF STRUCTURE <lfs_tab> TO <lv_str>.
      <lv_str> = ls_konh-kbetr_q.
      ASSIGN COMPONENT 'KONWA' OF STRUCTURE <lfs_tab> TO <lv_str>.
      <lv_str> = ls_konh-konwa.
      ASSIGN COMPONENT 'KPEIN' OF STRUCTURE <lfs_tab> TO <lv_str>.
      <lv_str> = ls_konh-kpein.
      ASSIGN COMPONENT 'KMEIN' OF STRUCTURE <lfs_tab> TO <lv_str>.
      <lv_str> = ls_konh-kmein.
      ASSIGN COMPONENT 'LOEVM_KO' OF STRUCTURE <lfs_tab> TO <lv_str>.
      <lv_str> = ls_konh-loevm_ko.
      ASSIGN COMPONENT 'KSTBM' OF STRUCTURE <lfs_tab> TO <lv_str>.
      <lv_str> = ls_konh-kstbm.
    ENDIF.
  ENDLOOP.

  IF <fs_tab> IS INITIAL.
*      MESSAGE '选取异常!' TYPE 'S' DISPLAY LIKE 'E'.
    MESSAGE i001(00) WITH '没有符合条件的数据'.
  ELSE.
    CALL SCREEN 9000.
  ENDIF.

  CLEAR:lt_rows[],lt_dd03l[],mt_tabs[],lt_texpr[],lv_selid,mt_flds[],lv_title,mt_twhere[],lt_twhere[].
ENDFORM.
*&---------------------------------------------------------------------*
*& Module STATUS_9000 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_9000 OUTPUT.

  SET PF-STATUS 'STATUS_9000' EXCLUDING excltab. .
  SET TITLEBAR 'TITLE_9000'.

  CLEAR gs_layo.
  ls_layo-cwidth_opt = 'X'.
  ls_layo-zebra      = 'X'.
  ls_layo-sel_mode = 'D'.

  IF g_tab IS INITIAL.
    CREATE OBJECT go_con
      EXPORTING
        container_name = 'GO_CON'.

    CREATE OBJECT g_tab
      EXPORTING
        i_parent = go_con.


    ls_variant-report = '9000'.

    CALL METHOD g_tab->set_table_for_first_display
      EXPORTING
        is_variant                    = ls_variant
        i_save                        = 'A'
        i_default                     = 'X'
        is_layout                     = ls_layo
      CHANGING
        it_outtab                     = <fs_tab>
        it_fieldcatalog               = lt_fcat[]
      EXCEPTIONS
        invalid_parameter_combination = 1
        program_error                 = 2
        too_many_lines                = 3
        OTHERS                        = 4.

    CREATE OBJECT cl_9000_event.
*    SET HANDLER cl_9000_event->handle_toolbar FOR g_tab.
*    SET HANDLER cl_9000_event->handle_user_command FOR g_tab.

    CALL METHOD g_tab->register_edit_event
      EXPORTING
        i_event_id = cl_gui_alv_grid=>mc_evt_enter.    "回车事件

    CALL METHOD g_tab->register_edit_event
      EXPORTING
        i_event_id = cl_gui_alv_grid=>mc_evt_modified.

    CALL METHOD g_tab->set_ready_for_input
      EXPORTING
        i_ready_for_input = 1.

  ELSE.
    PERFORM frm_refresh_tab.
  ENDIF.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_9000  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_9000 INPUT.
  DATA(gv_code) = ok_code_9000  .
  CLEAR:ok_code_9000.

  CASE gv_code.
    WHEN 'BACK' OR 'CANCEL' OR 'EXIT'.
      g_tab->free( ).
      go_con->free( ).
      CLEAR:g_tab,go_con.
      LEAVE TO SCREEN 0.
    WHEN OTHERS.
  ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  FIELD_F4  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*MODULE field_f4 INPUT.
*
*  CALL FUNCTION 'F4IF_FIELD_VALUE_REQUEST'
*    EXPORTING
*      tabname           = gt_selfields-tabname
*      fieldname         = gt_Selfields-fieldname
*      value             = selval
*      selection_screen  = 'X'
*      dynpprog          = 'X'
*      dynpnr            = 'X'
*      dynprofield       = 'X'
*    TABLES
*      return_tab        = return_tab
*    EXCEPTIONS
*      field_not_found   = 1
*      no_help_for_field = 2
*      inconsistent_help = 3
*      no_values_found   = 4
*      OTHERS            = 5.
*
*ENDMODULE.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值