[SAP ABAP] OO ALV报表练习1
销售订单明细查询报表
业务目的:根据选择屏幕的筛选条件,使用 ALV 报表,显示销售订单详情
效果展示
用户的输入条件界面

用户的查询结果界面

涉及的主要功能点:
1.当在销售订单明细查询页面取不到任何数据时,在选择画面提示错误消息"不存在满足条件的数据,请确认选择条件"
2.点击ALV报表中的【编辑】按钮,可将'交货工厂'和'交货数量'字段变为可编辑状态,编辑完成并按回车键,即可及时更新ALV报表中的数据
3.ALV报表中的"物料号"设置成"HOTSPOT"热点,单击某物料号跳转到 MM03 的界面显示该物料详情
4.ALV报表中的"交货工厂"字段设置F4搜索帮助
完整代码如下所示
主程序(zsd002_437)
*&---------------------------------------------------------------------*
*& Report ZSD001_437
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zsd002_437.INCLUDE zsd002_437_c01.INCLUDE zsd002_437_top. " 数据定义INCLUDE zsd002_437_f01. " 子例程INCLUDE zsd002_437_o01.INCLUDE zsd002_437_i01.*----------------------------------------------------------------------*
* DESC: INITIALIZATION 事件
*----------------------------------------------------------------------*
INITIALIZATION.*----------------------------------------------------------------------*
* DESC: AT SELECTION-SCREEN OUTPUT 事件
*----------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.*----------------------------------------------------------------------*
* DESC: AT SELECTION-SCREEN 事件
*----------------------------------------------------------------------*
AT SELECTION-SCREEN.*----------------------------------------------------------------------*
* DESC: START-OF-SELECTION 事件
*----------------------------------------------------------------------*
START-OF-SELECTION.PERFORM frm_get_data. " 获取数据" 检查数据是否为空IF gt_item IS INITIAL.MESSAGE '不存在满足条件的数据,请确认选择条件' TYPE 'E'.ENDIF.*---------------------------------------------------------------------*
* END-OF-SELECTION 事件
*---------------------------------------------------------------------*
END-OF-SELECTION.PERFORM frm_display_data. " ALV呈现数据
INCLUDE程序( zsd002_437_c01)

