两者的操作大同小异,只是后者能更好的和ALV容器结合使用,前后则不能;而在输入参数属性的结构上也有些差异。
I_INTERFACE_CHECK:检查接口一致性
I_BYPASSING_BUFFER:是否使用缓存
I_BUFFER_ACTIVE:是否激活缓存,如果每次显示ALV都是相同的字段目录,则该字段目录会被放到一特殊的缓存里,加快显示速度。
I_CALLBACK_HTML_END_OF_LIST:ALVHTML格式页脚内容信息
I_STRUCTURE_NAME:为输出表数据结构的命名,指定了这个参数,域目录将会自动生成
I_BACKGROUND_ID:ALV背景图片ObjectID
IT_SPECIAL_GROUPS/IT_SPECIAL_GROUPS_LVC:若内表中一些字段通过SP_GROUP被分组在一起,必须为这些组传递组文本内表
IT_FILTER/IT_FILTER_LVC:ALV过滤设置
IS_SEL_HIDE:替换或修改屏幕中select-option的值
IT_EVENT_EXIT:设置回调的方法的执行行为,表明用户所写的代码是在执行标准执行之前还是之后
I_SCREEN_START_COLUMN:以对话框形式显示的开始列
I_SCREEN_START_LINE:以对话框形式显示的开始行
I_SCREEN_END_COLUMN:以对话框形式显示的结束列
I_SCREEN_END_LINE:以对话框形式显示的结束行
I_HTML_HEIGHT_TOP:HTML抬头的高度
I_HTML_HEIGHT_END:HTML页脚的高度
IT_ALV_GRAPHICS:是否可以在图表中显示ALV
IT_HYPERLINK:使用超链接
下面详细介绍下常用的输入参数:
1.I_CALLBACK_PROGRAM参数属性
定义调用程序名称,一般为当前程序sy-repid
2.I_CALLBACK_PF_STATUS_SET参数
定义ALV屏幕菜单,此参数允许报表展现用户自定义的屏幕菜单,
参数类型为:SLIS_FORMNAME,指定自定义按钮的子FORM,该子FORM不显式的调用;
如:
i_callback_pf_status_set='FRM_SET_STATUS'Form中的定义为:
FORMfrm_set_statusUSINGp_extabTYPEslis_t_extab.SETPF-STATUS'Z_ALV_STATUS'.ENDFORM."frm_set_status
2.1).没有自定义按钮时候,该参数可以不要,这时会显示ALV标准的按钮;
2.2).当我们使用自定义按钮后,ALV自带的标准按钮,则会失效,这时需要将一些必要的按钮在工具条补上;
2.3).其中“分隔符”的插入方法为:在需要插入分隔符的方框内,选择菜单:Edit->Insert->Separatorline即可插入分隔符;
2.4).下面是ALV中的标准工具的名称、代码、图标名称、快捷键:
2.5).一般情况下,可以快速拷贝标准程序的菜单栏,再进行修改、筛选;
操作步骤如下:
01).进入SE80,打开RepositoryInformationSystem;
02).打开路径:RepositoryInformationSystem->ProgramLibrary->ProgramSubObjects->GUIStatus;
03).在右边屏幕的程序名称(ProgramName)输入框内输入标准程序名称:SAPLKKBL,然后执行;
05).双击进入菜单编辑后,拷贝到需要用到的程序中即可。
完成标准按钮添加
3.I_CALLBACK_USER_COMMAND参数属性
参数类型为:SLIS_FORMNAME,与I_CALLBACK_PF_STATUS_SET参数一样,为定义的子FORM,不显式调用;
i_callback_user_command='FRM_ALV_USER_COMMAND'Form的定义为:
其中,标准按钮的FCode,可以通过类CL_GUI_ALV_GRID中的Attributes查看;
操作步骤:
01).进入事务码SE24,输入类名称:CL_GUI_ALV_GRID,点击显示(Display);
02).切换到Attributes标签,找到自己需要的”属性”和”初始值”,这个初始值就是我们要找的标准按钮的FCODE;
3.1热点链接
设置之后,当用户点击带有热点的字段时,就会触发Subroutine(FRM_USER_COMMAND)中的动作;
对于热点链接,所对应的FCode为“&IC1“;
示例如下:
lv_pos=lv_pos+1.wa_fieldcat-col_pos=lv_pos.wa_fieldcat-fieldname='MATNR'.wa_fieldcat-scrtext_l='物料编号'.wa_fieldcat-fix_column='X'.wa_fieldcat-hotspot='X'."热点,链接用APPENDwa_fieldcatTOi_fieldcat.CLEARwa_fieldcat.*&---------------------------------------------------------------------**&FormFRM_ALV_USER_COMMAND*&---------------------------------------------------------------------*FORMfrm_alv_user_commandUSINGp_ucommTYPEsy-ucommp_rs_selfieldTYPEslis_selfield.CASEp_ucomm.WHEN'&IC1'."判断用户的动作"读取用户点击的当前行的一行内容READTABLEi_tabINTOwa_tabINDEXp_rs_selfield-tabindex.IFp_rs_selfield-fieldnameEQ'MATNR'."判断用户点击的是哪一列IFNOTwa_tab-matnrISINITIAL.………ENDIF.ELSEIFp_rs_selfield-fieldnameEQ'TCODE'.IFNOTwa_tab-tcodeISINITIAL.PERFORMfrm_call_tranUSINGp_rs_selfield."调用其他事务ENDIF.ENDIF.CLEARwa_tab.ENDCASE.p_rs_selfield-refresh='X'.ENDFORM."frm_alv_user_command
3.2显示明细
在使用REUSE_ALV_GRID_DISPLAY_LVC时,会发现使用REUSE_ALV_GRID_DISPLAY时的双击显示行明细功能没有了;
当然,也可以点击工具栏中的放大镜按钮,直接查看明细;
如若想要实现双击显示明细,则可以直接执行FCode:&ETA调用标准功能:
*&---------------------------------------------------------------------**&FormFRM_ALV_USER_COMMAND*&---------------------------------------------------------------------**text*----------------------------------------------------------------------**-->PA_UCOMMtext*-->PS_SELFIELDtext*----------------------------------------------------------------------*FORMfrm_alv_user_commandUSINGpa_ucommTYPEsy-ucommps_selfieldTYPEslis_selfield.CASEpa_ucomm.WHEN'&IC1'."双击pa_ucomm='&ETA'."查看明细ENDCASE.ENDFORM."FRM_ALV_USER_COMMAND
3.3调用其他事务
*&---------------------------------------------------------------------**&Formfrm_alv_call_tran*&---------------------------------------------------------------------**text*----------------------------------------------------------------------**-->P_RS_SELFIELDtext*----------------------------------------------------------------------*FORMfrm_alv_call_tranUSINGp_rs_selfieldTYPEslis_selfield.SETPARAMETERID'LIB'FIELDp_rs_selfield-value.CALLTRANSACTION'SE37'ANDSKIPFIRSTSCREEN.ENDFORM."frm_alv_call_tran其中,”LIB“是指:参数ID(PARAMETERID)。
查找方法:
01).用一个事务码进入屏幕界面,在输入框内按F1;
02).在弹出来的界面中点击”技术信息”按钮,在字段数据的最后一行,即为参数ID;
“SE37″是指我们要调用的事务代码,ANDSKIPFIRSTSCREEN表示跳过第一屏屏幕;
4.I_CALLBACK_TOP_OF_PAGE/I_CALLBACK_HTML_TOP_OF_PAGE参数属性
I_CALLBACK_TOP_OF_PAGE与I_CALLBACK_HTML_TOP_OF_PAGE参数属性都用于书写ALV抬头标题信息,
只是区别在于后者支持HTML格式;
参数类型:SLIS_FORMNAME,也与I_CALLBACK_PF_STATUS_SET参数一样,为定义的子FORM,不显式调用。
i_callback_top_of_page='FRM_TOP_OF_PAGE'i_callback_html_top_of_page='FRM_HTML_TOP_OF_PAGE'其中,对应FORM(FRM_HTML_TOP_OF_PAGE)的定义,需要引用类:CL_DD_DOCUMENT(动态文本类)来显示HTML格式。
*&---------------------------------------------------------------------**&Formfrm_html_top_of_page*&---------------------------------------------------------------------**text*----------------------------------------------------------------------**-->P_CL_DDtext*----------------------------------------------------------------------*FORMfrm_html_top_of_pageUSINGp_cl_ddTYPEREFTOcl_dd_document.…ENDFORM."frm_html_top_of_page
'INTOm_buffer.CALLMETHODp_cl_dd->html_insertEXPORTINGcontents=m_bufferCHANGINGposition=m_p.ENDFORM."frm_html_top_of_page*ALVCALLFUNCTION'REUSE_ALV_GRID_DISPLAY_LVC'EXPORTINGi_callback_program=sy-repid"当前程序i_callback_top_of_page='FRM_TOP_OF_PAGE'i_callback_html_top_of_page='FRM_HTML_TOP_OF_PAGE'is_layout_lvc=i_layout_lvc"属性内表it_fieldcat_lvc=i_fieldcat_lvc[]"列明内表i_save='X'"是否保存布局TABLESt_outtab=i_tab"数据内表EXCEPTIONSprogram_error=1OTHERS=2.效果如图所示:
4.1REUSE_ALV_COMMENTARY_WRITE函数
上面文档中出现REUSE_ALV_COMMENTARY_WRITE函数,这里顺便了解下该函数的应用。
该函数与CL_DD_DOCUMENT类一样,用于I_CALLBACK_TOP_OF_PAGEFORM中输出抬头/页脚内容信息;
所以一般情况下:
I_CALLBACK_TOP_OF_PAGEForm与REUSE_ALV_COMMENTARY_WRITE函数配合使用;
I_CALLBACK_HTML_TOP_OF_PAGEForm与CL_DD_DOCUMENT类配合使用。
REUSE_ALV_COMMENTARY_WRITE函数包括一个必须参数,三个可选参数:
01).IT_LIST_COMMENTARY(必须):一个类型为SLIS_T_LISTHEADER的内表;
*HeadertablefortopofpageTYPES:BEGINOFslis_listheader,typ(1)TYPEC,"H=Header,S=Selection,A=Actionkey(20)TYPEC,infoTYPEslis_entry,ENDOFslis_listheader.TYPES:slis_t_listheaderTYPEslis_listheaderOCCURS1.02).I_LOGO(可选):图片/Logo的ObjectID
03).I_END_OF_LIST_GRID(可选):用于页脚的信息
04).I_ALV_FORM(可选):是否用于ALV的FORM中,默认为:Space
接下来,看下示例:
4.2上传图片
01).通过事务码:OAER,进入BusinessDocumentNavigator参数界面;
02).输入值:
ClassName输入:”PICTURES”;
ClassType输入:“OT”
ObjectKey输入:自定义ID名称(这里输入ZJX_LOGO),用于标记上上传图片的唯一标识
03).按F8执行后,进入到导航界面:
04)选择PICTURES节点后,在创建标签中,打开标准文档类型节点;
05)双击屏幕节点,会弹出文件框,直接上传现有的图片;
06)选择文件后,输入描述与关键字,便于搜索查找;
07)上传成功后,记录下ObjectKey:”ZJX_LOGO”
然后在ALV抬头中加入上传后的LOGO:
关于图片上传的内容,可以查看以下内容:
*Notes:
*1)Logos&wallpaperscanbefoundintableBDS_CONN05
*2)TransactionOAERcanbeusedtocreatePICTURES.
*RuntransactionOAERwithclassClasstype=OT,
*andObjectkeywithwhatevernameyouwanttocreate.Inthe
*nextscreen,rightclickingonscreenandimport
StepsforuploadingLogo:-:
1.GotothetransactionOAER
2.Entertheclassnameas‘PICTURES’
3.Entertheclasstypeas‘OT’
4.Entertheobjectkeyasthenameofthelogoyouwishtogive
5.Execute
6.TheninthenewscreenselectStandarddoc.typesinbottomwindow
ClickontheScreenicon
Now,itwillaskforthefilepathwhereyouhavetouploadthelogo
7.NowyoucanusethislogoinREUSE_ALV_COMMENTARY_WRITE
or
ImportLogoandBackgroundPictureforReporting
Inthisstep,youcanimportacustomer-specificlogoandabackgroundpictureintotheR/3System.
ThesewillbedisplayedintheheaderareaofreportsinHRFundsandPositionManagement.
FromtheSPRO:
HRFundsandPositionManagement–>DialogControl–>CustomizeReportingInterface–>ImportLogoandBackgroundPictureforReporting.
Activities
1.EntertheNameofyourlogo/backgroundpictureasanobjectkeyintheinitialscreen.
2.MakesurethattheclassnameisPICTURES,andtheclasstypeisOT.
3.ChooseExecute.
4.Double-clickthedocumenttypePictureontheCreatetabpage.
Adialogboxwillappearinwhichyoucanenterthepathinwhichthelogo/backgroundpicturecanbefound.
5.EnterthepathandchooseOpen.ThelogowillbeuploadedintothecurrentR/3System.
Ifthelogo/backgroundpictureistobetransportedintoothersystemsaswell,chooseTransport.
6.ReturntotheinitialscreenandrepeattheprocedureafterhavingenteredtheNameofyourbackgroundpictureasanobjectkey.
Pleasenotethatthelogo/backgroundpicturecanonlybedisplayedinALV-basedreportswithanHTMLheader.
ManuallyprogrammedreportssuchasbusinessdistributionplansarenotbasedontheALV.
Ifyouhaveselectedseveralinitialobjects,ALV-basedreportsinHRFundsandPositionManagementwillautomaticallyuseahiearchical-sequentialdisplay.
Alogoisnotdisplayedhereeither.Notealsothatthelogocannotbeprinted(seeprintpreviewinprogram).
Makesurethatthelogodoesnotexceedaheightof100pixelsbecauseitwouldmeanthattheheaderofthereportwillbescrollable.
5.I_GRID_TITLE参数属性
该参数为ALV小标题,位于ALV抬头信息下方;示例如下:
6.I_GRID_SETTINGS参数属性
类型为:LVC_S_GLAY,该结构包括:
01)COLL_TOP_P:最小化TOP_OF_PAGE
02)COLL_END_L:最小化END_OF_LIST
03)TOP_P_ONLY:仅打印TOP_OF_PAGE
04)EOL_P_ONLY:仅打印END_OF_LIST
05)NO_COLWOPT:不优化打印的列宽
06)EDT_CLL_CB:退出可编辑单元格时回调
其中,常用的是EDT_CLL_CB字段,该字段用于回调输入的变量;
即,当我们在ALV的显示界面可编辑字段上修改了数据,回车后会回调我们修改的数据到内表中,并对其修改;
这个字段在编辑操作中很关键。
示例代码如下:
*定义回调变量DATA:i_grid_settingsTYPElvc_s_glay.i_grid_settings-edt_cll_cb='X'.*在ALV中使用CALLFUNCTION'REUSE_ALV_GRID_DISPLAY_LVC'EXPORTINGi_callback_program=sy-repidis_layout_lvc=i_layout_lvcit_fieldcat_lvc=i_fieldcat_lvc[]i_grid_settings=i_grid_settingsi_save='X'TABLESt_outtab=i_tabEXCEPTIONSprogram_error=1OTHERS=2.
7.IS_LAYOUT/IS_LAYOUT_LVC参数属性
7.1设置grid的字段列宽度自动适应
i_layout-colwidth_optimize='X'7.2设置grid的行颜色变换显示
i_layout-zebra='X'7.3设置弹出窗口的标题栏
i_layout-detail_titlebar='详细内容'7.4设置grid的多行选择列,其中box必须为内表的一列,为一个字符长度
i_layout-box_fieldname='BOX'7.5设置grid是否显示行分割线
i_layout-no_vline='X'7.6设置grid的合计行显示在明细的上面
i_layout-totals_before_items='X'7.7设置grid不显示弹出明细显示窗口
i_layout-detail_popup='X'7.8设置grid显示led列,light为内表字段,,一个字符长,,值范围为1-3
i_layout-excp_fname='light'7.9设置grid的没有标题
i_layout-no_colhead='X'
8.IT_FIELDCAT/IT_FIELDCAT_LVC参数属性
8.1单列优化宽度
wa_fieldcat-col_opt='X'.
8.2单列求和或者取消求和,添加属性
wa_fieldcat-do_sum=‘X’."求和wa_fieldcat-no_sum=‘X’."取消求和
如若在IS_LAYOUT属性中加上下列属性,则求和后的行就会在第一行出现
i_layout-totals_bef='X'.
8.3对齐方式
字符串是默认为左对齐;
货币、数量默认为右对齐;
8.4以图标方式输出
需要作为图标输出,首先要引入图标的信息:Include;
然后在内表中添加显示图标的字段名称;
*内表字段i_tab-icon_folder=icon_object_folder.*FieldCat属性lv_pos=lv_pos+1.wa_fieldcat-col_pos=lv_pos.wa_fieldcat-fieldname='ICON_FOLDER'.wa_fieldcat-scrtext_l='ICON'.wa_fieldcat-icon='X'."启用图标wa_fieldcat-hotspot='X'.APPENDwa_fieldcatTOi_fieldcat.CLEARwa_fieldcat.这样图标就可以在ALV界面中显示了,其中添加”热点”的目的是为了当用户点击该图标的时候,可以触发一系列的操作,如文件的选择等等;
注意:图标的名称用事务码”ICON“进入后,第二列就是图标代码,根据需要进行选择;
8.5单元格的F1、F4帮助
8.5.1F1帮助
wa_fieldcat-rollname='PS_PSPID'."指定数据元素
8.5.2F4帮助
在Fieldcat中添加下列属性:
8.6字段类型保留
对于货币或数量字段,需要在其设置字段中再添加一个”指定数据类型”的属性,如下:
*货币字段wa_fieldcat-datatype='CURR'."指定数据类型*数量字段wa_fieldcat-datatype='QUAN'."指定数据类型wa_fieldcat-inttype='C'."数据类型以C类型输出
9.IT_EXCLUDING参数属性
该参数可对ALV标准工具栏隐藏不必要的功能;
对于该参数的应用,需要知道ALV标准按钮对应的FCode,这里在上面讲过,可以查看CL_GUI_ALV_GRID类的属性及其初始值;
*定义隐藏标准按钮的变量DATA:wa_excludingTYPEslis_t_extab,it_excludingTYPEslis_extab.*将需要隐藏的标准按钮的"FCODE"添加到内表IT_EXCLUDING中wa_excluding-fcode='&ABC'.APPENDwa_excludingTOit_excluding.CALLFUNCTION'REUSE_ALV_GRID_DISPLAY_LVC'EXPORTINGi_callback_program=sy-repidis_layout_lvc=i_layout_lvcit_fieldcat_lvc=i_fieldcat_lvc[]it_excluding=it_excluding"添加隐藏按钮的属性参数i_save='X'TABLESt_outtab=i_tabEXCEPTIONSprogram_error=1OTHERS=2.
10.IT_SORT/IT_SORT_LVC参数属性
ALV字段排序设置;
两个参数的类型定义虽然不一样,但结构是一样的,所以操作上并无差异;
下面查看下IT_SORT参数的类型结构定义:
TYPES:BEGINOFslis_sortinfo_alv,sposLIKEalvdynp-sortpos,“排序顺序序号fieldnameTYPEslis_fieldname,“排序内表字段名称tabnameTYPEslis_fieldname,“排序内表名称upLIKEalvdynp-sortup,“升序downLIKEalvdynp-sortdown,“降序groupLIKEalvdynp-grouplevel,“subtotLIKEalvdynp-subtotals,“输出小计comp(1)TYPEc,expa(1)TYPEc,obligatory(1)TYPEc,ENFOFslis_sortinfo_alv.
*定义排序变量DATA:wa_sort_lvcTYPElvc_s_sort,it_sort_lvcTYPElvc_t_sort.*设置排序参数wa_sort_lvc-spos=1."排序顺序wa_sort_lvc-fieldname='WERKS'."排序字段wa_sort_lvc-up='X'."升序APPENDwa_sort_lvcTOit_sort_lvc.CLEARwa_sort_lvc.wa_sort_lvc-spos=2."排序顺序wa_sort_lvc-fieldname=‘matnr’."排序字段wa_sort_lvc-up='X'."升序APPENDwa_sort_lvcTOit_sort_lvc.CLEARwa_sort_lvc.*ALV中添加排序属性CALLFUNCTION'REUSE_ALV_GRID_DISPLAY_LVC'EXPORTINGi_callback_program=sy-repid"is_layout_lvc=i_layout_lvc"it_fieldcat_lvc=i_fieldcat_lvc[]"it_sort_lvc=it_sort_lvcTABLESt_outtab=i_tab"EXCEPTIONSprogram_error=1OTHERS=2.
11.I_DEFAULT/I_SAVE/IS_VARIANT参数属性
这三个参数都是用于ALV布局的保存设置:
01).I_DEFAULT参数用于设置用户是否可以定义默认的布局:’X'可以定义默认布局,SPACE不可以定义默认布局(默认:X)
02).I_SAVE参数保存表格布局:’X'只能保存全局变式’U'只能保存特定变式’A'都可以保存SPACE不能保存变式(默认:space)
03).IS_VARIANT参数用于启用用户表格布局变式
12.IT_EVENTS参数属性
IT_EVENTS参数属性,传入一个SLIS_T_EVENT类型的内表,设置相应处理FORM;
通过与REUSE_ALV_EVENTS_GET函数配合使用,可自定义ALV事件。
首先,查看下SLIS_T_EVENT的类型结构定义,如下所示:
*---StructureforeventhandlingTYPES:BEGINOFslis_alv_event,name(30),form(30),ENDOFslis_alv_event.TYPES:slis_t_eventTYPEslis_alv_eventOCCURS0.
再看下REUSE_ALV_EVENTS_GET函数,该函数可以获取ALV中现有的事件,其参数也较为简单:
Import参数:I_LIST_TYPE,类型为SLIS_LIST_TYPE,即为ALV事件的序号,其输入可以为:0,1,2,4
Export参数:ET_EVENTS,类型为SLIS_T_EVENT;
接下来,查看下示例:
通过IT_EVENTS参数属性,就可以为ALV添加自定义的事件CALLER_EXIT;