一,报表alv:alv grid ooalv alv list
A,事件:
- load-of-program
- initializtion
- at selection-screenoutput
- at selection-screen
- start-of-selection
- end-of-selection
- top-of-page
- end-of-page
- at line-selection
- at user-command
B,单元格可编辑:
整体可编辑:gs_layout–edit = ‘X’.
某列可编辑:gt_fieldcat–edit = ‘X’.
单元格可编辑:只能使用REUSE_ALV_GRID_DISPLAY_LVC,并且还作以下一些设置:
cellstab TYPE lvc_t_styl,“在输出内表中加上这一类型的列
“先将所有单元格设置为可编辑状态
gt_fieldcat–edit = ‘X’.
DATA: gt_cellstab TYPE lvc_t_styl WITH HEADER LINE.
“再将原本可编辑的单元格切换到不可编辑样式。注:这里只是样式的切换,不能仅仅使用cl_gui_alv_grid=>mc_style_enabled来将单元格设置为可编辑状态,单元格真正是否可编辑是由fieldcat-edit或layout-edit来决定的,而仅设置为cl_gui_alv_grid=>mc_style_enabled是不可编辑的
gt_cellstab–style = cl_gui_alv_grid=>mc_style_disabled.
APPEND gt_cellstab.
gt_data–cellstab = gt_cellstab[].
gs_layout–stylefname = ‘CELLSTAB’.“数据内表中哪列为可编辑信息内表
C,单元格数据修改后立即自动刷新
单元格中的数据被修改后,将ALV单元格中的数据立即刷新到ABAP对应的内表中:
DATA: G_GRID TYPE REF TO CL_GUI_ALV_GRID.
FORM USER_COMMAND USING UCOMM LIKE SY–UCOMM
RS_SELFIELD TYPE SLIS_SELFIELD. “#EC CALLED
DATA: L_LINE TYPE I,
L_INDEX TYPE I.
DATA: L_VALID TYPE CHAR01.
* 刷新ALV报表
CALL FUNCTION ‘GET_GLOBALS_FROM_SLVC_FULLSCR’
IMPORTING
E_GRID = G_GRID.
CALL METHOD G_GRID->CHECK_CHANGED_DATA.
CASE UCOMM.
WHEN ‘CHANGE’.
*更改销售订单
PERFORM CHANGE_SO_DATA .
WHEN OTHERS.
ENDCASE.
RS_SELFIELD–REFRESH = ‘X’.
RS_SELFIELD–COL_STABLE = ‘X’.
RS_SELFIELD–ROW_STABLE = ‘X’.
ENDFORM. “user_command
数据有效性验证事件:data_changed
2 种方式:
²按回车触发: i_event_id = cl_gui_alv_grid=>mc_event_enter
²单元格失去焦点: i_event_id = cl_gui_alv_grid=>mc_event_modifies
必须设置一种方式,要不然数据变化事件不会被触发事件
字段可编辑遇到的问题:
ALV 可编辑状态修改数字字段,保存后会自动减少1000倍
加一句,GT_FIELDCAT_0100-DECIMALS = 3. 就可以了
选择屏幕做搜索帮助
两种方式
1,SE11自建搜索帮助,然后选择屏幕字段参考
2,内表,函数F4IF_INT_TABLE_VALUE_REQUEST
二,程序优化:
A,for all entries:注意1,in后面时候为空一定要判断,2,保证内表取出的数据有主键,排序去重,3,in后面内
表数据不能太大,4,这个语句虽然方便但是占内存,
B,建正确的索引
C,尽量减少数据库的访问,能一次取就一次取,尽量减少数据库的访问次数
D,loop里尽量不要写select ,loop套loop的话要减少外层的循环次数,
E,对于大表mseg,mkpf,lips等表尽量少用innerjoin,根据条件尽量少选更少的数据在内表处理。
F,批量保存的是可以采用异步保存可以大大提高效率