*&---------------------------------------------------------------------*
*& 包含 ZSD002_437_C01
*&---------------------------------------------------------------------**----------------------------------------------------------------------*
* CLASS book DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_handler DEFINITION FINAL.PUBLIC SECTION.METHODS:handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid " 增设自定义按钮IMPORTING e_object e_interactive,after_user_command FOR EVENT after_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_changede_onf4e_onf4_beforee_onf4_aftere_ucomm," 数据变更完成handle_data_changed_finished FOR EVENT data_changed_finished OF cl_gui_alv_gridIMPORTING e_modified et_good_cells," 单击handle_hotspot_click FOR EVENT hotspot_click OF cl_gui_alv_gridIMPORTING e_row_id e_column_id," 双击double_click FOR EVENT double_click OF cl_gui_alv_gridIMPORTING e_row e_column es_row_no," F4搜索帮助handle_f4_help FOR EVENT onf4 OF cl_gui_alv_gridIMPORTING e_fieldnamee_fieldvaluees_row_noer_event_dataet_bad_cellse_display.ENDCLASS.*----------------------------------------------------------------------*
* CLASS book IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_handler IMPLEMENTATION.METHOD handle_toolbar. " 增设自定义按钮PERFORM frm_event_toolbar USING e_object.ENDMETHOD.METHOD after_user_command. " 按钮响应PERFORM frm_user_command USING e_ucomm.ENDMETHOD.METHOD handle_data_changed. " 数据变更PERFORM frm_data_changed USING er_data_changede_onf4e_onf4_beforee_onf4_after e_ucomm.ENDMETHOD.METHOD handle_data_changed_finished. " 数据变更完成PERFORM frm_changed_finished USING e_modified et_good_cells.ENDMETHOD.METHOD handle_hotspot_click. " 单击PERFORM frm_hotspot_click USING e_row_id e_column_id.ENDMETHOD.METHOD double_click. " 双击PERFORM frm_double_click USING e_row e_column es_row_no.ENDMETHOD.METHOD handle_f4_help. " F4搜索帮助PERFORM frm_on_f4 USING e_fieldnamee_fieldvaluees_row_noer_event_dataet_bad_cellse_display.ENDMETHOD.ENDCLASS.
INCLUDE程序( zsd002_437_top)
*&---------------------------------------------------------------------*
*& 包含 ZSD001_437_TOP
*&---------------------------------------------------------------------*DATA: ok_code TYPE sy-ucomm.DATA: go_grid TYPE REF TO cl_gui_alv_grid, " ALV对象go_custom_container TYPE REF TO cl_gui_custom_container, " Container容器go_event TYPE REF TO lcl_handler,gv_valid_error TYPE boole_d,gt_f4 TYPE lvc_t_f4.CONSTANTS: go_container TYPE scrfname VALUE 'GO_CONT'. " 容器* ALV参数定义
DATA: gs_layout TYPE lvc_s_layo, " 用于定义ALV表单的相关格式、属性gs_fcat TYPE lvc_s_fcat, " 字段目录工作区gt_fcat TYPE STANDARD TABLE OF lvc_s_fcat. " 字段目录内表TABLES: vbak, vbap.* 定义数据类型
TYPES: BEGIN OF ty_item,sel(1), " 选择标志vtext1 TYPE tvkot-vtext, " 销售组织名称vtext2 TYPE tvtwt-vtext, " 分销渠道名称bztxt TYPE t171t-bztxt, " 销售区域名称ktext TYPE t151t-ktext, " 客户组vtext3 TYPE tvktt-vtext, " 账户分配组auart TYPE vbak-auart, " 订单类型bezei TYPE tvakt-bezei, " 订单类型描述vbeln TYPE vbak-vbeln, " 销售订单号kunnr TYPE kna1-kunnr, " 客户编号name1 TYPE kna1-name1, " 客户名称audat TYPE vbak-audat, " 订单创建日期posnr TYPE vbap-posnr, " 行项目号matnr TYPE mara-matnr, " 物料编码maktx TYPE makt-maktx, " 物料名称kwmeng TYPE vbap-kwmeng, " 订单数量vrkme TYPE vbap-vrkme, " 订单单位werks TYPE vbap-werks, " 交货工厂fevor TYPE marc-fevor, " 生产管理员txt TYPE t024f-txt, " 生产主管姓名mbdat TYPE vbbe-mbdat, " 订单预交日期vbeln_fh TYPE c LENGTH 100, " 发货单单号erdat TYPE likp-erdat, " 发货单创建日期lfimg TYPE lips-lfimg, " 申请发货数labst TYPE mard-labst, " 现有库存vgbel TYPE vbap-vgbel, " 合同号labor TYPE mara-labor, " 产品状态delqty TYPE vbfa-rfmng, " 发货数量style TYPE lvc_t_styl, " 单元格属性:是否可编辑linecolor(4) TYPE c, " 指定行颜色的字段cellcolor TYPE lvc_t_scol, " 单元格颜色
END OF ty_item.DATA: gt_item TYPE STANDARD TABLE OF ty_item, " 内表gs_item TYPE ty_item. " 结构体变量* 选择屏幕(屏幕输入)
SELECT-OPTIONS:s_vkorg FOR vbak-vkorg OBLIGATORY, " 销售组织(必输)s_vtweg FOR vbak-vtweg, " 分销渠道s_auart FOR vbak-auart, " 销售订单类型s_vbeln FOR vbak-vbeln, " 销售订单编号s_matnr FOR vbap-matnr. " 物料编码
INCLUDE程序( zsd002_437_f01)
*&---------------------------------------------------------------------*
*& 包含 ZSD001_437_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form frm_get_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_get_data.SELECT tvkot~vtext AS vtext1, " 销售组织名称tvtwt~vtext AS vtext2, " 分销渠道名称t171t~bztxt, " 销售区域名称t151t~ktext, " 客户组tvktt~vtext AS vtext3, " 账户分配组vbak~auart, " 订单类型tvakt~bezei, " 订单描述类型vbak~vbeln, " 销售订单号vbak~kunnr, " 客户编号kna1~name1, " 客户名称vbak~audat, " 订单创建日期vbap~posnr, " 行项目号vbap~matnr, " 物料编码makt~maktx, " 物料名称vbap~kwmeng, " 订单数量vbap~vrkme, " 订单单位vbap~werks, " 交货工厂marc~fevor, " 生产管理员t024f~txt, " 生产主管姓名vbap~vgbel, " 合同号mara~labor " 产品状态FROM vbakINNER JOIN vbapON vbak~vbeln = vbap~vbelnLEFT JOIN tvkotON vbak~vkorg = tvkot~vkorgAND tvkot~spras = @sy-languLEFT JOIN tvtwtON vbak~vtweg = tvtwt~vtwegAND tvtwt~spras = @sy-languLEFT JOIN vbkdON vbap~vbeln = vbkd~vbelnAND vbap~posnr = vbkd~posnrLEFT JOIN t171tON vbkd~bzirk = t171t~bzirkAND t171t~spras = @sy-languLEFT JOIN t151tON vbkd~kdgrp = t151t~kdgrpAND t151t~spras = @sy-languLEFT JOIN tvkttON vbkd~ktgrd = tvktt~ktgrdAND tvktt~spras = @sy-languLEFT JOIN tvaktON vbak~auart = tvakt~auartAND tvakt~spras = @sy-languLEFT JOIN kna1ON vbak~kunnr = kna1~kunnrLEFT JOIN maktON vbap~matnr = makt~matnrAND makt~spras = @sy-languLEFT JOIN marcON vbap~werks = marc~werksAND vbap~matnr = marc~matnrLEFT JOIN t024fON marc~fevor = t024f~fevorAND marc~werks = t024f~werksLEFT JOIN maraON vbap~matnr = mara~matnrINTO CORRESPONDING FIELDS OF TABLE @gt_itemWHERE vbak~vkorg IN @s_vkorgAND vbak~vtweg IN @s_vtwegAND vbak~auart IN @s_auartAND vbak~vbeln IN @s_vbelnAND vbap~matnr IN @s_matnr.IF sy-subrc = 0.PERFORM frm_edit_data. " 编辑处理内表数据ENDIF.ENDFORM.*&---------------------------------------------------------------------*
*& Form frm_edit_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_edit_data.IF gt_item IS NOT INITIAL. " 当gt_item内表不为空时,进行以下逻辑处理* 订单预交日期字段查询处理SELECT vbbe~vbeln, " 销售凭证vbbe~posnr, " 销售凭证项目vbbe~mbdat " 订单预交日期FROM vbbeINTO TABLE @DATA(lt_vbbe)FOR ALL ENTRIES IN @gt_itemWHERE vbeln = @gt_item-vbelnAND posnr = @gt_item-posnr.IF sy-subrc = 0.SORT lt_vbbe BY vbeln posnr mbdat. " 对内表lt_vbbe中的字段vbeln,posnr和mbdat进行升序排序ENDIF.* 发货单单号、发货单创建日期和申请发货数字段查询处理SELECT lips~vgbel, " 参考单据的单据编号lips~vgpos, " 参考项目的项目号lips~vbeln, " 发货单单号lips~posnr, " 交货项目lips~lfimg, " 实际已交货量likp~erdat " 记录建立日期FROM lipsINNER JOIN likpON lips~vbeln = likp~vbelnINTO TABLE @DATA(lt_lips)FOR ALL ENTRIES IN @gt_itemWHERE vgbel = @gt_item-vbelnAND vgpos = @gt_item-posnr.IF sy-subrc = 0.SORT lt_lips BY vbeln posnr erdat DESCENDING.DATA(lt_max_erdat) = lt_lips. " 赋值SORT lt_max_erdat BY vgbel vgpos erdat DESCENDING.ENDIF.* 现有库存字段查询处理SELECT mard~werks, " 工厂mard~matnr, " 物料编号mard~labst " 非限制使用的估价的库存FROM mardINTO TABLE @DATA(lt_mard)FOR ALL ENTRIES IN @gt_itemWHERE matnr = @gt_item-matnrAND werks = @gt_item-werks.ENDIF.LOOP AT gt_item ASSIGNING FIELD-SYMBOL(<lfs_item>). " 一条一条处理" 订单预交日期字段逻辑处理" 取最小的订单预交日期SELECT MIN( mbdat )FROM vbbeINTO <lfs_item>-mbdatWHERE vbeln = <lfs_item>-vbelnAND posnr = <lfs_item>-posnr.LOOP AT lt_lips INTO DATA(ls_lips)WHERE vgbel = <lfs_item>-vbeln AND vgpos = <lfs_item>-posnr ." 发货单单号字段逻辑处理IF ls_lips-vbeln IS NOT INITIAL.ls_lips-vbeln = |{ ls_lips-vbeln ALPHA = OUT }|. " 去除vbeln字段中的前导零<lfs_item>-vbeln_fh = <lfs_item>-vbeln_fh && ',' && ls_lips-vbeln. " 如果出现多个交货单,则将交货单拼接显示 DN1,DN2,DN3ENDIF." 申请发货数字段逻辑处理<lfs_item>-lfimg = <lfs_item>-lfimg + ls_lips-lfimg. " 根据订单号进行行项目累加ENDLOOP.SHIFT <lfs_item>-vbeln_fh LEFT DELETING LEADING ','. " 删除首端的逗号" 发货单创建日期字段逻辑处理READ TABLE lt_max_erdat WITH KEY vgbel = <lfs_item>-vbeln vgpos = <lfs_item>-posnrINTO DATA(ls_max_erdat).IF sy-subrc = 0.<lfs_item>-erdat = ls_max_erdat-erdat. " 取最大日期ENDIF." 现有库存字段逻辑处理LOOP AT lt_mard INTO DATA(ls_mard)WHERE werks = <lfs_item>-werks AND matnr = <lfs_item>-matnr.<lfs_item>-labst = <lfs_item>-labst + ls_mard-labst. " 累加所有库位的数量ENDLOOP." '现有库存'字段值大于0,单元格显示绿色,否则行颜色显示为蓝色IF <lfs_item>-labst > 0." 设置单元格颜色方式1DATA:ls_cellcolor TYPE lvc_s_scol.ls_cellcolor-fname = 'LABST'.ls_cellcolor-color-col = '5'.ls_cellcolor-color-int = '1'.ls_cellcolor-color-inv = '0'.APPEND ls_cellcolor TO <lfs_item>-cellcolor." 设置单元格颜色方式2" APPEND VALUE #( fname = 'LABST' color-col = '5' color-int = '1' color-inv = '0') TO <lfs_item>-cellcolor.ELSE.<lfs_item>-linecolor = 'C110'. " 设置行颜色ENDIF.ENDLOOP.
ENDFORM.*&---------------------------------------------------------------------*
*& Form frm_display_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_display_data.CALL SCREEN 9001.
ENDFORM.*&---------------------------------------------------------------------*
*& Form frm_alv_set_fields
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_alv_set_fields .DATA: lv_index LIKE sy-index.CLEAR: gs_fcat,gt_fcat,gs_layout.* 设置行的属性(ALV界面格式)gs_layout-box_fname = 'SEL'. " 选择标识gs_layout-zebra = 'X'. " 斑马条纹显示gs_layout-cwidth_opt = 'X'. " 优化列宽设置gs_layout-sel_mode = 'A'.gs_layout-ctab_fname = 'CELLCOLOR'." 单元格颜色gs_layout-stylefname = 'STYLE'. " 单元格编辑gs_layout-info_fname = 'LINECOLOR'." 行颜色* ALV字段处理宏DEFINE catalog.lv_index = lv_index + 1.gs_fcat-col_pos = lv_index.gs_fcat-fieldname = &1. " 设置要输出的表格列的值,在内表中定义的字段名(必须大写)gs_fcat-fix_column = &2. " 固定列gs_fcat-ref_table = &3.gs_fcat-edit = &4.gs_fcat-colddictxt = 'L'.gs_fcat-scrtext_l = &5. " 设置要输出的表格列的列名,即ALV报表显示的列名gs_fcat-ref_field = &6.gs_fcat-outputlen = &7.gs_fcat-emphasize = &8. " 列颜色gs_fcat-hotspot = &9. " 热点IF gs_fcat-fieldname = 'WERKS'.gs_fcat-f4availabl = 'X'. " F4检索帮助设置ENDIF.APPEND gs_fcat TO gt_fcat.END-OF-DEFINITION.* &1 &2 &3 &4 &5 &6 &7 &8 &9catalog:'VTEXT1' 'X' '' '' '销售组织名称' '' '' 'C110' '', " 销售组织名称'VTEXT2' 'X' '' '' '分销渠道名称' '' '' '' '', " 分销渠道名称'BZTXT' '' '' '' '销售区域名称' '' '' '' '', " 销售区域名称'KTEXT' '' '' '' '客户组' '' '' '' '', " 客户组'VTEXT3' '' '' '' '账户分配组' '' '' '' '', " 账户分配组'AUART' '' '' '' '订单类型' '' '' '' '', " 订单类型'BEZEI' '' '' '' '订单类型描述' '' '' '' '', " 订单类型描述'VBELN' '' '' '' '销售订单号' '' '' '' '', " 销售订单号'KUNNR' '' '' '' '客户编号' '' '' '' '', " 客户编号'NAME1' '' '' '' '客户名称' '' '' '' '', " 客户名称'AUDAT' '' '' '' '订单创建日期' '' '' '' '', " 订单创建日期'POSNR' '' '' '' '行项目号' '' '' '' '', " 行项目号'MATNR' '' 'MARA' '' '物料编码' 'MATNR' '' '' 'X', " 物料编码'MAKTX' '' '' '' '物料名称' '' '' '' '', " 物料名称'KWMENG' '' '' '' '订单数量' '' '' '' '', " 订单数量'VRKME' '' '' '' '订单单位' '' '' '' '', " 订单单位'WERKS' '' '' '' '交货工厂' '' '' '' '', " 交货工厂'FEVOR' '' '' '' '生产管理员' '' '' '' '', " 生产管理员'TXT' '' '' '' '生产主管姓名' '' '' '' '', " 生产主管姓名'MBDAT' '' '' '' '订单预交日期' '' '' '' '', " 订单预交日期'VBELN_FH' '' '' '' '发货单单号' '' '' '' '', " 发货单单号'ERDAT' '' '' '' '发货单创建日期' '' '' '' '', " 发货单创建日期'LFIMG' '' '' '' '申请发货数' '' '' '' '', " 申请发货数'LABST' '' '' '' '现有库存' '' '' '' '', " 现有库存'VGBEL' '' '' '' '合同号' '' '' '' '', " 合同号'LABOR' '' '' '' '产品状态' '' '' '' '', " 产品状态'DELQTY' '' '' '' '交货数量' '' '' '' ''. " 交货数量
ENDFORM.*&---------------------------------------------------------------------*
*& Form frm_alv_init
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_alv_init.DATA: ls_stable TYPE lvc_s_stbl.DATA: ls_variant TYPE disvariant.DATA: lt_toolbar_excluding TYPE ui_functions.IF go_grid IS INITIAL." 实例化容器CREATE OBJECT go_custom_containerEXPORTINGcontainer_name = go_container " 9001屏幕界面中用户定义的容器名称EXCEPTIONScntl_error = 1cntl_system_error = 2create_error = 3lifetime_error = 4lifetime_dynpro_dynpro_link = 5OTHERS = 6.IF sy-subrc <> 0.MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgnoWITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.ENDIF." 实例化ALV GridCREATE OBJECT go_gridEXPORTINGi_parent = go_custom_container " 实例化的容器对象EXCEPTIONSerror_cntl_create = 1error_cntl_init = 2error_cntl_link = 3error_dp_create = 4OTHERS = 5.IF sy-subrc <> 0.MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgnoWITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.ENDIF.PERFORM frm_alv_set_fields. " 设置Fieldcat以及Layout等属性(ALV格式化)" 创建实例对象CREATE OBJECT go_event." 指定字段注册F4搜索帮助gt_f4 = VALUE #( ( fieldname = 'WERKS' register = abap_true getbefore = abap_true ) ).CALL METHOD go_grid->register_f4_for_fieldsEXPORTINGit_f4 = gt_f4." 注册事件SET HANDLER go_event->handle_toolbar FOR go_grid. " 增设自定义按钮SET HANDLER go_event->after_user_command FOR go_grid. " 按钮响应SET HANDLER go_event->handle_data_changed FOR go_grid. " 数据变更SET HANDLER go_event->handle_data_changed_finished FOR go_grid. " 数据变更完成SET HANDLER go_event->handle_hotspot_click FOR go_grid. " 单击SET HANDLER go_event->double_click FOR go_grid. " 双击SET HANDLER go_event->handle_f4_help FOR go_grid. " F4搜索帮助go_grid->set_ready_for_input( ). " 将ALV设置为可输入状态" 为ALV报表注册编辑事件CALL METHOD go_grid->register_edit_eventEXPORTINGi_event_id = cl_gui_alv_grid=>mc_evt_enter " Event Enter(回车)EXCEPTIONSerror = 1OTHERS = 2.IF sy-subrc <> 0.MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgnoWITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 .ENDIF.ls_variant-report = sy-repid. " 程序名称ls_variant-handle = 1." 指定隐藏工具栏按钮APPEND cl_gui_alv_grid=>mc_fg_sort TO lt_toolbar_excluding. " 排序按钮" 执行ALV显示CALL METHOD go_grid->set_table_for_first_displayEXPORTINGi_bypassing_buffer = 'X'is_variant = ls_variant " 布局按钮设置i_save = 'A'is_layout = gs_layoutit_toolbar_excluding = lt_toolbar_excluding " 隐藏按钮CHANGINGit_outtab = gt_itemit_fieldcatalog = gt_fcatEXCEPTIONSinvalid_parameter_combination = 1program_error = 2too_many_lines = 3OTHERS = 4.ELSE.ls_stable-row = 'X'.ls_stable-col = 'X'." 刷新ALV内容CALL METHOD go_grid->refresh_table_displayEXPORTINGis_stable = ls_stableEXCEPTIONSfinished = 1OTHERS = 2.ENDIF.
ENDFORM.*&---------------------------------------------------------------------*
*& Form frm_event_toolbar
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> E_OBJECT
*&---------------------------------------------------------------------*
FORM frm_event_toolbar USING iv_object TYPE REF TO cl_alv_event_toolbar_set.DATA: lv_quickinfo TYPE stb_button-quickinfo, " Toolbar quickinfolv_icon TYPE stb_button-icon. " Toolbar iconPERFORM frm_set_toolbar USING 'ZBT01' lv_icon '' lv_quickinfo '编辑' '' 0 iv_object.ENDFORM.*&---------------------------------------------------------------------*
*& Form frm_set_toolbar
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> P_
*& --> LV_ICON
*& --> P_
*& --> LV_QUICKINFO
*& --> TEXT_B01
*& --> P_
*& --> P_0
*& --> IV_OBJECT
*&---------------------------------------------------------------------*
FORM frm_set_toolbar USING iv_function TYPE stb_button-function " 功能代码iv_icon TYPE stb_button-icon " 图标名称iv_disabled TYPE stb_button-disabled " 按钮是否禁用iv_quickinfo TYPE stb_button-quickinfo " 图标的快捷信息iv_text TYPE stb_button-text " 文本iv_type TYPE stb_button-butn_type " 工具栏按钮类型iv_pos TYPE i " 按钮插入的位置iv_object TYPE REF TO cl_alv_event_toolbar_set.DATA: ls_toolbar TYPE stb_button. " 存储按钮的相关信息(结构体)CLEAR ls_toolbar.MOVE iv_function TO ls_toolbar-function.MOVE iv_icon TO ls_toolbar-icon.MOVE iv_disabled TO ls_toolbar-disabled.MOVE iv_quickinfo TO ls_toolbar-quickinfo.MOVE iv_type TO ls_toolbar-butn_type.MOVE iv_text TO ls_toolbar-text.IF iv_pos EQ 0.APPEND ls_toolbar TO iv_object->mt_toolbar.ELSE.INSERT ls_toolbar INTO iv_object->mt_toolbar INDEX iv_pos.ENDIF.ENDFORM.*&---------------------------------------------------------------------*
*& Form frm_user_command
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> E_UCOMM
*&---------------------------------------------------------------------*
FORM frm_user_command USING pv_ucomm TYPE sy-ucomm.DATA: ls_stylerow TYPE lvc_s_styl.CASE pv_ucomm.WHEN 'ZBT01'.LOOP AT gt_item ASSIGNING FIELD-SYMBOL(<lfs_item>)." 对字段'WERKS'和'DELQTY'设置可编辑功能IF <lfs_item>-style IS NOT INITIAL.REFRESH:<lfs_item>-style.ELSE.ls_stylerow-fieldname = 'WERKS'.ls_stylerow-style = cl_gui_alv_grid=>mc_style_enabled.INSERT ls_stylerow INTO TABLE <lfs_item>-style.ls_stylerow-fieldname = 'DELQTY'.ls_stylerow-style = cl_gui_alv_grid=>mc_style_enabled.INSERT ls_stylerow INTO TABLE <lfs_item>-style.ENDIF.ENDLOOP." ALV刷新PERFORM frm_alv_grid_refresh USING go_grid.WHEN OTHERS.ENDCASE.
ENDFORM.*&---------------------------------------------------------------------*
*& Form frm_alv_grid_refresh
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> GO_GRID
*&---------------------------------------------------------------------*
FORM frm_alv_grid_refresh USING io_grid TYPE REF TO cl_gui_alv_grid .DATA: ls_stable TYPE lvc_s_stbl.ls_stable-row = abap_true.ls_stable-col = abap_true.CALL METHOD io_grid->refresh_table_displayEXPORTINGis_stable = ls_stablei_soft_refresh = abap_trueEXCEPTIONSfinished = 1OTHERS = 2.IF sy-subrc NE 0.PERFORM frm_disp_sys_msg.ENDIF.CALL METHOD cl_gui_cfw=>flushEXCEPTIONScntl_system_error = 1cntl_error = 2.IF sy-subrc NE 0.PERFORM frm_disp_sys_msg.ENDIF.ENDFORM.*&---------------------------------------------------------------------*
*& Form frm_disp_sys_msg
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_disp_sys_msg .MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgnoWITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 DISPLAY LIKE 'E'.
ENDFORM.*&---------------------------------------------------------------------*
*& Form frm_data_changed
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> ER_DATA_CHANGED
*& --> E_ONF4
*& --> E_ONF4_BEFORE
*& --> E_ONF4_AFTER
*& --> E_UCOMM
*&---------------------------------------------------------------------*
FORM frm_data_changed USING pr_data_changed TYPE REF TO cl_alv_changed_data_protocoliv_onf4 TYPE char01iv_onf4_before TYPE char01iv_onf4_after TYPE char01iv_ucomm TYPE sy-ucomm.DATA: lv_fieldname TYPE lvc_fname. " 字段名FIELD-SYMBOLS:<lv_modi_value> TYPE lvc_s_modi-value,<lv_field_value> TYPE any.LOOP AT pr_data_changed->mt_mod_cells INTO DATA(ls_mod_data).READ TABLE gt_item ASSIGNING FIELD-SYMBOL(<lfs_output_item>) INDEX ls_mod_data-row_id.IF sy-subrc = 0.lv_fieldname = ls_mod_data-fieldname.ASSIGN ls_mod_data-value TO <lv_modi_value>.CASE lv_fieldname.WHEN 'DELQTY'." 检查'DELQTY'字段修改后的值是否只包含数字、小数点和空格IF <lv_modi_value> CO '0123456789. '.ASSIGN COMPONENT ls_mod_data-fieldname OF STRUCTURE <lfs_output_item> TO <lv_field_value>.IF sy-subrc = 0 .<lv_field_value> = <lv_modi_value>.ENDIF.ELSE." 报错误信息PERFORM frm_add_protocol_entry USING 'DELQTY' ls_mod_data-row_id pr_data_changed 'E' '000' '' '' '' ''.ENDIF.WHEN OTHERS.ENDCASE.ENDIF.ENDLOOP.ENDFORM.*&---------------------------------------------------------------------*
*& Form frm_add_protocol_entry
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> P_
*& --> LS_MOD_DATA_ROW_ID
*& --> PR_DATA_CHANGED
*& --> P_
*& --> P_
*& --> P_
*& --> P_
*& --> P_
*& --> P_
*&---------------------------------------------------------------------*
FORM frm_add_protocol_entry USING iv_filedname TYPE lvc_fnameiv_rowid TYPE iio_data_changed TYPE REF TO cl_alv_changed_data_protocoliv_msgty TYPE syst_msgtyiv_msgno TYPE syst_msgnoiv_msgv1 TYPE syst_msgviv_msgv2 TYPE syst_msgviv_msgv3 TYPE syst_msgviv_msgv4 TYPE syst_msgv.CALL METHOD io_data_changed->add_protocol_entryEXPORTINGi_msgid = 'Z_MSG2025' " 消息文本所在的消息类i_msgty = iv_msgty " 消息类型i_msgno = iv_msgno " 消息号i_msgv1 = iv_msgv1i_msgv2 = iv_msgv2i_msgv3 = iv_msgv3i_msgv4 = iv_msgv4i_row_id = iv_rowidi_fieldname = iv_filedname.gv_valid_error = abap_true. " 存在有效的错误
ENDFORM.*&---------------------------------------------------------------------*
*& Form frm_changed_finished
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> E_MODIFIED
*& --> ET_GOOD_CELLS
*&---------------------------------------------------------------------*
FORM frm_changed_finished USING pv_modified TYPE char01pt_good_cells TYPE lvc_t_modi." 在满足特定条件刷新ALVIF pv_modified = abap_true AND pt_good_cells IS NOT INITIAL.PERFORM frm_alv_grid_refresh USING go_grid. " 刷新ALVENDIF.ENDFORM.*&---------------------------------------------------------------------*
*& Form frm_hotspot_click
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> E_ROW_ID
*& --> E_COLUMN_ID
*&---------------------------------------------------------------------*
FORM frm_hotspot_click USING ps_row_id TYPE lvc_s_rowps_column_id TYPE lvc_s_col.READ TABLE gt_item INTO DATA(ls_item) INDEX ps_row_id-index.IF sy-subrc = 0.SET PARAMETER ID 'MAT' FIELD ls_item-matnr.CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN.ENDIF.ENDFORM.*&---------------------------------------------------------------------*
*& Form frm_double_click
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> E_ROW
*& --> E_COLUMN
*& --> ES_ROW_NO
*&---------------------------------------------------------------------*
FORM frm_double_click USING ps_row_id TYPE lvc_s_rowps_column TYPE lvc_s_colps_row_no TYPE lvc_s_roid.READ TABLE gt_item INTO gs_item INDEX ps_row_id-index." 事件触发时显示当前行的销售订单号MESSAGE gs_item-vbeln TYPE 'I'.ENDFORM.*&---------------------------------------------------------------------*
*& Form frm_on_f4
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> E_FIELDNAME
*& --> E_FIELDVALUE
*& --> ES_ROW_NO
*& --> ER_EVENT_DATA
*& --> ET_BAD_CELLS
*& --> E_DISPLAY
*&---------------------------------------------------------------------*
FORM frm_on_f4 USING iv_fieldname TYPE lvc_fnameiv_fieldvalue TYPE lvc_valueis_row_no TYPE lvc_s_roidio_event_data TYPE REF TO cl_alv_event_datait_bad_cells TYPE lvc_t_modiiv_display TYPE char01.DATA: ls_modi TYPE lvc_s_modi,lt_ret_tab TYPE STANDARD TABLE OF ddshretval, " 内表,存储用户在F4搜索帮助窗口中选择的结果lv_dynprofield TYPE help_info-dynprofld.FIELD-SYMBOLS: <itab> TYPE lvc_t_modi." 从字段目录gt_fcat内表中读取与触发F4帮助的字段名对应的字段目录项,存储在ls_fieldcat结构体中READ TABLE gt_fcat INTO DATA(ls_fieldcat)WITH KEY fieldname = iv_fieldname.CHECK sy-subrc = 0. " 检查上述读取操作是否成功,如果失败则终止当前处理CASE iv_fieldname.WHEN 'WERKS'." 查询数据SELECT werks,name1FROM t001wINTO TABLE @DATA(lt_t001w).IF sy-subrc = 0.SORT lt_t001w BY werks. " 排序ENDIF.CLEAR:lv_dynprofield.lv_dynprofield = iv_fieldname." 调用函数显示F4搜索帮助窗口CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'EXPORTINGretfield = 'WERKS'value_org = 'S'window_title = ls_fieldcat-reptext " 标题dynprofield = lv_dynprofield " Screen Field nameTABLESvalue_tab = lt_t001wreturn_tab = lt_ret_tabEXCEPTIONSparameter_error = 1no_values_found = 2OTHERS = 3.WHEN OTHERS.ENDCASE." 更新ALV数据ASSIGN io_event_data->m_data->* TO <itab>.READ TABLE lt_ret_tab INTO DATA(ls_ret_tab) INDEX 1.IF sy-subrc = 0.ls_modi-row_id = is_row_no-row_id. " 行号ls_modi-fieldname = iv_fieldname. " 字段名ls_modi-value = ls_ret_tab-fieldval. " 选择的值APPEND ls_modi TO <itab>.ENDIF." 触发修改事件CALL METHOD cl_gui_cfw=>flush.io_event_data->m_event_handled = 'X'.ENDFORM.
INCLUDE程序( zsd002_437_o01)

