当前位置: 代码迷 >> 报表 >> ALV 表格小结一
  详细解决方案

ALV 表格小结一

热度:332   发布时间:2016-05-05 08:01:17.0
ALV 报表小结一
2009-02-23
在PA教程中,对ALV的创建采用了ALV Control Grid的方式, 跟实际开发中的方式有些不同, 经过几周的实际开发,有了些认识,记录下来.


ALV的创建一般有两种方式: 1> 采用function module,    2> OOPS abap
两种创建方式有对应的适用范围,也有一些交集,可以参考下图: 

可以看到需要创建ALV list/ hierachical list,   Fullscreen grid时可以采用Function module.并且是向后兼容的
而我们创建ALV grid or tree control时则要采用OO的创建方法,在6.4之前也是适用的,但使用OO ALV wrapper to control时,则适用于6.4之后的版本.
NW WAS 与R3 4.6之间还是有较大的改变,整个平台扩展了许多东西, 像web service, OO的大规模使用,而且据说是采用SOA策略的实现,

一 .FM

在使用FM来实现ALV时,对应于fullscreen alv,   Type-pool:   SLIS非常重要,它定义了FM中的许多参数类型.
1 . ALV是种展现手段,那么它就会涉及到定义数据选择条件,数据获取,数据展现,事件处理等步骤.
1> 在定义选择条件时,可以采用Selection screen来定义条件,可以定义一个值(PARAMETERS),也可以定义一个范围(SELECTION-OPTIONS),方便的很,如果程序中如果有动态条件的话,可以考虑采用RANGES来, 并且有个小技巧是采用 ( ) 来动态执行SQL.简单例子如下.
    select * into itab
                from sflight
                where (wheretab)
wheretab 是个行项类型是字符型的内表, 它的每一行就是一个选择条件字符串.
对于这种动态语句尽量避免使用,因为它在运行时才能确定执行语句,并且可以避过编译时的语法检查.
注: SAP标准程序中可以看到这种用法,如FM:  SD_PARTNER_READ.
       SELECT  * FROM  (object ) INTO  TABLE  l_vbpa WHERE  vbeln = f_vbeln. 它是将选取的数据表动态化了.

2> 数据选取
  这里一般对程序性能影响最大,关注点在于对数据库表的访问,内表的操作等方面.

3> 数据展现
  field catalog:它是一个内表,对应于每一列的显示选项的技术性信息或额外的信息,像hotspot的定义,这一列显示不显示等.
  layout structure: layout for grid,可以定义一些GRID的配置,像求总选项,

4> 事件处理
  对于双击事件,hotspot的处理, TOP-OF-PAGE, END-OF-LIST等.

2.相关的FM.
REUSE_ALV_VARIANT_DEFAULT_GET
REUSE_ALV_VARIANT_F4
REUSE_ALV_VARIANT_EXISTENCE
REUSE_ALV_EVENTS_GET:  包含事件名称与事件处理form名称的内表
REUSE_ALV_COMMENTARY_WRITE
REUSE_ALV_FIELDCATALOG_MERGE: 根据ABAP Dictionary中的Transparent table , Structure, View等生成一个field catalog
REUSE_ALV_LIST_DISPLAY: 以list形式显示结果
REUSE_ALV_GRID_DISPLAY: 以Grid形式显示结果
REUSE_ALV_POPUP_TO_SELECT

粗线标识的是最经常使用的.


3. field catalog
1>它是对输出表的字段的描述,定义了字段的输出属性.
   比如:
col_pos     字段在表中第几列,
fieldname   输出的字段名,如果此字段是CURR(currency field) ,QUAN(Quantity field) 需要指定相应的CUKY, UNIT字段.设置,Cfieldname Ctabname 和Qfieldname    Qtabname
no_out       隐藏此列,不输出,但注意用户可以change layout来显示出此列.
hotspot       设置此列的所有cell为热点, 单击即可触发相应function.
do_sum       此列求总
no_zero      只输出有意义的值,空值不输出.
edit_mask 对字段像WRITE般设置格式化.
just            R L 调整对齐方式

调整输出列抬头的文本:文本可以随着用户调整列的宽度而变化,其文本即是在对应data element中定义的,如果需要定制,则可以指定以下字段
  seltext_l (long field label)
  seltext_m (medium field label)
  seltext_s (short field label)
  reptext_ddic (header) Analogous to the Data element main header
  Ddictxt (specify text): You can specify with values 'L', 'M', and 'S',直接指定文本显示长文本,中,短文本, 指定这个字段后则会固定下来,不会随着用户的宽度调整变化.

2> 如何构建
   A. 手工构建
      创建SLIS_T_FIELD_ALV类型的内表,  行项类型为SLIS_FIELD_ALV 对每个字段的相应属性进行设置后,加入内表.
           CLEAR X_FIELDCAT.
        X_FIELDCAT-COL_POS    = 12.
        X_FIELDCAT-FIELDNAME  = 'DMBTR'.
        X_FIELDCAT-TABNAME    = 'I_TAB'.
        X_FIELDCAT-SELTEXT_M  = 'Local curr'.
        X_FIELDCAT-OUTPUTLEN  = 12.
        X_FIELDCAT-INTTYPE    = 'P'.
        X_FIELDCAT-JUST       = 'R'.
        X_FIELDCAT-DO_SUM     = 'X'.
        APPEND X_FIELDCAT TO I_FIELDCAT.

   B. 半自动
       调用FM: REUSE_FIELD_CATALOG_MERGE ,传入DDIC中的transparent table, view ,structure的名称,输出field catalog内表.
    CALL  FUNCTION  'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
