SAP FUNCTION ALV、SALV开发总结


1.ABAP 编程中的三种ALV 的展示方式
2. FUNCTION ALV的两种实现方式及常用参数分析总结
3. FUNCTION ALV ALV常见功能点实现
3.1 ALV 可编辑功能
3.2 ALV GUI界面实现与分析
3.3 ALV USER COMMAND 自定义按钮实现 / 通过参数 EVENTS 实现
3.4 ALV 字段使用宏或者单独使用函数封装fieldcat,以及选中复选框、选中行的实现
4.OOALV 与 SALV的实现细节

1.ABAP 编程中的三种ALV 的展示方式

ALV 含义是 ABAP LIST VIEWER 的缩写,它属于实际业务中查询数据或者修改数据时经常使用的程序。ALV包含了实现诸如在展示画面中创建按钮、实现EXCEL文件下载 、word文档保存、合计、筛选等功能的程序包。
1.1 ALV 的三种类型
ALV 分为函数式的 FUNCTION ALV 、利用GRIG控件的GRID ALV、以及SALV。其中后两种使用了面向对象的编程方法。对于SALV而言,它既可以像函数式ALV似的不使用自定义画面而进行全屏报表输出,也可以像GRID ALV那样使用容器在自己画的画面上显示ALV。 SALV 不支持编辑模式,个人觉得用它来做一些弹框画面比较方便的。以grid 风格展示的 ALV 本文重点介绍函数式ALV 与SALV。GRID ALV 之后会专门写一期来进行介绍。

2.FUNCTION ALV 的两种实现方式及常用参数分析总结

调用ALV 前引用类型池SLIS,这两种函数式ALV参数的参考类型都存放在这里面。
2.1 REUSE_ALV_GRID_DISPLAY_LVC

     Layout 主要用于设定 ALV 的输出格式,为 ALV 输出的可选项;
     Fieldcat 主要用于ALV的结构定义,包括具体的栏位及名称、类型、格式等属性,为 ALV 输出的必选项。
     在调用ALV之前,需要先定义Layout 和Fieldcat,他们同属于类型池 SLIS。

