ALV完整功能代码实现
alv各种设置
目录1.将得到并整理好的数据以ALV的形式显示出来 (4)1.1.在子FORM(这里如:F_FIELDS)指定需要显示的字段 (4)1.2.在子FORM(这里如:F_BUILD_LAYOUT)里设置ALV的全局属性 (5)1.3.在子FORM(这里如:F_DISPLAY)里将内表中的数据进行显示 (5)1.4.为ALV程序添加表头标题(这里以添加HTML表头标题为主) (6)1.4.1.在显示ALV的函数(REUSE_ALV_GRID_DISPLAY_LVC)里添加一个参数 (6)1.4.2.在子FORM(F_TOP_OF_PAGE)里定义好需要的变量 (6)1.4.3.准备好所需数据,如登录用户的描述、制表日期等 (6)1.4.4.将表头数据输出 (7)2.函数“REUSE_ALV_GRID_DISPLAY_LVC”中输入参数的应用 (8)2.1.排序 (8)2.1.1.在显示ALV的子FORM里定义排序用到的变量 (8)2.1.2.设置好需要排序的字段 (8)2.1.3.在显示ALV的函数的输入参数里添加排序的属性 (9)2.2.隐藏不必要的标准按钮 (9)2.2.1.先在显示ALV的子FORM里定义隐藏按钮用到的变量 (9)2.2.2.得到需要隐藏的标准按钮的“FCODE” (9)2.3.自定义“工具栏” (10)2.3.1.在显示ALV的函数的输入参数里指定自定义按钮的子FORM (10)3.热点链接、用户动作的捕捉、调用其他程序或标准事务程序 (11)3.1.在显示ALV的函数的输入参数里指定捕捉用户动作的子FORM (11)3.2.在“字段和列名”的子FORM(F_FIELDS)里,对需要链接的列添加“热点”属性 (11)3.3.操作代码 (12)3.4.显示具体细节 (13)3.5.调用其他事务 (15)3.6.打开并选择文件: (15)4.关于设置字段和列名的子FORM(F_FIELDS)的参数设置: (16)4.1.单列优化宽度 (16)4.2.单列求和或者取消求和,添加属性 (16)4.3.对其方式 (17)4.4.作为图标输出 (17)4.5.固定列和关键列 (17)4.6.列的字符宽度 (17)5.单元格的F1、F4帮助: (18)5.1.F1帮助: (18)5.2.F4帮助: (18)6.输入并保存、回调修改内表(输入时的小数位错位的问题、指定数据类型、小说位数) (18)7.界面颜色的更改 (20)7.1.更改单元格(字体)的前景、背景颜色 (20)7.2.更改行的颜色和列的颜色: (20)7.3.利用设置字段和列名子的FORM(F_FIELDS)里来设置列的颜色 (21)8.ALV自带的最左端复选框按钮和自定义复选框按钮 (21)8.1.ALV自带的复选框按钮: (21)8.2.自定义复选框按钮 (22)9.按照上传的模板格式导出为本地文件 (22)9.1.定义导出为EXCEL用到的数据变量 (22)9.2.上传模板 (22)9.3.代码 (23)10.为ALV标题添加图片 (28)10.1.上传图片 (28)10.2.在子FORM(F_TOP_OF_PAGE2)里的代码 (28)ALV:SAP LIST VIEW,一种比较美观的报表显示工具ALV用到的函数,目前我们有2个:REUSE_ALV_GRID_DISPLAY、REUSE_ALV_GRID_DISPLAY_LVC;两个函数都可以将数据用ALV的形式显示出来,只是方在一些小的地方有些不同。
SAP_ALV详细说明
一.ALV介绍The ALV Grid Control (ALV = S A P L ist V iewer)是一个显示列表的灵活的工具,它提供了基本功能的列表操作,也可以通过自定义来进行增强,因此可以允许你可以在大型的应用程序中使用.SAP提示: 在SAP的开发项目中,ALV GRID也可以作为修改和创建数据的一种工具,然而,目前这个功能只在实验计划中使用,还没有向客户发布.下面是一个ALV GRID的图片:它包括3大部分,工具栏,标题,用于显示数据的网格控制器.如果有必要,用户可以隐藏标题和工具栏.ALV家族包含3中ALV工具:简易的,两层ALV,分等级连续的列表和树形结构的ALV.二.ALV GRID CONTROL (ALV网格控制器)ALV GRID CONTROL使用了控制器技术以实现艺术性的屏幕显示,象所有的控制器一样,ALV GRID CONTROL通过系统中的一个全局的类提供了方法,以响应它的动作.使用了ABAP的对象以后,列表是通过ALV的一个实例(INSTANCE)来显示的,程序员可以使用ABAP对象的事件管理.三.ALV GRID CONTROL 实例ALV GRID实例的定义,参照CL_GUI_ALV_GRID类data ALV_GRID1 type ref to cl_gui_alv_grid.ALV GRID继承结构:四、ALV GRID相关的几个控制结构1.字段目录[Field catalog]字段目录是用来控制ALV显示的网格中每个字段的属性的,比如字段的顺序,对齐方式,可编辑状态,颜色,等等.常用的控制字段如下:(下面的示例将说明这些字段的使用,参考STRUCTURELVC_S_FCAT)布局是用来控制整个ALV的一个布局,比如ALV的标题,是否可编辑,行颜色,列颜色. 参照ALV的控制结构[LVC_S_LAYO],以后的例子我将详细介绍如何设置行颜色和列颜色.详细的结构说明3.打印和排序,过滤控制打印的参数控制请参考结构[LVC_S_PRNT]排序的参数控制请参考结构[LVC_S_SORT]过滤的参数控制请参考结构[LVC_S_FILT]这里不再一一解释,进入中文版本,里面应该也有解释的,虽然一些不是很清楚.五.编写简单的ALV程序.首先这里就不详细介绍DIALOG的用法了.OO的ALV GRID必须存在于一个容器当中,就是FUNCTION的ALV,其实也是一样的,底层也是使用CL_GUI_ALV_GRID这个类的.首先ALV的显示需要有几个先决条件.1,字段目录,这个是必须的,如果没有这个参数,参考一个数据字典也是可以的,就是参数I_STRUCTURE_NAME.2.存放数据的内表,最好内表的结构和字段目录是一致的,否则可能会出现一些无法预知的错误,当然你说我非要不一样,那也不一定会出现错误.我建议是最好一样的.这2个是必须的,布局的话,应该是可以不设置的,使用默认的就可以了.第一步:创建个SCREEN,在屏幕上创建个容器,CONTAINER.定义变量.DATA:WCL_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,WCL_ALV TYPE REF TO CL_GUI_ALV_GRID .*--- 存放字段目录的内表DATA gt_fieldcat TYPE lvc_t_fcat .*--- 布局结构DATA gs_layout TYPE lvc_s_layo .*----声明需要显示的内表(以SFLIGHT为例)DATA BEGIN OF gt_list OCCURS 0 .INCLUDE STRUCTURE SFLIGHT .DATA END OF gt_list .第二步: 创建ALV这个对象,它的父组件是那个容器.在PBO中写入如下代码:PROCESS BEFORE OUTPUT .MODULE display_alv .创建DISPLAY_ALV的MODULE后,写下如下代码:MODULE display_alv OUTPUT .PERFORM display_alv .ENDMODULE .在FORM DISPLAY_ALV中,判断ALV实例是否存在,如果不存在,则创建:IF WCL_ALV IS INITIAL .CREATE OBJECT: WCL_CONTAINEREXPORTINGCONTAINER_NAME = 'ALV_CON'.CREATE OBJECT WCL_ALVEXPORTINGI_PARENT = WCL_CONTAINER.*-----准备获取字段目录PERFORM prepare_field_catalog CHANGING gt_fieldcat .*-----设置布局PERFORM prepare_layout CHANGING gs_layout .*-----显示ALVCALL METHOD gr_alvgrid->set_table_for_first_display EXPORTING* I_BUFFER_ACTIVE =* I_CONSISTENCY_CHECK =* I_STRUCTURE_NAME =* IS_VARIANT =* I_SAVE =* I_DEFAULT = 'X'is_layout = gs_layout* IS_PRINT =* IT_SPECIAL_GROUPS =* IT_TOOLBAR_EXCLUDING =* IT_HYPERLINK =CHANGINGit_outtab = gt_list[]it_fieldcatalog = gt_fieldcat* IT_SORT =* IT_FILTER =EXCEPTIONSinvalid_parameter_combination = 1program_error = 2too_many_lines = 3OTHERS = 4 .ELSE .*----刷新ALVCALL METHOD gr_alvgrid->refresh_table_display* EXPORTING* IS_STABLE =* I_SOFT_REFRESH =EXCEPTIONSfinished = 1OTHERS = 2 .IF sy-subrc <> 0.*--异常处理ENDIF.ENDIF .方法"set_table_for_first_display"的参数说明方法"REFRESH_TABLE_DISPLAY"的参数说明第三步,获取要显示数据的字段目录.有两种方式.1.手动创建FORM prepare_field_catalog CHANGING pt_fieldcat TYPE lvc_t_fcat .DATA ls_fcat type lvc_s_fcat .ls_fcat-fieldname = 'CARRID' .ls_fcat-inttype = 'C' .ls_fcat-outputlen = '3' .ls_fcat-coltext = 'Carrier ID' .ls_fcat-seltext = 'Carrier ID' .APPEND ls_fcat to pt_fieldcat .CLEAR ls_fcat .ls_fcat-fieldname = 'CONNID' .ls_fcat-ref_table = 'SFLIGHT' .ls_fcat-ref_table = 'CONNID' .ls_fcat-outputlen = '3' .ls_fcat-coltext = 'Connection ID' .ls_fcat-seltext = 'Connection ID' .APPEND ls_fcat to pt_fieldcat .ENDFORM .2.半自动的创建FORM prepare_field_catalog CHANGING pt_fieldcat TYPE lvc_t_fcat . DATA ls_fcat type lvc_s_fcat .CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'EXPORTINGi_structure_name = 'SFLIGHT'CHANGINGct_fieldcat = pt_fieldcat[]EXCEPTIONSinconsistent_interface = 1program_error = 2OTHERS = 3.IF sy-subrc <> 0.*--Exception handlingENDIF.LOOP AT pt_fieldcat INTO ls_fcat .CASE pt_fieldcat-fieldname .WHEN 'CARRID' .ls_fcat-outpulen = '10' .ls_fcat-coltext = 'Airline Carrier ID' .MODIFY pt_fieldcat FROM ls_fcat .WHEN 'PAYMENTSUM' .ls_fcat-no_out = 'X' .MODIFY pt_fieldcat FROM ls_fcat .ENDCASE .ENDLOOP .ENDFORM .第四步,设置布局FORM prepare_layout CHANGING ps_layout TYPE lvc_s_layo.ps_layout-zebra = 'X' .ps_layout-grid_title = 'Flights' .ps_layout-smalltitle = 'X' .ENDFORM. " prepare_layout第五步,排除不需要的标准按钮(可选,这个是第一种方法,还有另外一种,在添加自定义的按钮的时候介绍)在你的ALV上,如果你想排除一些你不想要的标准按钮,你可以把需要排除的按钮填入到表UI_FUNCTIONS中,然后传给set_table_for_first_display方法的参数"IT_TOOLBAR_EXCLUDING".这些按钮的功能码一般都可以通过查看类cl_gui_alv_grid的常量属性中获取到,或者自己加个断点,在after_user_command事件中.如果你要隐藏全部的工具条,你可以把layout中的no_toolbar设置为"X".FORM exclude_tb_functions CHANGING pt_exclude TYPE ui_functions .DATA ls_exclude TYPE ui_func.ls_exclude = cl_gui_alv_grid=>mc_fc_maximum .APPEND ls_exclude TO pt_exclude.ls_exclude = cl_gui_alv_grid=>mc_fc_minimum .APPEND ls_exclude TO pt_exclude.ls_exclude = cl_gui_alv_grid=>mc_fc_subtot .APPEND ls_exclude TO pt_exclude.ls_exclude = cl_gui_alv_grid=>mc_fc_sum .APPEND ls_exclude TO pt_exclude.ls_exclude = cl_gui_alv_grid=>mc_fc_average .APPEND ls_exclude TO pt_exclude.ls_exclude = cl_gui_alv_grid=>mc_mb_sum .APPEND ls_exclude TO pt_exclude.ls_exclude = cl_gui_alv_grid=>mc_mb_subtot .ENDFORM .按照上面的步骤,一个ALV的DEMO基本可以创建了.下面我们将讲述一些功能.功能一:在第一次显示以后,修改字段目录和布局.在运行的时候,很有可能需要在显示之后,需要设置一个新的布局或者字段目录.有下面这些方法去实现.字段目录: get_frontend_fieldcatalogset_frontend_fieldcatalog布局:get_frontend_layoutset_frontend_layout使用这些方法,你在执行的任何时候,可以获取这些内容,然后修改他们.DATA ls_fcat TYPE lvc_s_fcat .DATA lt_fcat TYPE lvc_t_fcat .DATA ls_layout TYPE lvc_s_layo .CALL METHOD gr_alvgrid->get_frontend_fieldcatalogIMPORTINGet_fieldcatalog = lt_fcat[] .LOOP AT lt_fcat INTO ls_fcat .IF ls_fcat-fieldname = 'PAYMENTSUM' .ls_fcat-no_out = space .MODIFY lt_fcat FROM ls_fcat .ENDIF .ENDLOOP .CALL METHOD gr_alvgrid->set_frontend_fieldcatalogEXPORTINGit_fieldcatalog = lt_fcat[] .CALL METHOD gr_alvgrid->get_frontend_layoutIMPORTINGes_layout = ls_layout .ls_layout-grid_title = 'Flights (with Payment Sums)' .CALL METHOD gr_alvgrid->set_frontend_layoutEXPORTINGis_layout = ls_layout .功能二:设置排序条件有时候我们需要使用到数据的排序.这个可以通过填充参考结构LVC_T_SORT创建的内表来实现,这个内表中包含了排序的标准.可以传递给set_table_for_first_display这个方法的IT_SORT参数来初始化一个排序.FORM prepare_sort_table CHANGING pt_sort TYPE lvc_t_sort .DATA ls_sort TYPE lvc_s_sort .ls_sort-spos = '1' .ls_sort-fieldname = 'CARRID' .ls_sort-up = 'X' . "A to Zls_sort-down = space .APPEND ls_sort TO pt_sort .ls_sort-spos = '2' .ls_sort-fieldname = 'SEATSOCC' .ls_sort-up = space .ls_sort-down = 'X' . "Z to AAPPEND ls_sort TO pt_sort .ENDFORM. " prepare_sort_table这有2点特别的说明:1.如果这边排序的字段名,不存在于字段目录中,那将出现DUMP.2.排序以后,垂直的网格中,如果出现相同的内容,就会合并,如果要避免,请在布局中设置"no_merging"为"X" .你可以通过使用方法“get_sort_criteria” 和“set_sort_criteria”来获取和设置排序的标准.功能三:设置过滤(和排序类似)ALV的标准按钮中已经有过滤的功能,我们也可以在初始显示的时候就设置过滤条件.我们需要把过滤条件填充到参考表类型"LVC_T_FILT"创建的内表中.过滤条件是类似一个RANGES结构的.然后把这个内表传递给方法"SET_TABLE_FOR_FIRST_DISPLAY"中的参数"IT_FILTER"FORM prepare_filter_table CHANGING pt_filt TYPE lvc_t_filt .DATA ls_filt TYPE lvc_s_filt .ls_filt-fieldname = 'FLDATE' .ls_filt-sign = 'E' .ls_filt-option = 'BT' .ls_filt-low = '20030101' .ls_filt-high = '20031231' .APPEND ls_filt TO pt_filt .ENDFORM. " preparefiltertable我们可以使用"get_filter_criteria" 和"set_filter_criteria"来获取过滤条件和设置过滤条件.功能四:选择方式有时候,我们需要选择一些单元格,行或者列,在布局中,有个参数"SEL_MODE"可以设置我们不同的选择方式.下面是参数的介绍.和不同的地方.注意:1.如果你设置了ALV是可编辑的,可能会覆盖你在布局中选择方式的设置的.2.设置了选择方式以后,我们可以使用很多方法来获取用户的选择.比如"GET_SELECTED_CELLS","GET_SELECTED_CELLS_ID","GET_SELECTED_R OWS","GET_SELECTED_COLUMNS"3.在执行PAI以后,用户所选择的单元格,行或者列可能丢失.你可以在PBO中,使用对应的SET方法来恢复这些选择.功能五:颜色设置有的时候,我们需要在ALV网格上绘上一些颜色.可以给特定的行,某个特定的列,某个特定的单元格绘制颜色.如果某列被设置为关键列,这列的颜色将被自动绘制,而不需要我们额外的指定.先介绍ALV里色码.就是颜色编码,4位CHAR型.Cx y z---Color | | || 1/0: 相反开/关1/0: 强化开/关其中C是固定的第一位,第二位代表是颜色编码(1到7),第三位是加强的设置,第四位是相反,个人理解,在强化关闭的情况下,相反的作用是背景和字体的变化.颜色编码:A)设置列的颜色.我们可以通过字段目录的"emphasize"控制字段来控制某列的颜色.这个字段同样是4位的CHAR型,传入上述的颜色编码.例如:LS_FCAT-EMPHASIZE = 'C701'.如果这列被设置为关键列,就是 LS_FCAT-KEY = 'X' ,那么颜色设置就不会起作用.请注意,自动产生的字段目录中,KEY的设置是自动获取的.B)设置行的颜色为某行设置颜色,是有点复杂的,我们需要在要显示的数据内表中增加一个字段,这个字段不需要在字段目录中存在.同样,这个字段也是4位的CHAR型,符合颜色编码的定义.那我们就需要这样来定义我们的数据内表:DATA BEGIN OF gt_list OCCURS 0 .INCLUDE STRUCTURE SFLIGHT .DATA rowcolor(4) TYPE c .DATA END OF gt_list .很明显,填入颜色编码以后,ALV怎么知道它是我们用来设置颜色的呢,在布局中,有个控制字段"INFO_FNAME",我们可以设置这个字段来告诉ALV,我们的颜色字段是哪个.ps_layout-info_fname = 'ROWCOLOR'.请注意,这个字段随便你起名字,但是记住,一定是数据内表里的字段,而且这边设置的时候一定要大写.你可以在任何时候设置行的颜色,只需要去修改内表里的这个字段的值,但是记得,一定要刷新以后才起作用.C)设置单元格的颜色设置单元格和设置行的颜色,本质上没有什么大的区别,但是定位单元格需要2个参数.我们需要在数据内表中插入一个表类型的字段,这样我们的数据内表就变成了DEEP结构了,不过ALV是可以处理的.不需要担心.插入的这个表类型的类型为"LVC_T_SCOL".里面有3个参数:FNAME告诉我们你需要设置的是哪个字段,如果为空,然后直接在COLOR中设置颜色,就是整行设置为这个颜色.如果具体到某个单元格,必须指定是哪个字段.COLOR字段是用来设置颜色的.NOKEYCOL字段比较关键了.设置为关键列的一些字段,我们的颜色设置可能被覆盖.通过这个字段的设置,可以避免被关键列覆盖.同样,ALV在布局中有个字段"CTAB_FNAME"告诉我们,数据内表中,哪个字段是用来设置单元格的颜色的.DATA BEGIN OF gt_list OCCURS 0 .INCLUDE STRUCTURE SFLIGHT .DATA rowcolor(4) TYPE c .DATA cellcolors TYPE lvc_t_scol .DATA END OF gt_list .DATA ls_cellcolor TYPE lvc_s_scol ....READ TABLE gt_list INDEX 5 .ls_cellcolor-fname = 'SEATSOCC' .ls_cellcolor-color-col = '7' .ls_cellcolor-color-int = '1' .APPEND ls_cellcolor TO gt_list-cellcolors .MODIFY gt_list INDEX 5 .注意:颜色设置中有优先级顺序,他们是单元格--->行--->列.功能六:插入超链接插入超链接是通过一个含有超级链接和句柄的表来实现的.这个表类型为"LVC_T_HYPE" ,句柄是一个INT4类型的字段,我们需要在数据显示的内表中,加入这样的字段,来告诉ALV,我们的字段指定的句柄,从而找到对应的超级链接.在字段目录中,WEB_FIELD是用来指定对应的句柄名的.下面举个例子来说明,我们要为字段CARRID,CONNID建立超级链接:首先,内表定义中,我们加入2个句柄字段:DATA BEGIN OF gt_list OCCURS 0 .INCLUDE STRUCTURE SFLIGHT .DATA rowcolor(4) TYPE c .DATA cellcolors TYPE lvc_t_scol .DATA carrid_handle TYPE int4 .DATA connid_handle TYPE int4 .DATA END OF gt_list .第二: 建立一个超级链接内表,里面存放句柄所对应的超级链接.创建的时候注意,它参考的表类型,一定是"LVC_T_HYPE".FORM prepare_hyperlinks_table CHANGING pt_hype TYPE lvc_t_hype . DATA ls_hype TYPE lvc_s_hype .ls_hype-handle = '1' .ls_hype-href = '/carrids/car1' .APPEND ls_hype TO pt_hype .ls_hype-handle = '2' .ls_hype-href = '/carrids/car1' .APPEND ls_hype TO pt_hype .ls_hype-handle = '3' .ls_hype-href = '/carrids/car1' .APPEND ls_hype TO pt_hype .ls_hype-handle = '4' .ls_hype-href = '/connids/con11' .APPEND ls_hype TO pt_hype .ls_hype-handle = '5' .ls_hype-href = '/connids/con12'APPEND ls_hype TO pt_hype ... ..ENDFORM .第三.通过字段目录FIELDCATLOG来指定相应的句柄字段.对于CARRID的field catalogLs_fieldcat-web_field = …CARRID_HANDLE‟.对于CONNID的field catalogLs_fieldcat-web_field = …CONNID_HANDLE‟.在方法"SET_TABLE_FOR_FIRST_DISPLAY"中把句柄内表传给参数it_hyperlink。
abap alv字段 值描述 -回复
abap alv字段值描述-回复ABAP是一种面向对象的编程语言,用于SAP系统的开发。
在ABAP中,ALV是模块化的列表显示工具,用于在SAP系统中显示表格格式的数据。
ALV的字段描述用于提供用户对显示的数据进行解释和理解的信息。
本文将详细介绍ABAP ALV字段值描述的概念、作用、实现方法以及在SAP 系统中的应用。
首先,我们来了解一下ABAP ALV字段值描述的概念。
在ALV表格中,每个列都有一个字段描述,该描述用于提供关于该列的详细信息,包括该列表示的含义、数据类型、取值范围等。
字段值描述是字段描述的补充,用于解释字段的具体取值。
例如,在一个销售订单的ALV表格中,有一列是"订单状态",可能取值为"未处理"、"进行中"和"已完成",字段值描述可以为每个具体的取值提供详细的说明,比如"未处理:订单尚未被处理"、"进行中:订单正在进行中"和"已完成:订单已经完成"。
接下来,我们来探讨一下ABAP ALV字段值描述的作用。
字段值描述可以在ALV表格中提供更加友好和易于理解的数据展示,帮助用户更加准确地理解表格中数据的含义。
对于那些有特定业务规则和含义的字段,字段值描述可以起到解释和澄清的作用,减少用户对数据的困惑和误解。
此外,通过字段值描述,用户还可以直观地了解每个字段值的含义,从而更好地进行数据分析和决策。
那么,我们该如何在ABAP中实现ALV字段值描述呢?ABAP提供了一些特定的函数和方法来实现这个功能。
首先,我们需要在数据字典中为每个字段值创建描述,可以使用数据元素或者域来做到这一点。
然后,在程序中,使用函数模块"REUSE_ALV_COMMENTARY_WRITE"将描述信息和字段值关联起来,并将其显示在ALV表格中的相应列中。
ABAP程序代码:alv双击及功能按钮添加
*&---------------------------------------------------------------------**& Report ZXXXX*&*&---------------------------------------------------------------------**&*&*&---------------------------------------------------------------------*REPORT ZXXXX.TABLES:fmcifmfctr." alv 控件定义处理data: g_custom_container1001 type ref to cl_gui_custom_container.data alvgrid1001 type ref to cl_gui_alv_grid.data gs_layout_alv1001 type LVC_S_LAYO.data gt_tab1001 type lvc_t_fcat.data gt_wa1001 type lvc_t_fcat with header line.data flag1001."全局标示。
data x1001 type i.data y1001 type i.data select_rows1001 type LVC_s_ROW OCCURS 0 WITH HEADER LINE. data select_rows1001_get type LVC_s_ROW OCCURS 0 WITH HEADER LINE. data: BEGIN OF itab OCCURS 0FUNDS_CTR TYPE BAPI_0050_ITEM-FUNDS_CTRCMMT_ITEM TYPE BAPI_0050_ITEM-CMMT_ITEMEND OF itab.data: BEGIN OF alv_out OCCURS 0FISC_YEAR TYPE BAPI_0050_ITEM-FISC_YEARDOCDATE TYPE BAPI_0050_HEADER-DOCDATEFUNDS_CTR TYPE BAPI_0050_ITEM-FUNDS_CTRCMMT_ITEM TYPE BAPI_0050_ITEM-CMMT_ITEMTOTAL_AMOUNT TYPE BAPI_0050_ITEM-TOTAL_AMOUNTITEM_TEXT TYPE BAPI_0050_ITEM-ITEM_TEXTBUDGETING_PERIOD TYPE BAPI_0050_PERIOD-BUDGETING_PERIOD PERIOD_AMOUNT TYPE BAPI_0050_PERIOD-PERIOD_AMOUNTbelnr TYPE bseg-belnrstate TYPE icon-idstate_txt(30)END OF alv_out.data g_FILE LIKE RLGRAP-FILENAME.DATA: G_MAX_COL TYPE I.*----------------------------------------------------------------------** CLASS cl_event_receiver1001 DEFINITION*----------------------------------------------------------------------***----------------------------------------------------------------------*class cl_event_receiver1001 definition.public section.methods:handle_toolbar for event toolbar of cl_gui_alv_gridimporting e_obxxxxject e_interactivehandle_user_command for event user_command of cl_gui_alv_gridimporting e_ucommhandle_double_clickfor event double_click of cl_gui_alv_gridimporting e_row e_column.private section.endclass. "cl_event_receiver DEFINITION*----------------------------------------------------------------------** CLASS cl_event_receiver IMPLEMENTATION*----------------------------------------------------------------------***----------------------------------------------------------------------*class cl_event_receiver1001 implementation.method handle_toolbar.data: ls_toolbar type stb_button.clear ls_toolbar.move 'POST' to ls_toolbar-function.move ICON_SYSTEM_OKAY to ls_toolbar-icon."move '单据过账' to ls_toolbar-quickinfo.move '单据过账' to ls_toolbar-text.move ' ' to ls_toolbar-disabled.append ls_toolbar to e_obxxxxject->mt_toolbar.endmethod. "handle_toolbarmethod handle_user_command.data: lt_rows type lvc_t_row.case e_ucomm.when 'POST'.PERFORM post.endcase.endmethod. "handle_user_commandmethod handle_double_click.flag1001 = 'X'.x1001 = e_row-index.data:l_row type il_field(30).l_row = e_row-index.l_field = e_column-fieldname."PERFORM call_tcode USING l_row l_field .* CALL FUNCTION 'SAPGUI_SET_FUNCTIONCODE' * EXPORTING* functioncode = 'FLUSH'.endmethod. "handle_double_clickendclass. "cl_event_receiver IMPLEMENTATION data: event_receiver1001 type ref to cl_event_receiver1001. start-of-selection.call SCREEN 1001.*&---------------------------------------------------------------------**& Module STATUS_1001 OUTPUT*&---------------------------------------------------------------------** text*----------------------------------------------------------------------*MODULE STATUS_1001 OUTPUT.SET PF-STATUS '1001'.SET TITLEBAR '1001'.if g_custom_container1001 is initial.free gt_tab1001.clear gt_tab1001.PERFORM build_cat USING 'STATE' '数据校验' 'X' ''.PERFORM build_cat USING 'STATE_TXT' '校验结果' 'X' ''.PERFORM build_cat USING 'FISC_YEAR' '会计年度' '' ''.PERFORM build_cat USING 'DOCDATE' '凭证日期' '' ''.PERFORM build_cat USING 'FUNDS_CTR' '基金中心' '' ''.PERFORM build_cat USING 'CMMT_ITEM' '承诺项目' '' ''.PERFORM build_cat USING 'TOTAL_AMOUNT' '总金额' '' ''.PERFORM build_cat USING 'BUDGETING_PERIOD' '预算期间' '' ''. PERFORM build_cat USING 'PERIOD_AMOUNT' '期间金额' '' ''.PERFORM build_cat USING 'BELNR' '预算凭证' '' ''.CREATE obxxxxject g_custom_container1001EXPORTINGcontainer_name = 'C1001'.CREATE obxxxxject alvgrid1001EXPORTINGi_parent = g_custom_container1001.CREATE obxxxxject event_receiver1001.set handler event_receiver1001->handle_toolbar for alvgrid1001.set handler event_receiver1001->handle_double_click for alvgrid1001.set handler event_receiver1001->handle_user_command for alvgrid1001.gs_layout_alv1001-no_toolbar = ''.gs_layout_alv1001-cwidth_opt = 'X'.gs_layout_alv1001-sel_mode = 'X'.endif.CALL METHOD alvgrid1001->set_table_for_first_display EXPORTINGis_layout = gs_layout_alv1001* it_toolbar_excluding = pt_excludeCHANGINGit_fieldcatalog = gt_tab1001* it_sort = gt_sort_grid[]it_outtab = alv_out[].free select_rows1001.CLEAR select_rows1001.select_rows1001-INDEX = x1001.APPEND select_rows1001.CLEAR select_rows1001.CALL METHOD alvgrid1001->set_selected_rowsEXPORTINGit_index_rows = select_rows1001[].ENDMODULE. " STATUS_1001 OUTPUT*&---------------------------------------------------------------------* *& Module USER_COMMAND_1001 INPUT*&---------------------------------------------------------------------* * text*----------------------------------------------------------------------* MODULE USER_COMMAND_1001 INPUT.CASE sy-ucomm.WHEN 'BACK'.set SCREEN 0.when 'UP'.CALL FUNCTION 'KD_GET_FILENAME_ON_F4'EXPORTINGMASK = '文本文件(制表符分隔)*.xls'STATIC = 'X'CHANGINGFILE_NAME = g_FILE.PERFORM SUB_GET_MAX_COL USING alv_out[]CHANGING G_MAX_COL.PERFORM SUB_IMPORT_XLS_TO_ITAB TABLES alv_outUSING alv_outg_FILE.LOOP AT alv_out.SELECT SINGLE * FROM fmci WHERE FIPEX = alv_out-CMMT_ITEM.IF sy-subrc <> 0.alv_out-state = '@0A@'.CONCATENATE '承诺项目' alv_out-cmmt_item '不存在' INTO alv_out-state_txt. ENDIF.SELECT SINGLE * FROM fmfctr WHERE FICTR = alv_out-FUNDS_CTR.IF sy-subrc <> 0.alv_out-state = '@0A@'.CONCATENATE '基金中心' alv_out-cmmt_item '不存在' INTO alv_out-state_txt. ENDIF.IF alv_out-TOTAL_AMOUNT <> 0 and alv_out-PERIOD_AMOUNT <> 0.alv_out-state = '@0A@'.alv_out-state_txt = '汇总金额和期间金额只能输入一个'.ENDIF.IF alv_out-TOTAL_AMOUNT = 0 and alv_out-PERIOD_AMOUNT = 0.alv_out-state = '@0A@'.alv_out-state_txt = '汇总金额和期间金额必须输入一个'.ENDIF.IF alv_out-state = ''.alv_out-state = '@01@'.alv_out-state_txt = '正确'.ENDIF.modify alv_out.CLEAR alv_out.ENDLOOP.when 'DOWN'.DATA: L_OBJDATA TYPE WWWDATATABp_subrc TYPE sy-subrcl_str(200).CONCATENATE 'C:\ZHYLFI014\' SY-DATUM sy-uzeit'.XLS' INTO g_FILE. SELECT SINGLE RELID OBJIDFROM WWWDATA "存对象模板的表INTO CORRESPONDING FIELDS OF L_OBJDATAWHERE SRTF2 = 0AND RELID = 'MI' "有三种类型 HT MI ITAND OBJID = 'ZHYLFI014.XLS' .CONDENSE g_FILE NO-GAPS.CALL FUNCTION 'DOWNLOAD_WEB_obxxxxject'EXPORTINGKEY = L_OBJDATADESTINATION = g_fileIMPORTINGRC = P_SUBRC.IF p_SUBRC <> 0.MESSAGE '模板下载失败!' TYPE 'S' DISPLAY LIKE 'E'.ELSe.CONCATENATE '模板下载成功,请到' g_file '路径下查看!' INTO l_str. MESSAGE l_str TYPE 'S' DISPLAY LIKE 'S'.ENDIF.when 'FLUSH'.WHEN OTHERS.ENDCASE.ENDMODULE. " USER_COMMAND_1001 INPUT*&---------------------------------------------------------------------**& Form BUILD_CAT*&---------------------------------------------------------------------** text*----------------------------------------------------------------------** -->P1 text* -->P2 text* -->P3 text* -->P4 text*----------------------------------------------------------------------*FORM BUILD_CAT USING p1 p2 p3 p4.gt_wa1001-fieldname = p1.gt_wa1001-coltext = p2.gt_wa1001-key = p3.gt_wa1001-HOTSPOT = p4.append gt_wa1001 to gt_tab1001.clear gt_wa1001.ENDFORM. " BUILD_CAT*&---------------------------------------------------------------------**& Form POST*&---------------------------------------------------------------------** text*----------------------------------------------------------------------** --> p1 text* <-- p2 text*----------------------------------------------------------------------*FORM POST .data:HEADER_DATA TYPE BAPI_0050_HEADERFMAREA TYPE BAPI_0050_FIELDS-FM_AREADOCUMENTYEAR TYPE BAPI_0050_FIELDS-DOC_YEARDOCUMENTNUMBER TYPE BAPI_0050_FIELDS-DOCUMENTITEM_DATA LIKE BAPI_0050_ITEM OCCURS 0 WITH HEADER LINEPERIOD_DATA LIKE BAPI_0050_PERIOD OCCURS 0 WITH HEADER LINE RETURN LIKE BAPIRET2 OCCURS 0 WITH HEADER LINE.data: x TYPE ierr type c.READ TABLE alv_out INDEX 1.header_data-FM_AREA = 'SRMB'.header_data-VERSION = '000'.header_data-DOCDATE = alv_out-DOCDATE.header_data-DOCTYPE = 'FM01'.header_data-DOCSTATE = '1'.header_data-PROCESS = 'ENTR'.free ITEM_DATA.CLEAR ITEM_DATA.free PERIOD_DATA.CLEAR PERIOD_DATA.free itab.CLEAR itab.LOOP AT alv_out.itab-FUNDS_CTR = alv_out-FUNDS_CTR.itab-CMMT_ITEM = alv_out-CMMT_ITEM.APPEND itab.CLEAR itab.ENDLOOP.SORT itab AS TEXT by FUNDS_CTR CMMT_ITEM.delete ADJACENT DUPLICATES FROM itab.x = 0.LOOP at itab.x = x + 1.read TABLE alv_out WITH KEY FUNDS_CTR = itab-FUNDS_CTR CMMT_ITEM = itab-CMMT_ITEM.ITEM_DATA-ITEM_NUM = x.ITEM_DATA-FISC_YEAR = alv_out-FISC_YEAR.ITEM_DATA-BUDCAT = '9F'.ITEM_DATA-BUDTYPE = 'YS01'.ITEM_DATA-FUNDS_CTR = alv_out-FUNDS_CTR.ITEM_DATA-CMMT_ITEM = alv_out-CMMT_ITEM.ITEM_DATA-TRANS_CURR = 'RMB'.if alv_out-TOTAL_AMOUNT <> 0.ITEM_DATA-TOTAL_AMOUNT = alv_out-TOTAL_AMOUNT. ITEM_DATA-DISTKEY = '1'.endif.ITEM_DATA-ITEM_TEXT = alv_out-item_text.ITEM_DATA-VALTYPE = 'B1'.APPEND ITEM_DATA.CLEAR ITEM_DATA.endloop.LOOP at alv_out WHERE TOTAL_AMOUNT = 0.READ TABLE item_data WITH KEY FUNDS_CTR = alv_out-FUNDS_CTR CMMT_ITEM = alv_out-CMMT_ITEM.PERIOD_DATA-ITEM_NUM = item_data-ITEM_NUM.PERIOD_DATA-BUDGETING_PERIOD = alv_out-BUDGETING_PERIOD. PERIOD_DATA-PERIOD_AMOUNT = alv_out-PERIOD_AMOUNT.APPEND PERIOD_DATA.CLEAR PERIOD_DATA.endloop.* LOOP at alv_out.* x = x + 1.* ITEM_DATA-ITEM_NUM = x.* ITEM_DATA-FISC_YEAR = alv_out-FISC_YEAR.* ITEM_DATA-BUDCAT = '9F'.* ITEM_DATA-BUDTYPE = 'YS01'.* ITEM_DATA-FUNDS_CTR = alv_out-FUNDS_CTR.* ITEM_DATA-CMMT_ITEM = alv_out-CMMT_ITEM.* ITEM_DATA-TRANS_CURR = 'RMB'.* if alv_out-TOTAL_AMOUNT <> 0.* ITEM_DATA-TOTAL_AMOUNT = alv_out-TOTAL_AMOUNT.* ITEM_DATA-DISTKEY = '1'.* endif.* ITEM_DATA-ITEM_TEXT = alv_out-item_text.* ITEM_DATA-VALTYPE = 'B1'.* APPEND ITEM_DATA.* CLEAR ITEM_DATA.** if alv_out-TOTAL_AMOUNT = 0.* PERIOD_DATA-ITEM_NUM = x.* PERIOD_DATA-BUDGETING_PERIOD = alv_out-BUDGETING_PERIOD. * PERIOD_DATA-PERIOD_AMOUNT = alv_out-PERIOD_AMOUNT.* APPEND PERIOD_DATA.* CLEAR PERIOD_DATA.* endif.** endloop.CALL FUNCTION 'FMKU_0050_CREATE_WITH_COMMIT'EXPORTING* LANGUAGE =HEADER_DATA = HEADER_DATA* HEADER_DATA_ADD =TESTRUN = ''IMPORTINGFMAREA = FMAREADOCUMENTYEAR = DOCUMENTYEARDOCUMENTNUMBER = DOCUMENTNUMBER TABLESITEM_DATA = ITEM_DATA* SENDER_ITEM_DATA =PERIOD_DATA = PERIOD_DATA* SENDER_PERIOD_DATA =* LONG_TEXT =* EXTENSION_IN =RETURN = RETURN.IF return[] IS NOT INITIAL.LOOP AT return.IF return-type = 'E'.err = 'X'.ENDIF.MESSAGE return-message TYPE 'I'.ENDLOOP.ENDIF.IF err = 'X' .ROLLBACK WORK .EXIT.else.LOOP AT alv_out.alv_out-state = '@08@'.alv_out-state_txt = '已生成预算凭证'.alv_out-belnr = DOCUMENTNUMBER.modify alv_out.CLEAR alv_out.ENDLOOP.CALL FUNCTION 'SAPGUI_SET_FUNCTIONCODE'EXPORTINGfunctioncode = 'FLUSH'.ENDIF.ENDFORM. " POST*&---------------------------------------------------------------------* *& Form SUB_GET_MAX_COL*&---------------------------------------------------------------------** text*----------------------------------------------------------------------** -->P_TABLE text* -->P_MAX_COL text*----------------------------------------------------------------------*FORM SUB_GET_MAX_COL USING P_TABLE TYPE STANDARD TABLECHANGING P_MAX_COL.DATA: LO_ABAP_TABLEDESCR TYPE REF TO CL_ABAP_TABLEDESCRLO_ABAP_STRUCTDESCR TYPE REF TO CL_ABAP_STRUCTDESCR.DATA LS_ABAP_COMPDESCR TYPE ABAP_COMPDESCR.DATA L_LINES TYPE I.LO_ABAP_TABLEDESCR ?=CL_ABAP_TYPEDESCR=>DESCRIBE_BY_DATA( P_TABLE ).LO_ABAP_STRUCTDESCR ?= LO_ABAP_TABLEDESCR->GET_TABLE_LINE_TYPE( ). DESCRIBE TABLE LO_ABAP_STRUCTDESCR->COMPONENTS LINES L_LINES.P_MAX_COL = L_LINES .ENDFORM. " SUB_GET_MAX_COL*&---------------------------------------------------------------------**& Form SUB_IMPORT_XLS_TO_ITAB*&---------------------------------------------------------------------** text*----------------------------------------------------------------------** -->P_TABLE text* -->P_TAB_WA text* -->P_FPATCH text*----------------------------------------------------------------------*FORM SUB_IMPORT_XLS_TO_ITAB TABLES P_TABLEUSING P_TAB_WAP_FPATCH.DATA LT_XLS TYPE ALSMEX_TABLINE OCCURS 0 WITH HEADER LINE.DATA L_ITAB_COL TYPE I.FIELD-SYMBOLS <FS_FIELD>.IF P_FPATCH IS NOT INITIAL.CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'EXPORTINGFILENAME = P_FPATCHI_BEGIN_COL = 1I_BEGIN_ROW = 2I_END_COL = G_MAX_COLI_END_ROW = 65535TABLESINTERN = LT_XLSEXCEPTIONSINCONSISTENT_PARAMETERS = 1UPLOAD_OLE = 2OTHERS = 3.IF SY-SUBRC <> 0.MESSAGE '上传文件失败!' TYPE 'S' DISPLAY LIKE 'E'.STOP.ELSE.LOOP AT LT_XLS.L_ITAB_COL = LT_XLS-COL.ASSIGN COMPONENT L_ITAB_COL OF STRUCTURE P_TAB_WA TO <FS_FIELD>. <FS_FIELD> = LT_XLS-VALUE.AT END OF ROW.APPEND P_TAB_WA TO P_TABLE.CLEAR: L_ITAB_COL P_TAB_WA.ENDAT.CLEAR LT_XLS.ENDLOOP.ENDIF.ENDIF.ENDFORM. " SUB_IMPORT_XLS_TO_ITAB。
SAP_ALV_详细使用方法
ALV学习资料SAP提供一组ALV(ABAP LIST VIEWER)功能模块,这些功能模块可以修饰报表输出。
这些设置的ALV功能可以提高报表的可读性。
首先呢,我先跟大家说一下ALV是什么东西?ALV=SAP LIST VIEWER,SAP列表显示器。
就目前ALV技术主要分ALV GRID 和ALV TREE。
先跟大家说一下目前本人用的比较多的ALV GRID技术,ALV GRID 的效果见图(1.1)。
图(1.1)第一步在使用ALV时,需要定义一个SAP标准TYPE-POOLS,具体语法为:TYPE-POOLS: SLIS.然后需要定义一个LAYOUT式样,和一个FIELDCAT字段格式,具体语法为:DATA: LIT_FCAT TYPE SLIS_T_FIELDCAT_ALV,LT_LAYO TYPE SLIS_LAYOUT_ALV,GIT_EVENTS TYPE SLIS_T_EVENT,GIT_LISTHEADER TYPE SLIS_T_LISTHEADER.,LIT_EXTAB TYPE SLIS_T_EXTAB.第二步(可选)可以为需要为最初的目录显示选择参数。
在这里需要使用函数‘'REUSE_ALV_V ARIANT_DEFAULT_GET’Sample code:CALL FUNCTION 'REUSE_ALV_V ARIANT_DEFAULT_GET'EXPORTINGi_save = variant save condition ( A=all, U = user-specific )CHANGINGcs_variant = internal table containing the program name (and the defaultvariant---optional )EXCEPTIONSnot_found = 2.使用者也可以使用现有的变量中选择,使用函数‘REUSE_ALV_V ARIANT_F4’。
abap-ALV-功能
ALV Simple Introduction一、ALV相关概念ALV――ABAP LIST VIEWER,这里我们姑且称之为ABAP表单浏览器,用它可以标准化,简单化R/3系统中的表单,它可以提供给用户一个统一的表单格式以及用户接口。
二、结合一个具体的实例来看ALV的功能首先我们看下图中的这个ALV的布局(这是一般ALV程序表单的典型布局):根据上面对ALV的直观形象,下面将屏幕上的区域划分成几块,分别来解释它的作用:1.快捷工具栏(如下图)细节按钮,你首先必须选中列表中的一行,然后点击它的话,就会弹出一个窗口,显示选中行的细节内容。
(另外:你双击你要选择的行,也可以显示细节)按升序排列,首先选中一列,然后再点击它,就可以看到该列是按照升序重新排列。
按降序排列,首先选中一列,然后再点击它,就可以看到该列是按照降序重新排列。
设置过滤器,通过设置它可以达到筛选的目的,以列名称作为筛选的筛选标准,填入过滤器相应的标准值,然后就可以筛选出满足自己条件的记录。
打印预览,点击它之后,就可以预览一下将要打印内容的布局情况。
Microsoft Excel,调用MS的Excel到当前ALV的列表显示区域。
(前提:必须安装了MS的Excel)字处理,字处理的相关设置。
本地文件,将当前表单存储到本地机器上,有几种供选择的存储格式。
邮件收件人,给系统内用户发邮件图形,点击它可以根据表单情况绘制相关图表。
更改布局,点击它可以对表单中的列项目排列次序的互换,删减等。
选择布局,从已经保存的布局中选择自己满意的布局。
保存布局,对于自己满意的布局,可以通过点击它来将布局保存起来。
2.表单标题区这个区域主要是用来显示一些抬头信息(总揽信息),类似于WORD中的页眉。
我们在使用的时候根据需要来进行相关填写。
3.表单显示区这个区域主要是用来显示我们通过代码筛选出来的数据,相关的操作在下面的程序编写部分详细介绍。
三、程序的编写1.写一个ALV程序的基本流程:第一步:定义将要用到的表,即TALBES定义部分,然后定义TYPE-POOLS: SLIS.。
SAP_ABAP_OO_实现_CL_SALV_TABLE
SAP_ABAP_OO_实现_CL_SALV_TABLEOO实现ALV⼀、最简单的ALV显⽰以前都是通过函数“REUSE_ALV_GRID_DISPLAY”来显⽰列表,这种⽅式是⾯向过程的,现在有另外⼀种⾯向对象化的⽅式来显⽰列表,函数REUSE_ALV_GRI D_DISPLAY可以做到的它也能够做到。
它主要是通过⼀个类CL_SALV_TABLE来实现的.下⾯让我们来实现最简单的ALV列表。
1取得要显⽰的数据。
2.调⽤类CL_SALV_TABLE的静态⽅法Factory()创建类的实例。
3.取得实例之后再调⽤⽅法Display()显⽰列表.处理过程完成,最后让我们看⼀下显⽰结果。
下⾯是报表的所有源代码:关于ALV的最全⽂档可以参考SAP Help/doc/67f98ad53186bceb19e8bb3a.html /saphelp_nw70/helpdata/EN/5e/88d440e14f8431e10 000000a1550b0/content.htm⼆、ALV显⽰的三种形式⼀般的ALV有三种显⽰形式,分别为⼀、普通的List⼆、全屏的Grid三、在⾃定义屏幕的显⽰的Grid跟以往实现这三种ALV显⽰⽅式相⽐,以往的三种显⽰⽅式分别是调⽤不同的Function和Class,实现⽅式复杂。
现在这三种显⽰⽅式可以通过⼀个类(CL _SALV_TABLE)来实现,⽽且通过这个类和它的⼦类可以更加容易的实现ALV的功能,⽐如:排序,总计,过滤,页眉页脚,单击双击事件等。
下⾯让我们⼀步⼀步地来实现这三种显⽰形式。
1.⾸先我们先创建选择屏幕,屏幕有三个选项,三个选项分别为三种显⽰⽅式。
2取得要显⽰的数据。
3.判断选择屏幕的选项创建不同的实例。
4.当⽤户选择第⼀个选项,列表输出为全屏的⽹格列表,执⾏⽅法alv_ful l( )。
5.当⽤户选择第⼆个选项,列表输出为普通的列表,执⾏⽅法alv_list( ). alv_list⽅法跟alv_full⽅法不同的是在创建实例的时候多了⼀个选项list_ display = ‘X’.6.当⽤户选择第三个选项,列表在⾃定义屏幕上输出⽹格列表,执⾏⽅法a lv_grid( ).⽅法alv_grid()调⽤了屏幕100。
reuse_alv_fieldcatalog_merge 例子
REUSE_ALV_FIELDCATALOG_MERGE是一个SAP ABAP中的功能,用于合并两个字段目录(Field Catalogs)并显示在一个ALV网格(ALV Grid)中。
以下是一个简单的例子来说明如何使用它。
假设我们有两个表SFLIGHT(航班信息)和SBOOK(预订信息),我们想要在一个ALV网格中同时显示这两个表的信息。
1.准备字段目录首先,为SFLIGHT和SBOOK准备两个字段目录。
abap复制代码DATA: lt_fieldcat_sflight TYPE TABLE OF slis_fieldcat_alv,lt_fieldcat_sbook TYPE TABLE OF slis_fieldcat_alv.APPEND VALUE #(fieldname = 'CARRID' name = '航班号' ) TO lt_fieldcat_sflight.APPEND VALUE #(fieldname = 'CONNID' name = '连接号' ) TO lt_fieldcat_sflight.APPEND VALUE #(fieldname = 'FLDATE' name = '飞行日期' ) TO lt_fieldcat_sflight.APPEND VALUE #(fieldname = 'CARRID' name = '航班号' ) TO lt_fieldcat_sbook.APPEND VALUE #(fieldname = 'BOOKID' name = '预订ID' ) TO lt_fieldcat_sbook.APPEND VALUE #(fieldname = 'NAME1' name = '乘客姓名' ) TO lt_fieldcat_sbook. 1.合并字段目录使用REUSE_ALV_FIELDCATALOG_MERGE来合并这两个字段目录。
FUNCTION ALV 强大功能
一。
在ALV报表设计有时候需要根据一定条件将特定的单元显示成特定的颜色,具体实现步骤如下:1. 在需要显示的内表中添加新的字段,字段类型为lvc_t_scol2. 根据条件设置颜色数据;3. 设置layout-coltab_fieldname的数据指定显示颜色的字段.代码如下:(注意红色部分)REPORT z_alv_color.TYPE-POOLS: slis.DATA: BEGIN OF it_flight OCCURS 0,carrid LIKE sflight-carrid,connid LIKE sflight-connid,fldate LIKE sflight-fldate,seatsmax LIKE sflight-seatsmax,seatsocc LIKE sflight-seatsocc,color TYPE lvc_t_scol,END OF it_flight.DATA: it_fieldcat TYPE slis_t_fieldcat_alv,layout TYPE slis_layout_alv.CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'EXPORTINGi_program_name = sy-repidi_internal_tabname = 'IT_FLIGHT'i_inclname = sy-repidCHANGINGct_fieldcat = it_fieldcatEXCEPTIONSinconsistent_interface = 1program_error = 2.SELECT carridconnidfldateseatsmaxseatsoccFROM sflightINTO CORRESPONDING FIELDS OF TABLE it_flightUP TO 20 ROWS.DATA: col TYPE lvc_s_scol,coltab TYPE lvc_t_scol,color TYPE lvc_s_colo.color-col = '6'.color-int = '0'.color-inv = '0'.LOOP AT it_flight.IF it_flight-seatsocc Eq 0.col-fname = 'SEATSOCC'.col-color = color.APPEND col TO coltab.CLEAR col.it_flight-color = coltab.MODIFY it_flight.ENDIF.ENDLOOP.layout-coltab_fieldname = 'COLOR'.CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'EXPORTINGi_callback_program = sy-repidis_layout = layoutit_fieldcat = it_fieldcatTABLESt_outtab = it_flightEXCEPTIONSprogram_error = 1.二。
SAP_ALV_详细使用方法
ALV学习资料SAP提供一组ALV(ABAP LIST VIEWER)功能模块,这些功能模块可以修饰报表输出。
这些设置的ALV功能可以提高报表的可读性。
首先呢,我先跟大家说一下ALV是什么东西?ALV=SAP LIST VIEWER,SAP列表显示器。
就目前ALV技术主要分ALV GRID 和ALV TREE。
先跟大家说一下目前本人用的比较多的ALV GRID技术,ALV GRID 的效果见图(1.1)。
图(1.1)第一步在使用ALV时,需要定义一个SAP标准TYPE-POOLS,具体语法为:TYPE-POOLS: SLIS.然后需要定义一个LAYOUT式样,和一个FIELDCAT字段格式,具体语法为:DATA: LIT_FCAT TYPE SLIS_T_FIELDCAT_ALV,LT_LAYO TYPE SLIS_LAYOUT_ALV,GIT_EVENTS TYPE SLIS_T_EVENT,GIT_LISTHEADER TYPE SLIS_T_LISTHEADER.,LIT_EXTAB TYPE SLIS_T_EXTAB.第二步(可选)可以为需要为最初的目录显示选择参数。
在这里需要使用函数‘'REUSE_ALV_VARIANT_DEFAULT_GET’Sample code:CALL FUNCTION 'REUSE_ALV_VARIANT_DEFAULT_GET'EXPORTINGi_save = variant save condition ( A=all, U = user-specific ) CHANGINGcs_variant = internal table containing the program name (and the defaultvariant---optional )EXCEPTIONSnot_found = 2.使用者也可以使用现有的变量中选择,使用函数‘REUSE_ALV_VARIANT_F4’。
ALV详解:FunctionALV(二)
ALV详解:FunctionALV(⼆)Function ALV单元格数据修改后⽴即同步(即⽴即触发DATA_CHANGED事件)输出内表如果修改了⽹格中数据,如果没有设置在单元格内容被修改后失去焦点(或回车)时⽴即同步到输出内表中(即⽴触发事件),则输出内表中的数据要等到保存、刷新、切换布局等按钮执⾏后,才会触发DATA_CHANGED事件,将修改过的数据更新到输出内表中,如果要求在数据修改失去焦点时⽴即同步到输出内表,则有以下两种⽅法:⽅法⼀:REUSE_ALV_GRID_DISPLAY 函数的i_grid_settings-edt_cll_cb进⾏设置::slis.DATA: gt_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.DATA: gt_sort TYPE slis_t_sortinfo_alv WITH HEADER LINE.DATA:BEGIN OF gt_data OCCURS 0,key1(1),key2(2),END OF gt_data.START-OF-SELECTION.PERFORM inital.DEFINE fill_fdcat.clear gt_fieldcat.gt_fieldcat-fieldname = &1.gt_fieldcat-seltext_l = &2.gt_fieldcat-key = &3.gt_fieldcat-edit = 'X'.append gt_fieldcat.END-OF-DEFINITION.fill_fdcat 'KEY1' 'KEY1' 'X'.fill_fdcat 'KEY2' 'KEY2' 'X'.DATA: i_grid_settings TYPE lvc_s_glay .edt_cll_cb= 'X' .CALL FUNCTION ''EXPORTINGit_fieldcat = gt_fieldcat[]"只要在显⽰界⾯可编辑字段上修改了数据,回车或失去焦点后就会⽴即将内表的数据也修改= i_grid_settingsTABLESt_outtab = gt_data[].READ TABLE gt_data INDEX 1.WRITE: gt_data-key1.FORM inital .gt_data-key1 = 'a'.gt_data-key2 = 'aa'.APPEND gt_data.ENDFORM.⽅法⼆:在user_command 回调Form处理:CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'EXPORTINGi_callback_program = sy-cprogi_callback_user_command = 'USER_COMMAND'it_fieldcat = fieldcat[]TABLESt_outtab = gt_data.FORM user_command USING ucomm LIKE sy-ucommselfield selfield TYPE slis_selfield.l_ref1 TYPE REF TO .CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'IMPORTINGe_grid = l_ref1.CALL METHOD l_ref1->."调⽤此⽅法后会触发DATA_CHANGED事件。
alv标准功能编号
alv标准功能编号ALV(Advanced List View)是SAP提供的一个报表程序,用于生成一个交互式的、灵活的报表。
功能编号是指对ALV中各个功能的标识和引用。
在SAP的ALV中,标准功能编号包括:1. ALV_DELETE_FILTER:删除过滤器。
2. ALV_INSERT_FILTER:插入过滤器。
3. ALV_SCREEN_SIZE:设置屏幕大小。
4. ALV_SET_SORTING:设置排序。
5. ALV_RESET:重置ALV。
6. ALV_COMMIT:提交ALV更改。
7. ALV_GET_FILTER:获取过滤器值。
8. ALV_SET_FILTER:设置过滤器值。
9. ALV_GET_SORTING:获取排序设置。
10. ALV_SET_SORTING:设置排序设置。
11. ALV_GET_SCREEN_SIZE:获取屏幕大小。
12. ALV_SET_SCREEN_SIZE:设置屏幕大小。
13. ALV_GET_DATA:获取ALV数据。
14. ALV_SET_DATA:设置ALV数据。
15. ALV_GET_DISPLAY:获取ALV显示设置。
16. ALV_SET_DISPLAY:设置ALV显示设置。
17. ALV_GET_OPTIONS:获取ALV选项设置。
18. ALV_SET_OPTIONS:设置ALV选项设置。
19. ALV_GET_DATA_FOR_GRAPH:获取用于图表的数据。
20. ALV_SET_DATA_FOR_GRAPH:设置用于图表的数据。
21. ALV_GET_GROUPING:获取分组设置。
22. ALV_SET_GROUPING:设置分组设置。
23. ALV_GET_DRILLDOWN:获取钻取设置。
24. ALV_SET_DRILLDOWN:设置钻取设置。
25. ALV_GET_PDCA:获取PDCA设置。
26. ALV_SET_PDCA:设置PDCA设置。
FM实现ALV Table 七:汇总,分类汇总,排序,过滤
Function实现ALV Table七:汇总,分类汇总,排序,过滤ALV标准功能汇总,分类汇总,排序,过滤这些功能除了可以直接使用它的标准功能按钮之外,你也可以在程序里设定,让ALV列表第一次显示出来就已经使用了这些功能。
用REUSE_ALV_GRID_DISPLAY实现的ALV不能在程序设定输出字段的平均值,最小值,最大值等标准功能。
用OO方式实现ALV输出的就可以,请参考/lhx20/archive/2008/08/26/2833234.aspx一、排序排序用到类型slis_t_sortinfo_alv,按条件把过滤的字段和规则设置好,添加到一个参考slis_t_sortinfo_alv类型的内表,在调用Function的时候指导内表赋给it_sort参数二、过滤过滤用到类型slis_t_filter_alv,按条件把排序的字段和规则设置好,添加到一个参考slis_t_filter_alv类型的内表,在调用Function的时候把内表的值赋给it_fitler参数三、分类汇总分类汇总是汇总和排序两个功能来进行分类和汇总的。
按照排序的字段的值进行分类,对已经汇总的字段进行分类汇总。
在设置排序的时候设置类型slis_t_sortinfo_alv -subtot =‘X’就可以了。
四、汇总汇总是设置要汇总的字段的Fieldcat属性,设置slis_t_fieldcat_alv-do_sum = ‘X’。
下面是源代码TYPE-POOLS slis.TYPES ty_tab_spfli TYPE spfli OCCURS 0.START-OF-SELECTION.PERFORM f_display.*&---------------------------------------------------------------------* *& Form f_getdata*&---------------------------------------------------------------------* * text*----------------------------------------------------------------------* * -->PT_SPFLI text*----------------------------------------------------------------------* FORM f_getdata TABLES pt_spfli TYPE ty_tab_spfli.SELECT * FROM spfli INTO TABLE pt_spfli.ENDFORM. "f_getdata*&---------------------------------------------------------------------* *& Form f_display*&---------------------------------------------------------------------* * text*----------------------------------------------------------------------* FORM f_display.DATA: lt_spfli TYPE ty_tab_spfli,lt_filter TYPE slis_t_filter_alv,lt_sort TYPE slis_t_sortinfo_alv,lt_fieldcat TYPE slis_t_fieldcat_alv.PERFORM f_getdata TABLES lt_spfli.PERFORM f_filter_build TABLES lt_filter.PERFORM f_sort_build TABLES lt_sort.PERFORM f_fieldcat CHANGING lt_fieldcat.CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'EXPORTINGi_callback_program = sy-repidit_fieldcat = lt_fieldcatit_filter = lt_filterit_sort = lt_sortTABLESt_outtab = lt_spfli.ENDFORM. "f_display*&---------------------------------------------------------------------**& Form f_fieldcat*&---------------------------------------------------------------------** text*----------------------------------------------------------------------** -->PT_FIELDCAT text*----------------------------------------------------------------------* FORM f_fieldcat CHANGING pt_fieldcat TYPE slis_t_fieldcat_alv.FIELD-SYMBOLS <fs_fieldcat> LIKE LINE OF pt_fieldcat.CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'EXPORTINGi_structure_name = 'SPFLI'CHANGINGct_fieldcat = pt_fieldcatEXCEPTIONSinconsistent_interface = 1program_error = 2other = 3.LOOP AT pt_fieldcat ASSIGNING <fs_fieldcat> WHERE fieldname = 'DISTANCE'. <fs_fieldcat>-do_sum = 'X'.ENDLOOP.ENDFORM. "f_fieldcat*&---------------------------------------------------------------------**& Form f_filter_build*&---------------------------------------------------------------------** text*----------------------------------------------------------------------** -->PT_FILTER text*----------------------------------------------------------------------* FORM f_filter_build TABLES pt_filter TYPE slis_t_filter_alv.DATA lwa_filter LIKE LINE OF pt_filter.lwa_filter-fieldname = 'DISTANCE'.lwa_filter-sign0 = 'E'.lwa_filter-optio = 'EQ'.lwa_filter-valut = 'MI '.APPEND lwa_filter TO pt_filter.ENDFORM. "f_filter_build*&---------------------------------------------------------------------* *& Form f_sort_build*&---------------------------------------------------------------------* * text*----------------------------------------------------------------------* * -->PT_SORT text*----------------------------------------------------------------------* FORM f_sort_build TABLES pt_sort TYPE slis_t_sortinfo_alv.DATA lwa_sort LIKE LINE OF pt_sort.lwa_sort-fieldname = 'CARRID'.lwa_sort-up = 'X'.lwa_sort-subtot = 'X'.APPEND lwa_sort TO pt_sort.ENDFORM. "f_sort_build。
FM实现ALV Table 三:功能设计
Function实现ALV Table 三:功能设计ALV默认提供了一些标准的功能选择供我们来操作ALV列表,但是这些功能有可能某些是我们不需要用的,想把它隐藏掉,或者某些功能无法做到,就得自定义功能按钮。
一、去掉不必要的功能按钮REUSE_ALV_GRID_DISPLAY提供了一个参数it_exculding来去掉你不想要的ALV功能。
FORM set_func_exculding TABLES pt_extab TYPE slis_t_extab.DATA lwa_extab LIKE LINE OF pt_extab.lwa_extab-fcode = '%SL'.APPEND lwa_extab TO pt_extab.ENDFORM. "set_status_exculding二、自定义功能按钮REUSE_ALV_GRID_DISPLAY有一个参数i_callback_pf_status_set用来设置ALV列表指定的GUI Status。
还有一个参数i_callback_user_command用来设置用户自定义的功能动作。
1.首先要自己创建一个GUI Status,并设置好自定义按钮2.设置ALV使用自己创建的GUI Status。
FORM set_pf_status USING rt_extab TYPE slis_t_extab.SET PF-STATUS 'SLVC_FULLSCREEN' EXCLUDING rt_extab.ENDFORM. "set_pf_status3.设置用户点击自定义的功能按钮之后的动作。
FORM user_command USING r_ucomm TYPE sy-ucommrs_selfield TYPE slis_selfield.DATA l_message TYPE string.CASE r_ucomm.WHEN 'FUNCTION'.MESSAGE i000(ytest) WITH 'You Click Button ''My Func'''.WHEN '&IC1'.l_message = rs_selfield-tabindex.CONCATENATE 'Double Click,''Row:'l_message'Value:'rs_selfield-value'Fieldname:'rs_selfield-fieldnameINTO l_messageSEPARATED BY space.MESSAGE i000(ytest) WITH l_message.ENDCASE.ENDFORM. "user_command下面是效果图源代码TYPE-POOLS slis.PERFORM f_main.*&---------------------------------------------------------------------* *& Form f_main*&---------------------------------------------------------------------* * ALV display*----------------------------------------------------------------------* FORM f_main.DATA: lt_spfli TYPE TABLE OF spfli,lt_fieldcat TYPE slis_t_fieldcat_alv,lt_extab TYPE slis_t_extab.PERFORM get_data TABLES lt_spfli.PERFORM set_catalog CHANGING lt_fieldcat.PERFORM set_func_exculding TABLES lt_extab.CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'EXPORTINGi_callback_program = sy-repidit_fieldcat = lt_fieldcatit_excluding = lt_extabi_callback_pf_status_set = 'SET_PF_STATUS'i_callback_user_command = 'USER_COMMAND'TABLESt_outtab = lt_spfli.ENDFORM. "f_main*&---------------------------------------------------------------------* *& Form set_func_exculding*&---------------------------------------------------------------------* * set function exculding*----------------------------------------------------------------------* * -->PT_EXTAB the function code which will be exculded*----------------------------------------------------------------------* FORM set_func_exculding TABLES pt_extab TYPE slis_t_exta b.DATA lwa_extab LIKE LINE OF pt_extab.lwa_extab-fcode = '%SL'.APPEND lwa_extab TO pt_extab.ENDFORM. "set_status_exculding*&---------------------------------------------------------------------* *& Form set_pf_status*&---------------------------------------------------------------------* * set GUI stauts*----------------------------------------------------------------------* * -->RT_EXTAB the function code which will be exculded*----------------------------------------------------------------------* FORM set_pf_status USING rt_extab TYPE slis_t_extab.SET PF-STATUS 'SLVC_FULLSCREEN' EXCLUDING rt_extab.ENDFORM. "set_pf_status*&---------------------------------------------------------------------* *& Form user_command*&---------------------------------------------------------------------* * user command*----------------------------------------------------------------------* * -->R_UCOMM function code* -->RS_SELFIELD select field structure*----------------------------------------------------------------------* FORM user_command USING r_ucomm TYPE sy-ucommrs_selfield TYPE slis_selfield.DATA l_message TYPE string.CASE r_ucomm.WHEN 'FUNCTION'.MESSAGE i000(ytest) WITH 'You Click Button ''My Func'''.WHEN '&IC1'.l_message = rs_selfield-tabindex.CONCATENATE 'Double Click,''Row:'l_message'Value:'rs_selfield-value'Fieldname:'rs_selfield-fieldnameINTO l_messageSEPARATED BY space.MESSAGE i000(ytest) WITH l_message.ENDCASE.ENDFORM. "user_command*&---------------------------------------------------------------------* *& Form get_data*&---------------------------------------------------------------------* * Get the data for output*----------------------------------------------------------------------* * -->PT_SPFLI data internal table*----------------------------------------------------------------------* FORM get_data TABLES pt_spfli.SELECT * FROM spfli INTO TABLE pt_spfli.ENDFORM. "get_data*&---------------------------------------------------------------------* *& Form set_catalog*&---------------------------------------------------------------------* * set fieldcatalog for alv output*----------------------------------------------------------------------* FORM set_catalog CHANGING pt_fieldcat TYPE slis_t_fieldcat_alv.DATA lwa_fieldcat TYPE slis_fieldcat_alv."macroDEFINE add_field.clear lwa_fieldcat.lwa_fieldcat-col_pos = &1.lwa_fieldcat-fieldname = &2.lwa_fieldcat-seltext_l = &3.append lwa_fieldcat to pt_fieldcat.END-OF-DEFINITION."add field catalogadd_field 1 'MANDT' 'Client'.add_field 2 'CARRID' 'Airline Code'.add_field 3 'CONNID' 'Fight Number'.add_field 4 'COUNTRYFR' 'Country From'.add_field 5 'CITYFROM' 'City From'.add_field 6 'AIRPFROM' 'Airpart From'.add_field 7 'COUNTRYTO' 'Country To'.add_field 8 'CITYTO' 'City To'.add_field 9 'AIRPTO' 'Airpart To'.add_field 10 'FLTIME' 'Fly Time'.add_field 11 'DEPTIME' 'Dept Time'.add_field 12 'ARRTIME' 'Arrive Time'.add_field 13 'DISTANCE' 'Distance'.add_field 14 'DISTID' 'Mass unit of distance'.add_field 15 'FLTYPE' 'Flight type'.add_field 16 'PERIOD' 'Arrival n day(s) later'.ENDFORM. "set_catalog。
OO ALV常用功能完整简例
OO ALV常用功能完整简例(热键单击,双击,帮助,编辑,自定义工具条等)(2013-07-23 14:18:51)转载▼标签:分类:ALValvoo热键跳转ooalv二、效果图:执行:单击单击航线单元格:双击双击连接号码单元格:F4帮助航班单元格上F4或点击后面的小按钮(本功能在设置字段样式时实现DEFINE mac_fieldlog."设置参考表和参考字段,为了提供搜索帮助wa_fieldcatalog-ref_table = &4. "参考表wa_fieldcatalog-ref_field = &5. "参考字段编辑某单元格并校验修改价格后随便点击某个按钮或者双击某个字段,触发:handle_data_changed三、实现过程:1、创建一个屏幕9001,不需要画2、定义数据:*&---------------------------------------------------------------*& ALV 全局变量*&---------------------------------------------------------------DATA: g_alv_grid TYPE REF TO cl_gui_alv_grid,"ALV控件alv_ctner TYPE REF TO cl_gui_docking_container.DATA: wa_fieldcatalog TYPE lvc_s_fcat, "显示数据列内表工作区域 it_fieldcatalog TYPE lvc_t_fcat. "显示数据列内表DATA: g_event TYPE REF TO alv_event_receiver.*&---------------------------------------------------------------*& 全局变量*&---------------------------------------------------------------DATA:BEGIN OF str_spfli,checkbox TYPE char1, "复选框carrid TYPE sflight-carrid , "航线承运人IDconnid TYPE sflight-connid , "航班连接 Idfldate TYPE sflight-fldate , "航班日期price TYPE sflight-price , "航空运费END OF str_spfli.DATA:g_it_show LIKE TABLE OF str_spfli WITH KEY checkbox carrid.g_wa_show LIKE str_spfli.3、获取显示数据:"获取数据SELECT carridconnidfldatepriceFROM sflight INTO CORRESPONDING FIELDS OF TABLE g_it_show.4、alv 显示数据:PROCESS BEFORE OUTPUT.MODULE STATUS_9001."alv 显示数据MODULE MDL_ALV_SHOW.*&---------------------------------------------------------------module MDL_ALV_SHOW output.PERFORM zform_alv_show.endmodule.*&---------------------------------------------------------------FORM zform_alv_show .DATA: l_style TYPE i,ls_layout TYPE lvc_s_layo,is_stable TYPE lvc_s_stbl,l_disvariant TYPE disvariant.* 屏幕初始化IF alv_ctner IS INITIAL.CREATE OBJECT alv_ctnerEXPORTINGrepid = sy-repiddynnr = '9001'* side = cl_gui_docking_container=>dock_at_right ”ALV贴屏幕右边,从屏幕右边开始算宽度side = cl_gui_docking_container=>dock_at_left "ALV贴屏幕左边,从左边算屏幕宽度, extension = 900 "屏幕宽度style = cl_gui_control=>ws_child "可选参数,设置ALV是否可用手动拖动大小EXCEPTIONScntl_error = 1cntl_system_error = 2create_error = 3lifetime_error = 4lifetime_dynpro_dynpro_link = 5OTHERS = 6.IF sy-subrc <> 0.MESSAGE s001(00) WITH '屏幕初始化失败'.LEAVE LIST-PROCESSING.ENDIF.*添加自定义工具条PERFORM frm_set_alv_toolbar.*CREATE OBJECT g_alv_gridEXPORTINGi_parent = alv_ctner.*构建显示字段样式PERFORM frm_build_fieldcat."Set/Reset Ready for Input StatusCALL METHOD g_alv_grid->set_ready_for_inputEXPORTINGi_ready_for_input = 1.* layout 设定样式CLEAR ls_layout.ls_layout-cwidth_opt = 'X'. "优化列宽CLEAR l_disvariant.l_disvariant-report = sy-repid. "当前程序* event 绑定事件CREATE OBJECT g_event."自定义工具条SET HANDLER g_event->toolbar FOR g_alv_grid."数据修改事件SET HANDLER g_event->handle_data_changed FOR g_alv_grid."单击某一单元格事件SET HANDLER g_event->handle_cell_click FOR g_alv_grid."用户点击工具条上按钮触发的事件SET HANDLER g_event->handle_user_command FOR g_alv_grid."双击某一单元格事件SET HANDLER g_event->handle_double_click FOR g_alv_grid."以下两个方法达到的效果是:光标离开正在编辑的单元格时,就触发了handle_data_changed"如果不注释掉以下两个方法,则只有执行下一操作时才会触发handle_data_changed,比如点保存、删除CALL METHOD g_alv_grid->register_edit_eventEXPORTINGi_event_id = cl_gui_alv_grid=>mc_evt_modified.CALL METHOD g_alv_grid->register_edit_eventEXPORTINGi_event_id = cl_gui_alv_grid=>mc_evt_enter.* "显示内表数据CALL METHOD g_alv_grid->set_table_for_first_display EXPORTINGis_layout = ls_layoutis_variant = l_disvariantit_toolbar_excluding = gt_toolsCHANGINGit_fieldcatalog = it_fieldcatalog[]it_outtab = g_it_show[].ELSE."冲销设置tcode 为 RELOAD,防止因为原来的tcode影响程序执行CALL METHOD cl_gui_cfw=>set_new_ok_codeEXPORTINGnew_code = 'RELOAD'."ALV 控制:刷新稳定性按行刷新,可选参数CLEAR is_stable.is_stable-col = 'X'."刷新CALL METHOD g_alv_grid->refresh_table_display EXPORTINGis_stable = is_stablei_soft_refresh = 'X'."提交CALL METHOD cl_gui_cfw=>flush.ENDIF.ENDFORM. " ZFORM_ALV_SHOW其中:添加工具条上常用按钮FORM frm_set_alv_toolbar .REFRESH gt_tools[]."你也可以删除标准的功能按钮DELETE e_object->mt_toolbar WHERE FUNCTION = '&DETAIL'.DELETE e_object->mt_toolbar WHERE FUNCTION = '&REFRESH'.DELETE e_object->mt_toolbar WHERE FUNCTION = '&LOCAL&UNDO'. DELETE e_object->mt_toolbar WHERE FUNCTION = '&SORT_ASC'.DELETE e_object->mt_toolbar WHERE FUNCTION = '&SORT_DSC'.DELETE e_object->mt_toolbar WHERE FUNCTION = '&FIND'.DELETE e_object->mt_toolbar WHERE FUNCTION = '&FIND_MORE'.DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_FILTER'. DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_SUM'.DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_SUBTOT'. DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_EXPORT'. DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_VARIANT'.DELETE e_object->mt_toolbar WHERE quickinfo = '插入行'.DELETE e_object->mt_toolbar WHERE quickinfo = '删除行'.DELETE e_object->mt_toolbar WHERE quickinfo = '剪切'.DELETE e_object->mt_toolbar WHERE quickinfo = '复制文本'.DELETE e_object->mt_toolbar WHERE quickinfo = '插入总览'.DELETE e_object->mt_toolbar WHERE quickinfo = '附加行'.DELETE e_object->mt_toolbar WHERE quickinfo = '复制行'.DELETE e_object->mt_toolbar WHERE quickinfo = '视图'.DELETE e_object->mt_toolbar WHERE quickinfo = '显示图形'.DELETE e_object->mt_toolbar WHERE quickinfo = '撤销'.DELETE e_object->mt_toolbar WHERE quickinfo = '明细'.DELETE e_object->mt_toolbar WHERE quickinfo = '打印'.DELETE e_object->mt_toolbar WHERE quickinfo = '最终用户文档'.APPEND cl_gui_alv_grid=>mc_fc_check TO gt_tools.APPEND cl_gui_alv_grid=>mc_fc_loc_cut TO gt_tools.APPEND cl_gui_alv_grid=>mc_fc_loc_copy TO gt_tools.APPEND cl_gui_alv_grid=>mc_fc_loc_copy_row TO gt_tools.APPEND cl_gui_alv_grid=>mc_fc_loc_delete_row TO gt_tools.APPEND cl_gui_alv_grid=>mc_fc_loc_insert_row TO gt_tools.APPEND cl_gui_alv_grid=>mc_fc_loc_move_row TO gt_tools.APPEND cl_gui_alv_grid=>mc_fc_loc_paste TO gt_tools.APPEND cl_gui_alv_grid=>mc_fc_loc_paste_new_row TO gt_tools.APPEND cl_gui_alv_grid=>mc_fc_sum TO gt_tools.APPEND cl_gui_alv_grid=>mc_fc_info TO gt_tools.APPEND cl_gui_alv_grid=>mc_fc_refresh TO gt_tools.APPEND cl_gui_alv_grid=>mc_fc_graph TO gt_tools.APPEND cl_gui_alv_grid=>mc_fc_loc_append_row TO gt_tools.APPEND cl_gui_alv_grid=>mc_fc_loc_undo TO gt_tools. ENDFORM. " FRM_SET_ALV_TOOLBAR设置显示字段和其参考字段DEFINE mac_fieldlog.* g_pos = g_pos + 1. "第几列* wa_fieldcatalog-col_pos = g_pos. "列wa_fieldcatalog-fieldname = &1. "字段名称* wa_fieldcatalog-coltext = &2. "显示名称,跟reptext效果基本相同wa_fieldcatalog-reptext = &2.wa_fieldcatalog-outputlen = &3. "显示长度"设置参考表和参考字段,为了提供搜索帮助wa_fieldcatalog-ref_table = &4. "参考表 wa_fieldcatalog-ref_field = &5. "参考字段"设置复选框可编辑if &1 eq 'CHECKBOX'.wa_fieldcatalog-checkbox = 'X'.wa_fieldcatalog-edit = 'X'.endif."设置价格PRICE字段可修改if &1 eq 'PRICE'.wa_fieldcatalog-edit = 'X'.endif."设置航线承运人字段 CARRID 为热键if &1 eq 'CARRID'.wa_fieldcatalog-hotspot = 'X'.endif.append wa_fieldcatalog to it_fieldcatalog.clear wa_fieldcatalog.END-OF-DEFINITION.FORM frm_build_fieldcat .mac_fieldlog 'CHECKBOX' '选择' '' ' ' ' ' .mac_fieldlog 'CARRID' '航线承运人' '' 'SFLIGHT' 'CARRID'.mac_fieldlog 'CONNID' '航班数量' '' 'SFLIGHT' 'CONNID' .mac_fieldlog 'FLDATE' '国家' '' 'SFLIGHT' 'FLDATE '. "最后两个字段参考表内字段,可以作为帮助 mac_fieldlog 'PRICE' '起飞城市' '' 'SFLIGHT' 'PRICE' .ENDFORM. " FRM_BUILD_FIELDCAT事件的定义*----------------------------------------------------------------* CLASS ALV_EVENT_RECEIVER DEFINITION*----------------------------------------------------------------CLASS alv_event_receiver DEFINITION.PUBLIC SECTION."添加工具条METHODS toolbar FOR EVENT toolbar OF cl_gui_alv_grid IMPORTINGe_objecte_interactive."子都修改时触发METHODS handle_data_changed FOR EVENT data_changed OF cl_gui_alv_grid IMPORTINGer_data_changed."某字段设置热键后,单击此单元格时触发METHODS handle_cell_click FOR EVENT hotspot_click OF cl_gui_alv_grid IMPORTINGe_row_ide_column_ides_row_no."双击时触发METHODS handle_double_click FOR EVENT double_click OF cl_gui_alv_grid IMPORTINGe_rowe_columnes_row_no."按F1时触发METHODS handle_onf1 FOR EVENT onf1 OF cl_gui_alv_grid IMPORTINGe_fieldnamees_row_noer_event_data."当用户按屏幕上按钮时触发METHODS handle_user_command FOR EVENT user_command OF cl_gui_alv_grid IMPORTINGe_ucomm..ENDCLASS. "alv_event_receiver DEFINITION*&---------------------------------------------------------------------**& Class (Implementation) ALV_EVENT_RECEIVER*&---------------------------------------------------------------------*CLASS alv_event_receiver IMPLEMENTATION.METHOD handle_data_changed.DATA:l_it_data TYPE lvc_t_modi,l_wa_data LIKE LINE OF l_it_data.DATA: l_price_old TYPE string,l_price_new TYPE string,l_msg TYPE string.l_it_data = er_data_changed->mt_mod_cells.LOOP AT er_data_changed->mt_mod_cells INTO l_wa_data WHERE fieldname = 'PRICE'.READ TABLE g_it_show INTO g_wa_show INDEX l_wa_data-row_id.IF sy-subrc = 0.l_price_old = g_wa_show-price .l_price_new = l_wa_data-value .IF l_price_old <> l_price_new.CONCATENATE '价格由' l_price_old '改为' l_price_new INTO l_msg.MESSAGE l_msg TYPE 'I'.ENDIF.ENDIF.ENDLOOP.ENDMETHOD. "handle_data_changedMETHOD toolbar.DATA: ls_toolbar TYPE stb_button.CLEAR ls_toolbar.MOVE 3 TO ls_toolbar-butn_type. "分隔符APPEND ls_toolbar TO e_object->mt_toolbar.CLEAR ls_toolbar.MOVE 'SEL_ALL' TO ls_toolbar-function. "添加两个按钮全选和取消全选MOVE icon_select_all TO ls_toolbar-icon.MOVE '全选' TO ls_toolbar-quickinfo.MOVE ' ' TO ls_toolbar-disabled.APPEND ls_toolbar TO e_object->mt_toolbar.CLEAR ls_toolbar.MOVE 'CAN_ALL' TO ls_toolbar-function.MOVE icon_deselect_all TO ls_toolbar-icon.MOVE '全部取消 ' TO ls_toolbar-quickinfo.MOVE ' ' TO ls_toolbar-disabled.APPEND ls_toolbar TO e_object->mt_toolbar.CLEAR ls_toolbar.MOVE 0 TO ls_toolbar-butn_type. "按钮MOVE 'DELETE' TO ls_toolbar-function. "功能码MOVE 'DELETE' TO ls_toolbar-text. "显示名称MOVE icon_cancel TO ls_toolbar-icon. "图标MOVE '删除选中行' TO ls_toolbar-quickinfo. "鼠标停留时的提示信息MOVE ' ' TO ls_toolbar-disabled. "可用APPEND ls_toolbar TO e_object->mt_toolbar.ENDMETHOD. "toolbarMETHOD handle_cell_click."获取单击字段DATA: l_msg TYPE string,l_wa_click LIKE LINE OF g_it_show,l_row TYPE string,l_field TYPE string.l_row = es_row_no-row_id. "选中行l_field = e_column_id. "选中的字段READ TABLE g_it_show INTO l_wa_click INDEX es_row_no-row_id.IF sy-subrc = 0."得到所单击值CONCATENATE '您选中第' l_row '行,字段为:' l_field ',选中值为' l_wa_click-carrid INTO l_msg.MESSAGE l_msg TYPE 'I'.ENDIF.ENDMETHOD. "handle_cell_clickMETHOD handle_double_click."获取单击字段DATA: l_msg TYPE string,l_wa_click LIKE LINE OF g_it_show,l_row TYPE string,l_field TYPE string.l_field = e_column-fieldname. "选中行l_row = es_row_no-row_id. "选中的字段READ TABLE g_it_show INTO l_wa_click INDEX es_row_no-row_id .IF sy-subrc = 0."得到所单击值CONCATENATE '您选中第' l_row '行,字段为:' l_field ',选中值为:' INTO l_msg.CASE l_field.WHEN 'CONNID'.CONCATENATE l_msg l_wa_click-connid INTO l_msg.MESSAGE l_msg TYPE 'I'.WHEN 'FLDATE'.CONCATENATE l_msg l_wa_click-fldate INTO l_msg.MESSAGE l_msg TYPE 'I'.ENDCASE.ENDIF.ENDMETHOD. "handle_DOUBLE_CLICKMETHOD handle_onf1.ENDMETHOD. "handle_ONF1*&---------------------------------------------------------------------------&**& **& HANDLE_USER_COMMAND * *&---------------------------------------------------------------------------&* METHOD handle_user_command.REFRESH:lt_cols, lt_rows.CALL METHOD g_alv_grid->get_selected_rows IMPORTINGet_index_rows = lt_rows.CALL METHOD g_alv_grid->get_selected_columns IMPORTINGet_index_columns = lt_cols.CALL METHOD cl_gui_cfw=>flush.CASE e_ucomm.WHEN 'SEL_ALL'.LOOP AT g_it_show INTO g_wa_show.g_wa_show-checkbox = 'X'.MODIFY g_it_show FROM g_wa_show.ENDLOOP.WHEN 'CAN_ALL'.LOOP AT g_it_show INTO g_wa_show.g_wa_show-checkbox = ' '.MODIFY g_it_show FROM g_wa_show.ENDLOOP.WHEN 'DELETE'.LOOP AT g_it_show INTO g_wa_show WHERE checkbox IS NOT INITIAL.DELETE TABLE g_it_show FROM g_wa_show.ENDLOOP.WHEN OTHERS.ENDCASE.CALL METHOD cl_gui_cfw=>set_new_ok_codeEXPORTINGnew_code = 'RELOAD'.ENDMETHOD. "HANDLE_USER_COMMANDENDCLASS. "ALV_EVENT_RECEIVER关于删除标准按钮,我也debug的然后可以根据功能码或者quickinfo删除可能alv会用到跳转跳转METHOD HANDLE_CELL_CLICK.PERFORM FRM_TO_ME23N USING ES_ROW_NO.ENDMETHOD. "handle_cell_cFORM FRM_TO_ME23N USING PV_ES_ROW_NO TYPE LVC_S_ROID."获取单击字段DATA: L_WA_CLICK LIKE LINE OF GT_DATA.READ TABLE GT_DATA INTO L_WA_CLICK INDEX PV_ES_ROW_NO-ROW_ID. IF SY-SUBRC = 0.SET PARAMETER ID 'BES' FIELD L_WA_CLICK-EBELN.CALL TRANSACTION 'ME23N' AND SKIP FIRST SCREEN .ENDIF.ENDFORM. "frm_to_me23n。
abap alv 代码模板
abap alv 代码模板ALV (ABAP List Viewer) 是SAP 提供的一个非常强大的报表工具。
下面是一个简单的ALV 代码模板,你可以根据自己的需求进行修改:REPORT ZEXAMPLE.PARAMETERS: p_matnr TYPE matnr OBLIGATORY,p_werks TYPE werks OBLIGATORY.START-OF-SELECTION.* 创建ALV 结构体DATA: lt_matkl LIKE TABLE OF matkl,lt_matnr_werks TYPE TABLE OF matnr werks.* 填充数据INSERT INTO lt_matkl VALUES ('MATERIAL', 'MATERIAL', 'DESCRIPTION').INSERT INTO lt_matkl VALUES ('MAT1000', 'ZINC', 'ZINC MATERIAL').INSERT INTO lt_matkl VALUES ('MAT2000', 'IRON', 'IRON MATERIAL').APPEND TO TABLE lt_matnr_werks VALUES ('MAT1000', '100').APPEND TO TABLE lt_matnr_werks VALUES ('MAT2000', '200').* 创建ALV 实例DATA: l_options TYPE REF TO cl_salv_table_options,l_alv TYPE REF TO cl_salv_list.CALL METHOD cl_salv_table_options=>create_by_nameEXPORTINGname = 'alv'IMPORTINGoptions = l_options.CALL METHOD cl_salv_list=>createEXPORTINGi_parent = l_options->get_parent( )IMPORTINGe_outtab = lt_matnr_werks.CALL METHOD l_alv->display.这个模板创建了一个简单的ALV 报表,显示了两个材料(MAT1000 和MAT2000)和它们的工厂(100 和200)。
源代码(ALV F4帮助 插入 复制 删除)
ALV—F4帮助插入复制删除编辑一、功能展示:1.ALV展示画面2.插入功能3.复制行功能展示4.删除行功能展示二、源代码(数据均是通过代码添加至内表,不涉及取数,所以任何系统均可执行此代码)。
*&---------------------------------------------------------------------**& Report ZALV_F4*& 作者:SAP_MAO*&---------------------------------------------------------------------**& 功能背景:实现取数*& ->ALV显示*& ->ALV可编辑(新增,修改,删除,F4帮助)*& ->保存至自建表(demo省略数据检查步骤)*&*&---------------------------------------------------------------------* REPORT ZALV_DEMO03.* 类型池TYPE-POOLS:SLIS.* 在这个类未真正定义之前暂时定义,供其他类或者变量参照定义(如 row-30 ) CLASS LCL_EVENT_RECEIVER DEFINITION DEFERRED.* 常量定义* 类型定义TYPES: BEGIN OF TYP_EDIT ,MANDT TYPE MANDT, " 客户端PERNR TYPE PERSNO, " 人员号NACHN TYPE NACHN, " 姓ZSEX TYPE CHAR2, " 性别SCORE TYPE CHAR5, " 分数END OF TYP_EDIT.* 变量定义DATA: GT_FCAT TYPE LVC_T_FCAT,GS_FCAT TYPE LVC_S_FCAT,GT_F4 TYPE LVC_T_F4,GS_F4 TYPE LVC_S_F4,GS_EVENT TYPE SLIS_ALV_EVENT,GT_EVENT TYPE SLIS_T_EVENT,GS_LAYOUT TYPE LVC_S_LAYO,GS_GLAY TYPE LVC_S_GLAY.DATA: EVENT_RECEIVER TYPE REF TO LCL_EVENT_RECEIVER,GO_GRID TYPE REF TO CL_GUI_ALV_GRID. " ALV List Viewer DATA: BEGIN OF GS_DATA ,PERNR TYPE PERSNO, " 人员号NACHN TYPE NACHN, " 姓ZSEX TYPE CHAR2, " 性别SCORE TYPE CHAR5, " 分数SEL(1), "被显示的内表,添加一个专用字段END OF GS_DATA,GT_DATA LIKE STANDARD TABLE OF GS_DATA.DATA: BEGIN OF GS_F4VALUE,GESCH TYPE GESCH,ZTEXT TYPE TEXT,END OF GS_F4VALUE,GT_F4VALUE LIKE TABLE OF GS_F4VALUE.*&---------------------------------------------------------------------* *& CLASS LCL_EVENT_RECEIVER DEFINITION*&---------------------------------------------------------------------* CLASS LCL_EVENT_RECEIVER DEFINITION. " 定义PUBLIC SECTION.METHODS:HANDLE_F4 FOR EVENT ONF4 OF CL_GUI_ALV_GRIDIMPORTING E_FIELDNAMEE_FIELDVALUEES_ROW_NOER_EVENT_DATAET_BAD_CELLSE_DISPLAY.ENDCLASS.*&---------------------------------------------------------------------**& CLASS LCL_EVENT_RECEIVER IMPLEMENTATION*&---------------------------------------------------------------------* CLASS LCL_EVENT_RECEIVER IMPLEMENTATION." 实施METHOD HANDLE_F4.PERFORM F_F4_HELP USING E_FIELDNAMEES_ROW_NO.ER_EVENT_DATA->M_EVENT_HANDLED = 'x' .PERFORM REFRESH_TABLE_ALV.ENDMETHOD.ENDCLASS.INITIALIZATION.AT SELECTION-SCREEN.START-OF-SELECTION." 获取数据PERFORM FRM_GET_DATA.PERFORM FRM_SHOW_DATA.*&---------------------------------------------------------------------**& Form FRM_GET_DATA*&---------------------------------------------------------------------** text*----------------------------------------------------------------------** --> p1 text* <-- p2 text*----------------------------------------------------------------------* FORM FRM_GET_DATA .* SELECT pernr nachn FROM pa0002 INTO CORRESPONDING FIELDS OF TABLE gt_dat a* WHERE begda LE sy-datum AND endda GE sy-datum.GS_DATA-PERNR = '10000001'.GS_DATA-NACHN = '王'.APPEND GS_DATA TO GT_DATA.CLEAR GS_F4VALUE.GS_F4VALUE-GESCH = 1.GS_F4VALUE-ZTEXT = '男'.APPEND GS_F4VALUE TO GT_F4VALUE.CLEAR GS_F4VALUE.GS_F4VALUE-GESCH = 2.GS_F4VALUE-ZTEXT = '女'.APPEND GS_F4VALUE TO GT_F4VALUE.ENDFORM. " FRM_GET_DATA*&---------------------------------------------------------------------* *& Form FRM_SHOW_DATA*&---------------------------------------------------------------------* * text*----------------------------------------------------------------------* * --> p1 text* <-- p2 text*----------------------------------------------------------------------* FORM FRM_SHOW_DATA .DEFINE %%FCAT.CLEAR gs_fcat.gs_fcat-fieldname = &1.gs_fcat-scrtext_l = &2.gs_fcat-KEY = &3.gs_fcat-edit = &4.IF &1 = 'ZSEX'.gs_fcat-f4availabl = 'X'.ENDIF.APPEND gs_fcat TO gt_fcat.END-OF-DEFINITION.%%FCAT: 'PERNR' '人员编号' 'X' 'X','NACHN' '姓名' 'X' 'X','ZSEX' '性别' '' 'X','SCORE' '分数' '' 'X'.DATA: LS_LAYOUT TYPE LVC_S_LAYO.LS_LAYOUT-ZEBRA = ABAP_TRUE.LS_LAYOUT-CWIDTH_OPT = ABAP_TRUE.LS_LAYOUT-BOX_FNAME = 'SEL'. "指定这个字段为【选择块】GS_EVENT-NAME = 'CALLER_EXIT'.GS_EVENT-FORM = 'F_CALLER_EXIT'.APPEND GS_EVENT TO GT_EVENT.GS_GLAY-EDT_CLL_CB = 'X'.CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'EXPORTINGI_CALLBACK_PROGRAM = SY-CPROGI_CALLBACK_PF_STATUS_SET = 'PF_STATUS_SET'I_CALLBACK_USER_COMMAND = 'FRM_USER_COMMAND'IS_LAYOUT_LVC = LS_LAYOUTIT_FIELDCAT_LVC = GT_FCATIT_EVENTS = GT_EVENTI_GRID_SETTINGS = GS_GLAYTABLEST_OUTTAB = GT_DATA.ENDFORM. " FRM_SHOW_DATAFORM F_CALLER_EXIT USING E_GRID TYPE SLIS_DATA_CALLER_EXIT.GS_F4-FIELDNAME = 'ZSEX'.GS_F4-REGISTER = 'X'.INSERT GS_F4 INTO TABLE GT_F4.CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'IMPORTINGE_GRID = GO_GRID.CREATE OBJECT EVENT_RECEIVER.SET HANDLER EVENT_RECEIVER->HANDLE_F4 FOR GO_GRID.CALL METHOD GO_GRID->REGISTER_F4_FOR_FIELDSEXPORTINGIT_F4 = GT_F4[].ENDFORM.FORM F_F4_HELP USING E_FIELDNAME TYPE LVC_FNAME ES_ROW_NO TYPE LVC_S_ROID. DATA: LT_DDSHRETVAL TYPE STANDARD TABLE OF DDSHRETVAL,LS_DDSHRETVAL TYPE DDSHRETVAL.CHECK E_FIELDNAME = 'ZSEX'.REFRESH LT_DDSHRETVAL.CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'EXPORTINGRETFIELD = 'ZSEX' " Name of return field in FIELD_TABDYNPPROG = SY-REPIDDYNPNR = SY-DYNNRDYNPROFIELD = 'ZTEXT' " Name of screen field for value return VALUE_ORG = 'S'CALLBACK_PROGRAM = SY-REPIDTABLESVALUE_TAB = GT_F4VALUERETURN_TAB = LT_DDSHRETVALEXCEPTIONSPARAMETER_ERROR = 1NO_VALUES_FOUND = 2OTHERS = 3.IF SY-SUBRC = 0 AND LT_DDSHRETVAL IS NOT INITIAL .CLEAR LS_DDSHRETVAL.READ TABLE LT_DDSHRETVAL INTO LS_DDSHRETVAL INDEX 1.IF LS_DDSHRETVAL-FIELDVAL IS NOT INITIAL.CLEAR GS_DATA.READ TABLE GT_DATA INTO GS_DATA INDEX ES_ROW_NO-ROW_ID.GS_DATA-ZSEX = LS_DDSHRETVAL-FIELDVAL.MODIFY GT_DATA FROM GS_DATA INDEX ES_ROW_NO-ROW_IDTRANSPORTING ZSEX.ENDIF.ENDIF.ENDFORM.FORM REFRESH_TABLE_ALV .DATA: LS_STBL TYPE LVC_S_STBL.LS_STBL-ROW = 'X'."LS_STBL-COL = 'X'.CALL METHOD GO_GRID->REFRESH_TABLE_DISPLAYEXPORTINGIS_STABLE = LS_STBL.ENDFORM.FORM PF_STATUS_SET USING RT_EXTAB TYPE SLIS_T_EXTAB.SET PF-STATUS 'STANDARD_001'.ENDFORM.*&---------------------------------------------------------------------* *& Form FRM_ALV_USER_COMMAND*&---------------------------------------------------------------------**& user_command功能实现*&---------------------------------------------------------------------* *& --> p1 text*& <-- p2 text*&---------------------------------------------------------------------* FORM FRM_USER_COMMAND USING UCOMM TYPE SY-UCOMMSELFIELD TYPE SLIS_SELFIELD.DATA: LR_GRID TYPE REF TO CL_GUI_ALV_GRID.DATA: L_ANSWER TYPE CHAR1.DATA: LS_LAYOUT TYPE LVC_S_LAYO.DATA LT_EDIT TYPE TABLE OF TYP_EDIT.DATA LS_EDIT TYPE TYP_EDIT.LS_LAYOUT-ZEBRA = ABAP_TRUE.LS_LAYOUT-CWIDTH_OPT = ABAP_TRUE.LS_LAYOUT-BOX_FNAME = 'SEL'. "指定这个字段为【选择块】SELFIELD-REFRESH = 'X'.CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'IMPORTINGE_GRID = LR_GRID.LR_GRID->CHECK_CHANGED_DATA( ). "refresh alv* LR_GRID->REFRESH_TABLE_DISPLAY( ). "refresh alvCASE UCOMM.WHEN 'F03' OR 'F15'.LEAVE PROGRAM.* LEAVE LIST-PROCESSING. " 返回选择屏幕WHEN 'F12'.LEAVE PROGRAM. " 退出程序WHEN '&INSERT'. " 双击事件CLEAR GS_DATA.INSERT GS_DATA INTO GT_DATA INDEX 1.CLEAR GS_DATA.SELFIELD-REFRESH = 'X'.WHEN '©'.READ TABLE GT_DATA WITH KEY SEL = 'X' INTO GS_DATA.IF SY-TABIX = 1.ENDIF.IF SY-SUBRC = 0.APPEND GS_DATA TO GT_DATA .CLEAR GS_DATA.ELSE.MESSAGE '请选择复制行' TYPE 'S' DISPLAY LIKE 'E'.ENDIF.WHEN '&DELETE'.DELETE GT_DATA INDEX SELFIELD-TABINDEX.WHEN 'SAVE'.LOOP AT GT_DATA INTO GS_DATA.MOVE-CORRESPONDING GS_DATA TO LS_EDIT.LS_EDIT-MANDT = SY-MANDT.APPEND LS_EDIT TO LT_EDIT.CLEAR:GS_DATA,LS_EDIT.ENDLOOP.DELETE FROM ZALV_EDIT.INSERT ZALV_EDIT FROM TABLE LT_EDIT.IF SY-SUBRC = 0.COMMIT WORK.MESSAGE '保存成功' TYPE 'S'.ELSE.ROLLBACK WORK.MESSAGE '保存失败' TYPE 'S' DISPLAY LIKE 'E'.ENDIF.WHEN OTHERS.* LR_GRID->SET_FRONTEND_LAYOUT( LS_LAYOUT ).* LR_GRID->REFRESH_TABLE_DISPLAY( ). "refresh alv ENDCASE.ENDFORM.。
OO实现ALV TABLE 八:ALV的布局功能
OO实现ALV TABLE 八:ALV的布局功能在ALV的输出结果中,我们可以利用ALV提供的标准功能(过滤,排序,汇总)对输出结果正行操作。
比如说我们对一个结果进行了排序和过滤等的动作,下次再运行这个报表的时候可以选择一个功能直接运行这些动作。
这就需要布局(Layout)的功能了。
首先我们设置布局的功能按钮。
ls_key-report = sy-repid.lr_layout = gr_table->get_layout( ).lr_layout->set_key( ls_key ).lr_layout->set_save_restriction( l_restrict ).lr_layout->set_default( 'X' ).IF p_lay IS NOT INITIAL.lr_layout->set_initial_layout( p_lay ).ENDIF.设置前台选项页面。
SELECTION-SCREEN BEGIN OF BLOCK blk WITH FRAME.PARAMETERS: p_lay LIKE disvariant-variant.SELECTION-SCREEN SKIP.PARAMETERS: p_save1 RADIOBUTTON GROUP rg DEFAULT 'X',p_save2 RADIOBUTTON GROUP rg,p_save3 RADIOBUTTON GROUP rg.SELECTION-SCREEN END OF BLOCK blk.设置前台布局选项功能搜索帮助DATA: ls_layout TYPE salv_s_layout_info,ls_key TYPE salv_s_layout_key,l_restrict TYPE salv_de_layout_restriction.l_restrict = get_restrict( ).ls_key-report = sy-repid.ls_layout = cl_salv_layout_service=>f4_layouts(s_key = ls_keyrestrict = l_restrict ).layout = ls_layout-layout.下面是效果图下面是程序的所有代码:REPORT y_xin_002.*变量定义TYPES: BEGIN OF gs_spfli,mandt TYPE spfli-mandt,carrid TYPE spfli-carrid,connid TYPE spfli-connid,countryfr TYPE spfli-countryfr, cityfrom TYPE spfli-cityfrom, airpfrom TYPE spfli-airpfrom, countryto TYPE spfli-countryto, cityto TYPE spfli-cityto,airpto TYPE spfli-airpto,fltime TYPE spfli-fltime,deptime TYPE spfli-deptime,arrtime TYPE spfli-arrtime,distance TYPE spfli-distance,distid TYPE spfli-distid,fltype TYPE spfli-fltype,period TYPE spfli-period,END OF gs_spfli.TYPES ty_spfli TYPE gs_spfli OCCURS 0.*选择屏幕SELECTION-SCREEN BEGIN OF BLOCK blk WITH FRAME.PARAMETERS: p_lay LIKE disvariant-variant.SELECTION-SCREEN SKIP.PARAMETERS: p_save1 RADIOBUTTON GROUP rg DEFAULT 'X',p_save2 RADIOBUTTON GROUP rg,p_save3 RADIOBUTTON GROUP rg.SELECTION-SCREEN END OF BLOCK blk.*----------------------------------------------------------------------* * CLASS lcl_alv DEFINITION*----------------------------------------------------------------------* * ALV操作类(定义)*----------------------------------------------------------------------* CLASS lcl_alv DEFINITION.PUBLIC SECTION.METHODS: getdata "取得要显示的数据RETURNING value(lt_tab) TYPE ty_spfli,alv_full "全屏Grid列表处理方法IMPORTING value(lt_tab) TYPE ty_spfli.CLASS-METHODS: f4_layout "布局选项的搜索帮助EXPORTING value(layout) TYPE disvariant-variant,get_restrict "取得约束选项的值RETURNING value(restrict) TYPEsalv_de_layout_restriction.PRIVATE SECTION.DATA: gr_table TYPE REF TO cl_salv_table.ENDCLASS. "lcl_alv DEFINITION*----------------------------------------------------------------------* * CLASS lcl_alv IMPLEMENTATION*----------------------------------------------------------------------* * ALV操作类(实现)*----------------------------------------------------------------------* CLASS lcl_alv IMPLEMENTATION.*取得要显示的数据METHOD getdata.SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_tab FROM spfli.ENDMETHOD. "getdata*输出全屏网格列表的方法METHOD alv_full.DATA: lr_functions TYPE REF TO cl_salv_functions_list,lr_selections TYPE REF TO cl_salv_selections,lr_layout TYPE REF TO cl_salv_layout,ls_key TYPE salv_s_layout_key,l_restrict TYPE salv_de_layout_restriction.l_restrict = lcl_alv=>get_restrict( )."创建实例TRY.cl_salv_table=>factory(IMPORTINGr_salv_table = gr_tableCHANGINGt_table = lt_tab).CATCH cx_salv_msg.ENDTRY."设置布局功能按钮ls_key-report = sy-repid.lr_layout = gr_table->get_layout( ).lr_layout->set_key( ls_key ).lr_layout->set_save_restriction( l_restrict ).lr_layout->set_default( 'X' ).IF p_lay IS NOT INITIAL.lr_layout->set_initial_layout( p_lay ).ENDIF."显示ALV的标准功能lr_functions = gr_table->get_functions( ).lr_functions->set_all( 'X' ).""显示列表gr_table->display( ).ENDMETHOD. "alv_full*前台布局选项搜索帮助METHOD f4_layout.DATA: ls_layout TYPE salv_s_layout_info,ls_key TYPE salv_s_layout_key,l_restrict TYPE salv_de_layout_restriction.l_restrict = get_restrict( ).ls_key-report = sy-repid.ls_layout = cl_salv_layout_service=>f4_layouts(s_key = ls_keyrestrict = l_restrict ).layout = ls_layout-layout.ENDMETHOD. "f4_layout*取得约束选项的值METHOD get_restrict.CASE 'X'.WHEN p_save1.restrict = if_salv_c_layout=>restrict_none.WHEN p_save2.restrict = if_salv_c_layout=>restrict_user_dependant.WHEN p_save3.restrict = if_salv_c_layout=>restrict_user_independant.ENDCASE.ENDMETHOD. "constructorENDCLASS. "lcl_alv IMPLEMENTATION*&---------------------------------------------------------------------* *& Form f_main*&---------------------------------------------------------------------* * 整合数据,执行*----------------------------------------------------------------------* FORM f_main.DATA: lt_tab TYPE ty_spfli,lr_alv TYPE REF TO lcl_alv.CREATE OBJECT lr_alv."取得要显示的数据lt_tab = lr_alv->getdata( ).lr_alv->alv_full( lt_tab ).ENDFORM. "f_main*布局搜索帮助AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_lay.CALL METHOD lcl_alv=>f4_layoutIMPORTINGlayout = p_lay.*执行动作START-OF-SELECTION.PERFORM f_main.。
alv自动列宽
在SAP ABAP中,要实现ALV(ABAP List Viewer)的自动列宽,可以使用以下步骤:
1. 设置布局参数:
在创建或修改ALV网格控件时,需要设置布局参数以启用自动列宽功能。
abap代码:
2. 设置布局参数:
使用SET_TABLE_FOR_FIRST_DISPLAY方法设置表格数据和布局参数。
在这个方法中,你可以设置LAYOUT-CWIDTH_OPT参数为X来启用自动列宽。
abap代码:
在<layout_parameter>结构中,设置CWIDTH_OPT字段为X:
abap代码:
3. 刷新ALV:
调用refresh_table_display方法来应用新的布局参数并刷新ALV。
abap代码:
通过以上步骤,ALV应该会根据内容自动调整列宽。
请注意,这可能会导致某些列宽过大或过小,如果需要更精细的控制,可能需要手动调整特定列的宽度或者使用其他的布局策略。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
*&---------------------------------------------------------------------*
num TYPE zrecord-num,
END OF ty_out.
TYPES:BEGIN OF ty_truck,
cbo TYPE c, "选择列
truckid TYPE ztruckinfo-truckid,
name TYPE ztruckinfo-name, "车名
PERFORM f_field_table USING 'VOLEH' '体积单位' 'VOLEH' 'LIPS'.
PERFORM f_field_table USING 'VSTEL' '销售点' 'VSTEL' 'LIKP'.
PERFORM f_field_table USING 'TRUCKID' '分配车辆' 'TRUCKID' ''.
LOOP AT it_out INTO wa_out.
wa_out-truckid = '@06@'. "图标名称
MODIFY it_out FROM wa_out.
ENDLOOP.
ENDFORM. "get_data
*&---------------------------------------------------------------------*
wa_excluding LIKE line of i_excluding,
it_excluding type slis_t_extab.
DATA:key TYPE i VALUE 1, "记录选中ALV的行号
index TYPE i VALUE 0, "为隔行显示背景色设置变量
DATA it_distribution TYPE STANDARD TABLE OF zdistribution.
*************************************定义与数据表ZRECORD对应的表
DATA wa_record LIKE zrecord.
DATA it_record TYPE STANDARD TABLE OF zrecord.
posnr TYPE lips-posnr, "行号
matnr TYPE lips-matnr, "物料号
lfimg TYPE lips-lfimg, "数量
vrkme TYPE lips-vrkme, "单位
ntgew TYPE lips-ntgew, "重量
gewei TYPE lips-gewei, "重量单位
UP TO p_rows ROWS
WHERE lips~lfimg > 0
AND lips~VBELN IN s_vbeln
AND lips~matnr IN s_matnr
AND likp~vstel = p_vstel.
**********************************************************为ALV加上图标
FORM f_fieldcat. "第2个参数可以设置表头别名
PERFORM f_field_table USING 'SEQ' '复选' 'SEQ' ''.
PERFORM f_field_table USING 'VBELN' '交货单号' 'VBELN' 'LIPS'.
PERFORM f_field_table USING 'POSNR' '行项目号' 'POSNR' 'LIPS'.
*&---------------------------------------------------------------------*
*& Report Z2012_08_30
*&
*&---------------------------------------------------------------------*
PERFORM f_field_table USING 'KWMENG' '装载数量' 'KWMENG' ''.
ENDFORM. "f_fieldcat
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT Z2012_08_30.
" 包含图标等在内的一些信息
INCLUDE <list> .
TABLES vbap.
TABLES lips.
PERFORM get_data.
END-OF-SELECTION.
************************************************************** 显示数据
PERFORM f_fieldcat.
PERFORM f_layout.
kwmeng TYPE lips-lfimg, "运输的重量
END OF ty_truck.
******************************************************设置隐藏标准按钮的变量
DATA: i_excluding TYPE slis_t_extab,
lips~ntgew lips~gewei lips~volum lips~voleh likp~vstel
FROM lips JOIN likp ON lips~vbeln = likp~vbeln
INTO CORRESPONDING FIELDS OF TABLE it_out
* text
*----------------------------------------------------------------------*
FORM get_data.
SELECT lips~vbeln lips~posnr lips~matnr lips~lfimg lips~vrkme
DATA t_fieldcat TYPE slis_t_fieldcat_alv.
DATA w_fieldcat TYPE LINE OF slis_t_fieldcat_alv.
DATA wa_layout TYPE slis_layout_alv.
DATA wa_layout1 TYPE slis_layout_alv.
TABLES likp.
TABLES ztruckinfo.
TABLES zdistribution.
TABLES zrecord.
TYPE-POOLS slis.
TYPES:BEGIN OF ty_out,
seq ips-vbeln, "销售订单号
*& Form f_fieldcat
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
PERFORM f_field_table USING 'NTGEW' '重量' 'NTGEW' 'LIPS'.
PERFORM f_field_table USING 'GEWEI' '重量单位' 'GEWEI' 'LIPS'.
PERFORM f_field_table USING 'VOLUM' '体积' 'VOLUM' 'LIPS'.
PERFORM f_exclude.
PERFORM f_call_alv.
*&---------------------------------------------------------------------*
*& Form get_data
*&---------------------------------------------------------------------*
PARAMETER p_vstel TYPE likp-vstel DEFAULT '1000'.
PARAMETER p_rows(3) TYPE C DEFAULT 100.
START-OF-SELECTION.