ABAP开发SELECTION-SCREEN: FUNCTION KEY 1,2,3,4,5的使用方法

REPORT报表的自定义工具栏按钮。

SELECTION-SCREEN: FUNCTION KEY 是包含在选择画面(1000)的标准GUI的功能按钮,最多只能有5个,功能码是FC1~FC5.也是系统预留好的。

然后,以上被定义的按钮的图标和文本描述都是可以设定的,在tables:sscrfields的functxt_01 ,functxt_02,functxt_03..............

 

下面有个例子:

REPORT demo_sel_screen_function_key. 
TYPE-POOLS icon. 
TABLES sscrfields. 
DATA functxt TYPE smp_dyntxt. 

PARAMETERS: p_carrid TYPE s_carr_id, 
            p_cityfr TYPE s_from_cit. 
SELECTION-SCREEN: FUNCTION KEY 1, 
                  FUNCTION KEY 2. 

INITIALIZATION. 
  functxt-icon_id   = icon_ws_plane. 
  functxt-quickinfo = 'Preselected Carrier'. 
  functxt-icon_text = 'LH'. 
  sscrfields-functxt_01 = functxt. 
  functxt-icon_text = 'UA'. 
  sscrfields-functxt_02 = functxt. 

AT SELECTION-SCREEN. 
  CASE sscrfields-ucomm. 
    WHEN 'FC01'. 
      p_carrid = 'LH'. 
      p_cityfr = 'Frankfurt'. 
    WHEN 'FC02'. 
      p_carrid = 'UA'. 
      p_cityfr = 'Chicago'. 
    WHEN OTHERS. 
      ... 
  ENDCASE. 

效果图:

1.初始画面

 

2.【LH】按钮按下的时候

 

3.【UA】按钮按下的时候