(1)为fieldcat 和layout 创建内表和工作区
在这里插入图片描述
fieldcat参考表类型为slis_t_fieldcat_alv,参考的结构类型 slis_fieldcat_alv ,通过该结构类型创建的工作区来添加多个字段以及字段对应的一些控制信息
layout设置全局属性,它参考的类型是 slis_layout_alv,相当于结构
在这里插入图片描述
对该函数中出现的常用参数含义进行总结:


    I_CALLBACK_PROGRAM==:调用ALV的程序名称"通常使用SY-REPID
    I_CALLBACK_PF_STATUS_SET==ALVGUI
    I_CALLBACK_USER_COMMAND==:自定义用户命令的FROM
    I_CALLBACK_TOP_OF_PAGEALV抬头内容信息
    I_CALLBACK_HTML_TOP_OF_PAGEALV HTML格式抬头内容信息
    I_GRID_TITLEALV 标题
    I_GRID_SETTINGSGRID信息
    IS_LAYOUT_LVCALV输出布局样式
    T_FIELDCAT_LVC:设定显示的项目名称及输出设定
    IT_EXCLUDING:隐藏设置的ALV工具栏
    IT_SORT_LVCALV自定义排序
    I_DEFAULT:用户是否可以定义默认的布局,'X'-可以定义默认布局,Space-不可以定义默认布局 (默认:XI_SAVE:保存表格布局,'X'-只能保存全局变式;'U'-只能保存特定变式;'A'-都可以保存;Space-不能保存变式 (默认:space)
    IS_VARIANT:表格布局变式
    IT_EVENTS:设置事件, 类型为slis_t_event的内表(name:事件名称,form:事件的FORM

对该函数中出现的不常用参数含义进行总结:

    I_INTERFACE_CHECK: 检查接口一致
    I_BYPASSING_BUFFER: 是否使用缓存
    I_BUFFER_ACTIVE:是否激活缓存,如果每次显示ALV都是相同的字段目录,则该字段目录会被放到一特殊的缓存里,加快显示速度。
    I_CALLBACK_HTML_END_OF_LISTALV HTML格式页脚内容信息
    I_STRUCTURE_NAME:为输出表数据结构的命名,指定了这个参数,域目录将会自动生成
    I_BACKGROUND_IDALV背景图片Object ID
    IT_SPECIAL_GROUPS / IT_SPECIAL_GROUPS_LVC:若内表中一些字段通过SP_GROUP被分组在一起,必须为这些组传递组文本内表
    IT_FILTER / IT_FILTER_LVCALV过滤设置
    IS_SEL_HIDE:替换或修改屏幕中select-option的值
    IT_EVENT_EXIT:设置回调的方法的执行行为,表明用户所写的代码是在执行标准执行之前还是之后
    IS_PRINT:后台打印的相关参数
    I_SCREEN_START_LINE:以对话框形式显示的开始行
    I_SCREEN_END_COLUMN:以对话框形式显示的结束列
    I_SCREEN_END_LINE:以对话框形式显示的结束行
    I_HTML_HEIGHT_TOPHTML抬头的高度
    I_HTML_HEIGHT_ENDHTML页脚的高度
    IT_ALV_GRAPHICS:是否可以在图表中显示ALV
    IT_HYPERLINK:使用超链接

slis_layout_alv 常用字段
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述
slis_fieldcat_alv 常用字段
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2 REUSE_ALV_GRID_DISPLAY_LVC

   fieldcat参考表类型为     vc_t_fcat  ,参考的结构类型是   lvc_s_fcat
   layout设置全局属性,它参考的类型是 ==lvc_s_layo

在这里插入图片描述

lvc_s_fcat参数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. FUNCTION ALV ALV常见功能点实现

3.1 ALV编辑功能实现

首先要明确,这两种FUNCTION ALV 都可以实现整列的编辑或者是整表可编辑,实现列编辑 只需要各自的fieldcat中选择edit属性打上’X’即可;实现整个ALV可编辑layout 中将edit 设置为’X’即可;当需要实现某单元格可以编辑时,这时必须使用REUSE_ALV_GRID_DISPLAY_LVC ,这是前提条件。下面谈下具体的实现思路:

1.首先要让某列或者整个ALV成为可编辑的
2.对于用来展示ALV表中存放一个STYLE 字段,主要是控制某行是否可编辑(见下图)(由于STYLE 是表,所以还要创建一个工作区来给它添加某行的状态)
3.接下来想办法让某列或者多列的行被设计为不可编辑
(1)定义一个工作区参考lvc_s_style,在展示的表里面定义一个字段表参考 lvc_t_styl,提前将这个表中存的某些行对应的字段设置成不可编辑,如果有行满足我们不让它展示这个目的,就将该表不可编辑的状态赋值给ALV展示数据表中定义的这个表STYLE的工作区,相当于让展示表的某行不可编辑
(2)如上所述,将一列所有行编辑状态进行设置(通过LOOP 展示表实现)
(3)遍历所有的行,找出不需要编辑的行,将行状态放在展示数据的表的STYLE中
(4 )这一步不唯一;对行进行筛选, index = index +1确定行,更新状态,然后用modify 语句更新展示用的内表,user command 回调函数进行刷新
(5)不要忘了在layout-stulename中添加’STYLE’

...
TYPES:BEGIN OF gt_itb,
        budat TYPE  mkpf-budat,
        werks TYPE  mseg-werks,
        lgort TYPE  mseg-lgort,    "库存地点
        matnr TYPE  mseg-matnr,
        maktx TYPE  makt-maktx,       "物料说明
        shkzg TYPE mseg-shkzg,  "借货标识
        menge TYPE mseg-menge,
        text  TYPE  char10,
        sel,
        check TYPE c LENGTH 1,  "复选框
        style TYPE  lvc_t_styl,  "设置控制行字段可编辑所需字段,参考的是表
        test,
      END OF gt_itb.
*TYPES gt_xxx TYPE TABLE OF 结构类型,参照结构,用table of来声明内表
*TYPES gt_xxx TYPE   表类型           参照数据字典,用type
*with hesderline 自带工作区,叫表头行
DATA: gt_itab TYPE TABLE OF gt_itb WITH HEADER LINE,         "定义相关内表,参照结构类型来定义表,结构是一行,用tables of 来定义可以让其成为可以插入多行的表
      gs_itab TYPE gt_itb.                             "定义工作区,也就是定义表里的一行,用type声明的只有一行,type tableof才是多行

...
ls_layout-stylefname = 'STYLE'.
...


FORM editcell .
*将某一列的所有行的编辑状态进行设置,这里设置为不可编辑
  gs_field_style-fieldname = 'LGORT'.
  gs_field_style-style = cl_gui_alv_grid=>mc_style_disabled.
  INSERT  gs_field_style INTO TABLE  gt_field_style.
*遍历所有行,找出不需要进行编辑的行,将行状态表放在展示数据的表的style字段中
  LOOP AT gt_itab INTO gs_itab.

* 根据行具体信息筛选
*这一步仅仅在操作工作区,对行条件进行设置
*    IF gs_itab-lgort <> 'JP10'.
*      gs_itab-style = gt_field_style.
*    ENDIF.
*用工作区将展示数据的表进行更新
    sy-index = sy-index + 1.

* 根据索引标识,手动进行+1,对行进行筛选
    IF sy-index <> 2.
      gs_itab-style = gt_field_style.

      MODIFY gt_itab FROM gs_itab INDEX SY-INDEX TRANSPORTING style.
    ENDIF.

  ENDLOOP.
ENDFORM.

这里是实现的将 LGORT 这列的第二行变为可编辑。

3.2 ALV GUI界面实现与分析

报表执行后,报表显示页面需要展示可以点击的按钮,这些按钮可以来自于常用的程序,也可以由自己进行定义
在这里插入图片描述
功能键里面一般就是放最上面的按钮
在这里插入图片描述
通过执行事务码SE41,填入SAP标准模板的程序名SAPLKKBL,状态STANDARD_FULLSCREEN,便可剽窃成功。当然自定义的按钮会在user_command 回调函数里面被分类,系统存这个按钮功能吗的变量是sy-ucomm.
下面贴一段代码展示下,gii状态的设置,和其中自定义按钮被执行。

在这里插入图片描述

1.设置GUI状态名,这个ALV_PF_STATUS 就是传入ALV函数的参数名
一般都是在alv展示函数里面的 i_callback_pf_status_set = ‘xxx_status’,参数指定子例程如下:

FORM alv_pf_status USING rt_extab TYPE slis_t_extab.
  SET PF-STATUS 'STATUS' EXCLUDING rt_extab.
ENDFORM .

3.3 ALV USER COMMAND 自定义按钮实现 / 通过参数 EVENTS 实现

1.设置上方工具栏按钮点击后的回调函数,记得要刷新下

一般是在ALV函数中的 i_callback_user_command指定子例程名,在子例程中定义用户操作的代码

FORM alv_user_command USING r_ucomm LIKE sy-ucomm
                  rs_selfield TYPE slis_selfield.  "使用该结构获取行

  DATA g_grid TYPE REF TO cl_gui_alv_grid.
  DATA ls_layout TYPE lvc_s_layo.
  DATA l_tabix TYPE sy-tabix.
  
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'  "自动刷新数据
    IMPORTING
      e_grid = g_grid.
  CALL METHOD g_grid->check_changed_data.
  rs_selfield-refresh = 'X'.
  rs_selfield-row_stable = 'X'.
  rs_selfield-col_stable = 'X'.
  CASE r_ucomm.
    WHEN 'ZCREATE' .
      PERFORM bapi_deal.
    WHEN 'ZFIX'.
      PERFORM bdc.
  ENDCASE.

ENDFORM.

2.当然,也可以打开ALV输出函数里面的IT_EVENTS选项
IT_EVENTS 需要name 和 form,类似这种,就不用打开 i_callback_pf_status_set 和 i_callback_user_command

DATA: gt_events TYPE slis_t_event .
DATA: gs_events TYPE slis_alv_event.
gs_events -name =  'PF_STATUS_SET'.
gs_events-form = 'SET_STATUS.
gs_events -name  =  'ALV_USER_COMMAND'.
gs_events -form   =   'USER_COMMAND'.
APPEND gs_events to gt_events.'

3.4 ALV 字段使用宏或者单独使用函数封装fieldcat,以及选中复选框、选中行的实现

一般传入ALV函数中的字段控制表fieldcat 有两种设置方法
1.通过定义宏来批量实现

程序的最前面定义了一个宏add_field

DEFINE add_field.
  CLEAR wa_field.
wa_field-fieldname = &1.
wa_field-reptext_ddic = &2.
wa_field-outputlen = &3.
wa_field-edit = &4.
* wa_field-checkbox = &4.   "复选框字段

*相当于直接指定某个字段为status,而不用对所有字段一个个去进行设置
CASE  &1.
WHEN 'STATUS'.
 wa_field-icon = 'X'.
ENDCASE.

*CASE  &1.
*  WHEN 'BOX'.
*   wa_field-CHECKBOX = 'X'.
*ENDCASE.

APPEND wa_field TO it_field.
END-OF-DEFINITION.

在传入ALV函数前给宏里面的字段对应赋值

  add_field 'STATUS' '状态灯'  '12' ' ' .
  add_field 'FMTPURCHASENO' '摩尔委外采购单号' '10' ' ' .
  add_field 'FBILLTYPE' '单据类型'  '4' ' '.
  add_field ' FPRODUTYPE' '生产类型' '4' ' '.
  add_field ' FMTPURCHASEROWLKNO' '摩尔外协采购单行号' '4' ' '.
  add_field 'MATNR' '比亚迪料号' '40' ' '.
  add_field 'FMTSUBREQPRODNO' '摩尔成品料号' '40' ' '.
  add_field 'FSUBQTY' '委外数量' '10' ' '.
  add_field 'REMAIN_AMOUNT' '可开工单量' '13' ' '  .
  add_field 'BUILD_AMOUNT' '已开工单量' '13' ' '.
  add_field 'WERKS' '工厂' '4' 'X'.

2.定义一个form,逐列对每个字段的属性进行设置

传入ALV函数前执行一个perform xxx,然后在FORM里面实现即可,类似如下的写法:

FORM frm_build_fieldcat .

  CLEAR wa_field.
  wa_field-fieldname = 'BUKRS'.
  wa_field-reptext_ddic = 'WBS元素公司代码'.
  wa_field-outputlen = 5.
  APPEND  wa_field TO it_field.
  
  CLEAR wa_field.
  wa_field-fieldname = 'WERKS'.
  wa_field-reptext_ddic = '工厂'.
  wa_field-outputlen = 5.
  APPEND  wa_field TO it_field.
  
  CLEAR wa_field.
  wa_field-fieldname = 'POSID'.
  wa_field-reptext_ddic = 'WBS元素'.
  wa_field-outputlen = 26.
  APPEND  wa_field TO it_field.
  
  CLEAR wa_field.
  wa_field-fieldname = 'COUNT1'.
  wa_field-reptext_ddic = '未关闭但可用金额'.
  wa_field-outputlen = 10.
  APPEND  wa_field TO it_field.
  
  CLEAR wa_field.
  wa_field-fieldname = 'COUNT2'.
  wa_field-reptext_ddic = '全部状态记录数'.
  wa_field-outputlen = 10.
  APPEND  wa_field TO it_field.
ENDFORM.

实现对某行的可选,这个只需要在展示表中加上一个标志字段SEL,在layout 中 指定下这个字段的名称
ls_layout-box_fieldname = ‘SEL’.
这样点击就会被赋值为X了,loop展示表就可以取到这行数据

实现复选框得可选,同样展示表里面新增一个字段sel,在fieldcat中其设置为checkbox,其实是同样的效果,点击后也会被赋值为 X
在这里插入图片描述
当然,选则界面也有个复选框,PARAMETERS: c2 AS CHECKBOX USER-COMMAND ddd DEFAULT ‘X’.意思是给选择界面加了个复选框,AT SELECTION-SCREEN OUTPUT. 部分下loop at screen 时,讨论下checkbox 是否被选中的情况。

4.OOALV 与 SALV的实现细节

优点:不用创建屏幕就可以进行调用的全屏式ALV, GRID ALV不能注册成为Batch JOB 在后台进行运行,使用SALV却可以。
缺点是不提供编辑功能。
着重研究的是: CL_SALV_TABLE 一般ALV报表类型
SALV支持如下三种ALV展示的模式
全屏模式
全屏模式-Classic 报表模式
利用控制器的模式

==SE24 ==进入确定类的方法
画面上显示ALV使用以下两种方法
(1)FACTORY
-定义展示在画面上的数据
-定义ALV报表样式
FACTORY 方法中定义以下参数,将决定ALV报表样式。

报表样式	     LIST_DISPLAY	       R_CONTAINER	                CONTAINER_NAME
全屏	         ABAP_FALSE	            初始值                    	 初始值
Classic List	 ABAP_TRUE	            初始值                 	     初始值
利用控制器的     SALV	ABAP_FALSE	    参照CL_GUI_CONTAINER	     控制器名

(2)display
-调用此方法展示ALV
注意: FACTORY 是静态方法,使用 => 符号;DISPLAY 是Instance 方法,因此使用-> 符号。
(pop_salv 参照cl_salv_table salv中一般ALV类型 )
go_functionlist = pop_salv->get_functions( )."get方法拿到实例对象,相当于CREATE obj
go_functionlist->set_all(‘X’). "调用对象的set方法,激活ALV工具栏里面的按钮
在这里插入图片描述
在这里插入图片描述
SALV使用控制器模式实现:
Ztest_5305841_17 SAP 开发书籍p495页

核心点:类似于GRID ALV这种方式
1.需要SAP 容器连接画面以及ALV GRID 控件,SAP 容器是包含其他控件的一种特殊的控件,也就是父控件。
2.这种ALV需要我们自己画屏幕向里面加入控件名CONTAINER,然后在PBO部分使用CREATE object c创建容器对象,factory方法来向屏幕中的容器里创建ALV,然后Dispaly调用ALV,也就是将全屏模式实现部分放在pbo中,PAI部仍然做校验逻辑,并完成点击的按钮获得按钮ok_code进行后续处理。
在这里插入图片描述
设置SALV的输出样式

调用salv子类修改报表样式
      ==定义子类引用对象==
 DATA gr_dispaly TYPE REF TO cl_salv_displaying_setting.
     调用子类类型对应的主类方法
 Gr_display = gr_table ->get_display_settings( ).
     利用子类方法设置详细事项
 Gr_display ->set_striped_patttern(value =X).

主类和子类之间的连接方法

注意这里子类的方法调用的方法都没有进行标注
在这里插入图片描述
在这里插入图片描述
实现事件控制方法

CLASS lcl_handel_events IMPLMENTATION.
   METHOD XXXX.
        YYYYYY.
   ENDMETHOD.
ENDCLASS.

*SALV toobar 
为SALV GRID 追加按钮,当单击按钮时在use_commmand 事件中执行。
为全屏模式下的SALV追加按钮还需要先创建GUI STATUS,调用方法将其追加到画面上
Gr_table->set_screen_status(
  Pfstatus =GUI状态名’
  Report = sy-repid
Set_functions = gr_table->c_functions_all).

ps:后续会补充一些SALV的例子,以及GRID ALV 的实现思想,最近真的特别忙,写个帖子写了好几天了,困告QAQ

  • 4
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
SAP FICO报表开发功能说明书是指对于SAP FICO模块中的财务会计与控制模块所涉及的报表开发的功能描述和使用说明的文档。 首先,在SAP FICO模块中,报表开发是指根据用户的需求,通过SAP系统的报表开发工具,结合相应的查询逻辑和数据提取技术,生成满足用户需求的财务报表。这些报表可以包括资产负债表、损益表、现金流量表等。 在功能说明书中,首先需要明确报表的基本信息,包括报表的名称、报表的用途、报表的输入参数等。然后,需要详细描述报表的数据源和数据提取逻辑,说明数据是如何从SAP系统中提取的,并通过哪些逻辑和规则进行计算和加工,最终形成报表所需的数据。 接着,需要说明报表的展示形式和样式,包括报表中的字段和列的排列方式、报表的分组和汇总方式等。还可以描述报表中的筛选条件和可选参数,允许用户根据需要进行数据的筛选和过滤。 除了基本的报表功能,功能说明书还可以介绍报表的扩展和自定义功能。例如,报表的导出功能,允许用户将报表导出为Excel、PDF或其他格式的文档;报表的打印功能,允许用户将报表直接打印出来;报表的动态参数设置功能,允许用户根据需要自定义报表的参数。 最后,功能说明书还应包含报表的使用说明,包括报表的调用方式、使用步骤、操作提示等。这样用户就能够根据说明书的指引,正确地使用并理解报表的功能和特点。 总之,SAP FICO报表开发功能说明书是对于财务会计与控制模块中报表开发的功能和使用进行详细描述和解释的文档,它能够帮助用户正确使用报表、理解报表的数据来源和计算逻辑,从而更好地进行财务分析和决策。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值