*----------------------------------------------------------------------*
***INCLUDE ZSD002_437_O01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module STATUS_9001 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_9001 OUTPUT.SET PF-STATUS '9001_STATUS'.SET TITLEBAR '9001_TITLE'.
ENDMODULE.*&---------------------------------------------------------------------*
*& Module ALV_INIT OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE alv_init OUTPUT.PERFORM frm_alv_init.
ENDMODULE.
INCLUDE程序( zsd002_437_i01)

*----------------------------------------------------------------------*
***INCLUDE ZSD002_437_I01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_9001 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_9001 INPUT.CASE ok_code.WHEN '&BACK' OR '&EXIT' OR '&CANCEL'.SET SCREEN 0. " 返回上一个屏幕ENDCASE.
ENDMODULE.
上述代码涉及的消息类、文本元素以及其他内容如下所示
9001屏幕的元素清单,逻辑流以及布局如下所示
本文涉及到的具体相关操作可参考以下文章
[SAP ABAP] OOALV 报表练习1(操作讲解)
https://blog.csdn.net/Hudas/article/details/145536473?spm=1001.2014.3001.5502
相关文章:
[SAP ABAP] OO ALV报表练习1
销售订单明细查询报表 业务目的:根据选择屏幕的筛选条件,使用 ALV 报表,显示销售订单详情 效果展示 用户的输入条件界面 用户的查询结果界面 涉及的主要功能点: 1.当在销售订单明细查询页面取不到任何数据时,在选择…...
安卓基础(第一集)
SharedPreferences(本地存储简单数据) 在 Android 中,SharedPreferences 用于存储小型数据。 (1)存储数据 // 获取 SharedPreferences 对象 SharedPreferences sharedPreferences getSharedPreferences("MyPre…...
数据库高安全—数据保护:数据动态脱敏
书接上文数据库高安全—审计追踪:传统审计&统一审计,从传统审计和统一审计两方面对高斯数据库的审计追踪技术进行解读,本篇将从数据动态脱敏方面对高斯数据库的数据保护技术进行解读。 5.1 数据动态脱敏 数据脱敏,顾名思义就…...
Datawhale 数学建模导论二 2025年2月
第6章 数据处理与拟合模型 本章主要涉及到的知识点有: 数据与大数据Python数据预处理常见的统计分析模型随机过程与随机模拟数据可视化 本章内容涉及到基础的概率论与数理统计理论,如果对这部分内容不熟悉,可以参考相关概率论与数理统计的…...
ArcGIS Enterprise 与 ArcGIS Online 的关系
ArcGIS Enterprise 和 ArcGIS Online 是 Esri 提供的两款核心产品,它们在功能、部署方式和使用场景上存在显著差异,但同时也有一定的联系和互补性。以下是关于这两款产品的详细关系说明: 1. 产品定位与功能 ArcGIS Enterprise 是一款企业级解决方案,支持在组织的基础设施上…...
ASP.NET Core SignalR实践指南
Hub类的生命周期是瞬态的,每次调用集线器的时候都会创建一个新的Hub类实例,因此不要在Hub类中通过属性、成员变量等方式保存状态。如果服务器的压力比较大,建议把ASP.NET Core程序和SignalR服务器端部署到不同服务器上,以免它们互…...
【力扣 - 简单题】88. 合并两个有序数组
题目:88. 合并两个有序数组 - 力扣(LeetCode) 解题: class Solution { public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {for (int i m; i < n m; i ){nums1[i] nums2[i -…...
【密评】 | 商用密码应用安全性评估从业人员考核题库(23)
在GM/T0048《智能密码钥匙密码检测规范》中,产品的对称算法性能应满足哪个标准中的要求()。 A.GM/T 0016《智能密码钥匙密码应用接口规范》 B.GM/T 0017《智能密码钥匙密码应用接口数据格式规范》 C.GM/T 0027《智能密码钥匙技术规范》 D.GM/T 0028《密码模块安全技术要求》…...
记录 | WPF基础学习MVVM例子讲解1
目录 前言一、NotificationObject与数据属性创建个类,声明NotificationObject 二、DelegateCommand与命令属性三、View与ViewModel的交互(难点)在ViewModel文件下创建MainWindowViewModel数据和方法绑定资源指定 代码下载四、优势体现代码下载…...
PyTorch 中 `torch.cuda.amp` 相关警告的解决方法
在最近的写代码过程中,遇到了两个与 PyTorch 的混合精度训练相关的警告信息。这里随手记录一下。 警告内容 警告 1: torch.cuda.amp.autocast FutureWarning: torch.cuda.amp.autocast(args...) is deprecated. Please use torch.amp.autocast(cuda, args...) i…...
实验7 路由器之间IPsec VPN配置
实验7 路由器之间IPsec VPN配置 1.实验目的 通过在两台路由器之间配置IPsec VPN连接,掌握IPsec VPN配置方法,加深对IPsec协议的理解。 2.实验内容 (1)按照实验拓扑搭建实验环境。 (2)在路由器R1和R4配置IP…...
Unity中快速制作2D沙雕动画:流程编
Unity中快速制作2D沙雕动画(搞笑/无厘头风格),通过以下方案实现低成本、高成效的开发流程,结合夸张的动作、滑稽的物理效果和魔性音效: 1. 角色与素材设计 核心原则:丑萌即正义,越怪越好&#…...
小白零基础如何搭建CNN
1.卷积层 在PyTorch中针对卷积操作的对象和使用的场景不同,如有1维卷积、2维卷积、 3维卷积与转置卷积(可以简单理解为卷积操作的逆操作),但它们的使用方法比较相似,都可以从torch.nn模块中调用,需要调用的…...
【Java八股文】01-Java基础面试篇
【Java八股文】01-Java基础面试篇 概念Java特点Java为什么跨平台JVM、JDK、JRE关系 面向对象什么是面向对象,什么是封装继承多态?多态体现的方面面向对象设计原则重载重写的区别抽象类和实体类区别Java抽象类和接口的区别抽象类可以被实例化吗 深拷贝浅拷…...
k8s部署logstash
1. 编写logstash.yaml配置文件 --- apiVersion: v1 kind: Service metadata:name: logstash spec:type: ClusterIPclusterIP: Noneports:- name: logstash-tcpport: 5000targetPort: 5000- name: logstash-beatsport: 5044targetPort: 5044- name: logstash-apiport: 9600targ…...
Arcgis/GeoScene API for JavaScript 三维场景底图网格设为透明
项目场景: 有时候加载的地图服务白色区域会露底,导致在三维场景时,露出了三维网格,影响效果,自此,我们需要将三维场景的底图设为白色或透明。 问题描述 如图所示: 解决方案: 提示…...
《qt open3d网格拉普拉斯平滑》
qt open3d网格拉普拉斯平滑 效果展示二、流程三、代码效果展示 二、流程 创建动作,链接到槽函数,并把动作放置菜单栏 参照前文 三、代码 1、槽函数实现 void on_actionFilterLaplacian_triggered();void MainWindow::on_actionFil...
怎么选择免费的SEO排名工具
随着2025年互联网的迅猛发展,越来越多的企业意识到,拥有一个高排名的网站对于品牌曝光和吸引客户至关重要。尤其是通过SEO(搜索引擎优化),可以提高网站在搜索引擎中的排名,进而带来更多的自然流量ÿ…...
缓存技术介绍
缓存技术是一种用于提高数据访问速度的技术,通过在快速存储介质(如内存)中保存频繁访问的数据,从而减少对较慢存储介质(如硬盘)的访问次数。缓存可以显著提高系统性能,尤其是在处理大量数据或进…...
SSH隧道+Nginx:绿色通道详解(SSH Tunnel+nginx: Green Channel Detailed Explanation)
SSH隧道Nginx:内网资源访问的绿色通道 问题背景 模拟生产环境,使用两层Nginx做反向代理,请求公网IP来访问内网服务器的网站。通过ssh隧道反向代理来实现,重点分析一下nginx反代的基础配置。 实验环境 1、启动内网服务器的tomca…...
Spring 项目接入 DeepSeek,分享两种超简单的方式!
⭐自荐一个非常不错的开源 Java 面试指南:JavaGuide (Github 收获148k Star)。这是我在大三开始准备秋招面试的时候创建的,目前已经持续维护 6 年多了,累计提交了 5600 commit ,共有 550 多位贡献者共同参与…...
【c++】四种类型转换形式
【c】四种类型转换形式 编译时: static_cast(静态转换) const_cast(去常性转换) reinterpret_cast(重新解释转换,直接转换地址) 运行时: dynamic_cast(动态转换,运行时类…...
Unity 制作2D动画必要准备:启动篇
制作Unity 2D动画需要准备以下内容: 美术素材准备 选择或绘制符合需求的2D精灵图(如像素风格角色、场景元素)确保素材包含完整动画序列帧(如行走/攻击/跳跃等动作分解)注意素材尺寸统一性,建议采用网格化排…...
半小时在本地部署DeepSeek的Janus Pro,进行图片分析和文生图
半小时在本地部署DeepSeek的Janus Pro,进行图片分析和文生图 下载Janus Pro源代码下载模型文件创建Python虚拟环境安装依赖包Janus Pro测试运行程序图片分析测试文生图测试使用中文提示词使用英文提示词 测试印象: 整体模型体积较小,个人可以…...
急停信号的含义
前言: 大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任软件经理,从事C#上位机软件开发8年以上!我们在开发C#的运动控制程序的时候,一个必要的步骤就是确认设备按钮的急停…...
设置mysql的主从复制模式
mysql设置主从复制模式似乎很容易,关键在于1)主库启用二进制日志,2)从库将主库设为主库。另外,主从复制,复制些什么?从我现在获得的还很少的经验来看,复制的内容有表,用户…...
三角拓扑聚合优化器TTAO-Transformer-BiLSTM多变量回归预测(Maltab)
三角拓扑聚合优化器TTAO-Transformer-BiLSTM多变量回归预测(Maltab) 完整代码私信回复三角拓扑聚合优化器TTAO-Transformer-BiLSTM多变量回归预测(Maltab) 一、引言 1、研究背景和意义 在现代数据科学领域,时间序列…...
东方财富Android面试题及参考答案
接口和抽象类的区别是什么? 定义与语法 接口:接口是一种抽象类型,它只包含方法签名、常量定义,方法默认是public、abstract的,常量默认是public、static、final的。接口不能包含实例变量和普通方法的实现。抽象类:抽象类是一种不能被实例化的类,它可以包含抽象方法和具体…...
ArcGIS基础知识之ArcMap基础设置——ArcMap选项:常规选项卡设置及作用
作为一名 GIS 从业者,ArcMap 是我们日常工作中不可或缺的工具。对于初学者来说,掌握 ArcMap 的基础设置是迈向 GIS 分析与制图的第一步。今天,就让我们一起深入了解 ArcMap 选项中常规选项卡的各个设置,帮助大家更好地使用这款强大的软件。 在 ArcMap 中,常规选项卡是用户…...
element-ui时间组件同一个月内选择/30天内选择
element-ui时间组件同一个月内选择/30天内选择 同一个月 <el-date-picker v-model"time" type"datetimerange"range-separator"至" start-placeholder"开始时间"value-format"timestamp" :picker-options"pickerO…...
