文章目录
ALV
总的大体的执行顺序如下:
REPORT ZT_RETURN.
include ZT_RETURN_TOP."变量定义
include ZT_RETURN_SEL."选择屏幕
include ZT_RETURN_FRM."方法
START-OF-SELECTION.
"获取数据
PERFORM frm_get_data.
"设置alv的显示列
PERFORM frm_set_fieldcat.
"设置alv的显示样式
PERFORM frm_set_layout.
"显示alv
PERFORM frm_display_alv.
end-OF-SELECTION.
1、ZT_RETURN_TOP:变量的定义
"定义一个内表来接收查询到的数据
TYPES:BEGIN OF T_RETURN,
EBELN type EKPO-EBELN,
EBELP type EKPO-EBELP,
MATNR type EKPO-MATNR,
MENGE type EKPO-MENGE,
END OF T_STORETURN.
DATA: LT_RETURN TYPE TABLE OF T_RETURN,
LS_RETURN TYPE T_RETURN.
"声明ALV的对象
DATA:gs_layout_lvc TYPE lvc_s_layo,
gt_fcat_lvc TYPE lvc_t_fcat,
gs_fcat_lvc TYPE lvc_s_fcat.
2、ZT_RETURN_SEL:定义对应的选择屏幕
```clike
TABLES:ekko,ekpo,lips.
SELECT-OPTIONS: P_BSTYP FOR EKKO-BSTYP,
P_EBELN FOR EKPO-EBELN,
P_LGORT for lips-LGORT."库存地点
3、ZT_RETURN_FRM:定义对应的方法
FORM FRM_GET_DATA ."查询对应的数据到内表LT_RETURN中
ENDFORM.
FORM FRM_SET_FIELDCAT . "设置显示的列名已经长度等基本属性
DEFINE set_fieldcat.
CLEAR gs_fcat_lvc .
gs_fcat_lvc-fieldname = &1."内表的字段
gs_fcat_lvc-outputlen = &2."输出长度
gs_fcat_lvc-scrtext_l = &3."在ALV里面显示的名字
gs_fcat_lvc-just = &4."水平对齐方式,L左对齐,R右对齐。
gs_fcat_lvc-no_zero = &5."去除前导零
APPEND gs_fcat_lvc TO gt_fcat_lvc .
END-OF-DEFINITION.
set_fieldcat:'EBELN' '' '凭证' '' '',
'EBELP' '' '行项目' '' '',
'MATNR' '' '物料' '' ''.
ENDFORM.
FORM FRM_SET_LAYOUT . "设置alv的显示样式
CLEAR:gs_layout_lvc.
gs_layout_lvc-zebra = 'X'.
gs_layout_lvc-cwidth_opt = 'X'.
ENDFORM.
FORM FRM_DISPLAY_ALV . "alv显示
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
is_layout_lvc = gs_layout_lvc
it_fieldcat_lvc = gt_fcat_lvc
i_save = 'A'
TABLES
t_outtab = LT_STORETURN
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM.
注:
1、选择屏幕中的p_werks如果要显示为中文:菜单–转到–文本元素–选择文本–在对应的行中输入中文。
2、如果alv显示后,上面的一排菜单没反应的话,则去事务代码(se41),按图输入对应的程序及状态名:
SAPLKKBL
STANDARD_FULLSCREEN
**
说下abap程序对应事件的执行顺序:
**
1、INITIATION: 初始化事件,用于程序初始化,例如选择屏幕中字段默认值的填充。
2、START-OF-SELECTION: 选择开始事件,如果报表中含有选择屏幕,则在选择屏幕的处理结束后触发
3、END-OF-SELECTION:选择结束事件,如果程序中使用逻辑数据库,则在所有逻辑数据处理结束后触发。一般在该事件中输出列表。
4、AT SELECTION-SCREEN OUTPUT :显示选择屏幕之前触发。
5、AT SELECTION-SCREEN:选择屏幕PAI事件,用户在选择屏幕中执行某些功能后被触发(比如:当用户输入不正确的值时,给处错误消息)
6、TOP-OF-PAGE:页眉控制,在每个新页面开始时触发。
7、END-OF-PAGE:页脚控制,在当前页面结束时触发。
8、AT LINE-SELECTION:行选择控制,用户选择某列表行时触发。
9、AT USER-COMMAND : 用户交互控制,用户选择某个GUI功能时触发。
**
事件块的中止分为有条件中止和无条件中止。
**
1 、CHECK:根据条件中止
CHEXK:如果CHECK语句中的条件为假,则系统离开当前事件并转向下一个事件块。但是如果CHECK用在事件块内部的循环语句中,则只作用于当前循环。
2、STOP;EXIT:无条件中止
STOP:立即结束任何当前事件,直接转向END-OF-SELECTION.
EXIT:立即离开任何模块,直接转向列表输出屏幕,不执行END-OF-SELECTION。
**
补:增加alv增加自定义按钮的内容(在以上alv成功实现的情况下,需复制状态过来)
**
1、事务代码:se41
2、SAPLKKBL
STANDARD_FULLSCREEN
注意:第五步和第六步根据自己的程序名和想要命名的状态名去填写
3、打开GUI状态,然后双击,填写完3之后,在4的位置进行双击
4、输入对应的按钮名称,并选择对应的图标。
5、在alv的调用上添加对应的菜单项和按钮方法:
FORM FRM_DISPLAY_ALV .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
i_callback_pf_status_set = 'FRM_SET_STATUS' "一定要添加菜单调用的方法,不然添加菜单也出不来
i_callback_user_command = 'FRM_USER_COMMAND'"按钮调用事件
is_layout_lvc = gs_layout_lvc
it_fieldcat_lvc = gt_fcat_lvc
i_save = 'A'
TABLES
t_outtab = LT_STORETURN
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM.
FORM frm_set_status USING p_extab TYPE slis_t_extab.
SET PF-STATUS 'STANDARD_FULLSCREEN'.
ENDFORM.
FORM frm_user_command USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield.
CASE r_ucomm.
WHEN 'CREATE'.
MESSAGE '自定的按钮' TYPE 'I'.
ENDCASE.
ENDFORM.
**
补:alv增加checkbox可勾选,事件的创建:勾选一个,自动勾选相同类型的
**
1、定义的结构需要多一个列,用来存放复选框。
TYPES:BEGIN OF T_STORETURN,
SEL(1) TYPE c, "复选框字段
EBELN type EKPO-EBELN,
EBELP type EKPO-EBELP
END OF T_STORETURN.
2、在alv组件的定义的时候需要增加复选框的选项以及可编辑。
FORM FRM_SET_FIELDCAT .
DEFINE set_fieldcat.
CLEAR gs_fcat_lvc .
gs_fcat_lvc-fieldname = &1."内表的字段
gs_fcat_lvc-outputlen = &2."输出长度
gs_fcat_lvc-scrtext_l = &3."在ALV里面显示的名字
gs_fcat_lvc-just = &4."水平对齐方式,L左对齐,R右对齐。
gs_fcat_lvc-no_zero = &5."去除前导零
gs_fcat_lvc-checkbox = &6. "设置是否选择框
gs_fcat_lvc-hotspot = &7. "设置热点
gs_fcat_lvc-EDIT = &8."设置可编辑
gs_fcat_lvc-KEY = &9."设置key
APPEND gs_fcat_lvc TO gt_fcat_lvc .
END-OF-DEFINITION.
set_fieldcat: 'SEL' '' '选择' '' '' 'X' '' 'X' '',"这边的设置热点要为空,不然就选择不了,这个有点不懂,有知道的可以留言帮忙解惑下
'EBELN' '' '采购凭证' '' '' '' '' '' '',
'EBELP' '' '采购行项目' '' '' '' '' '' ''.
ENDFORM.
注:以上两步的完成,就可以实现alv前方增加一个checkbox了。
以下则是关于事件的创建(勾选一个,自动勾选其他数据一样的行):
3、事件的创建
"要先定义对应的变量
DATA:GO_GRID TYPE REF TO CL_GUI_ALV_GRID.
DATA: LT_EVENT TYPE SLIS_T_EVENT,
LS_EVENT TYPE SLIS_ALV_EVENT.
"添加一个方法用来创建事件
FORM FRM_SET_EVENT .
CLEAR LS_EVENT.
LS_EVENT-NAME = 'CALLER_EXIT'.
LS_EVENT-FORM = 'CALLER_EXIT'.
APPEND LS_EVENT TO LT_EVENT.
CLEAR LS_EVENT.
LS_EVENT-NAME = 'DATA_CHANGED'.
LS_EVENT-FORM = 'DATA_CHANGED'.
APPEND LS_EVENT TO LT_EVENT.
ENDFORM.
然后在alv显示的这边需要加一个事件参数
FORM FRM_DISPLAY_ALV .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
i_callback_pf_status_set = 'FRM_SET_STATUS' "一定要添加菜单调用的方法,不然添加菜单也出不来
i_callback_user_command = 'FRM_USER_COMMAND'"按钮调用事件
is_layout_lvc = gs_layout_lvc
it_fieldcat_lvc = gt_fcat_lvc
IT_EVENTS = LT_EVENT "事件参数这边需要添加
i_save = 'A'
TABLES
t_outtab = LT_STORETURN
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM.
接下来就是触发的逻辑以及对alv界面的刷新
""勾选单个数据时,把相同的数据也勾选
FORM DATA_CHANGED USING OR_DATA_CHANGED TYPE REF TO CL_ALV_CHANGED_DATA_PROTOCOL.
DATA: LS_MOD_CELLS TYPE LVC_S_MODI.
DATA: LV_TABIX TYPE SY-TABIX,
LV_OK TYPE CHAR1.
FIELD-SYMBOLS: <FS_VALUE> TYPE ANY.
CLEAR: LV_OK,LV_TABIX.
IF <FS_VALUE> IS ASSIGNED.
CLEAR: <FS_VALUE>.
ENDIF.
LOOP AT OR_DATA_CHANGED->MT_GOOD_CELLS INTO LS_MOD_CELLS.
IF LS_MOD_CELLS-FIELDNAME = 'SEL'.
CLEAR ls_STORETURN.
READ TABLE LT_STORETURN INTO ls_STORETURN INDEX LS_MOD_CELLS-ROW_ID.
IF SY-SUBRC = 0.
ls_STORETURN-SEL = LS_MOD_CELLS-VALUE.
MODIFY LT_STORETURN FROM ls_STORETURN TRANSPORTING SEL where EBELN = ls_STORETURN-EBELN.
ENDIF.
ENDIF.
ENDLOOP.
PERFORM FRM_REF_ALV.
ENDFORM.
FORM FRM_REF_ALV .
DATA: LS_STBL TYPE LVC_S_STBL.
LS_STBL-ROW = ABAP_TRUE.
LS_STBL-COL = ABAP_TRUE.
CALL METHOD GO_GRID->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = LS_STBL.
ENDFORM.
FORM CALLER_EXIT USING U_EXIT TYPE SLIS_DATA_CALLER_EXIT.
DATA LT_F4 TYPE LVC_T_F4.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
E_GRID = GO_GRID.
CALL METHOD GO_GRID->REGISTER_EDIT_EVENT
EXPORTING
I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_ENTER
EXCEPTIONS
ERROR = 1
OTHERS = 2.
CALL METHOD GO_GRID->REGISTER_EDIT_EVENT
EXPORTING
I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_MODIFIED
EXCEPTIONS
ERROR = 1
OTHERS = 2.
ENDFORM.
补:alv中可编制,并保存到数据库表中
注:在前面可以正常展示alv的前提下,做如下的增加:
ZT_RETURN_TOP:
data:ls_setting type lvc_s_glay.
ZT_RETURN_FRM
"这个方法内增加了&6可编辑和&7设置小数点
FORM FRM_SET_FIELDCAT . "设置显示的列名已经长度等基本属性
DEFINE set_fieldcat.
CLEAR gs_fcat_lvc .
gs_fcat_lvc-fieldname = &1."内表的字段
gs_fcat_lvc-outputlen = &2."输出长度
gs_fcat_lvc-scrtext_l = &3."在ALV里面显示的名字
gs_fcat_lvc-just = &4."水平对齐方式,L左对齐,R右对齐。
gs_fcat_lvc-no_zero = &5."去除前导零
gs_fcat_lvc-EDIT = &6."设置可编辑
gs_fcat_lvc-decimals = &7."修改有数字的时候要设置小数点位,不然会自动缩小100倍
APPEND gs_fcat_lvc TO gt_fcat_lvc .
END-OF-DEFINITION.
set_fieldcat:'CID' '' '航空公司代码' '' '' '' '',
'CNAME' '' '航空公司名称' '' '' '' '',
'FLYID' '' '航班号' '' '' '' '',
'FFROM' '' '起飞地' '' '' '' '',
'FDEST' '' '目的地' '' '' '' '',
'FLYFARE' '' '机票金额' '' '' 'X' '2',
'CURCY' '' '货币码' '' '' '' '',
'ISPAUSE' '' '航班状态' '' '' '' ''.
ENDFORM.
"在alv显示的方法这边增加了个i_grid_settings = ls_setting:用来回传编辑后的值
FORM FRM_DISPLAY_ALV . "alv显示
ls_setting-edt_cll_cb = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
is_layout_lvc = gs_layout_lvc
it_fieldcat_lvc = gt_fcat_lvc
i_callback_pf_status_set = 'FRM_SET_STATUS' "一定要添加菜单调用的方法,不然添加菜单也出不来
i_callback_user_command = 'FRM_USER_COMMAND'"按钮调用事件
i_save = 'A'
i_grid_settings = ls_setting
TABLES
t_outtab = LT_RETURN
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM.
"最后自定义按钮去执行对应的事件就可以
FORM frm_user_command USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield.
CASE r_ucomm.
WHEN '&DATA_SAVE'.
MODIFY YFLYPLAN999 from TABLE LT_RETURN.
ENDCASE.
ENDFORM.
RS_SELFIELD:可以获取到修改的列名以及值
OOALV
1、总的include
INCLUDE zooalv_top."定义的变量
include zooalv_method. "ooalv的事件,这个要放在包含CREATE OBJECT EVENT_RECEIVER的include之前,不然会报错
INClUDE zooalv_sel."选择屏幕
include zooalv_frm."定义的方法
2、INCLUDE zooalv_top
这边主要是定义ooalv中会用到的各种变量,事件LCL_EVENT_RECEIVER也在这边定义
CLASS LCL_EVENT_RECEIVER DEFINITION DEFERRED.
"用来存放屏幕点击的按键
DATA: OK_CODE LIKE SY-UCOMM.
"ALV容器类
DATA: G_DOCKING TYPE REF TO CL_GUI_DOCKING_CONTAINER.
"ALV分割容器
DATA: G_SPLITTER TYPE REF TO CL_GUI_SPLITTER_CONTAINER.
"ALV容器
DATA: G_CONTAINER_UP TYPE REF TO CL_GUI_CONTAINER,
G_GRID_UP TYPE REF TO CL_GUI_ALV_GRID. "ALV对象
"ALV容器
DATA: G_CONTAINER_DOWN TYPE REF TO CL_GUI_CONTAINER.
DATA:LT_FLY TYPE TABLE OF YFLYPLAN999,
LS_FLY TYPE YFLYPLAN999.
"ALV样式
DATA: LS_LAYOUT TYPE LVC_S_LAYO.
"ALV的输出列表工作区
DATA:LS_FIELDCAT_UP TYPE LVC_T_FCAT.
DATA: LS_VARIANT TYPE DISVARIANT.
DATA: GV_ROW TYPE I VALUE 1.
DATA:EVENT_RECEIVER TYPE REF TO LCL_EVENT_RECEIVER.
DATA: L_FLAG TYPE C.
"菜单
DATA: LS_TOOLBAR TYPE UI_FUNCTIONS.
3、INCLUDE ZOOALV_METHOD
CLASS LCL_EVENT_RECEIVER DEFINITION. "事件定义
PUBLIC SECTION.
DATA: ERROR_IN_DATA TYPE C.
METHODS:
*---定义ALV按钮事件
HANDLE_TOOLBAR FOR EVENT TOOLBAR OF CL_GUI_ALV_GRID
IMPORTING
E_OBJECT
E_INTERACTIVE,
*---用户双击事件
HANDLE_DOUBLE_CLICK FOR EVENT DOUBLE_CLICK OF CL_GUI_ALV_GRID
IMPORTING
E_ROW
E_COLUMN
ES_ROW_NO,
*---数据修改事件
HANDLE_DATA_CHANGED FOR EVENT DATA_CHANGED OF CL_GUI_ALV_GRID
IMPORTING
ER_DATA_CHANGED,
*---数据修改完成事件
HANDLE_DATA_CHANGED_FINISHED FOR EVENT DATA_CHANGED_FINISHED OF CL_GUI_ALV_GRID
IMPORTING
SENDER
E_MODIFIED
ET_GOOD_CELLS,
*---ALV按钮功能事件
HANDLE_USER_COMMAND FOR EVENT USER_COMMAND OF CL_GUI_ALV_GRID
IMPORTING
E_UCOMM.
"自定义校验列
METHODS: check_curcy
IMPORTING ps_change TYPE lvc_s_modi
pr_data_changed TYPE REF TO cl_alv_changed_data_protocol.
ENDCLASS.
CLASS LCL_EVENT_RECEIVER IMPLEMENTATION.
"增加自定义按钮
METHOD HANDLE_TOOLBAR.
DATA: L_BUTTON TYPE STB_BUTTON.
CLEAR L_BUTTON.
L_BUTTON-BUTN_TYPE = 3. "分隔符 |
APPEND L_BUTTON TO E_OBJECT->MT_TOOLBAR.
CLEAR L_BUTTON.
L_BUTTON-FUNCTION = 'EXCEL_IN'.
L_BUTTON-ICON = ICON_POSITION.
L_BUTTON-TEXT = '导入'.
APPEND L_BUTTON TO E_OBJECT->MT_TOOLBAR.
ENDMETHOD.
"数据修改结束后的操作
METHOD HANDLE_DATA_CHANGED_FINISHED.
DATA: LS_GOOD TYPE LVC_S_MODI,
LS_FLAG TYPE C VALUE '0'.
DATA: L_FIRST TYPE SY-DATUM,
L_LAST TYPE SY-DATUM,
LV_DATE TYPE SY-DATUM.
DATA: COLNAME(10).
"如果修改成功,刷新ALV
CHECK E_MODIFIED = 'X'.
"PERFORM FRM_REFRESH_ALV.
ENDMETHOD.
"alv修改数据时候触发的事件
METHOD HANDLE_DATA_CHANGED.
DATA: LV_VALUE TYPE LVC_VALUE,
L_SUBRC LIKE SY-SUBRC.
DATA: LS_GOOD TYPE LVC_S_MODI.
ERROR_IN_DATA = SPACE.
SORT ER_DATA_CHANGED->MT_MOD_CELLS BY ROW_ID."对发生改变所有单元格进行排序
LOOP AT ER_DATA_CHANGED->MT_MOD_CELLS INTO LS_GOOD.
*获取改变的数据(列名,行数)
* CALL METHOD ER_DATA_CHANGED->GET_CELL_VALUE
* EXPORTING
* I_ROW_ID = LS_GOOD-ROW_ID
* I_FIELDNAME = LS_GOOD-FIELDNAME
* IMPORTING
* E_VALUE = LV_VALUE.
CLEAR L_FLAG.
IF ls_good-fieldname = 'CURCY'.
"这边增加了个方法,针对修改的列进行校验等操作
CALL METHOD check_curcy
EXPORTING
ps_change = ls_good
pr_data_changed = er_data_changed.
ENDIF.
"显示错误信息
IF L_FLAG EQ 'X'.
CALL METHOD er_data_changed->display_protocol.
ENDIF.
ENDLOOP.
GV_ROW = LS_GOOD-ROW_ID.
IF GV_ROW = 0.
GV_ROW = 99999999.
ENDIF.
ENDMETHOD. "HANDLE_DATA_CHANGED.
"触发对应自定义按钮事件
METHOD HANDLE_USER_COMMAND.
CASE E_UCOMM .
WHEN 'EXCEL_IN' .
MESSAGE '自定义导入按钮' TYPE 'I'.
ENDCASE.
ENDMETHOD.
"双击alv事件
METHOD HANDLE_DOUBLE_CLICK.
DATA: LV_WERKS TYPE MARC-WERKS,
LV_MATNR TYPE MARC-MATNR.
MESSAGE '双击成功' TYPE 'S'.
"READ TABLE gt_alv INDEX rs_selfield-tabindex INTO DATA(wa_sel_temp). "获取击行
ENDMETHOD. "HANGDLE_DOUBLE_CLICK
"自定义校验列的方法
METHOD check_curcy.
DATA: l_CURCY TYPE CURCY.
"获取修改值
CALL METHOD pr_data_changed->get_cell_value
EXPORTING
i_row_id = ps_change-row_id
i_fieldname = ps_change-fieldname
IMPORTING
e_value = l_CURCY.
select *
INTO TABLE @data(lt_TCURC)
FROM TCURC
WHERE WAERS = @l_CURCY.
IF SY-SUBRC <> 0.
L_FLAG = 'X'.
"MESSAGE '输入的值有误' TYPE 'I'.
ENDIF.
ENDMETHOD.
ENDCLASS.
4、ZOOALV_SEL
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-s01. "Model Option
PARAMETERS p_cid02 type YFLYPLAN999-cid.
SELECTION-SCREEN: END OF BLOCK b1.
START-OF-SELECTION.
call SCREEN 2000.
5、ZOOALV_FRM
"屏幕2000的按钮方法,需要先复制一个gui状态过来并引用才可以调用到按钮名称
MODULE USER_COMMAND_2000 INPUT.
CASE OK_CODE.
WHEN 'BACK' OR 'CANCEL'.
LEAVE TO SCREEN 0.
WHEN 'EXIT'.
LEAVE PROGRAM.
WHEN 'SAVE'.
"PERFORM FRM_SAVEDATE.
ENDCASE.
CLEAR OK_CODE.
ENDMODULE.
"这边调用对应的gui状态和标题
MODULE STATUS_2000 OUTPUT.
SET PF-STATUS '2000'. "调用菜单"
SET TITLEBAR '1000'.
"这边可以去设置显示的alv要分成几部分,这边分成了2部分,就写了上面的部分,下面没写
****************分成上下两个页面*******
PERFORM FRM_CREATE_CONTAINER. "容器创建
PERFORM FRM_OBJECT_UP. "上屏
"PERFORM FRM_OBJECT_DOWN. "下屏
****************分成上下两个页面*******
ENDMODULE.
"容器创建
FORM FRM_CREATE_CONTAINER .
CHECK G_DOCKING IS INITIAL.
CREATE OBJECT G_DOCKING
EXPORTING
REPID = SY-REPID
DYNNR = SY-DYNNR
EXTENSION = 2000. "初始界面宽度
"这边设置界面的分布
*--分割容器,2行1列
CREATE OBJECT G_SPLITTER
EXPORTING
PARENT = G_DOCKING
ROWS = 2
COLUMNS = 1.
*---设置容器对象
G_CONTAINER_UP = G_SPLITTER->GET_CONTAINER( ROW = 1
COLUMN = 1 ).
G_CONTAINER_DOWN = G_SPLITTER->GET_CONTAINER( ROW = 2
COLUMN = 1 ).
ENDFORM.
FORM FRM_OBJECT_UP .
PERFORM FRM_GET_UPDATA. "获取数据
PERFORM FRM_GET_LAYOUT. "ALV样式设定
PERFORM FRM_GET_FIELDCAT_UP. "ALV字段目录
PERFORM EXCLUDE_TB_FUNCTIONS CHANGING LS_TOOLBAR. "删除不需要的按钮
"创建ALV对象
IF G_GRID_UP IS INITIAL.
CREATE OBJECT G_GRID_UP
EXPORTING
I_PARENT = G_CONTAINER_UP.
ENDIF.
"布局设置
CLEAR: LS_VARIANT.
LS_VARIANT-REPORT = SY-REPID && 'UP'.
CALL METHOD G_GRID_UP->SET_TABLE_FOR_FIRST_DISPLAY "ALV显示
EXPORTING
I_SAVE = 'U'
IS_LAYOUT = LS_LAYOUT "ALV输出样式
I_DEFAULT = 'X' "默认布局
I_BUFFER_ACTIVE = 'X'
IT_TOOLBAR_EXCLUDING = LS_TOOLBAR"需要删除不需要的按钮,这边需要这个参数
IS_VARIANT = LS_VARIANT
CHANGING
IT_OUTTAB = LT_FLY
IT_FIELDCATALOG = LS_FIELDCAT_UP
EXCEPTIONS
INVALID_PARAMETER_COMBINATION = 1
PROGRAM_ERROR = 2
TOO_MANY_LINES = 3
OTHERS = 4.
CALL METHOD G_GRID_UP->REGISTER_EDIT_EVENT "调用事件
EXPORTING
I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_MODIFIED.
CREATE OBJECT EVENT_RECEIVER.
"增加自定义菜单按钮事件
SET HANDLER EVENT_RECEIVER->HANDLE_TOOLBAR FOR G_GRID_UP.
"双击事件
SET HANDLER EVENT_RECEIVER->HANDLE_DOUBLE_CLICK FOR G_GRID_UP.
"修改结束后事件
SET HANDLER EVENT_RECEIVER->HANDLE_DATA_CHANGED_FINISHED FOR G_GRID_UP.
"数据修改时间
SET HANDLER EVENT_RECEIVER->HANDLE_DATA_CHANGED FOR G_GRID_UP.
"按钮触发事件
SET HANDLER EVENT_RECEIVER->HANDLE_USER_COMMAND FOR G_GRID_UP.
"设置alv中是否允许编辑
CALL METHOD G_GRID_UP->SET_READY_FOR_INPUT
EXPORTING
I_READY_FOR_INPUT = 1. "0:不可编辑;1:可编辑
"刷新alv
PERFORM FRM_REFRESH_ALV.
ENDFORM.
FORM FRM_GET_UPDATA .
SELECT *
INTO TABLE LT_FLY
FROM YFLYPLAN999.
ENDFORM.
FORM FRM_GET_LAYOUT .
CLEAR: LS_LAYOUT.
* LS_LAYOUT-CWIDTH_OPT = 'X'. "自适应列宽
* LS_LAYOUT-BOX_FNAME = 'BOX'. "选择框
LS_LAYOUT-SEL_MODE = 'A'. "复选按钮
LS_LAYOUT-ZEBRA = 'X'. "表格条纹形式
LS_LAYOUT-STYLEFNAME = 'CELLSTAB'. "设置可编辑信息
* LS_LAYOUT-CTAB_FNAME = 'CELLCOLOR'. "设置单元格颜色信息
ENDFORM.
FORM FRM_GET_FIELDCAT_UP .
REFRESH LS_FIELDCAT_UP.
PERFORM FRM_FIELD_APPEND USING:
LS_FIELDCAT_UP 'CID' '代码' '' '' '8' '' '' '' '' '' '' '' 'YFLYPLAN999' 'CID' ,
LS_FIELDCAT_UP 'CNAME' '名称' '' '' '12' '' '' '' '' '' '' '' 'YFLYPLAN999' 'CNAME' ,
LS_FIELDCAT_UP 'FLYID' '航班号' '' '' '12' '' '' '' '' '' '' '' 'YFLYPLAN999' 'FLYID' ,
LS_FIELDCAT_UP 'FFROM' '起飞地' '' '' '15' '' '' '' '' '' '' '' 'YFLYPLAN999' 'FFROM' ,
LS_FIELDCAT_UP 'FDEST' '目的地' '' '' '10' '' '' '' '' '' '' '' 'YFLYPLAN999' 'FDEST' ,
LS_FIELDCAT_UP 'FLYFARE' '机票金额' '' '' '12' '' '' '' '' '' '' '' 'YFLYPLAN999' 'FLYFARE' ,
LS_FIELDCAT_UP 'CURCY' '货币码' 'X' '' '8' '' '' '' '' '' '' '' 'YFLYPLAN999' 'CURCY' ,
LS_FIELDCAT_UP 'ISPAUSE' '航班状态' '' '' '12' '' '' '' '' '' '' '' 'YFLYPLAN999' 'ISPAUSE'.
ENDFORM.
FORM FRM_FIELD_APPEND USING IT_FIELDCAT TYPE LVC_T_FCAT "字段目录内表
FIELD_NAME "字段名
FIELD_TEXT "字段描述
FIELD_EDIT "是否可编辑
FIELD_KEY "关键字段
FIELD_LENTH_O "输出长度
FIELD_DECI "小数位
FIELD_DECI_O "显示的小数位
FIELD_NO_ZERO "隐藏零
FIELD_NO_OUT "是否输出显示
FIELD_CHECKBOX "复选框
FIELD_ICON "图标,居中显示
FIELD_EMPHASIZE "颜色
FIELD_REF_TABLE "参考表
FIELD_REF_FIELD. "参考字段
DATA: LS_FIELDCAT TYPE LVC_S_FCAT.
DATA L_TEXT TYPE CHAR50.
IF L_TEXT IS INITIAL.
L_TEXT = FIELD_TEXT.
ENDIF.
CLEAR: LS_FIELDCAT.
LS_FIELDCAT-FIELDNAME = FIELD_NAME. "字段名
LS_FIELDCAT-REPTEXT = L_TEXT. "字段描述
LS_FIELDCAT-EDIT = FIELD_EDIT. "是否可编辑
LS_FIELDCAT-KEY = FIELD_KEY. "关键字段
LS_FIELDCAT-OUTPUTLEN = FIELD_LENTH_O. "输出长度
LS_FIELDCAT-DECIMALS = FIELD_DECI. "小数位
LS_FIELDCAT-DECIMALS_O = FIELD_DECI_O. "显示的小数位
LS_FIELDCAT-NO_ZERO = FIELD_NO_ZERO. "隐藏零
LS_FIELDCAT-NO_OUT = FIELD_NO_OUT. "是否输出
LS_FIELDCAT-CHECKBOX = FIELD_CHECKBOX. "复选框
LS_FIELDCAT-ICON = FIELD_ICON. "图标,居中显示
LS_FIELDCAT-EMPHASIZE = FIELD_EMPHASIZE. "颜色
LS_FIELDCAT-REF_TABLE = FIELD_REF_TABLE.
LS_FIELDCAT-REF_FIELD = FIELD_REF_FIELD.
LS_FIELDCAT-INTLEN = '200'.
APPEND LS_FIELDCAT TO IT_FIELDCAT.
ENDFORM.
FORM FRM_REFRESH_ALV .
DATA: LS_STBL TYPE LVC_S_STBL.
LS_STBL-ROW = 'X'.
LS_STBL-COL = 'X'.
CALL METHOD G_GRID_UP->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = LS_STBL.
ENDFORM. " FRM_REFRESH_ALV
FORM EXCLUDE_TB_FUNCTIONS CHANGING PT_EXCLUDE TYPE UI_FUNCTIONS.
DATA LS_EXCLUDE TYPE UI_FUNC.
LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_CHECK.
APPEND LS_EXCLUDE TO PT_EXCLUDE.
LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_INSERT_ROW.
APPEND LS_EXCLUDE TO PT_EXCLUDE.
LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_DELETE_ROW.
APPEND LS_EXCLUDE TO PT_EXCLUDE.
LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_COPY.
APPEND LS_EXCLUDE TO PT_EXCLUDE.
LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_LY_NO_DELETE_ROWS.
APPEND LS_EXCLUDE TO PT_EXCLUDE.
LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_PASTE.
APPEND LS_EXCLUDE TO PT_EXCLUDE.
LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_MOVE_ROW.
APPEND LS_EXCLUDE TO PT_EXCLUDE.
LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_CUT.
APPEND LS_EXCLUDE TO PT_EXCLUDE.
LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_COPY_ROW.
APPEND LS_EXCLUDE TO PT_EXCLUDE.
LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_PASTE_NEW_ROW.
APPEND LS_EXCLUDE TO PT_EXCLUDE.
LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_APPEND_ROW.
APPEND LS_EXCLUDE TO PT_EXCLUDE.
LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_REFRESH.
APPEND LS_EXCLUDE TO PT_EXCLUDE.
ENDFORM.
6、2000屏幕
我们去复制或者新建一个gui状态,调用的时候这边会生成一行菜单,而我们ooalv也会有一行菜单,就比较不美观,所以要把状态自带的哪个菜单取消掉
打开屏幕的属性,把如下打钩即可。
在屏幕的元素清单这边,需要输入如下名称,该名称对应我们top中设置的变量名,设置完,才可以获取屏幕返回的按钮的名称。
7、2000状态
这边设置对应按钮的名称,然后设置点击事件,也可以用初始化的按钮名称。