*&---------------------------------------------------------------------*
*& 包括 ZLP032_ALV_CLASS_EVENT *
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& 包括 Z_SCREEN_ALV_CLASS_EVENT *
*&---------------------------------------------------------------------*
CLASS lcl_alv_application DEFINITION. "定义事件
PUBLIC SECTION.
METHODS:
handle_double "执行双击事件
FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING e_row e_column es_row_no,
handle_toolbar
FOR EVENT toolbar OF cl_gui_alv_grid "TOOLBAR
IMPORTING e_object e_interactive,
handle_user_command "执行toolbar的UCOMM
FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm,
handle_menu_button
FOR EVENT menu_button OF cl_gui_alv_grid
IMPORTING e_object e_ucomm,
handle_data_changed
FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING er_data_changed,
handle_hotspot_click
FOR EVENT hotspot_click OF cl_gui_alv_grid
IMPORTING e_row_id e_column_id es_row_no.
ENDCLASS. "lcl_event_receiver DEFINITION
*&---------------------------------------------------------------------*
*& Class (Implementation) lcl_event_receiver
*&---------------------------------------------------------------------*
* Text
*----------------------------------------------------------------------*
CLASS lcl_alv_application IMPLEMENTATION. "事件的实现
*-----------------------------------------------------------------
METHOD handle_double .
* READ TABLE it_ztcat INDEX e_row-index.
* if sy-subrc = 0.
* message 'shuangji' type 'E'.
* endif.
* if sy-dynnr = '0100'.
* READ TABLE it_MAIN INTO it_MAIN INDEX e_row-index.
* IF sy-subrc = 0.
* PERFORM DETAIL_DATA.
* PERFORM DISPLAY_DETAIL_ALV.
* ENDIF.
* elseif sy-dynnr = '0200'.
* read table it_double_click into it_double_click INDEX e_row-index.
* if sy-subrc = 0.
* CLEAR: F_PERID ,F_KNORD.
* f_perid = p_perid.
* f_knord = it_double_click-knord.
* set parameter id 'ZPERID' FIELD F_PERID.
* SET PARAMETER ID 'ZORDER' FIELD F_KNORD.
* CALL TRANSACTION 'ZBD002_03' AND SKIP FIRST SCREEN.
* endif.
* endif.
ENDMETHOD. "HANDLE_double
*-----------------------TOOLBAR------------------------------------*
METHOD handle_toolbar.
* ?2.In event handler method for event TOOLBAR: Append own functions
* by using event parameter E_OBJECT.
DATA: ls_toolbar TYPE stb_button.
*....................................................................
* E_OBJECT of event TOOLBAR is of type REF TO CL_ALV_EVENT_TOOLBAR_SET.
* This class has got one attribute, namly MT_TOOLBAR, which
* is a table of type TTB_BUTTON. One line of this table is
* defined by the Structure STB_BUTTON (see data deklaration above).
*
* A remark to the flag E_INTERACTIVE:
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* 'e_interactive' is set, if this event is raised due to
* the call of 'set_toolbar_interactive' by the user.
* You can distinguish this way if the event was raised
* by yourself or by ALV
* (e.g. in method 'refresh_table_display').
* An application of this feature is still unknown... :-)
*判断节点是否是根节点
*删除需要的ALV按钮
*把需要的引掉
* DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_SUM'.
* DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_SUBTOT'.
DELETE e_object->mt_toolbar WHERE function = '&&SEP05'.
DELETE e_object->mt_toolbar WHERE function = '&PRINT_BACK'.
DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_VIEW'.
DELETE e_object->mt_toolbar WHERE FUNCTION = '&COL0'.
DELETE e_object->mt_toolbar WHERE function = '&&SEP06'.
DELETE e_object->mt_toolbar WHERE function = '&GRAPH'.
DELETE e_object->mt_toolbar WHERE function = '&&SEP07'.
DELETE e_object->mt_toolbar WHERE function = '&INFO'.
DELETE e_object->mt_toolbar WHERE function = ''.
DELETE e_object->mt_toolbar WHERE function = '&&SEP00'.
DELETE e_object->mt_toolbar WHERE function = '&CHECK'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&CUT'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL©'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&PASTE'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&APPEND'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&INSERT_ROW'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&DELETE_ROW'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&UNDO'.
* DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_SUM'.
* DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_SUBTOT'.
DELETE e_object->mt_toolbar WHERE function = '&MB_VIEW'.
DELETE e_object->mt_toolbar WHERE function = '&GRAPH'.
DELETE e_object->mt_toolbar WHERE function = '&INFO'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL©_ROW'.
DELETE e_object->mt_toolbar WHERE function = '&REFRESH'.
"×××××××××××××××××加按钮 姚伟
* IF SY-TCODE <> 'ZBD002_22' AND SY-TCODE <> 'ZBD002_23'.
**分配方式
* CLEAR ls_toolbar.
* MOVE 3 TO ls_toolbar-butn_type.
* APPEND ls_toolbar TO e_object->mt_toolbar.
* CLEAR ls_toolbar.
* MOVE 'A_AVERAGE' TO ls_toolbar-function.
* MOVE icon_used_relation TO ls_toolbar-icon.
* MOVE '每征订代码按总数加权平均扣减'(114) TO ls_toolbar-quickinfo.
* MOVE 1 TO ls_toolbar-butn_type.
* MOVE ' ' TO ls_toolbar-disabled.
* APPEND ls_toolbar TO e_object->mt_toolbar.
* ENDIF.
*定义 创建alv按钮的宏
DEFINE set_toolbar.
clear ls_toolbar.
move &1 to ls_toolbar-function.
move &2 to ls_toolbar-icon.
move &3 to ls_toolbar-butn_type. "按钮类型(父菜单) ' '不为父菜单
move &4 to ls_toolbar-quickinfo.
MOVE &5 TO ls_toolbar-text.
move ' ' to ls_toolbar-disabled.
append ls_toolbar to e_object->mt_toolbar.
END-OF-DEFINITION.
CLEAR ls_toolbar. "分割线
MOVE '&&SEP07' TO ls_toolbar-function.
MOVE 3 TO ls_toolbar-butn_type.
APPEND ls_toolbar TO e_object->mt_toolbar.
*****自己加的按钮1
*ICON_CHANGE后面的不能为空,否则无法实现子菜单。
set_toolbar 'DO_EXPORT' ICON_EXPORT '' '导出模板' '导出模板'.
set_toolbar 'DO_IMPORT' ICON_IMPORT '' '导入数据' '导入数据'.
set_toolbar 'DO_SAVE' icon_system_save '' '保存' '保存'.
* set_toolbar 'DO_LOG' ICON_PROTOCOL '' '错误日志' .
set_toolbar '&&SEP08' '' 3 '' ''. "分隔符
set_toolbar 'DO_DELETE' ICON_DELETE '' '删除' '删除'.
set_toolbar 'DO_ADD' ICON_INSERT_FAVORITES '' '添加' '添加'.
set_toolbar '&&SEP08' '' 3 '' ''. "分隔符
set_toolbar 'DO_DBTAB' ICON_EFFECTIVITY_PERIOD '' '察看/修改已维护数据' '察看/修改已维护数据'.
ENDMETHOD. "handle_toolbar
*---------------user_command-----------------------------------*
*****对按钮的监听 姚伟
METHOD handle_user_command.
CASE e_ucomm.
*导出数据模板
WHEN: 'DO_EXPORT'.
PERFORM DO_EXPORT.
*导入数据
WHEN: 'DO_IMPORT'.
PERFORM DO_IMPORT.
*保存
WHEN: 'DO_SAVE'.
PERFORM DO_SAVE.
*查看错误日志
* WHEN: 'DO_LOG'.
* PERFORM DO_LOG.
*删除
WHEN: 'DO_DELETE'.
PERFORM DO_DELETE.
*添加
WHEN: 'DO_ADD'.
PERFORM DO_ADD.
*察看修改已维护数据
WHEN: 'DO_DBTAB'.
PERFORM DO_DBTAB.
ENDCASE.
ENDMETHOD. "lcl_event_receiver
*-------------------------------------------------------------------
METHOD handle_menu_button.
"××××××××××××××××加子菜单 姚伟
ENDMETHOD. "handle_menu_button
*-------------------------------------------------------------------
METHOD handle_data_changed. "用于双击和回车
"×××××××××××××××数据改变时触发
ENDMETHOD. "handle_menu_button
METHOD handle_hotspot_click.
ENDMETHOD. "handle_HOTSPOT_CLICK
ENDCLASS. "lcl_ALV_event_receiver
*&---------------------------------------------------------------------*
*& Form DO_EXPORT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM DO_EXPORT .
*倒出模板
TYPES:BEGIN OF IT_MY_HEAD,
F_WERKS(4),
F_MATKL(9),
F_PZSX(13),
F_PZXX(13),
F_CSSX(13),
F_CSXX(13),
F_MYSX(13),
F_MYXX(13),
F_YFS(13),
F_NAME(12),
F_FBUDA(8),
F_NAME1(12),
F_FKDAT(8),
F_ERROR(30),
F_LINES(9),
END OF IT_MY_HEAD.
DATA:IT_HEAD TYPE TABLE OF IT_MY_HEAD WITH HEADER LINE.
IT_HEAD-F_WERKS = '门店'.
IT_HEAD-F_MATKL = '商品类目'.
IT_HEAD-F_PZSX = '品种数上限'.
IT_HEAD-F_PZXX = '品种数下限'.
IT_HEAD-F_CSSX = '册数上限'.
IT_HEAD-F_CSXX = '册数下限'.
IT_HEAD-F_MYSX = '码洋上限'.
IT_HEAD-F_MYXX = '码洋下限'.
IT_HEAD-F_YFS = '新品预分数'.
IT_HEAD-F_NAME = '创建人'.
IT_HEAD-F_FBUDA = '创建日期'.
IT_HEAD-F_NAME1 = '修改人'.
IT_HEAD-F_FKDAT = '最后修改日期'.
IT_HEAD-F_ERROR = '错误信息'.
IT_HEAD-F_LINES = '序号'.
APPEND IT_HEAD.
CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
* CODEPAGE = '8400'
FILENAME = 'C://商品主配分析表模板.XLS'
FILETYPE = 'DAT'
MODE = ''
TABLES
DATA_TAB = IT_HEAD. "可以不止一行
IF SY-SUBRC = 0.
MESSAGE '导出模板成功(C://商品主配分析表模板.XLS)!' TYPE 'I'.
ELSE.
MESSAGE '导出模板失败!' TYPE 'I'.
ENDIF.
ENDFORM. " DO_EXPORT
*&---------------------------------------------------------------------*
*& Form DO_IMPORT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM DO_IMPORT .
REFRESH IT_IMPORT.
CLEAR IT_IMPORT.
*导入数据
CALL FUNCTION 'UPLOAD'
EXPORTING
* CODEPAGE = ' '
FILENAME = 'C://商品主配分析表模板.XLS'
filetype = 'DAT'
* ITEM = ' '
* FILEMASK_MASK = ' '
* FILEMASK_TEXT = ' '
* FILETYPE_NO_CHANGE = ' '
* FILEMASK_ALL = ' '
* FILETYPE_NO_SHOW = ' '
* LINE_EXIT = ' '
* USER_FORM = ' '
* USER_PROG = ' '
* SILENT = 'S'
* IMPORTING
* FILESIZE =
* CANCEL =
* ACT_FILENAME =
* ACT_FILETYPE =
TABLES
data_tab = IT_IMPORT
EXCEPTIONS
conversion_error = 1
invalid_table_width = 2
invalid_type = 3
no_batch = 4
unknown_error = 5
gui_refuse_filetransfer = 6
OTHERS = 7
.
IF sy-subrc <> 0.
MESSAGE '文件导入错误!' TYPE 'W'.
ENDIF.
*ZCPDWB中的地点
REFRESH IT_WERKS.
CLEAR IT_WERKS.
SELECT
SINGLE
WERKS
WERK_NAME AS NAME1
INTO CORRESPONDING FIELDS OF IT_WERKS
FROM ZCPDWB.
SORT IT_WERKS BY WERKS.
*排序
SORT IT_T023T BY MATKL.
SORT IT_T001W BY WERKS.
*把第一行的文字描述去掉
READ TABLE IT_IMPORT INDEX 1.
IF IT_IMPORT-F_WERKS = '门店'.
DELETE IT_IMPORT INDEX 1.
ENDIF.
***检查导入的数据是否有误
DATA:F_STRING TYPE STRING.
DATA:WA_ALV_100 LIKE IT_ALV_100.
DATA:F_ERROR(1).
CLEAR F_ERROR.
SORT IT_IMPORT BY F_WERKS F_MATKL.
REFRESH IT_ALV_100.
CLEAR IT_ALV_100.
LOOP AT IT_IMPORT.
IF IT_IMPORT-F_WERKS = '' AND IT_IMPORT-F_MATKL = ''.
CONTINUE.
ENDIF.
CLEAR WA_ALV_100.
CLEAR F_STRING.
*判断地点是否存在
WA_ALV_100-WERKS = IT_IMPORT-F_WERKS.
READ TABLE IT_T001W WITH KEY WERKS = WA_ALV_100-WERKS BINARY SEARCH.
IF SY-SUBRC = 0.
WA_ALV_100-WERK_NAME = IT_T001W-NAME1.
ELSE.
CLEAR F_STRING.
F_ERROR = 'X'. "有错误的行
CONCATENATE WA_ALV_100-WERKS '门店不存在' INTO F_STRING.
WA_ALV_100-F_ERROR = F_STRING.
ENDIF.
*判断类目是否存在
WA_ALV_100-MATKL = IT_IMPORT-F_MATKL.
READ TABLE IT_T023T WITH KEY MATKL = WA_ALV_100-MATKL BINARY SEARCH.
IF SY-SUBRC = 0.
WA_ALV_100-WGBEZ60 = IT_T023T-WGBEZ. "商品类目描述
ELSE.
CLEAR F_STRING.
F_ERROR = 'X'. "有错误的行
CONCATENATE '商品类目' WA_ALV_100-MATKL '不存在' INTO F_STRING.
WA_ALV_100-F_ERROR = F_STRING.
ENDIF.
*判断商品类目是否有重复的
READ TABLE IT_ALV_100 WITH KEY MATKL = WA_ALV_100-MATKL BINARY SEARCH.
IF SY-SUBRC = 0.
CLEAR F_STRING.
F_ERROR = 'X'. "有错误的行
CONCATENATE '商品类目' WA_ALV_100-MATKL '存在重复' INTO F_STRING.
WA_ALV_100-F_ERROR = F_STRING.
ENDIF.
WA_ALV_100-PZSX = IT_IMPORT-F_PZSX.
WA_ALV_100-PZXX = IT_IMPORT-F_PZXX.
IF WA_ALV_100-PZXX > WA_ALV_100-PZSX.
F_ERROR = 'X'. "有错误的行
WA_ALV_100-F_ERROR = '品种下限大于上限'.
ENDIF.
WA_ALV_100-CSSX = IT_IMPORT-F_CSSX.
WA_ALV_100-CSXX = IT_IMPORT-F_CSXX.
IF WA_ALV_100-CSXX > WA_ALV_100-CSSX.
F_ERROR = 'X'. "有错误的行
WA_ALV_100-F_ERROR = '册数下限大于上限'.
ENDIF.
WA_ALV_100-MYSX = IT_IMPORT-F_MYSX.
WA_ALV_100-MYXX = IT_IMPORT-F_MYXX.
IF WA_ALV_100-MYXX > WA_ALV_100-MYSX.
F_ERROR = 'X'. "有错误的行
WA_ALV_100-F_ERROR = '码洋下限大于上限'.
ENDIF.
WA_ALV_100-YFS = IT_IMPORT-F_YFS.
WA_ALV_100-NAME = IT_IMPORT-F_NAME.
WA_ALV_100-NAME1 = IT_IMPORT-F_NAME1.
READ TABLE IT_WERKS WITH KEY WERKS = WA_ALV_100-WERKS.
IF SY-SUBRC = 0. "若地点存在说明是修改的时间
WA_ALV_100-FKDAT = SY-DATUM.
ELSE. "若地点不存在说明是创建时间
WA_ALV_100-FBUDA = SY-DATUM.
ENDIF.
APPEND WA_ALV_100 TO IT_ALV_100.
CLEAR WA_ALV_100.
ENDLOOP.
*更新屏幕ALV
SORT IT_ALV_100 BY F_ERROR DESCENDING. "让错误的放在前面
DATA:F_LINES TYPE I. "序号
F_LINES = 0.
LOOP AT IT_ALV_100 ASSIGNING <WA>.
F_LINES = F_LINES + 1.
<WA>-F_LINES = F_LINES.
ENDLOOP.
CALL METHOD G_ALV_grid->refresh_table_display.
IF F_ERROR = 'X'.
*存在错误的行
MESSAGE '存在错误的行信息!' TYPE 'I'.
ENDIF.
ENDFORM. " DO_IMPORT
*&---------------------------------------------------------------------*
*& Form DO_SAVE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM DO_SAVE .
*屏幕上的更新到内表
DATA: g_ALV_grid_2 TYPE REF TO cl_gui_alv_grid.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
* ET_EXCLUDING =
* E_FLG_NO_HTML =
* E_REPID =
e_grid = g_ALV_grid_2
* ES_LAYOUT_KKBLO =
.
* CALL METHOD g_ALV_grid->check_changed_data."用来触发DATACHANGE方法的
***判断是否还有错误 若有则不更新数据库表,报错要求修改
*删除错误信息
DATA:F_STRING TYPE STRING.
DATA:F_ERROR(1). "是否还有错
DATA:IT_ALV_100_2 LIKE TABLE OF IT_MY_ALV_100 WITH HEADER LINE.
DATA:WA_ALV_2 LIKE IT_MY_ALV_100.
WA_ALV_2-F_ERROR = ''.
MODIFY IT_ALV_100 FROM WA_ALV_2 TRANSPORTING F_ERROR WHERE F_ERROR <> ''.
*判断是否还有错误
CLEAR:F_ERROR,F_STRING.
SORT IT_ALV_100 BY WERKS MATKL.
IT_ALV_100_2[] = IT_ALV_100[].
LOOP AT IT_ALV_100 ASSIGNING <WA>.
*判断地点是否存在
READ TABLE IT_T001W WITH KEY WERKS = <WA>-WERKS BINARY SEARCH.
IF SY-SUBRC = 0.
IT_ALV_100-WERK_NAME = IT_T001W-NAME1.
ELSE.
CLEAR F_STRING.
F_ERROR = 'X'. "还有错误的行
CONCATENATE <WA>-WERKS '门店不存在' INTO F_STRING.
<WA>-F_ERROR = F_STRING.
ENDIF.
*判断类目是否存在
READ TABLE IT_T023T WITH KEY MATKL = <WA>-MATKL BINARY SEARCH.
IF SY-SUBRC = 0.
<WA>-WGBEZ60 = IT_T023T-WGBEZ. "商品类目描述
ELSE.
CLEAR F_STRING.
F_ERROR = 'X'. "还有错误的行
CONCATENATE '商品类目' <WA>-MATKL '不存在' INTO F_STRING.
<WA>-F_ERROR = F_STRING.
ENDIF.
*判断商品类目是否有重复的
DELETE IT_ALV_100_2 INDEX 1. "这个有用把当前行和剩下的比较
READ TABLE IT_ALV_100_2 WITH KEY MATKL = <WA>-MATKL.
IF SY-SUBRC = 0.
CLEAR F_STRING.
F_ERROR = 'X'. "还有错误的行
CONCATENATE '商品类目' <WA>-MATKL '存在重复' INTO F_STRING.
<WA>-F_ERROR = F_STRING.
ENDIF.
IF <WA>-PZXX > <WA>-PZSX.
F_ERROR = 'X'. "还有错误的行
<WA>-F_ERROR = '品种下限大于上限'.
ENDIF.
IF <WA>-CSXX > <WA>-CSSX.
F_ERROR = 'X'. "还有错误的行
<WA>-F_ERROR = '册数下限大于上限'.
ENDIF.
IF <WA>-MYXX > <WA>-MYSX.
F_ERROR = 'X'. "还有错误的行
<WA>-F_ERROR = '码洋下限大于上限'.
ENDIF.
ENDLOOP.
IF F_ERROR = 'X'.
*还存在错误的行
*更新屏幕ALV
SORT IT_ALV_100 BY F_ERROR DESCENDING . "让错误的放在前面
DATA:F_LINES TYPE I. "序号
F_LINES = 0.
LOOP AT IT_ALV_100 ASSIGNING <WA>.
F_LINES = F_LINES + 1.
<WA>-F_LINES = F_LINES.
ENDLOOP.
CALL METHOD G_ALV_grid->refresh_table_display.
MESSAGE '存在错误的行信息!' TYPE 'I'.
ELSE.
*没有错误的行了
REFRESH IT_ALV_100_2.
CLEAR IT_ALV_100_2.
*删除数据库中存在的WERKS.
IT_ALV_100_2[] = IT_ALV_100[].
DELETE ADJACENT DUPLICATES FROM IT_ALV_100_2 COMPARING WERKS.
LOOP AT IT_ALV_100_2.
DELETE FROM ZCPDWB WHERE WERKS = IT_ALV_100_2-WERKS.
ENDLOOP.
IF SY-SUBRC = 0.
COMMIT WORK.
ELSE.
ROLLBACK WORK.
MESSAGE '删除数据库数据失败!' TYPE 'E'.
EXIT.
ENDIF.
DATA: F_ANSWER(1).
CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
EXPORTING
* DEFAULTOPTION = 'Y'
TEXTLINE1 = '数据将保存到数据库中,是否确定要进行?'
* TEXTLINE2 = ' '
TITEL = '保存提示'
* START_COLUMN = 25
* START_ROW = 6
CANCEL_DISPLAY = 'X'
IMPORTING
ANSWER = F_ANSWER
.
CASE: F_ANSWER.
WHEN: 'J'.
INSERT ZCPDWB FROM TABLE IT_ALV_100.
IF SY-SUBRC = 0.
COMMIT WORK.
MESSAGE '保存数据成功' TYPE 'I'.
CLEAR IT_ALV_100.
REFRESH IT_ALV_100.
CALL METHOD G_ALV_grid->refresh_table_display.
ELSE.
ROLLBACK WORK.
MESSAGE '保存数据有错' TYPE 'I'.
EXIT.
ENDIF.
WHEN: 'N' OR 'A'.
ENDCASE.
ENDIF.
ENDFORM. " DO_SAVE
*&---------------------------------------------------------------------*
*& Form DO_DBTAB
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM DO_DBTAB .
CALL SCREEN '200'.
ENDFORM. " DO_DBTAB
*&---------------------------------------------------------------------*
*& Form DO_DELETE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM DO_DELETE .
DATA: lt_rows TYPE lvc_t_row.
DATA: f_lines TYPE i.
DATA:wa_it_alv_l LIKE it_alv_100.
DATA:wa_lt_row TYPE lvc_s_row .
CALL METHOD g_ALV_grid->get_selected_rows "得到选中的
IMPORTING
et_index_rows = lt_rows.
IF lt_rows[] IS NOT INITIAL .
DATA: F_ANSWER(1).
CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
EXPORTING
* DEFAULTOPTION = 'Y'
TEXTLINE1 = '确定要删除选中的行?'
* TEXTLINE2 = ' '
TITEL = '提示'
* START_COLUMN = 25
* START_ROW = 6
CANCEL_DISPLAY = 'X'
IMPORTING
ANSWER = F_ANSWER
.
CASE: F_ANSWER.
WHEN: 'J'.
CLEAR wa_lt_row.
DATA:IT_ALV_100_12 LIKE TABLE OF IT_MY_ALV_100 WITH HEADER LINE.
LOOP AT lt_rows INTO wa_lt_row.
READ TABLE IT_ALV_100 INDEX wa_lt_row-index.
APPEND IT_ALV_100 TO IT_ALV_100_12.
ENDLOOP.
LOOP AT IT_ALV_100_12.
DELETE TABLE IT_ALV_100 FROM IT_ALV_100_12.
ENDLOOP.
CALL METHOD G_ALV_grid->refresh_table_display.
WHEN: 'N' OR 'A'.
ENDCASE.
ELSE.
MESSAGE '没有选中行!' TYPE 'I'.
ENDIF.
ENDFORM. " DO_DELETE
*&---------------------------------------------------------------------*
*& Form DO_ADD
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM DO_ADD .
F_SCREEN = '100'.
CALL SCREEN 400 STARTING AT 20 20.
ENDFORM. " DO_ADD
例子2:
*&---------------------------------------------------------------------*
*& 包括 ZBD002_40_CLASS *
*&---------------------------------------------------------------------*
* 类的定义-按征订代码统计
CLASS lcl_alv_100 DEFINITION.
PUBLIC SECTION.
METHODS:
handle_double "执行双击事件
FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING e_row e_column es_row_no ,
handle_toolbar
FOR EVENT toolbar OF cl_gui_alv_grid "TOOLBAR
IMPORTING e_object e_interactive,
handle_user_command "执行toolbar的UCOMM
FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm,
handle_data_changed
FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING er_data_changed.
ENDCLASS. "lcl_event_receiver DEFINITION
* 类执行-按征订代码统计
CLASS lcl_alv_100 IMPLEMENTATION.
*-----------------------------------------------------------------
METHOD handle_double .
CALL METHOD g_grid_100->check_changed_data.
CASE e_column-fieldname.
WHEN 'BOOKC'.
CLEAR: f_bookc_200,f_cb_200,f_qj_200.
* 双击进入征订代码+地点统计
READ TABLE it_alv_bookc INTO it_alv_bookc INDEX e_row-index.
IF sy-subrc = 0.
f_bookc_200 = it_alv_bookc-bookc. "ALV上面的字段
f_cb_200 = it_alv_bookc-ky_cb.
f_qj_200 = it_alv_bookc-qj_fh.
PERFORM get_table_2 USING it_alv_bookc-bookc.
ENDIF.
CALL SCREEN 200.
* 双击请减发货数,可以列出发货的转储信息,双击转储单号,可以修改未发货过账并
* 且没有截单的转储单数量
WHEN 'QJ_FH'.
READ TABLE it_alv_bookc INTO it_alv_bookc INDEX e_row-index.
IF sy-subrc = 0.
IF it_alv_bookc-qj_menge > it_alv_bookc-qj_fh.
* 如果有直配客户,就只能到明细去做确认
PERFORM check_zpkh_bookc.
* 取发货的转储明细
PERFORM get_data_ekpo USING p_perid it_alv_bookc-bookc.
REFRESH it_alv_ekpo.
CLEAR it_alv_ekpo.
it_alv_ekpo[] = it_ekpo[].
DELETE it_alv_ekpo WHERE zzbookc <> it_alv_bookc-bookc.
* 根据单据数量 结单状态 发货数量 计算可减少的数量
LOOP AT it_alv_ekpo INTO it_alv_ekpo .
IF it_alv_ekpo-zclose_order = ''.
it_alv_ekpo-shy_m = it_alv_ekpo-menge - it_alv_ekpo-glmng.
ELSE.
it_alv_ekpo-shy_m = 0.
ENDIF.
MODIFY it_alv_ekpo FROM it_alv_ekpo INDEX sy-tabix.
ENDLOOP.
f_screen = '0100'.
CLEAR r_menge.
PERFORM alv_list_ekpo USING f_screen.
it_alv_bookc-qj_fh = it_alv_bookc-qj_fh + r_menge.
IF it_alv_bookc-qj_fh <= 0.
it_alv_bookc-qj_fh = 0.
ENDIF.
MODIFY it_alv_bookc FROM it_alv_bookc INDEX e_row-index.
ENDIF.
ENDIF.
ENDCASE.
CALL METHOD cl_gui_cfw=>set_new_ok_code
EXPORTING
new_code = 'OK'.
ENDMETHOD. "HANDLE_double
*-----------------------TOOLBAR------------------------------------*
METHOD handle_toolbar.
*删除需要的ALV按钮
DELETE e_object->mt_toolbar WHERE function = '&MB_SUM'.
DELETE e_object->mt_toolbar WHERE function = '&MB_SUBTOT'.
DELETE e_object->mt_toolbar WHERE function = '&&SEP05'.
DELETE e_object->mt_toolbar WHERE function = '&PRINT_BACK'.
DELETE e_object->mt_toolbar WHERE function = '&MB_VIEW'.
DELETE e_object->mt_toolbar WHERE function = '&COL0'.
DELETE e_object->mt_toolbar WHERE function = '&&SEP06'.
DELETE e_object->mt_toolbar WHERE function = '&GRAPH'.
DELETE e_object->mt_toolbar WHERE function = '&&SEP07'.
DELETE e_object->mt_toolbar WHERE function = '&INFO'.
DELETE e_object->mt_toolbar WHERE function = ''.
DELETE e_object->mt_toolbar WHERE function = '&&SEP00'.
DELETE e_object->mt_toolbar WHERE function = '&CHECK'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&CUT'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL©'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&PASTE'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&APPEND'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&INSERT_ROW'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&DELETE_ROW'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&UNDO'.
* DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_SUM'.
* DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_SUBTOT'.
DELETE e_object->mt_toolbar WHERE function = '&MB_VIEW'.
DELETE e_object->mt_toolbar WHERE function = '&GRAPH'.
DELETE e_object->mt_toolbar WHERE function = '&INFO'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL©_ROW'.
DELETE e_object->mt_toolbar WHERE function = '&REFRESH'.
*对同个征订代码合并追加和请减
CLEAR ls_toolbar.
MOVE 'HB' TO ls_toolbar-function.
MOVE '合并'(114) TO ls_toolbar-quickinfo.
MOVE '合并' TO ls_toolbar-text.
MOVE ' ' TO ls_toolbar-disabled.
APPEND ls_toolbar TO e_object->mt_toolbar.
CLEAR ls_toolbar. "分割线
MOVE '&&SEP07' TO ls_toolbar-function.
MOVE 3 TO ls_toolbar-butn_type.
APPEND ls_toolbar TO e_object->mt_toolbar.
* 确认选择
CLEAR ls_toolbar.
MOVE 'ZHJ' TO ls_toolbar-function.
MOVE '确认追加'(114) TO ls_toolbar-quickinfo.
MOVE '确认追加' TO ls_toolbar-text.
MOVE ' ' TO ls_toolbar-disabled.
APPEND ls_toolbar TO e_object->mt_toolbar.
CLEAR ls_toolbar. "分割线
MOVE '&&SEP07' TO ls_toolbar-function.
MOVE 3 TO ls_toolbar-butn_type.
APPEND ls_toolbar TO e_object->mt_toolbar.
* 确认选择
CLEAR ls_toolbar.
MOVE 'QJ' TO ls_toolbar-function.
MOVE '确认请减'(114) TO ls_toolbar-quickinfo.
MOVE '确认请减' TO ls_toolbar-text.
MOVE ' ' TO ls_toolbar-disabled.
APPEND ls_toolbar TO e_object->mt_toolbar.
CLEAR ls_toolbar. "分割线
MOVE '&&SEP07' TO ls_toolbar-function.
MOVE 3 TO ls_toolbar-butn_type.
APPEND ls_toolbar TO e_object->mt_toolbar.
* 查看已确认
CLEAR ls_toolbar.
MOVE 'LIST' TO ls_toolbar-function.
MOVE '查看已确认明细'(114) TO ls_toolbar-quickinfo.
MOVE '查看已确认明细' TO ls_toolbar-text.
MOVE ' ' TO ls_toolbar-disabled.
APPEND ls_toolbar TO e_object->mt_toolbar.
CLEAR ls_toolbar. "分割线
MOVE '&&SEP07' TO ls_toolbar-function.
MOVE 3 TO ls_toolbar-butn_type.
APPEND ls_toolbar TO e_object->mt_toolbar.
* 查看被锁的征订代码
CLEAR ls_toolbar.
MOVE 'LOCK' TO ls_toolbar-function.
MOVE '查看被锁的征订代码'(114) TO ls_toolbar-quickinfo.
MOVE '查看被锁的征订代码' TO ls_toolbar-text.
MOVE ' ' TO ls_toolbar-disabled.
APPEND ls_toolbar TO e_object->mt_toolbar.
ENDMETHOD. "handle_toolbar
*---------------user_command-----------------------------------*
METHOD handle_user_command.
IF g_grid_100 IS INITIAL.
EXIT.
ENDIF.
CALL METHOD g_grid_100->check_changed_data.
PERFORM process_ucomm_100 USING e_ucomm.
ENDMETHOD. "lcl_event_receiver
*-------------------------------------------------------------------
METHOD handle_data_changed.
PERFORM data_changed_100 USING er_data_changed.
ENDMETHOD. "handle_menu_button
ENDCLASS. "lcl_ALV_event_receiver
* 类的定义-按征订代码+地点统计
CLASS lcl_alv_200 DEFINITION.
PUBLIC SECTION.
METHODS:
handle_double "执行双击事件
FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING e_row e_column es_row_no ,
handle_toolbar
FOR EVENT toolbar OF cl_gui_alv_grid "TOOLBAR
IMPORTING e_object e_interactive,
handle_user_command "执行toolbar的UCOMM
FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm,
handle_data_changed
FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING er_data_changed.
ENDCLASS. "lcl_event_receiver DEFINITION
* 类执行-按征订代码统计
CLASS lcl_alv_200 IMPLEMENTATION.
*-----------------------------------------------------------------
METHOD handle_double .
DATA:wa_zs901 LIKE it_zs901,
wa_alv_bookc_werks LIKE it_alv_bookc_werks.
CALL METHOD g_grid_200->check_changed_data.
CASE e_column-fieldname.
WHEN 'BOOKC'.
CLEAR: f_bookc_300,f_werks,f_cb_300,f_qj_300,wa_alv_bookc_werks.
READ TABLE it_alv_bookc_werks INTO wa_alv_bookc_werks INDEX e_row-index.
IF sy-subrc = 0.
f_bookc_300 = wa_alv_bookc_werks-bookc.
f_werks = wa_alv_bookc_werks-werks.
*获取可以储备数,这个数会随着确认数而变化的,确认时会修改这个表
LOOP AT it_zs901 INTO wa_zs901 WHERE bookc = wa_alv_bookc_werks-bookc.
f_cb_300 = f_cb_300 + wa_zs901-menge_41.
ENDLOOP.
f_qj_300 = wa_alv_bookc_werks-qj_fh.
PERFORM get_table_3 USING wa_alv_bookc_werks.
CALL SCREEN 300.
ENDIF.
WHEN 'QJ_FH'.
READ TABLE it_alv_bookc_werks INTO it_alv_bookc_werks INDEX e_row-index.
IF sy-subrc = 0.
IF it_alv_bookc_werks-qj_menge > it_alv_bookc_werks-qj_fh .
* 如果有直配客户就只能到明细里面去做修改
PERFORM check_zpkh.
PERFORM get_data_ekpo USING p_perid it_alv_bookc_werks-bookc.
REFRESH it_alv_ekpo.
CLEAR it_alv_ekpo.
it_alv_ekpo[] = it_ekpo[].
DELETE it_alv_ekpo WHERE werks <> it_alv_bookc_werks-werks OR
zzbookc <> it_alv_bookc_werks-bookc.
* 根据单据数量 结单状态 发货数量 计算可减少的数量
LOOP AT it_alv_ekpo INTO it_alv_ekpo .
IF it_alv_ekpo-zclose_order = ''.
it_alv_ekpo-shy_m = it_alv_ekpo-menge - it_alv_ekpo-glmng.
ELSE.
it_alv_ekpo-shy_m = 0.
ENDIF.
MODIFY it_alv_ekpo FROM it_alv_ekpo INDEX sy-tabix.
ENDLOOP.
f_screen = '0200'.
CLEAR r_menge.
PERFORM alv_list_ekpo USING f_screen.
ENDIF.
ENDIF.
ENDCASE.
CALL METHOD cl_gui_cfw=>set_new_ok_code
EXPORTING
new_code = 'OK'.
ENDMETHOD. "HANDLE_double
*-----------------------TOOLBAR------------------------------------*
METHOD handle_toolbar.
*删除需要的ALV按钮
DELETE e_object->mt_toolbar WHERE function = '&MB_SUM'.
DELETE e_object->mt_toolbar WHERE function = '&MB_SUBTOT'.
DELETE e_object->mt_toolbar WHERE function = '&&SEP05'.
DELETE e_object->mt_toolbar WHERE function = '&PRINT_BACK'.
DELETE e_object->mt_toolbar WHERE function = '&MB_VIEW'.
DELETE e_object->mt_toolbar WHERE function = '&COL0'.
DELETE e_object->mt_toolbar WHERE function = '&&SEP06'.
DELETE e_object->mt_toolbar WHERE function = '&GRAPH'.
DELETE e_object->mt_toolbar WHERE function = '&&SEP07'.
DELETE e_object->mt_toolbar WHERE function = '&INFO'.
DELETE e_object->mt_toolbar WHERE function = ''.
DELETE e_object->mt_toolbar WHERE function = '&&SEP00'.
DELETE e_object->mt_toolbar WHERE function = '&CHECK'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&CUT'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL©'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&PASTE'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&APPEND'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&INSERT_ROW'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&DELETE_ROW'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&UNDO'.
* DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_SUM'.
* DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_SUBTOT'.
DELETE e_object->mt_toolbar WHERE function = '&MB_VIEW'.
DELETE e_object->mt_toolbar WHERE function = '&GRAPH'.
DELETE e_object->mt_toolbar WHERE function = '&INFO'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL©_ROW'.
DELETE e_object->mt_toolbar WHERE function = '&REFRESH'.
* 追加确认
CLEAR ls_toolbar.
MOVE 'ZHJ' TO ls_toolbar-function.
MOVE '确认追加'(114) TO ls_toolbar-quickinfo.
MOVE '确认追加' TO ls_toolbar-text.
MOVE ' ' TO ls_toolbar-disabled.
APPEND ls_toolbar TO e_object->mt_toolbar.
CLEAR ls_toolbar. "分割线
MOVE '&&SEP07' TO ls_toolbar-function.
MOVE 3 TO ls_toolbar-butn_type.
APPEND ls_toolbar TO e_object->mt_toolbar.
* 确认选择
CLEAR ls_toolbar.
MOVE 'QJ' TO ls_toolbar-function.
MOVE '确认请减'(114) TO ls_toolbar-quickinfo.
MOVE '确认请减' TO ls_toolbar-text.
MOVE ' ' TO ls_toolbar-disabled.
APPEND ls_toolbar TO e_object->mt_toolbar.
CLEAR ls_toolbar. "分割线
MOVE '&&SEP07' TO ls_toolbar-function.
MOVE 3 TO ls_toolbar-butn_type.
APPEND ls_toolbar TO e_object->mt_toolbar.
* 查看已确认
CLEAR ls_toolbar.
MOVE 'LIST' TO ls_toolbar-function.
MOVE '查看已确认明细'(114) TO ls_toolbar-quickinfo.
MOVE '查看已确认明细' TO ls_toolbar-text.
MOVE ' ' TO ls_toolbar-disabled.
APPEND ls_toolbar TO e_object->mt_toolbar.
CLEAR ls_toolbar. "分割线
MOVE '&&SEP07' TO ls_toolbar-function.
MOVE 3 TO ls_toolbar-butn_type.
APPEND ls_toolbar TO e_object->mt_toolbar.
* 查看被锁的征订代码
CLEAR ls_toolbar.
MOVE 'LOCK' TO ls_toolbar-function.
MOVE '查看被锁的征订代码'(114) TO ls_toolbar-quickinfo.
MOVE '查看被锁的征订代码' TO ls_toolbar-text.
MOVE ' ' TO ls_toolbar-disabled.
APPEND ls_toolbar TO e_object->mt_toolbar.
ENDMETHOD. "handle_toolbar
*---------------user_command-----------------------------------*
METHOD handle_user_command.
IF g_grid_200 IS INITIAL.
EXIT.
ENDIF.
CALL METHOD g_grid_200->check_changed_data.
PERFORM process_ucomm_200 USING e_ucomm.
ENDMETHOD. "lcl_event_receiver
*-------------------------------------------------------------------
METHOD handle_data_changed.
PERFORM data_changed_200 USING er_data_changed.
ENDMETHOD. "handle_menu_button
ENDCLASS. "lcl_ALV_event_receiver
* 类的定义-明细
CLASS lcl_alv_300 DEFINITION.
PUBLIC SECTION.
METHODS:
handle_double "执行双击事件
FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING e_row e_column es_row_no ,
handle_toolbar
FOR EVENT toolbar OF cl_gui_alv_grid "TOOLBAR
IMPORTING e_object e_interactive,
handle_user_command "执行toolbar的UCOMM
FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm,
handle_data_changed
FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING er_data_changed.
ENDCLASS. "lcl_event_receiver DEFINITION
* 类执行-明细
CLASS lcl_alv_300 IMPLEMENTATION.
*-----------------------------------------------------------------
METHOD handle_double .
DATA: w_menge TYPE i.
CALL METHOD g_grid_100->check_changed_data.
CASE e_column-fieldname.
WHEN 'SHY_FH'.
READ TABLE it_alv_mingxi INTO it_alv_mingxi INDEX e_row-index.
IF sy-subrc = 0.
CLEAR w_menge.
w_menge = it_alv_mingxi-qj_fh + it_alv_mingxi-shy_fh.
IF it_alv_mingxi-qj_menge > w_menge .
PERFORM get_data_ekpo USING p_perid it_alv_bookc-bookc.
REFRESH it_alv_ekpo.
CLEAR it_alv_ekpo.
it_alv_ekpo[] = it_ekpo[].
* 非直发的转储单不能分配到直发客户,
IF it_alv_mingxi-zpkh = ''.
DELETE it_alv_ekpo WHERE zzbookc <> it_alv_mingxi-bookc OR
werks <> it_alv_mingxi-werks OR
kunnr <> ''.
ELSE.
DELETE it_alv_ekpo WHERE zzbookc <> it_alv_mingxi-bookc OR
werks <> it_alv_mingxi-werks OR
kunnr <> it_alv_mingxi-kunnr.
ENDIF.
it_alv_ekpo-zpkh = it_alv_mingxi-zpkh.
MODIFY it_alv_ekpo FROM it_alv_ekpo TRANSPORTING zpkh WHERE ebeln <> ''.
* 根据单据数量 结单状态 发货数量 计算可减少的数量
LOOP AT it_alv_ekpo INTO it_alv_ekpo .
IF it_alv_ekpo-zclose_order = ''.
it_alv_ekpo-shy_m = it_alv_ekpo-menge - it_alv_ekpo-glmng.
ELSE.
it_alv_ekpo-shy_m = 0.
ENDIF.
MODIFY it_alv_ekpo FROM it_alv_ekpo INDEX sy-tabix.
ENDLOOP.
CLEAR r_menge.
f_screen = '0300'.
PERFORM alv_list_ekpo USING f_screen.
ENDIF.
ENDIF.
ENDCASE.
ENDMETHOD. "HANDLE_double
*-----------------------TOOLBAR------------------------------------*
METHOD handle_toolbar.
*删除需要的ALV按钮
DELETE e_object->mt_toolbar WHERE function = '&MB_SUM'.
DELETE e_object->mt_toolbar WHERE function = '&MB_SUBTOT'.
DELETE e_object->mt_toolbar WHERE function = '&&SEP05'.
DELETE e_object->mt_toolbar WHERE function = '&PRINT_BACK'.
DELETE e_object->mt_toolbar WHERE function = '&MB_VIEW'.
DELETE e_object->mt_toolbar WHERE function = '&COL0'.
DELETE e_object->mt_toolbar WHERE function = '&&SEP06'.
DELETE e_object->mt_toolbar WHERE function = '&GRAPH'.
DELETE e_object->mt_toolbar WHERE function = '&&SEP07'.
DELETE e_object->mt_toolbar WHERE function = '&INFO'.
DELETE e_object->mt_toolbar WHERE function = ''.
DELETE e_object->mt_toolbar WHERE function = '&&SEP00'.
DELETE e_object->mt_toolbar WHERE function = '&CHECK'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&CUT'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL©'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&PASTE'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&APPEND'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&INSERT_ROW'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&DELETE_ROW'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&UNDO'.
* DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_SUM'.
* DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_SUBTOT'.
DELETE e_object->mt_toolbar WHERE function = '&MB_VIEW'.
DELETE e_object->mt_toolbar WHERE function = '&GRAPH'.
DELETE e_object->mt_toolbar WHERE function = '&INFO'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL©_ROW'.
DELETE e_object->mt_toolbar WHERE function = '&REFRESH'.
* 拒绝追加
CLEAR ls_toolbar.
MOVE 'JJ_ZHJ' TO ls_toolbar-function.
MOVE '拒绝追加'(114) TO ls_toolbar-quickinfo.
MOVE '拒绝追加' TO ls_toolbar-text.
MOVE ' ' TO ls_toolbar-disabled.
APPEND ls_toolbar TO e_object->mt_toolbar.
* 确认选择
CLEAR ls_toolbar.
MOVE 'ZHJ' TO ls_toolbar-function.
MOVE '确认追加'(114) TO ls_toolbar-quickinfo.
MOVE '确认追加' TO ls_toolbar-text.
MOVE ' ' TO ls_toolbar-disabled.
APPEND ls_toolbar TO e_object->mt_toolbar.
CLEAR ls_toolbar. "分割线
MOVE '&&SEP07' TO ls_toolbar-function.
MOVE 3 TO ls_toolbar-butn_type.
APPEND ls_toolbar TO e_object->mt_toolbar.
* 确认选择
CLEAR ls_toolbar.
MOVE 'JJ_QJ' TO ls_toolbar-function.
MOVE '拒绝请减'(114) TO ls_toolbar-quickinfo.
MOVE '拒绝请减' TO ls_toolbar-text.
MOVE ' ' TO ls_toolbar-disabled.
APPEND ls_toolbar TO e_object->mt_toolbar.
CLEAR ls_toolbar.
MOVE 'QJ' TO ls_toolbar-function.
MOVE '确认请减'(114) TO ls_toolbar-quickinfo.
MOVE '确认请减' TO ls_toolbar-text.
MOVE ' ' TO ls_toolbar-disabled.
APPEND ls_toolbar TO e_object->mt_toolbar.
CLEAR ls_toolbar. "分割线
MOVE '&&SEP07' TO ls_toolbar-function.
MOVE 3 TO ls_toolbar-butn_type.
APPEND ls_toolbar TO e_object->mt_toolbar.
* 查看已确认
CLEAR ls_toolbar.
MOVE 'LIST' TO ls_toolbar-function.
MOVE '查看已确认明细'(114) TO ls_toolbar-quickinfo.
MOVE '查看已确认明细' TO ls_toolbar-text.
MOVE ' ' TO ls_toolbar-disabled.
APPEND ls_toolbar TO e_object->mt_toolbar.
CLEAR ls_toolbar. "分割线
MOVE '&&SEP07' TO ls_toolbar-function.
MOVE 3 TO ls_toolbar-butn_type.
APPEND ls_toolbar TO e_object->mt_toolbar.
* 查看被锁的征订代码
CLEAR ls_toolbar.
MOVE 'LOCK' TO ls_toolbar-function.
MOVE '查看被锁的征订代码'(114) TO ls_toolbar-quickinfo.
MOVE '查看被锁的征订代码' TO ls_toolbar-text.
MOVE ' ' TO ls_toolbar-disabled.
APPEND ls_toolbar TO e_object->mt_toolbar.
ENDMETHOD. "handle_toolbar
*---------------user_command-----------------------------------*
METHOD handle_user_command.
IF g_grid_300 IS INITIAL.
EXIT.
ENDIF.
CALL METHOD g_grid_300->check_changed_data.
PERFORM process_ucomm_300 USING e_ucomm.
ENDMETHOD. "lcl_event_receiver
*-------------------------------------------------------------------
METHOD handle_data_changed.
PERFORM data_changed_300 USING er_data_changed.
ENDMETHOD. "handle_menu_button
ENDCLASS. "lcl_ALV_event_receiver
*&---------------------------------------------------------------------*
*& Form get_table_2
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_IT_ALV_BOOKC_BOOKC text
*----------------------------------------------------------------------*
FORM get_table_2 USING p_it_alv_bookc_bookc LIKE ztblc-bookc.
*获取BOOKC+WERKS层的ALV显示数据
CLEAR it_alv_bookc_werks.
REFRESH it_alv_bookc_werks.
SORT it_bookc_werks BY bookc werks.
LOOP AT it_bookc_werks WHERE bookc = p_it_alv_bookc_bookc.
APPEND it_bookc_werks TO it_alv_bookc_werks.
ENDLOOP.
SORT it_alv_bookc_werks BY bookc werks zhj_menge.
CLEAR f_menge.
f_menge = it_alv_bookc-ky_cb.
IF f_menge < 0.
f_menge = 0.
ENDIF.
* 对追加分配储备数(从小到大的满足)
LOOP AT it_alv_bookc_werks WHERE zhj_menge > 0.
IF f_menge = 0.
EXIT.
ENDIF.
f_tabix = sy-tabix.
IF it_alv_bookc_werks-zhj_menge < f_menge.
it_alv_bookc_werks-fp_cb = it_alv_bookc_werks-zhj_menge.
f_menge = f_menge - it_alv_bookc_werks-fp_cb.
MODIFY it_alv_bookc_werks INDEX f_tabix.
ELSE.
it_alv_bookc_werks-fp_cb = f_menge.
f_menge = 0.
MODIFY it_alv_bookc_werks INDEX f_tabix.
ENDIF.
ENDLOOP.
*追加
it_alv_bookc_werks-ky_cb = f_menge. "分配后剩下的
it_alv_bookc_werks-zhj = it_alv_bookc-zhj. "追加确认
it_alv_bookc_werks-zhj_v = it_alv_bookc-zhj_v. "是否向供应商报(和上一层一致)
it_alv_bookc_werks-use_aq = it_alv_bookc-use_aq. "是否用安全储备来满足(和上一层一样)
it_alv_bookc_werks-aq_cb = it_alv_bookc-aq_cb.
MODIFY it_alv_bookc_werks TRANSPORTING ky_cb zhj zhj_v use_aq aq_cb
WHERE zhj_menge > 0.
*请减
it_alv_bookc_werks-qj = it_alv_bookc-qj.
it_alv_bookc_werks-qj_v = it_alv_bookc-qj_v.
MODIFY it_alv_bookc_werks TRANSPORTING qj qj_v
WHERE qj_menge > 0.
ENDFORM. " get_table_2
*---------------------------------------------------------------------*
* CLASS lcl_alv_500 DEFINITION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_alv_500 DEFINITION.
PUBLIC SECTION.
METHODS:
handle_double "执行双击事件
FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING e_row e_column es_row_no ,
handle_toolbar
FOR EVENT toolbar OF cl_gui_alv_grid "TOOLBAR
IMPORTING e_object e_interactive,
handle_user_command "执行toolbar的UCOMM
FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm,
handle_data_changed
FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING er_data_changed.
ENDCLASS. "lcl_event_receiver DEFINITION
*---------------------------------------------------------------------*
* CLASS lcl_alv_500 IMPLEMENTATION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_alv_500 IMPLEMENTATION.
*-----------------------------------------------------------------
METHOD handle_double .
DATA: w_menge TYPE i.
CLEAR w_menge.
CASE e_column-fieldname.
WHEN 'FH_M'.
READ TABLE it_qx INTO it_qx INDEX e_row-index.
w_menge = it_qx-fh_m + it_qx-fp_m.
IF w_menge < it_qx-menge .
PERFORM get_data_ekpo USING p_perid it_qx-bookc.
REFRESH it_alv_ekpo.
CLEAR it_alv_ekpo.
it_alv_ekpo[] = it_ekpo[].
IF it_qx-zpkh = ''.
DELETE it_alv_ekpo WHERE zzbookc <> it_qx-bookc OR
werks <> it_qx-werks OR
kunnr <> ''.
ELSE.
DELETE it_alv_ekpo WHERE zzbookc <> it_qx-bookc OR
werks <> it_qx-werks OR
kunnr <> it_qx-kunnr.
ENDIF.
it_alv_ekpo-zpkh = it_qx-zpkh.
MODIFY it_alv_ekpo FROM it_alv_ekpo TRANSPORTING zpkh WHERE ebeln <> ''.
* 根据单据数量 结单状态 发货数量 计算可减少的数量
LOOP AT it_alv_ekpo INTO it_alv_ekpo .
IF it_alv_ekpo-zclose_order = ''.
it_alv_ekpo-shy_m = it_alv_ekpo-menge - it_alv_ekpo-glmng.
ELSE.
it_alv_ekpo-shy_m = 0.
ENDIF.
MODIFY it_alv_ekpo FROM it_alv_ekpo INDEX sy-tabix.
ENDLOOP.
f_screen = '0500'.
CLEAR r_menge.
PERFORM alv_list_ekpo USING f_screen.
ENDIF.
ENDCASE.
CALL METHOD g_grid_500->check_changed_data.
ENDMETHOD. "HANDLE_double
*-----------------------TOOLBAR------------------------------------*
METHOD handle_toolbar.
*删除需要的ALV按钮
DELETE e_object->mt_toolbar WHERE function = '&MB_SUM'.
DELETE e_object->mt_toolbar WHERE function = '&MB_SUBTOT'.
DELETE e_object->mt_toolbar WHERE function = '&&SEP05'.
DELETE e_object->mt_toolbar WHERE function = '&PRINT_BACK'.
DELETE e_object->mt_toolbar WHERE function = '&MB_VIEW'.
DELETE e_object->mt_toolbar WHERE function = '&COL0'.
DELETE e_object->mt_toolbar WHERE function = '&&SEP06'.
DELETE e_object->mt_toolbar WHERE function = '&GRAPH'.
DELETE e_object->mt_toolbar WHERE function = '&&SEP07'.
DELETE e_object->mt_toolbar WHERE function = '&INFO'.
DELETE e_object->mt_toolbar WHERE function = ''.
DELETE e_object->mt_toolbar WHERE function = '&&SEP00'.
DELETE e_object->mt_toolbar WHERE function = '&CHECK'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&CUT'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL©'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&PASTE'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&APPEND'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&INSERT_ROW'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&DELETE_ROW'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&UNDO'.
* DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_SUM'.
* DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_SUBTOT'.
DELETE e_object->mt_toolbar WHERE function = '&MB_VIEW'.
DELETE e_object->mt_toolbar WHERE function = '&GRAPH'.
DELETE e_object->mt_toolbar WHERE function = '&INFO'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL©_ROW'.
DELETE e_object->mt_toolbar WHERE function = '&REFRESH'.
CLEAR ls_toolbar. "分割线
MOVE '&&SEP07' TO ls_toolbar-function.
MOVE 3 TO ls_toolbar-butn_type.
APPEND ls_toolbar TO e_object->mt_toolbar.
* 确认选择
CLEAR ls_toolbar.
MOVE 'UN_SURE' TO ls_toolbar-function.
MOVE '取消确认'(114) TO ls_toolbar-quickinfo.
MOVE '取消确认' TO ls_toolbar-text.
MOVE ' ' TO ls_toolbar-disabled.
APPEND ls_toolbar TO e_object->mt_toolbar.
CLEAR ls_toolbar. "分割线
MOVE '&&SEP07' TO ls_toolbar-function.
MOVE 3 TO ls_toolbar-butn_type.
APPEND ls_toolbar TO e_object->mt_toolbar.
* 确认选择
CLEAR ls_toolbar.
MOVE 'LIST' TO ls_toolbar-function.
MOVE '察看已经取消的明细'(114) TO ls_toolbar-quickinfo.
MOVE '察看明细' TO ls_toolbar-text.
MOVE ' ' TO ls_toolbar-disabled.
APPEND ls_toolbar TO e_object->mt_toolbar.
ENDMETHOD. "handle_toolbar
*---------------user_command-----------------------------------*
METHOD handle_user_command.
IF g_grid_500 IS INITIAL.
EXIT.
ENDIF.
CALL METHOD g_grid_500->check_changed_data.
PERFORM process_ucomm_500 USING e_ucomm.
ENDMETHOD. "lcl_event_receiver
*-------------------------------------------------------------------
METHOD handle_data_changed.
PERFORM data_changed_500 USING er_data_changed.
ENDMETHOD. "handle_menu_button
ENDCLASS. "lcl_ALV_event_receiver
*---------------------------------------------------------------------*
* CLASS lcl_alv_100 DEFINITION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_alv_600 DEFINITION.
PUBLIC SECTION.
METHODS:
handle_double "执行双击事件
FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING e_row e_column es_row_no ,
handle_toolbar
FOR EVENT toolbar OF cl_gui_alv_grid "TOOLBAR
IMPORTING e_object e_interactive,
handle_user_command "执行toolbar的UCOMM
FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm,
handle_data_changed
FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING er_data_changed.
ENDCLASS. "lcl_event_receiver DEFINITION
*---------------------------------------------------------------------*
* CLASS lcl_alv_500 IMPLEMENTATION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_alv_600 IMPLEMENTATION.
*-----------------------------------------------------------------
METHOD handle_double .
* 直配的请减,需要删除转储单后才能去做确认
DATA: w_menge TYPE i.
CLEAR w_menge.
CASE e_column-fieldname.
WHEN 'FH_M'.
READ TABLE it_qj_zp INTO it_qj_zp INDEX e_row-index.
w_menge = it_qj_zp-qj_fh + it_qj_zp-shy_fh.
IF w_menge < it_qj_zp-qj_menge.
PERFORM get_data_ekpo_zp USING it_qj_zp-bookc it_qj_zp-kunnr.
REFRESH it_alv_ekpo.
CLEAR it_alv_ekpo.
it_alv_ekpo[] = it_ekpo[].
DELETE it_alv_ekpo WHERE zzbookc <> it_qj_zp-bookc OR
kunnr <> it_qj_zp-kunnr.
PERFORM alv_list_ekpo_zp.
CLEAR t_menge.
LOOP AT it_ekpo INTO it_ekpo WHERE loekz <> ''.
t_menge = t_menge + it_ekpo-menge - it_ekpo-wamng.
ENDLOOP.
it_qj_zp-shy_fh = it_qj_zp-shy_fh + t_menge.
DELETE it_ekpo WHERE loekz <> ''.
ENDIF.
ENDCASE.
ENDMETHOD. "handle_double
*--------------------------------------------------------------------
METHOD handle_toolbar.
*删除需要的ALV按钮
DELETE e_object->mt_toolbar WHERE function = '&MB_SUM'.
DELETE e_object->mt_toolbar WHERE function = '&MB_SUBTOT'.
DELETE e_object->mt_toolbar WHERE function = '&&SEP05'.
DELETE e_object->mt_toolbar WHERE function = '&PRINT_BACK'.
DELETE e_object->mt_toolbar WHERE function = '&MB_VIEW'.
DELETE e_object->mt_toolbar WHERE function = '&COL0'.
DELETE e_object->mt_toolbar WHERE function = '&&SEP06'.
DELETE e_object->mt_toolbar WHERE function = '&GRAPH'.
DELETE e_object->mt_toolbar WHERE function = '&&SEP07'.
DELETE e_object->mt_toolbar WHERE function = '&INFO'.
DELETE e_object->mt_toolbar WHERE function = ''.
DELETE e_object->mt_toolbar WHERE function = '&&SEP00'.
DELETE e_object->mt_toolbar WHERE function = '&CHECK'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&CUT'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL©'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&PASTE'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&APPEND'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&INSERT_ROW'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&DELETE_ROW'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&UNDO'.
* DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_SUM'.
* DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_SUBTOT'.
DELETE e_object->mt_toolbar WHERE function = '&MB_VIEW'.
DELETE e_object->mt_toolbar WHERE function = '&GRAPH'.
DELETE e_object->mt_toolbar WHERE function = '&INFO'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL©_ROW'.
DELETE e_object->mt_toolbar WHERE function = '&REFRESH'.
* 拒绝追加
CLEAR ls_toolbar.
MOVE 'JJ' TO ls_toolbar-function.
MOVE '拒绝请减'(114) TO ls_toolbar-quickinfo.
MOVE '拒绝请减' TO ls_toolbar-text.
MOVE ' ' TO ls_toolbar-disabled.
APPEND ls_toolbar TO e_object->mt_toolbar.
CLEAR ls_toolbar.
MOVE 'QJ' TO ls_toolbar-function.
MOVE '确认请减'(114) TO ls_toolbar-quickinfo.
MOVE '确认请减' TO ls_toolbar-text.
MOVE ' ' TO ls_toolbar-disabled.
APPEND ls_toolbar TO e_object->mt_toolbar.
CLEAR ls_toolbar. "分割线
MOVE '&&SEP07' TO ls_toolbar-function.
MOVE 3 TO ls_toolbar-butn_type.
APPEND ls_toolbar TO e_object->mt_toolbar.
* 查看已确认
CLEAR ls_toolbar.
MOVE 'LIST' TO ls_toolbar-function.
MOVE '查看已确认明细'(114) TO ls_toolbar-quickinfo.
MOVE '查看已确认明细' TO ls_toolbar-text.
MOVE ' ' TO ls_toolbar-disabled.
APPEND ls_toolbar TO e_object->mt_toolbar.
CLEAR ls_toolbar. "分割线
MOVE '&&SEP07' TO ls_toolbar-function.
MOVE 3 TO ls_toolbar-butn_type.
APPEND ls_toolbar TO e_object->mt_toolbar.
* 查看被锁的征订代码
CLEAR ls_toolbar.
MOVE 'LOCK' TO ls_toolbar-function.
MOVE '查看被锁的征订代码'(114) TO ls_toolbar-quickinfo.
MOVE '查看被锁的征订代码' TO ls_toolbar-text.
MOVE ' ' TO ls_toolbar-disabled.
APPEND ls_toolbar TO e_object->mt_toolbar.
ENDMETHOD. "handle_toolbar
*--------------------------------------------------------------------
METHOD handle_user_command.
IF g_grid_600 IS INITIAL.
EXIT.
ENDIF.
PERFORM user_command_600 USING e_ucomm.
ENDMETHOD. "handle_user_command
*--------------------------------------------------------------------
METHOD handle_data_changed.
PERFORM data_changed_600 USING er_data_changed.
ENDMETHOD. "handle_data_change
ENDCLASS. "lcl_alv_500 IMPLEMENTATION