SAP 标准ALV实现单元格可编辑,插入可编辑的新行,敲下回车后更新数据
实现单元格可编辑:
假定将要显示在ALV屏幕上的内表名为:it_alv。
通过slis_fieldcat_alv-edit = 'X',将单元格所在列设为可编辑状态。
在it_alv的data定义里添加新列field_style,类型为lvc_t_styl。
将内表it_alv中不需要编辑的行中单元格设为不可编辑状态。代码示例如下:
DATA:ls_stylelin TYPE lvc_s_styl.LOOP AT it_alv ASSIGNING <wa_alv>.IF it_alv-werks = '1020'."当工厂为1020时,不允许编辑该行的工厂ls_stylelin-fieldname = 'WERKS'.ls_stylelin-style = cl_gui_alv_grid=>mc_style_disabled. " 设置为不可编辑状态INSERT ls_stylelin INTO TABLE <wa_alv>-field_style .ENDIF.ENDLOOP.
实现插入可编辑的新行:
往it_alv里第一行插入新行
把该新行的field_style( lvc_t_styl )清空。
这样该新行的可编辑字段就是设置了slis_fieldcat_alv-edit = 'X'的列所存的字段。
代码示例如下:
INSERT INITIAL LINE INTO it_alv INDEX 1.IF sy-subrc = 0.READ TABLE it_alv ASSIGNING <wa_alv> INDEX 1.CLEAR <wa_alv>-field_style .ENDIF.
敲下回车后更新数据:
编写event类,在调用alv创建函数时添加输入参数。
ALV调用代码示例:
DATA: lt_events TYPE slis_t_event,ls_events TYPE slis_alv_event. " Alv grid.ls_events-name = 'CALLER_EXIT'.ls_events-form = 'FRM_REGISTER_EVENTS'.APPEND ls_events TO lt_events.CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'EXPORTINGi_callback_program = sy-repidi_callback_pf_status_set = 'FRM_SET_STATUS'i_callback_user_command = 'FRM_USER_COMMAND'is_layout_lvc = gs_layoit_fieldcat_lvc = gt_fcatit_events = lt_eventsi_save = 'A'TABLESt_outtab = it_alvEXCEPTIONSprogram_error = 1OTHERS = 2.
Event类定义代码示例:
*---------------------------------------------------------------------------------------------
*---------------------------------------------------------------------------------------------
*----------Reresh internal table data after input 'enter' command.
*----------------------------Enter event Definition-------------------------------------------
DATA:stbl TYPE lvc_s_stbl,g_grid TYPE REF TO cl_gui_alv_grid.
*----------------------------------------------------------------------*
* CLASS lcl_event_handler DEFINITION
*----------------------------------------------------------------------*
* 类定义
*----------------------------------------------------------------------*
CLASS lcl_event_handler DEFINITION."类定义PUBLIC SECTION.METHODS:handle_data_changed FOR EVENT data_changed_finished OF cl_gui_alv_gridIMPORTING e_modified et_good_cells.
ENDCLASS. "lcl_event_handler DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_event_handler IMPLEMENTATION
*----------------------------------------------------------------------*
* 类实现
*----------------------------------------------------------------------*
CLASS lcl_event_handler IMPLEMENTATION."类实现METHOD handle_data_changed.PERFORM handle_data_changed ."具体处理数据事件
* IF e_modified = 'X'.stbl-row = 'X'." 基于行的稳定刷新stbl-col = 'X'." 基于列稳定刷新CALL METHOD g_grid->refresh_table_displayEXPORTINGis_stable = stbl.
* ENDIF.ENDMETHOD. "HANDLE_DATA_CHANGED
ENDCLASS. "lcl_event_handler IMPLEMENTATION
*&---------------------------------------------------------------------*
*& Form register_events
*&---------------------------------------------------------------------*
* 注册回车事件
*----------------------------------------------------------------------
FORM frm_register_events USING e_grid TYPE slis_data_caller_exit.CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'IMPORTINGe_grid = g_grid.
*DATA: gr_event_handler TYPE REF TO lcl_event_handler.CREATE OBJECT gr_event_handler.
*CALL METHOD g_grid->register_edit_eventEXPORTINGi_event_id = cl_gui_alv_grid=>mc_evt_enterEXCEPTIONSerror = 1OTHERS = 2.SET HANDLER gr_event_handler->handle_data_changed FOR g_grid.IF sy-subrc <> 0.MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgnoWITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.ENDIF.
ENDFORM. "register_events*&---------------------------------------------------------------------*
*& Form HANDLE_DATA_CHANGED
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM handle_data_changed ."Auto output dataLOOP AT it_alv ASSIGNING <wa_alv> .SELECT SINGLE ekgrpINTO <wa_alv>-ekgrpFROM zmarcWHERE wekrs = <wa_alv>-werks.ENDLOOP.
ENDFORM. "HANDLE_DATA_CHANGED
完整程序代码示例:
*&---------------------------------------------------------------------*
*& Report ZTEST
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*REPORT ztest.TABLES:mara,marc,sscrfields.TYPE-POOLS:slis.DEFINE mro_fcat.clear: ls_fcat.ls_fcat-fieldname = &1.ls_fcat-coltext = &2.ls_fcat-scrtext_l = &2.ls_fcat-scrtext_m = &2.ls_fcat-scrtext_s = &2.ls_fcat-no_zero = 'X'.translate ls_fcat-fieldname to upper case.if &3 ne space.ls_fcat-ref_field = ls_fcat-fieldname.ls_fcat-ref_table = &3.ls_fcat-ref_field = &5.endif.
* if &1 eq 'ztype'. " OR &1 EQ 'aufnr'.
* ls_fcat-hotspot = 'X'.
* endif.ls_fcat-edit = &4.translate ls_fcat-ref_table to upper case.ls_fcat-datatype = &6 . " 指定数据类型
* ls_fcat-inttype = &7 . "这个是指定字段的类型为Cappend ls_fcat to gt_fcat.
END-OF-DEFINITION."ALV data define
DATA: ls_fcat TYPE slis_fieldcat_alv,gt_fcat TYPE lvc_t_fcat,gs_layo TYPE lvc_s_layo.DATA: lt_events TYPE slis_t_event,ls_events TYPE slis_alv_event. " Alv grid."Red Green Color
CONSTANTS: c_green TYPE icon-id VALUE '@08@',c_yellow TYPE icon-id VALUE '@09@',c_red TYPE icon-id VALUE '@0A@'.DATA: it_data LIKE TABLE OF zmarc WITH HEADER LINE.DATA: BEGIN OF it_alv OCCURS 0,box TYPE xfeld, " Check Boxmessage TYPE char255,id TYPE char25,werks LIKE zmm_rebaterule-werks ,ekgrp LIKE zmm_rebaterule-ekgrp ,field_style TYPE lvc_t_styl, "单元格可编辑END OF it_alv.
FIELD-SYMBOLS: <wa_alv> LIKE it_alv.SELECTION-SCREEN BEGIN OF BLOCK blk2 WITH FRAME TITLE text-000.
SELECT-OPTIONS: s_werks FOR zmm_rebaterule-werks OBLIGATORY.
SELECT-OPTIONS: s_ekgrp FOR zmm_rebaterule-ekgrp .
SELECTION-SCREEN END OF BLOCK blk2.SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-000.
PARAMETERS:rd01 RADIOBUTTON GROUP rd USER-COMMAND zchg DEFAULT 'X'.
PARAMETERS:rd02 RADIOBUTTON GROUP rd.
SELECTION-SCREEN END OF BLOCK b1.START-OF-SELECTION.IF rd01 EQ 'X'."Create/ChangePERFORM get_data.PERFORM process_alv_show.PERFORM alv_display.ELSEIF rd02 EQ 'X'."Display/PrintPERFORM get_data.PERFORM alv_display.ENDIF.*&---------------------------------------------------------------------*
*& Form PROCESS_ALV_SHOW
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM process_alv_show.DATA:ls_stylelin TYPE lvc_s_styl.DATA:lt_lvc_t_styl TYPE lvc_t_styl.LOOP AT it_alv ASSIGNING <wa_alv>.ls_stylelin-fieldname = 'WERKS'.ls_stylelin-style = cl_gui_alv_grid=>mc_style_disabled. " 设置为不可编辑状态INSERT ls_stylelin INTO TABLE <wa_alv>-field_style .ENDLOOP.
ENDFORM. "PROCESS_ALV_SHOW*&---------------------------------------------------------------------*
*& Form get_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM get_data.SELECT *INTO CORRESPONDING FIELDS OF TABLE it_alvFROM zmarcWHERE werks IN s_werks AND ekgrp IN s_ekgrp .SORT it_alv BY werks lifnr matnr.
ENDFORM. "get_data*&---------------------------------------------------------------------*
*& Form alv_display
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM alv_display.DATA: ls_fcat TYPE lvc_s_fcat.DATA: ls_disvariant TYPE disvariant.gs_layo-zebra = 'X'.gs_layo-cwidth_opt = 'X'.gs_layo-box_fname = 'BOX'.gs_layo-stylefname = 'FSTYLE'.gs_layo-info_fname = 'ZCOL' .gs_layo-stylefname = 'FIELD_STYLE'. " 将内表中的字段名存入显示格式IF rd02 EQ 'X' ."Display/Printmro_fcat 'WERKS' 'Plant Code' 'ZMARC' space '' ''.mro_fcat 'EKGRP' 'Purchase Group' 'ZMARC' space '' ''.CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'EXPORTINGi_callback_program = sy-repidi_callback_pf_status_set = 'FRM_SET_STATUS'i_callback_user_command = 'FRM_USER_COMMAND'is_layout_lvc = gs_layoit_fieldcat_lvc = gt_fcati_save = 'A'TABLESt_outtab = it_alvEXCEPTIONSprogram_error = 1OTHERS = 2.ELSEIF rd01 EQ 'X' ."Create/Changels_events-name = 'CALLER_EXIT'.ls_events-form = 'FRM_REGISTER_EVENTS'.APPEND ls_events TO lt_events.mro_fcat 'message' 'MESSAGE' '' space '' ''.mro_fcat 'id' 'ICON' '' space '' ''.mro_fcat 'WERKS' 'Plant Code' 'ZMARC' 'X' '' ''.mro_fcat 'EKGRP' 'Purchase Group' 'ZMARC' 'X' '' ''.CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'EXPORTINGi_callback_program = sy-repidi_callback_pf_status_set = 'FRM_SET_STATUS'i_callback_user_command = 'FRM_USER_COMMAND'is_layout_lvc = gs_layoit_fieldcat_lvc = gt_fcatit_events = lt_eventsi_save = 'A'TABLESt_outtab = it_alvEXCEPTIONSprogram_error = 1OTHERS = 2.ENDIF.
ENDFORM. "alv_display*&---------------------------------------------------------------------*
*& Form frm_set_status
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->RT_EXTAB text
*----------------------------------------------------------------------*
FORM frm_set_status USING rt_extab TYPE slis_t_extab.IF rd02 EQ 'X'.SET PF-STATUS '200'.ELSE.SET PF-STATUS '100'.ENDIF.DATA: lo_grid TYPE REF TO cl_gui_alv_grid.CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'IMPORTINGe_grid = lo_grid.CALL METHOD lo_grid->register_edit_eventEXPORTINGi_event_id = cl_gui_alv_grid=>mc_evt_modified.IF sy-subrc <> 0.ENDIF.ENDFORM. "frm_set_status*&---------------------------------------------------------------------*
*& Form frm_user_command
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->R_UCOMM text
* -->RS_SELFIELD text
*----------------------------------------------------------------------*
FORM frm_user_command USING r_ucomm LIKE sy-ucommrs_selfield TYPE slis_selfield.IF r_ucomm EQ '&SAVE'.PERFORM update_data.PERFORM insert_data.rs_selfield-refresh = 'X'.ELSEIF r_ucomm EQ '&NEWLINE'.PERFORM add_new_line.rs_selfield-refresh = 'X'.ENDIF.ENDFORM. "frm_user_command*&---------------------------------------------------------------------*
*& Form update_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM update_data.ENDFORM. "update_data*&---------------------------------------------------------------------*
*& Form insert_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM insert_data.ENDFORM. "insert_data*&---------------------------------------------------------------------*
*& Form add_new_line
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM add_new_line.DATA:ls_stylelin TYPE lvc_s_styl.DATA:lt_lvc_t_styl TYPE lvc_t_styl.INSERT INITIAL LINE INTO it_alv INDEX 1.IF sy-subrc = 0.READ TABLE it_alv ASSIGNING <wa_alv> INDEX 1.<wa_alv>-zccstatus = '1'.CLEAR <wa_alv>-field_style .ENDIF.
ENDFORM. "add_new_line*---------------------------------------------------------------------------------------------
*---------------------------------------------------------------------------------------------
*----------Reresh internal table data after input 'enter' command.
*----------------------------Enter event Definition-------------------------------------------
DATA:stbl TYPE lvc_s_stbl,g_grid TYPE REF TO cl_gui_alv_grid.
*----------------------------------------------------------------------*
* CLASS lcl_event_handler DEFINITION
*----------------------------------------------------------------------*
* 类定义
*----------------------------------------------------------------------*
CLASS lcl_event_handler DEFINITION."类定义PUBLIC SECTION.METHODS:handle_data_changed FOR EVENT data_changed_finished OF cl_gui_alv_gridIMPORTING e_modified et_good_cells.
ENDCLASS. "lcl_event_handler DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_event_handler IMPLEMENTATION
*----------------------------------------------------------------------*
* 类实现
*----------------------------------------------------------------------*
CLASS lcl_event_handler IMPLEMENTATION."类实现METHOD handle_data_changed.PERFORM handle_data_changed ."具体处理数据事件
* IF e_modified = 'X'.stbl-row = 'X'." 基于行的稳定刷新stbl-col = 'X'." 基于列稳定刷新CALL METHOD g_grid->refresh_table_displayEXPORTINGis_stable = stbl.
* ENDIF.ENDMETHOD. "HANDLE_DATA_CHANGED
ENDCLASS. "lcl_event_handler IMPLEMENTATION
*&---------------------------------------------------------------------*
*& Form register_events
*&---------------------------------------------------------------------*
* 注册回车事件
*----------------------------------------------------------------------
FORM frm_register_events USING e_grid TYPE slis_data_caller_exit.CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'IMPORTINGe_grid = g_grid.
*DATA: gr_event_handler TYPE REF TO lcl_event_handler.CREATE OBJECT gr_event_handler.
*CALL METHOD g_grid->register_edit_eventEXPORTINGi_event_id = cl_gui_alv_grid=>mc_evt_enterEXCEPTIONSerror = 1OTHERS = 2.SET HANDLER gr_event_handler->handle_data_changed FOR g_grid.IF sy-subrc <> 0.MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgnoWITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.ENDIF.
ENDFORM. "register_events*&---------------------------------------------------------------------*
*& Form HANDLE_DATA_CHANGED
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM handle_data_changed ."Auto output data 自动刷新数据LOOP AT it_alv ASSIGNING <wa_alv> .SELECT SINGLE ekgrpINTO <wa_alv>-ekgrpFROM zmarcWHERE wekrs = <wa_alv>-werks.ENDLOOP.
ENDFORM. "HANDLE_DATA_CHANGED
*---------------------------------------------------------------------------------------------
*---------------------------------------------------------------------------------------------
*----------------------------Enter event Definition-------------------------------------------
SAP 标准ALV实现单元格可编辑,插入可编辑的新行,敲下回车后更新数据相关推荐
- ABAP ALV检查单元格更新数据
ABAP ALV检查单元格更新数据 将ALV单元格设置为可输入后,通常我们需要对单元格输入的值做一个检查,一般来说用循环内表的方法可以实现上述操作,不过如果ALV中有大量数据,而我们只更新了少量的单元 ...
- PHPExcel 设置单元格受保护,不可编辑,或需要密码
设置全表受保护,不能编辑 $objPHPExcel = new \PHPExcel();$objPHPExcel->getActiveSheet()->getProtection()-&g ...
- SAP OOALV 动态设置单元格可否编辑
对于OOALV有些列允许客户输入,但是当用户输入之后,或者ALV展示之前要判断是否满足一定的条件,如果满足,那么就要单独设置某一行或者几行的这个字段不可以编辑或可以编辑,效果如果所示: 实现步骤 1. ...
- SAP ALV合并单元格示例(合并单元格为表头)
前言 实现参考Enno Wulff的文章(德文):Zellen verbinden 在原有基础上新增了部分功能(支持输入合并单元格的显示值) 效果 代码 主程序 *&------------- ...
- excel 单元格名称 java_Java 创建、编辑、删除Excel命名区域
Excel命名区域,即对指定单元格区域进行命名,以便对单元格区域引用,如在公式运用中可以引用指定命名区域进行公式操作.在创建命名区域时,可针对整个工作簿来创建,即workbook.getNameRan ...
- 对于ALV LVC 单元格的控制
需求是:当数据不符合条件时,不可编辑,反之,可编辑 主要实现的技术: CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' 代码如下: " 数据声明 显示A ...
- Excel单元格输入文本敲下回车键后自动调整列宽
Excel默认情况下在单元格中输入内容按下回车键后无法自动调整列宽,需要使用VBA添加此功能.以下方法来源于网友"七天内只能修改一次",亲测有效后重新编辑了文字并截图展示,希望对您 ...
- poi获取有效单元格个数_EXCEL利用SUM函数和FREQUENCY函数数组公式统计不同区间数据个数...
EXCEL函数公式大全之利用FREQUENCY函数数组公式统计不同区间数据个数.EXCEL函数与公式在工作中使用非常的频繁,会不会使用公式直接决定了我们的工作效率,今天我们来学习一下提高我们工作效率的 ...
- excel任意单元格中自动插入页码和总页数
一:用于一个工作表打印时可分为多页的情况. 二:用于多个工作表,每个工作表代表一页的情况. 一:用于一个工作表打印时可分为多页的情况. 公式→名称管理器→新建→范围(当前工作表) 1.定义两个名称: ...
最新文章
- 获取GridView中的某列值
- 强烈推荐7个让人惊艳的宝藏实用网站,太好用了
- 多帧点云拼接的全局ICP算法【附Matlab代码链接】
- Flash/Flex学习笔记(53):利用FMS快速创建一个文本聊天室
- 软件测试工具和报告学习-3月6日
- 语音数据采集-实时语音数据可视化
- mysql默认数据库名称,默认的MySQL数据库名称
- 论坛中,无限分类的原理
- 辅助类BinaryTreeNodeLeftChildRightSibling(左孩子右兄弟,二叉树结点)
- 高效程序员常用的工具
- php限制接口访问次数_令牌桶限流思路分享(PHP+Redis实现机制)
- 字符编码(ucs2 ucs4 utf)
- cent OS 6.3 yum方式安装openldap,phppldapadmin,lam
- tracert、traceroute、mtr、WinMTR
- 古诗词与代码之间不得不说的二三事。
- ftp服务器上传文件太慢,ftp服务器上传文件速度多少
- catgroup linux_linux中/etc/group文件详解
- 华为芯片设计面试题_华为公司面试硬件工程师笔试题
- 微信useragent java_微信内置浏览器和小程序的 User Agent 区别及判断方法
- Pycharm完整中文教程及安装配置