以一个极好alv的例子来说说alv开发
来源:互联网 发布:广州 荔湾区 骏域网络 编辑:程序博客网 时间:2024/04/29 11:23
ALV开发一般流程
第一步:定义ALV所要用到的类型池:TYPE-POOLS: SLIS
第二步:定义ALV所要显示的数据对应的内表数据类型及内表数据对象
第三步:定义一些显示ALV时所要使用到的变量
DATA:i_fieldcat_alv TYPE SLIS_T_FIELDCAT_ALV, "定义ALV列字段相关类型数据(列标题属性信息)SLIS_T_FIELDCAT_ALV 是一个无表头行的表结构体
i_fieldcat TYPE SLIS_FIELDCAT_ALV, "定义对象 SLIS_FIELDCAT_ALV是一个结构体所以i_fieldcat是工作区
i_layout TYPE SLIS_LAYOUT_ALV, "定义布局类型数据对象 SLIS_LAYOUT_ALV是一个结构体
i_events TYPE SLIS_T_EVENT, "alv事件 SLIS_T_EVENT是一个无表头行的表结构体 i_events 是一个无表头行的内表
w_events LIKE LINE OF i_events, "定义一个与i_events结构相同的工作区
i_list_comments TYPE SLIS_T_LISTHEADER, "alv表单标题区域设置 i_list_comments 是一个无表头行的表结构体
w_list_comments LIKE LINE OF i_list_comments, "定义一个与i_list_comments内表行结构相同的工作区
w_repid LIKE SY-REPID. "ABAP程序,我们一般取当前程序
第四步:定义选择屏幕
第五步:声明各个选择屏幕事件块
定义start-of-selection部分,在这通常会调用各种子程序.
*选择屏幕
SELECTION-SCREEN BEGIN OF BLOCK block1 WITH FRAME TITLE t1.
SELECT-OPTIONS:s_infnr FOR EINE-INFNR MEMORY ID INF."信息记录号码
PARAMETERS:PR_LOEKZ TYPE C AS CHECKBOX DEFAULT ''. "显示有删除标志的信息记录
SELECT-OPTIONS:s_ekorg FOR EINE-EKORG MEMORY ID EKO."采购组织
SELECT-OPTIONS:s_matnr FOR EINA-MATNR MEMORY ID MAT."物料编号
SELECT-OPTIONS:s_lifnr FOR EINA-LIFNR MEMORY ID LIF."供应商编号
SELECT-OPTIONS:s_erdat FOR EINA-ERDAT MEMORY ID erd."创建日期
SELECT-OPTIONS:s_urznr FOR EINA-URZNR MEMORY ID urz."批准号
SELECTION-SCREEN END OF BLOCK block1.
*初始化事件
INITIALIZATION.
t1 = '采购查询'.
*屏幕开始事件
START-OF-SELECTION.
PERFORM getdata.
PERFORM events_build.
PERFORM layout_build.
PERFORM fieldcat_build.
PERFORM alv_display_data.
FORM layout_build:定义布局
FORM layout_build.
i_layout-ZEBRA = 'X'. "ALV表格按斑马线条纹显示
i_layout-COLWIDTH_OPTIMIZE = 'X'. "将ALV字段宽度设置为最优化
i_layout-INFO_FIELDNAME = 'COLOR'. "設置顏色FIELD
w_repid = SY-REPID.
ENDFORM.
FORM fieldcat_build:列标题属性信息
FORM fieldcat_build.
REFRESH i_fieldcat_alv.
CLEAR i_fieldcat.
DATA column TYPE I VALUE 1.
i_fieldcat-COL_POS = column.
i_fieldcat-FIELDNAME = 'INFNR'.
i_fieldcat-SELTEXT_S = '采购信息记录'.
i_fieldcat-SELTEXT_M = '采购信息记录'.
i_fieldcat-SELTEXT_L = '采购信息记录'.
"i_fieldcat-reptext_ddic = '采购信息记录号'.
i_fieldcat-LZERO = 'X'. "字义字段前导以"0"的形式显示
i_fieldcat-KEY = 'X'.
i_fieldcat-HOTSPOT = 'X'."设置字段是否有热点(热点字段显示有下划线)
i_fieldcat-EMPHASIZE = 'C300'."设置字段颜色
APPEND i_fieldcat TO i_fieldcat_alv.
CLEAR i_fieldcat.
column = column + 1.
i_fieldcat-COL_POS = column.
i_fieldcat-FIELDNAME = 'LIFNR'.
i_fieldcat-SELTEXT_S = '供应商号码'.
i_fieldcat-SELTEXT_M = '供应商号码'.
i_fieldcat-SELTEXT_L = '供应商号码'.
"i_fieldcat-reptext_ddic = '供应商号码'.
i_fieldcat-LZERO = 'X'.
i_fieldcat-KEY = 'X'.
i_fieldcat-HOTSPOT = 'X'.
APPEND i_fieldcat TO i_fieldcat_alv.
CLEAR i_fieldcat.
ENDFORM.
FORM events_build:所有事件处理比如alv表头和表尾的设置,以及'USER_COMMAND等等都可以在这里实现。
FORM events_build.
CALL FUNCTION 'REUSE_ALV_EVENTS_GET' "输出一个内表类型是SLIS_T_EVENT,包含两个字段,一个是事件名称,另一个是处理事件的FORM名称,
EXPORTING
I_LIST_TYPE = 0
IMPORTING
ET_EVENTS = i_events
EXCEPTIONS
LIST_TYPE_WRONG = 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.
*对FUNCTION 'REUSE_ALV_EVENTS_GET' 说明一下,此function 是获取所有事件的名称,对应表里面的name字段
*而另外一个字段是form,执行这个function之后只是获得了事件名称,而form都是空的。需要程序员根据需要自己添加
*下面讲如何写form
首先:根据name来read内表i_events
READ TABLE i_events WITH KEY NAME = 'TOP_OF_PAGE' INTO w_events.
IF SY-SUBRC = 0.
MOVE 'ALV_TOP_OF_PAGE' TO w_events-form. "相应的form赋值,这里只是form的名称,form的写法和其他的form相同。
MODIFY i_events FROM w_events INDEX SY-TABIX.
ENDIF.
READ TABLE i_events INTO w_events WITH KEY NAME = 'USER_COMMAND'.
IF SY-SUBRC EQ 0.
MOVE 'ALV_USER_COMMAND' TO w_events-form. "用户指令的处理事件
MODIFY i_events FROM w_events INDEX SY-TABIX.
ENDIF.
READ TABLE i_events WITH KEY NAME = 'END_OF_LIST' INTO w_events.
IF SY-SUBRC = 0.
MOVE 'ALV_END_OF_LIST' TO w_events-form. ”显示表尾信息
MODIFY i_events FROM w_events INDEX SY-TABIX.
ENDIF.
ENDFORM.
i_events内表字段form 相应的form的创建。
FORM ALV_TOP_OF_PAGE. "ALV表头信息
CLEAR:i_list_comments.
w_list_comments-typ = 'H'.
w_list_comments-key = ''.
w_list_comments-info = '采购信息记录查询报表'.
APPEND w_list_comments TO i_list_comments.
CLEAR w_list_comments.
DATA:date_temp(30) TYPE C.
WRITE: SY-DATUM TO date_temp MM/DD/YYYY.
CONCATENATE '日期:' date_temp INTO date_temp.
CONCATENATE date_temp '. IT部' INTO date_temp.
w_list_comments-typ = 'S'.
w_list_comments-key = ''.
w_list_comments-info = date_temp.
APPEND w_list_comments TO i_list_comments.
CLEAR w_list_comments.
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE' "输出注释
EXPORTING
IT_LIST_COMMENTARY = i_list_comments
I_LOGO = 'ENJOYSAP_LOGO'
I_END_OF_LIST_GRID = 'X'
* I_ALV_FORM =
.
ENDFORM.
FORM ALV_END_OF_LIST.
CLEAR:i_list_comments.
w_list_comments-typ = 'S'.
w_list_comments-info = '确认:________采购申请人:___________________'.
APPEND w_list_comments TO i_list_comments.
CLEAR w_list_comments.
w_list_comments-typ = 'S'.
w_list_comments-info = 'Create By Information Department'.
APPEND w_list_comments TO i_list_comments.
CLEAR w_list_comments.
DATA:data_temp(30) TYPE C.
CONCATENATE '打印者:' SY-UNAME INTO data_temp.
w_list_comments-typ = 'S'.
w_list_comments-info = data_temp.
APPEND w_list_comments TO i_list_comments.
CLEAR w_list_comments.
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
IT_LIST_COMMENTARY = i_list_comments
I_LOGO = 'ENJOYSAP_LOGO'
I_END_OF_LIST_GRID = 'X'
* I_ALV_FORM =
.
ENDFORM.
FORM ALV_USER_COMMAND USING i_ucomm TYPE SY-UCOMM i_selfield TYPE SLIS_SELFIELD.
CASE i_ucomm.
WHEN '&IC1'. "对于热点链接,所对应的动作码为"&IC1"
IF i_selfield-FIELDNAME EQ 'INFNR'. "判断用户当前单击的是哪列
PERFORM call_tran USING i_selfield. "调用自定义事务
ENDIF.
ENDCASE.
ENDFORM.
FORM call_tran USING i_selfield TYPE SLIS_SELFIELD.
"SET SCREEN 0. "返回主屏幕
READ TABLE hd_itab INDEX i_selfield-tabindex. "i_selfield-tabindex 当击行索引,从内表中提取数据
IF SY-SUBRC = 0.
SET PARAMETER ID 'MAT' FIELD hd_itab-MATNR. "MAT指参数ID
SET PARAMETER ID 'LIF' FIELD hd_itab-LIFNR.
SET PARAMETER ID 'EKO' FIELD hd_itab-EKORG.
SET PARAMETER ID 'INF' FIELD hd_itab-INFNR.
CALL TRANSACTION 'ME13'."AND SKIP FIRST SCREEN "调用其它事务 ME13是我们要调用的事务
ENDIF.
ENDFORM.
写到这里我们就可以显示alv了
*&---------------------------------------------------------------------------*
*& FORM ALV DISPLAY DATA
*&---------------------------------------------------------------------------*
FORM alv_display_data.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_CALLBACK_PROGRAM = w_repid
I_GRID_TITLE = '采购信息记录汇总查询'
IS_LAYOUT = i_layout
IT_FIELDCAT = i_fieldcat_alv[]
IT_EVENTS = i_events[]
TABLES
T_OUTTAB = hd_itab[]
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的例子来说说alv开发
- 一个极好的ALV例子
- 一个简单ALV的例子
- 一个简单ALV的例子
- ALV一个百度文库的例子
- 有页头页脚的ALV例子
- 有页头页脚的ALV例子
- ALV例子
- ALV 例子
- 关于ALV双击 调用事务的一个例子
- 一个ALV(OO)的实例
- 一个ALV报表的模板
- ALV
- alv
- ALV
- alv
- ABAP的ALV报表开发
- 开发ALV的基本流程
- vb中如何加载vb mousewheel.dll
- GNU make 指南
- C++设计模式之十八--Chain of Responsibility责任链模式
- 看看递归路由
- Codeforces Round #122 (Div. 2) B. Square
- 以一个极好alv的例子来说说alv开发
- V$FIXED_TABLE & V$FIXED_VIEW_DEFINITION
- UVA - 10608 Friends
- C++中this指针的用法
- linux内核研究2
- 有向图的邻接表建立及其深搜宽搜
- dom4j使用递归的方法输出xml元素的所有值
- win7 wifi 设置 无线 5分钟断开
- C51模拟PS2键盘(二)