REPORT ZBISMT_UPDATE. * 定义数据类型 TYPES: BEGIN OF ty_excel_data, matnr TYPE matnr, " 物料号 maktx TYPE maktx, " 物料描述(仅用于读取Excel,不处理) bismt TYPE bismt, " 库格 werks TYPE werks_d, " 工厂 lgort TYPE lgort_d, " 库位 END OF ty_excel_data. * 定义内表和工作区 DATA: gt_excel_data TYPE TABLE OF ty_excel_data, gs_excel_data TYPE ty_excel_data, gt_zmm_bismt TYPE TABLE OF zmm_bismt, gs_zmm_bismt TYPE zmm_bismt, gt_updated TYPE TABLE OF zmm_bismt, " 存储更新的数据 gt_skipped TYPE TABLE OF zmm_bismt. " 存储跳过的数据(库格相同) * 保存结果到全局变量用于显示 DATA: gv_updated TYPE i, gv_skipped TYPE i, gv_inserted TYPE i. * 单物料维护相关变量 DATA: gv_edit_mode TYPE c, " 编辑模式:E=编辑,C=新建 gs_curr_data TYPE zmm_bismt. " 当前编辑的数据 * 选择屏幕定义 SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-t01. PARAMETERS: p_file TYPE rlgrap-filename. " Excel文件路径 PARAMETERS: p_werks TYPE werks_d DEFAULT '1011' OBLIGATORY. " 工厂输入 PARAMETERS: p_lgort TYPE lgort_d DEFAULT 'MT01' OBLIGATORY. " 库位输入 SELECTION-SCREEN SKIP. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT 1(20) TEXT-fil. " 文件选择标签 SELECTION-SCREEN PUSHBUTTON 21(15) but_file USER-COMMAND file_sel. " 文件选择按钮 SELECTION-SCREEN END OF LINE. PARAMETERS: p_test AS CHECKBOX DEFAULT 'X' USER-COMMAND test. " 测试模式开关 SELECTION-SCREEN END OF BLOCK b1. SELECTION-SCREEN SKIP. SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-t02. PARAMETERS: p_matnr TYPE matnr. " 物料号输入 SELECTION-SCREEN SKIP. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN PUSHBUTTON 1(10) but1 USER-COMMAND query. " 查询按钮 SELECTION-SCREEN PUSHBUTTON 12(10) but2 USER-COMMAND create. " 新建按钮 SELECTION-SCREEN PUSHBUTTON 23(10) but3 USER-COMMAND save. " 保存按钮 SELECTION-SCREEN END OF LINE. SELECTION-SCREEN SKIP. PARAMETERS: p_w_s TYPE werks_d MODIF ID dis, " 工厂(显示用) p_lg_s TYPE lgort_d MODIF ID dis, " 库位(显示用) p_bismt TYPE bismt MODIF ID edt. " 库格(可编辑) SELECTION-SCREEN END OF BLOCK b2. * 文本符号定义 INITIALIZATION. " 设置按钮文本 but1 = '查询'. but2 = '新建'. but3 = '保存'. but_file = '浏览...'. " 文件选择按钮文本 * 主程序 START-OF-SELECTION. " 只有在提供了文件路径时才执行批量更新 IF p_file IS NOT INITIAL. PERFORM read_excel_data. PERFORM process_data. PERFORM show_result. ELSE. " 显示提示信息,只有单物料维护被执行 WRITE: / '未提供Excel文件,跳过批量更新'. WRITE: / '仅执行了单物料维护功能'. ENDIF. *&---------------------------------------------------------------------* *& Form READ_EXCEL_DATA *&---------------------------------------------------------------------* FORM read_excel_data. DATA: lt_raw_data TYPE truxs_t_text_data. DATA: lt_temp_excel TYPE TABLE OF ty_excel_data. " 临时内表 " 检查文件是否存在 PERFORM check_file_existence USING p_file. " 调用函数上传Excel文件 CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP' EXPORTING i_tab_raw_data = lt_raw_data i_filename = p_file TABLES i_tab_converted_data = lt_temp_excel " 先读到临时内表 EXCEPTIONS conversion_failed = 1 OTHERS = 2. IF sy-subrc <> 0. MESSAGE 'Excel文件读取失败' TYPE 'E'. ENDIF. " 从第二行开始读取数据(跳过标题行) LOOP AT lt_temp_excel INTO gs_excel_data FROM 2. " 使用用户输入的工厂和库位值 gs_excel_data-werks = p_werks. gs_excel_data-lgort = p_lgort. APPEND gs_excel_data TO gt_excel_data. ENDLOOP. " 删除可能存在的空行(仅检查物料号) DELETE gt_excel_data WHERE matnr IS INITIAL. ENDFORM. " READ_EXCEL_DATA *&---------------------------------------------------------------------* *& Form PROCESS_DATA *&---------------------------------------------------------------------* FORM process_data. " 从目标表读取现有数据 SELECT matnr werks lgort bismt FROM zmm_bismt INTO TABLE gt_zmm_bismt. " 处理Excel数据 LOOP AT gt_excel_data INTO gs_excel_data. " 检查目标表中是否已存在相同物料号、工厂和库位的记录 READ TABLE gt_zmm_bismt INTO gs_zmm_bismt WITH KEY matnr = gs_excel_data-matnr werks = gs_excel_data-werks lgort = gs_excel_data-lgort. IF sy-subrc = 0. " 记录已存在,检查库格是否相同 IF gs_zmm_bismt-bismt = gs_excel_data-bismt. " 库格相同,跳过不处理 gv_skipped = gv_skipped + 1. APPEND gs_zmm_bismt TO gt_skipped. ELSE. " 库格不同,准备更新记录 gs_zmm_bismt-bismt = gs_excel_data-bismt. " 仅在非测试模式下执行更新 IF p_test <> 'X'. UPDATE zmm_bismt SET bismt = gs_excel_data-bismt WHERE matnr = gs_excel_data-matnr AND werks = gs_excel_data-werks AND lgort = gs_excel_data-lgort. ENDIF. IF sy-subrc = 0 OR p_test = 'X'. gv_updated = gv_updated + 1. APPEND gs_zmm_bismt TO gt_updated. ENDIF. ENDIF. ELSE. " 新记录,准备插入 gs_zmm_bismt-matnr = gs_excel_data-matnr. gs_zmm_bismt-werks = gs_excel_data-werks. gs_zmm_bismt-lgort = gs_excel_data-lgort. gs_zmm_bismt-bismt = gs_excel_data-bismt. " 仅在非测试模式下执行插入 IF p_test <> 'X'. INSERT zmm_bismt FROM gs_zmm_bismt. ENDIF. IF sy-subrc = 0 OR p_test = 'X'. gv_inserted = gv_inserted + 1. ENDIF. ENDIF. ENDLOOP. " 仅在非测试模式下提交更改 IF p_test <> 'X'. COMMIT WORK. ENDIF. ENDFORM. " PROCESS_DATA *&---------------------------------------------------------------------* *& Form SHOW_RESULT *&---------------------------------------------------------------------* FORM show_result. DATA: lv_total TYPE i. DATA: ls_updated TYPE zmm_bismt. " 工作区用于显示 " 计算总记录数 DESCRIBE TABLE gt_excel_data LINES lv_total. " 显示测试模式提示 IF p_test = 'X'. WRITE: / '当前处于测试模式,不会实际修改数据库'. SKIP 1. ENDIF. WRITE: / '批量更新处理完成'. WRITE: / '总记录数:', lv_total. WRITE: / '更新记录数:', gv_updated. WRITE: / '跳过记录数(库格相同):', gv_skipped. WRITE: / '插入记录数:', gv_inserted. " 仅显示数量,不显示明细 " 显示所有更新记录 IF gv_updated > 0. WRITE: / '所有更新记录:'. WRITE: / '物料号', 20 '工厂', 27 '库位', 35 '原库格', 50 '新库格'. LOOP AT gt_updated INTO ls_updated. " 获取原库格值用于显示 READ TABLE gt_zmm_bismt INTO gs_zmm_bismt WITH KEY matnr = ls_updated-matnr werks = ls_updated-werks lgort = ls_updated-lgort. IF sy-subrc = 0. WRITE: / ls_updated-matnr, 20 ls_updated-werks, 27 ls_updated-lgort, 35 gs_zmm_bismt-bismt, " 原库格 50 ls_updated-bismt. " 新库格 ENDIF. ENDLOOP. ENDIF. " 显示所有跳过记录 IF gv_skipped > 0. WRITE: / '所有跳过记录(库格相同):'. WRITE: / '物料号', 20 '工厂', 27 '库位', 35 '库格'. LOOP AT gt_skipped INTO gs_zmm_bismt. WRITE: / gs_zmm_bismt-matnr, 20 gs_zmm_bismt-werks, 27 gs_zmm_bismt-lgort, 35 gs_zmm_bismt-bismt. ENDLOOP. ENDIF. ENDFORM. " SHOW_RESULT *&---------------------------------------------------------------------* *& Form CHECK_FILE_EXISTENCE *&---------------------------------------------------------------------* FORM check_file_existence USING p_filename. DATA: lv_file TYPE string. DATA: lv_exists TYPE abap_bool. lv_file = p_filename. " 使用GUI前端服务检查文件是否存在 CALL METHOD cl_gui_frontend_services=>file_exist EXPORTING file = lv_file RECEIVING result = lv_exists EXCEPTIONS cntl_error = 1 error_no_gui = 2 OTHERS = 3. IF sy-subrc <> 0 OR lv_exists <> abap_true. MESSAGE '文件不存在或无法访问' TYPE 'E'. ENDIF. ENDFORM. " CHECK_FILE_EXISTENCE *&---------------------------------------------------------------------* *& AT SELECTION-SCREEN OUTPUT *&---------------------------------------------------------------------* AT SELECTION-SCREEN OUTPUT. " 控制单物料维护区域字段状态 PERFORM control_single_mat_fields. *&---------------------------------------------------------------------* *& AT SELECTION-SCREEN *&---------------------------------------------------------------------* AT SELECTION-SCREEN. " 处理按钮事件 CASE sy-ucomm. WHEN 'QUERY'. PERFORM handle_query. WHEN 'CREATE'. PERFORM handle_create. WHEN 'SAVE'. PERFORM handle_save. WHEN 'FILE_SEL'. " 文件选择按钮事件 PERFORM handle_file_selection. ENDCASE. *&---------------------------------------------------------------------* *& Form CONTROL_SINGLE_MAT_FIELDS *&---------------------------------------------------------------------* FORM control_single_mat_fields. " 设置显示字段属性 LOOP AT SCREEN. IF screen-group1 = 'DIS'. " 显示字段设为只读 screen-input = 0. MODIFY SCREEN. ELSEIF screen-group1 = 'EDT'. " 库格字段:编辑模式下可编辑 IF gv_edit_mode IS NOT INITIAL. screen-input = 1. ELSE. screen-input = 0. ENDIF. MODIFY SCREEN. ENDIF. ENDLOOP. ENDFORM. " CONTROL_SINGLE_MAT_FIELDS *&---------------------------------------------------------------------* *& Form HANDLE_QUERY *&---------------------------------------------------------------------* FORM handle_query. " 检查物料号是否输入 IF p_matnr IS INITIAL. MESSAGE '请输入物料号' TYPE 'S' DISPLAY LIKE 'E'. RETURN. ENDIF. " 检查物料号是否存在 PERFORM check_matnr_exists USING p_matnr. " 检查物料在指定工厂和库位是否存在 SELECT SINGLE * FROM zmm_bismt INTO gs_curr_data WHERE matnr = p_matnr AND werks = p_werks AND lgort = p_lgort. IF sy-subrc = 0. " 存在,进入编辑模式 gv_edit_mode = 'E'. p_w_s = gs_curr_data-werks. p_lg_s = gs_curr_data-lgort. p_bismt = gs_curr_data-bismt. MESSAGE s000(zmsg) WITH '物料已存在,进入编辑模式'. ELSE. " 不存在 CLEAR: p_w_s, p_lg_s, p_bismt. gv_edit_mode = ''. MESSAGE '该工厂和库位不存在该物料' TYPE 'S' DISPLAY LIKE 'E'. ENDIF. ENDFORM. " HANDLE_QUERY *&---------------------------------------------------------------------* *& Form HANDLE_CREATE *&---------------------------------------------------------------------* FORM handle_create. " 检查物料号是否输入 IF p_matnr IS INITIAL. MESSAGE '请输入物料号' TYPE 'S' DISPLAY LIKE 'E'. RETURN. ENDIF. " 检查物料号是否存在 PERFORM check_matnr_exists USING p_matnr. " 检查是否已存在 SELECT SINGLE * FROM zmm_bismt INTO gs_curr_data WHERE matnr = p_matnr AND werks = p_werks AND lgort = p_lgort. IF sy-subrc = 0. " 已存在,进入编辑模式 gv_edit_mode = 'E'. p_w_s = gs_curr_data-werks. p_lg_s = gs_curr_data-lgort. p_bismt = gs_curr_data-bismt. MESSAGE s000(zmsg) WITH '物料已存在,自动进入编辑模式'. ELSE. " 不存在,进入新建模式 gv_edit_mode = 'C'. p_w_s = p_werks. p_lg_s = p_lgort. CLEAR p_bismt. MESSAGE s000(zmsg) WITH '进入新建模式,请填写库格'. ENDIF. ENDFORM. " HANDLE_CREATE *&---------------------------------------------------------------------* *& Form HANDLE_SAVE *&---------------------------------------------------------------------* FORM handle_save. " 检查是否在编辑模式 IF gv_edit_mode IS INITIAL. MESSAGE '请先查询或新建物料' TYPE 'S' DISPLAY LIKE 'E'. RETURN. ENDIF. " 检查库格是否填写 IF p_bismt IS INITIAL. MESSAGE '库格不能为空' TYPE 'S' DISPLAY LIKE 'E'. RETURN. ENDIF. " 设置数据 gs_curr_data = VALUE #( matnr = p_matnr werks = p_w_s lgort = p_lg_s bismt = p_bismt ). " 根据模式保存 CASE gv_edit_mode. WHEN 'E'. " 编辑模式 UPDATE zmm_bismt SET bismt = p_bismt WHERE matnr = p_matnr AND werks = p_w_s AND lgort = p_lg_s. IF sy-subrc = 0. MESSAGE '物料更新成功' TYPE 'S'. ELSE. MESSAGE '物料更新失败' TYPE 'S' DISPLAY LIKE 'E'. ENDIF. WHEN 'C'. " 新建模式 INSERT zmm_bismt FROM gs_curr_data. IF sy-subrc = 0. MESSAGE '物料创建成功' TYPE 'S'. ELSE. MESSAGE '物料创建失败' TYPE 'S' DISPLAY LIKE 'E'. ENDIF. ENDCASE. " 重置编辑模式 gv_edit_mode = ''. ENDFORM. " HANDLE_SAVE *&---------------------------------------------------------------------* *& Form CHECK_MATNR_EXISTS *&---------------------------------------------------------------------* FORM check_matnr_exists USING p_matnr. " 检查物料主数据是否存在 SELECT SINGLE matnr FROM mara INTO @DATA(lv_matnr) WHERE matnr = @p_matnr. IF sy-subrc <> 0. MESSAGE '物料号不存在' TYPE 'S' DISPLAY LIKE 'E'. gv_edit_mode = ''. CLEAR: p_w_s, p_lg_s, p_bismt. STOP. ENDIF. " 检查库存视图是否存在 SELECT SINGLE matnr FROM mard INTO @lv_matnr WHERE matnr = @p_matnr AND werks = @p_werks AND lgort = @p_lgort. IF sy-subrc <> 0. MESSAGE '物料在指定工厂和库位的库存视图不存在' TYPE 'S' DISPLAY LIKE 'W'. ENDIF. ENDFORM. " CHECK_MATNR_EXISTS *&---------------------------------------------------------------------* *& Form HANDLE_FILE_SELECTION *&---------------------------------------------------------------------* FORM handle_file_selection. DATA: lt_file_table TYPE filetable, lv_rc TYPE i, lv_action TYPE i. " 调用文件选择对话框 CALL METHOD cl_gui_frontend_services=>file_open_dialog EXPORTING window_title = '选择Excel文件' default_extension = 'XLS' file_filter = 'Excel文件 (*.XLS;*.XLSX)|*.XLS;*.XLSX|所有文件 (*.*)|*.*|' CHANGING file_table = lt_file_table rc = lv_rc user_action = lv_action EXCEPTIONS file_open_dialog_failed = 1 cntl_error = 2 error_no_gui = 3 not_supported_by_gui = 4 OTHERS = 5. IF sy-subrc = 0 AND lv_action = cl_gui_frontend_services=>action_ok. " 获取用户选择的第一个文件 READ TABLE lt_file_table INDEX 1 INTO p_file. IF sy-subrc = 0. " 更新屏幕字段值 p_file = p_file. ENDIF. ENDIF. ENDFORM. " HANDLE_FILE_SELECTION 读取的文件类型改成txt文件,从第一行开始读取,读取的内容只有两列,物料号和库格,物料描述被我去掉了,并且把相关变量的定义名称从excel改成txt
最新发布
08-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值