*&---------------------------------------------------------------------*
*& 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.