*     I_PROGRAM_NAME               =
*     I_INTERNAL_TABNAME           =
      i_structure_name             = c_alv_structure_name
*     I_CLIENT_NEVER_DISPLAY       = 'X'
*     I_INCLNAME                   =
*     I_BYPASSING_BUFFER           =
*     I_BUFFER_ACTIVE              =
    CHANGING
      ct_fieldcat                  = gt_fieldcat[]
    EXCEPTIONS
      inconsistent_interface       = 1
      program_error                = 2
      OTHERS                        = 3

       如果要对抬头,hotspot等属性进行调整, 可以循环field catalog内表,修改其对应属性.如:
        LOOP  AT  gt_fieldcat ASSIGNING  <l_fcat>.
   
        CASE <l_fcat>-fieldname.
          WHEN 'flname'.
              "修改属性.
             
        ENDCASE.
         ENDLOOP.

4. field layout
 
  注意属性 GET_SELINFOS ,它对于REUSE_ALV_GRID_DISPLAY 的输入IS_SEL_HIDE有用,但在WAS 7.0中已不再支持.

5. 事件
   ALV触发的事件可用FM: REUSE_ALV_EVENTS_GET 来获得, 输出一个内表,类型是slis_t_event , 行项为slis_alv_event,包含两个字段,一个事件名,另一个是事件处理的FORM名.
   CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
       EXPORTING
           I_LIST_TYPE = 0
       IMPORTING
            ET_EVENTS   = I_EVENTS.
   常用事件有:
     列表抬头处理: Slis_ev_top_of_page TYPE slis_formname VALUE 'TOP_OF_PAGE'.
     双击,单击    : Slis_ev_user_command TYPE slis_formname VALUE 'USER_COMMAND'
      subtotal文本: Slis_ev_subtotal_text TYPE slis_formname VALUE   'SUBTOTAL_TEXT'.
               参考 https://www.sdn.sap.com/irj/scn/wiki?path=/display/Snippets/Display%252bsubtotal%252btext%252bin%252bALV%252bgrid
                   https://www.sdn.sap.com/irj/scn/thread?threadID=1033110&tstart=0
                    注意: 如果必须修改subtotal对应的字段的field_catalog属性no_out为X才可以触发这个事件.

6.开发时一般的需求:
一般都会涉及到REUSE_ALV_GRID_DISPLAY 的输入属性
1> ALV variant 保存
   
    is_default
    is_save  
    is_variant

2> 小计, 排序
    it_sort属性,可以定义按哪个字段排序并且可以指定按这个字段小计其它可以汇总的字段.
    -          spos :  Sort sequence
    -          fieldname :  Internal output table field name
    -          tabname : Only relevant for hierarchical-sequential lists. Name of the internal output table.
    -          up : 'X' = sort in ascending order
    -          down : 'X' = sort in descending order
    -          subtot : 'X' = subtotal at group value change
    -          group : '* ' = new page at group value change ,'UL' = underline at group value change
  
3> ALV 抬头 页脚
   A. 可以采用TOP_OF_PAGE事件触发可以采用方式:
        a. CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'  输出一个内表: slis_t_listheader 这种方法输出格式固定,不利于对齐
         设置输入属性i_logo可输出图片.

        b.  Grid方式:设置 , 布局容易控制一些.
         DATA : lr_content TYPE  REF  TO  cl_salv_form_element.

         DATA : lr_grid      TYPE  REF  TO  cl_salv_form_layout_grid,  " top grid definition
                  lr_flow      TYPE  REF  TO  cl_salv_form_layout_flow,  " flow for top grid
                  l_text(500 )  TYPE  c .                                         " showed in top of list

      * create a grid
      CREATE  OBJECT  lr_grid.
     
      *创建一个单元格
      lr_flow = lr_grid->create_flow(
                row    = 1   "行
                column = 1  ). "列

      * write a blank column
       WRITE  (20 ) '' .   "可直接输出

      plr_flow = plr_grid->create_flow(
       row    = 1
       column = 2 ).

    * create text in cell
    lr_flow->create_text( text  = pl_text ). "定制cell里的文本

       cl_salv_form_content=>set( lr_content ).
     
   B. 设置I_CALLBACK_HTML_TOP_OF_PAGE 属性触发
     FORM f_html_top_of_page USING pr_document TYPE REF TO cl_dd_document.
       可以加入HTML文本,链接,图片
                  CALL METHOD pr_document->add_text( text = 'Picture' ).

           CALL METHOD pr_document->add_gap( width = 10 ).

           CALL METHOD pr_document->add_picture( picture_id = 'ENJOYSAP_LOGO' ).



 
4> 点击某列,转到另外一个tranaction中,需要设置列字段为hotspot,再在user_command中处理function code: "&IC1 "
    it_events属性,传入一个slis_t_event类型的内表.设置相应处理form,如 handle_user_command.
    FORM  handle_user_command USING  p_ucomm     LIKE  sy-ucomm
                                 ps_selfield TYPE  slis_selfield.
   
Reference:
https://www.sdn.sap.com/irj/scn/wiki?path=/display/ABAP/ALV+TUTOTIAL+FOR+BEGINERS+WITH+EXAMPLES
这篇文章对FM方式创建ALV讲得非常全面.
  相关解决方案