zoukankan      html  css  js  c++  java
  • ALV详解:Function ALV(一)

    Function ALV

    ALVSAPListViewer

    ALV显示格式分为GRIDLIST两种模式,一个以网格显示,另一个以表格显示,两者都有工具栏稍有不同

    Layout结构

    Layout主要用于设置ALV整体输出格式,为ALV可选项参数。属于类型池 TYPE-POOLS:SLIS

    TYPE-POOLS:slis.
    DATA: layout 
    TYPE
     slis_layout_alv.

    Layout结构所定义的所有字段如下各字段详细使用说明,可参考REUSE_ALV_GRID_DISPLAY is_layout参数文档说明

             no_colhead(1) type c,         " no headings不显示列标题行
             no_hotspot(1) type c,         " headings not as hotspot
             zebra(1) type c,              " striped pattern
    斑马线显示,颜色隔行交替显示
             no_vline(1) type c,           " columns separated by space不显示垂直网格线
             no_hline(1) type c,        "rows separated by space B20K8A0N5D
    不显示水平网格线
             cell_merge(1) type c,         " not suppress field replication  ALV
    单元格中的内容能够复制到剪贴板
    edit(1) type c,               " for grid onlyALV
    是否可编辑,注意只对Grid模式有效,对List模式无效

             edit_mode(1) type c,          " for grid only
             numc_sum(1)     type c,       " totals for NUMC-Fields possib.
             no_input(1) type c,           " only display fields
             f2code like sy-ucomm,       
    "
    gs_layout-f2code  = '&ETA'.设置触发弹出详细信息窗口的功能码,这里是双击(&ETA)就可以弹出详细窗口,而不需要通过右键菜单
             reprep(1) type c,             " report report interface active
             no_keyfix(1) type c,          " do not fix keycolumns
             expand_all(1) type c,         " Expand all positions
             no_author(1) type c,          
    " No standard authority check
    *        PF-status

             def_status(1) type c,         " default status  space or 'A'
             item_text(20) type c,         " Text for item button
             countfname type lvc_fname,

     

    *        Display options
    colwidth_optimize(1) type c, ALV
    网格(单元格)宽度设置为自动最优化,按输出内容宽度自动调整
             no_min_linesize(1) type c,    " line size = width of the list
             min_linesize like sy-linsz,   " if initial min_linesize = 80
             max_linesize like sy-linsz,   " Default 250
             window_titlebar like sy-title,
             no_uline_hs(1) type c,

    *        Exceptions
             lights_fieldname type slis_fieldname," fieldname for exception
    列显示为红绿灯
             lights_tabname type slis_tabname, " fieldname for exception
             lights_rollname like dfies-rollname," rollname f. exceptiondocu
             lights_condense(1) type c,    
    " fieldname for exception
    *        Sums
             no_sumchoice(1) type c,       " no choice for summing up
             no_totalline(1) type c,       " no total line
             no_subchoice(1) type c,       " no choice for subtotals
             no_subtotals(1) type c,       " no subtotals possible
             no_unit_splitting type c,     " no sep. tot.lines by inh.units
    totals_before_items type c " diplay totals before the items
    统计行会在数据行前面显示
    totals_only(1) type c,        " show only totals
    只显示合计
    totals_text(60) type c,       " text for 1st col. in total line
    合计第一列文本
    subtotals_text
    (60) type c,    " text for 1st col. in subtotals
    *        Interaction
    交互
    box_fieldname type slis_fieldname, " fieldname for checkbox
    指定数据内表中哪列以选择按钮形式显示(首列前可按下或弹上来的按钮),ALV最左上角会出现全选按钮image001[6]
             box_tabname type slis_tabname," tabname for checkbox
             box_rollname like dd03p-rollname," rollname for checkbox
             expand_fieldname type slis_fieldname, " fieldname flag 'expand'
             hotspot_fieldname type slis_fieldname, " fieldname flag hotspot
             confirmation_prompt,          " confirm. prompt when leaving
    当退出image002[6]ALV报表展示界面时,是否需要提示用户
             key_hotspot(1) type c,        " keys as hotspot " K_KEYHOT
    设置关键字段是否是热点,可单击

             flexible_key(1) type c,       " key columns movable,...
             group_buttons(1) type c,      " buttons for COL1 - COL5
             get_selinfos(1) type c,       " read selection screen
             group_change_edit(1) type c,  " Settings by user for new group
             no_scrolling(1) type c,       
    " no scrolling
    *        Detailed screen详细屏幕
             detail_popup(1) type c,       " show detail in popup 
    右键中有 Detail 菜单,是否弹出详细信息窗口
             detail_initial_lines(1) type c, " show also initial lines
    为空行时单元格内容也会显示在右键弹出的详细框中
             detail_titlebar like sy-title," Titlebar for detail
    设置详细弹出窗口的标题栏
    *        Display variants
             header_text(20) type c,       " Text for header button
             default_item(1) type c,       
    " Items as default
    *        colour颜色
    info_fieldname type slis_fieldname, " infofield for listoutput
    指定数据输出内表中哪列存储的是颜色,用来设置ALV每行数据的颜色。注:使用属性需要同时在数据内表中定义一个与该参数所定义字段名相同的栏位,如:LAYOUT-INFO_FIELDNAME=’COLOR’,假设数据内表名为LT_OUT,则需要在该内表增加一个栏们“COLOR”,颜色范围 C000~C999
             coltab_fieldname type slis_fieldname, " colors
    *        others
             list_append(1) type c,       " no call screen
             xifunckey type aqs_xikey,    " eXtended interaction(SAPQuery)
             xidirect type flag,          " eXtended INTeraction(SAPQuery)
             dtc_layout type dtc_s_layo,  "Layout for configure the Tabstip
             allow_switch_to_list(1) type c, 
    "ACC: Switch from FullGrid to List

    Fieldcat结构

    Fieldcat主要用于ALV数据显示结构的定义,包括具体的栏位名称、类型、各字段的输出格式(与Layout不一样的是输出格式只针对某个字段),为ALV必选参数

    TYPE-POOLS:slis.
    DATA: 
    fieldcat 
    TYPE 
    slis_t_fieldcat_alv WITH HEADER LINE.

    Fieldcat结构所定义的所有字段如下(各字段详细使用说明,可参考REUSE_ALV_GRID_DISPLAY it_fieldcat参数文档说明):

         row_pos        like sy-curow, " output in row
             col_pos        like sy-cucol, 
    " position of the column
    列的输出位置字段在表中第几列
             fieldname      type slis_fieldname,"
    针对输出内表哪列进行设置,只有设置了的列才会显示,如果没有设置,则不会显示在ALV中。如果此字段是CURR(currency field) ,QUAN(Quantity field) 需要指定相应的CUKY, UNIT字段.需设置Cfieldname Ctabname Qfieldname    Qtabname
             tabname        type slis_tabname,
    currency(5)    type c, TCURX
    表中的货币名称
             cfieldname     type slis_fieldname, " field with currency unit
    金额字段所参照的货币单位字段名称(货币单位字段为数据内表中的某列?)
             ctabname       type slis_tabname,   " and table
             ifieldname     type slis_fieldname, " initial column
             quantity(3)    type c,
    计量单位
             qfieldname     type slis_fieldname, " field with quantity unit
             qtabname       type slis_tabname,   " and table
    roundtypei,        " round in write statement
    四舍五入至小数点后多少位
    exponent(3)       type c,     " exponent for floats
    浮点数的幂指数为多少位
    key(1)         type c,        " column with key-color
    指定字段是否是关键字段,如果是则单元格显示的颜色会不同,并会靠前显示
    icon(1)        type c,        " as icon
    字段将以图标形式显示,INCLUDE <list> ,图标字段内容来自list Inc.文件
    symbol(1)      type c,        " as symbol
    字段内容作为符号输出,与上面的ICON属性相似
    checkbox(1)    type c,        " as checkbox
    字段将以复选框形式显示
             just(1)        type c,        " (R)ight (L)eft (C)ent.
    单元格中内容显示时对齐方式。不设置时按钮数据类型默认对齐方式来对齐
             lzero(1)       type c,        " leading zero   
    X时输出前导零
             no_sign(1)     type c,        " write no-sign 
    不显示数字符号
             no_zero(1)     type c,        " write no-zero 
    只输出有意义的值,空值不输出。为X时全为零(如:00000)时不输出,所以不输出零时应该最好同时设置lzero = sapceno_zero = X,相反如果要输出,则应同时设置lzero = X no_zero = space
             no_convext(1)  type c,
             edit_mask      type slis_edit_mask, "
    对字段内容进行掩码格式化输出,具体请参照《ABAP BC Programming.docx》中的WRITE … TO章节,如:gt_fieldcat-edit_mask = '____/__/__'可对日期字段都日期格式化显示
    emphasize(4 type c,        " 
    emphasize设置列的颜色
             fix_column(1 type c,       " Spalte fixieren
    列固定不滚动,与Key属性相似,但颜色不会发生变化
             do_sum(1)      type c,        " sum up
    该列是否进行小计,需与gt_sort-subtot一起使用(即需要参考排序),否则只对整列进行一个合计
             no_out(1)      type c,        " (O)blig.(X)no out但注意用户可以change layout(布局设置)来显示出此列
             tech(1)        type c,        " technical field
    该字段为技术字段:设置为技术列的列将不会再显示出来,即使是在布局设置里也是看不到的
             outputlen      like dd03p-outputlen,
    列的字符输出宽度

             offset         type dd03p-outputlen,     " offset

    调整输出列抬头的文本:文本可以随着用户调整列的宽度而变化,其文本即是在对应data element中定义的,如果需要定制,则可以指定以下字段
    seltext_l like dd03p-scrtext_l, " long key word
    标题字段显示的名称(长)
    seltext_m like dd03p-scrtext_m, " middle key word
    标题字段显示的名称(中)
    seltext_s like dd03p-scrtext_s, " short key word
    标题字段显示的名称(短)
    ddictxt(1)     type c,        " (S)hort (M)iddle (L)ong
    设置以长、中还是短名称来显示,取值分别为 SML。直接指定文本显示为长文本、中、还是短文本, 指定这个字段后则会固定下来,不会随着用户的宽度调整变化.
    reptext_ddic   like dd03p-reptext,   " heading (ddic)
    (header) Analogous(相似)
     to the Data element main header


    rollname       like dd03p-rollname,F1
    帮助需参照的DataElement,在ALV的显示界面将鼠标放到该字段的位置后按F1会弹出该字段的说明。另外,可以不指明字段的描述(如seltext_lseltext_mseltext_s),函数会自动将字段的描述显示为该参照的数据元素

    下面datatype两个属性在字段如果是金额或P小数(数量)类型时,需要对datatype此属性进行设置,否则,如果不设置时,在修改对应单元格内容时,会自动将你所输入的数除100,即小数点提前两位;并且如果是数量类型,除了设置datatype外,inttype也需要进行设置,且为 C具体实现请参考这里
    datatype       like
     dd03p-datatype,
    inttype
     like dd03p-inttype,
             intlen         like dd03p-intlen,
             lowercase      like dd03p-lowercase,

     

             ref_fieldname  like dd03p-fieldname,"如需单元格显示F4输入帮助,则需要指定字段所参照的表
             ref_tabname    like dd03p-tabname,"如需单元格显示F4输入帮助,则需要指定字段所参照的表中的字段名
             roundfieldname type slis_fieldname,
             roundtabname   type slis_tabname,
             decimalsfieldname type slis_fieldname,
             decimalstabname   type slis_tabname,
             decimals_out(6 type c,     " decimals in write statement
    控制小数点的位数

             text_fieldname type slis_fieldname,         
             ddic_outputlen like dd03p-outputlen,

     

             key_sel(1)     type c,        " field not obligatory
             no_sum(1)      type c,        " do not sum up
             sp_group(4)    type c,        " group specification
             reprep(1)      type c,        " selection for rep/rep
    input(1)       type c,        " input
    edit(1)        type c,        " internal use only
    是否可编辑
    hotspot(1)     type c,        " hotspot
    设置字段内容下面是否有热点(有下划线,可点击,单击即可触发相应事件)

    ALV相关函数

    REUSE_ALV_GRID_DISPLAYGrid 格式的ALV

    REUSE_ALV_LIST_DISPLAY LIST格式的 ALV

    REUSE_ALV_FIELDCATALOG_MERGE:根据程序中的数据内表结构,来自动生成FIELDCAT[]内表,会根据内表结构所参照的词典类型来自动完成如表标题字段名的生成,得到大概的FIELDCAT[]后,可以再根据特殊情况再修改FIELDCAT[]内表,这样可以大大减少FIELDCAT[]内表的创建工作。注:程序中用来输出的内表结构中的每个字段都要参考了数据字典中的Data element,否则无法获取字段的相关信息,此时在自动构建FIELDCAT后再手动对无参照字典类型的字段进行手工设置

    注:还有一种以 LVC结尾的ALV函数REUSE_ALV_GRID_DISPLAY_LVC,此函数中引用到的类型大部分都不再从类型池slis 中来引用(TYPE-POOLS:slis.),而是直接引用字典中已定义好的表或结构类型,这种函数属于新性函数,与面向对象的CL_GUI_ALV_GRID生成的ALV参数类型上基本相同,所以以后一般如果使用函数方式来产生ALV,推荐使用REUSE_ALV_GRID_DISPLAY_LVC函数,而非REUSE_ALV_GRID_DISPLAY函数因为这样方便修改面向对象方式的ALV

     

    REUSE_ALV_GRID_DISPLAYREUSE_ALV_LIST_DISPLAY函数的参数基本相同:

    CALLFUNCTION'REUSE_ALV_GRID_DISPLAY'
    * EXPORTING
    *   I_INTERFACE_CHECK                 = ' '
    *   I_BYPASSING_BUFFER                = ' '
    *   I_BUFFER_ACTIVE                   = 
    ' '
    *   I_CALLBACK_PROGRAM                = ' '
    回调函数、待输出数据内表所在的程序名,一般为本程序,但一般不要直接使用SY-REPID系统变量,因为可能出现多层次调用(一个程序调用另一程序,形成调用链时)SY-REPID可能不是最后想要的程序
    *   I_CALLBACK_PF_STATUS_SET          = ' '
    设置工具栏
    *   I_CALLBACK_USER_COMMAND           = ' '
    工具栏按钮或数据行事件触发时所要调用的Form
    *   I_CALLBACK_TOP_OF_PAGE            = ' '
    *   I_CALLBACK_HTML_TOP_OF_PAGE       = ' '
    *   I_CALLBACK_HTML_END_OF_LIST       = ' '
    *   I_STRUCTURE_NAME                  =
    如果输出内表的结构参照的就是表结构,则可以不用指定fieldcat,直接使用这个词典结构,函数会自动根据此结构来生成fieldcat。在实际业务中一般是从多个表读取数据,因此直接使用字典结构作为字段目录的情况不常见;另外,可与IT_FIELDCAT混合使用,手动的IT_FIELDCAT级别优先

    *   I_BACKGROUND_ID                   = ' '
    设置报表背景图片?
    *   I_GRID_TITLE                      = ALV标题名
     I_GRID_SETTINGS                   =
    设置(打印、网格中的数据同步更新到输出数据内表)
    *   IS_LAYOUT                         = ALV Layout
     
    IT_FIELDCAT                       = FieldCat
    配置
    *   IT_EXCLUDING                      =
    *   IT_SPECIAL_GROUPS                 =
    *   IT_SORT                           =
    *   IT_FILTER                         =
    *   IS_SEL_HIDE                       =
    *   I_DEFAULT                         = 'X'
    用户是否可以设置默认的布局变式(即是否可以将某个布局变式设置为默认的布局): 'X' 可以定义默认布局,SPACE 不可以定义默认布局image003[6]
    *   I_SAVE                            = ' '
    保存表格布局:'X' 只能保存为全局标准变式,'U' 只能保存特定用户变式,'A'都可以保存,SPACE不能保存变式
    *   IS_VARIANT                        =
    *   IT_EVENTS                         =
    *   IT_EVENT_EXIT                     =

    *   IS_PRINT                          =
    从后端开始打印的参数
    *   IS_REPREP_ID                      =
    *   I_SCREEN_START_COLUMN             = 0
    *   I_SCREEN_START_LINE               = 0
    *   I_SCREEN_END_COLUMN               = 0
    *   I_SCREEN_END_LINE                 = 0
    *   I_HTML_HEIGHT_TOP                 = 0

    *   I_HTML_HEIGHT_END                 = 0
    *   IT_ALV_GRAPHICS                   =
    *   IT_HYPERLINK                      =
    *   IT_ADD_FIELDCAT                   =
    *   IT_EXCEPT_QINFO                   =
    *   IR_SALV_FULLSCREEN_ADAPTER        =
    * IMPORTING
    *   E_EXIT_CAUSED_BY_CALLER           =
    *   ES_EXIT_CAUSED_BY_USER            =

    TABLES
    t_outtab                          =
    需要显示的数据内表
    * EXCEPTIONS

    *   PROGRAM_ERROR                     = 1
    *   OTHERS                            = 2

    CALLFUNCTION'REUSE_ALV_LIST_DISPLAY'
    * EXPORTING
    *   I_INTERFACE_CHECK              = ' '
    *   I_BYPASSING_BUFFER             =
    *   I_BUFFER_ACTIVE                = ' '

    *   I_CALLBACK_PROGRAM             = ' '



    *   I_CALLBACK_PF_STATUS_SET       = ' '
    *   I_CALLBACK_USER_COMMAND        = ' '





    *   I_STRUCTURE_NAME               =









    *   IS_LAYOUT                      =
    *   IT_FIELDCAT                    =

    *   IT_EXCLUDING                   =
    *   IT_SPECIAL_GROUPS              =
    *   IT_SORT                        =
    *   IT_FILTER                      =
    *   IS_SEL_HIDE                    =
    *   I_DEFAULT                      = 'X'


    *   I_SAVE                         = ' '


    *   IS_VARIANT                     =

    *   IT_EVENTS                      =
    *   IT_EVENT_EXIT                  =
    *   IS_PRINT                       =
    *   IS_REPREP_ID                   =
    *   I_SCREEN_START_COLUMN          = 0
    *   I_SCREEN_START_LINE            = 0
    *   I_SCREEN_END_COLUMN            = 0
    *   I_SCREEN_END_LINE              = 0

    *   IR_SALV_LIST_ADAPTER           =




    *   IT_EXCEPT_QINFO                =
    *   I_SUPPRESS_EMPTY_DATA          = ABAP_FALSE

    * IMPORTING
    *   E_EXIT_CAUSED_BY_CALLER        =
    *   ES_EXIT_CAUSED_BY_USER         =

    TABLES
      t_outtab                       =
    * EXCEPTIONS
    *   PROGRAM_ERROR                  = 1
    *   OTHERS                         = 2

    image004[6]

    简单实例

    TYPE-POOLS:slis.
    DATA: fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.

    DATA:BEGIN OF lt_stock OCCURS 0,
      sel
    ,"用来做选择按钮列
     
    checkbox,"用作复选框列
      werks
    LIKE mard-werks,"工厂
      matnr
    LIKE mara-matnr,"物料
      labst
    LIKE mard-labst,"库存
      int
    TYPE i,"用来测试统计的自定义字段
     
    color(4),"用来存储颜色
     
    END OF lt_stock.

    INITIALIZATION.
     
    PERFORM inital.

    START-OF-SELECTION.
     
    DEFINE fill_fdcat.
       
    clear fieldcat.
        fieldcat
    -fieldname = &1. "需要显示的内表行结构中的哪个字段
        fieldcat
    -seltext_l = &2. "ALV显示时标题栏中的文本
        fieldcat
    -key = &3. "是否是关键字段,如果是则单元格显示的颜色会不同,并会靠前显示
       
    append fieldcat.
     
    END-OF-DEFINITION.

      fill_fdcat
    'WERKS' '工厂' 'X'.
      fill_fdcat
    'MATNR' '物料' 'X'.
      fill_fdcat
    'LABST' '库存' ''.
      fill_fdcat
    'INT' '自定义字段' ''.

     
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
       
    EXPORTING
          it_fieldcat
    = fieldcat[]
       
    TABLES

          t_outtab   
    = lt_stock.

    FORM inital .
      lt_stock
    -sel = 'X'.
      lt_stock
    -checkbox = 'X'.
      lt_stock
    -werks = '1001'.
      lt_stock
    -matnr = '1001M1'.
      lt_stock
    -labst = 4.
      lt_stock
    -int = 2.
      lt_stock
    -color = 'C100'.
     
    APPEND lt_stock .

     
    CLEAR:lt_stock.
      lt_stock
    -sel = 'X'.
      lt_stock
    -werks = '1001'.
      lt_stock
    -matnr = '1001M2'.
      lt_stock
    -labst = 3.
      lt_stock
    -int = 1.
      lt_stock
    -color = 'C200'.
     
    APPEND lt_stock .

     
    CLEAR:lt_stock.
      lt_stock
    -checkbox = 'X'.
      lt_stock
    -werks = '1002'.
      lt_stock
    -matnr = '1001M1'.
      lt_stock
    -labst = 2.
      lt_stock
    -int = 3.
      lt_stock
    -color = 'C300'.
     
    APPEND lt_stock .

     
    CLEAR:lt_stock.
      lt_stock
    -werks = '1002'.
      lt_stock
    -matnr = '1001M2'..
      lt_stock
    -labst = 1.
      lt_stock
    -int = 1.
      lt_stock
    -color = 'C300'.
     
    APPEND lt_stock .
    ENDFORM.  

    image005[6]

    Fieldcat动态创建

    通过编程创建

    注:通过此种方式实现时,显示内表中的所有列都会输出,只是那些没有参照字典中的类型字段没有字段标题名而已,这需要在FieldCat生产后,通过代码修改即可。

    REPORT  zalv_test.
    TYPE-POOLS:slis.
    DATA: fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.
    DATA: layout TYPE slis_layout_alv.

    DATA:BEGIN OF lt_stock OCCURS 0,
      sel
    ,"用来做选择按钮列
     
    checkbox,"用作复选框列
      werks
    LIKE mard-werks,"工厂
      matnr
    LIKE mara-matnr,"物料
      labst
    LIKE mard-labst,"库存
      int
    TYPE i,"用来测试统计的自定义字段
     
    color(5),"用来存储颜色
     
    END OF lt_stock.

    INITIALIZATION.
     
    PERFORM inital.

    START-OF-SELECTION.
     
    PERFORM build_fieldcat.

     
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
       
    EXPORTING
          it_fieldcat
    = fieldcat[]
       
    TABLES

          t_outtab   
    = lt_stock.

    FORM build_fieldcat .
     
    DATA: descr_ref TYPE REF TO cl_abap_structdescr.
     
    FIELD-SYMBOLS<comp_output> TYPE abap_compdescr.

     
    DATA: absname TYPE string.
     
    DATA: ref_datadesrc  TYPE REF TO cl_abap_datadescr.

     
    DATA: BEGIN OF title ,
        rollname
    TYPE dd04l-rollname,
        scrtext_s
    TYPE dd04t-scrtext_s,
        scrtext_m
    TYPE dd04t-scrtext_m,
        scrtext_l
    TYPE dd04t-scrtext_l,
       
    END OF title.

     
    "lt_stock为带表头的内表,这里传递的是表头,在使用时修改这里即可
      descr_ref ?= cl_abap_typedescr
    =>describe_by_data( lt_stock ).

     
    LOOP AT descr_ref->components ASSIGNING <comp_output>.

        ref_datadesrc 
    = descr_ref->get_component_type( <comp_output>-name ).
        absname
    = ref_datadesrc->absolute_name.

       
    SPLIT absname AT `=` INTO absname absname.

       
    CLEAR:title.
       
    SELECT SINGLE dd04l~rollname dd04t~scrtext_s dd04t~scrtext_m  dd04t~scrtext_l
           
    INTO CORRESPONDING FIELDS OF title

           
    FROM dd04l INNER JOIN dd04t ON dd04l~rollname = dd04t~rollname
           
    WHERE ddlanguage = sy-langu AND dd04l~rollname = absname.


        fieldcat
    -fieldname = <comp_output>-name.
    如果fieldcat定义为:data: fieldcat  type table of lvc_s_fcat(不过此时不能再使用REUSE_ALV_GRID_DISPLAY函数了,还是使用以LVC结尾的REUSE_ALV_GRID_DISPLAY_LVC函数,否则参数类型不匹).使用下面语句:
    *  fieldcat-reptext = title-scrtext_l.
    *  fieldcat-scrtext_l = title-scrtext_l.
    *  fieldcat-scrtext_m = title-scrtext_m.
    *  fieldcat-scrtext_s = title-scrtext_s.

    如果fieldcat定义为:data: fieldcat type slis_t_fieldcat_alv with header line.使用下面语句进行设置:
        fieldcat
    -seltext_l = title-scrtext_l.
        fieldcat
    -seltext_m = title-scrtext_m.
        fieldcat
    -seltext_s = title-scrtext_s.

       
    APPEND fieldcat.
     
    ENDLOOP.
    ENDFORM.                    "build_fieldcatalog

    FORM inital .
      lt_stock
    -sel = 'X'.
      lt_stock
    -checkbox = 'X'.
      lt_stock
    -werks = '1001'.
      lt_stock
    -matnr = '1001M1'.
      lt_stock
    -labst = 4.
      lt_stock
    -int = 2.
      lt_stock
    -color = 'C100'.
     
    APPEND lt_stock .

     
    CLEAR:lt_stock.
      lt_stock
    -sel = 'X'.
      lt_stock
    -werks = '1001'.
      lt_stock
    -matnr = '1001M2'.
      lt_stock
    -labst = 3.
      lt_stock
    -int = 1.
      lt_stock
    -color = 'C200'.
     
    APPEND lt_stock .

     
    CLEAR:lt_stock.
      lt_stock
    -checkbox = 'X'.
      lt_stock
    -werks = '1002'.
      lt_stock
    -matnr = '1001M1'.
      lt_stock
    -labst = 2.
      lt_stock
    -int = 3.
      lt_stock
    -color = 'C300'.
     
    APPEND lt_stock .

     
    CLEAR:lt_stock.
      lt_stock
    -werks = '1002'.
      lt_stock
    -matnr = '1001M2'..
      lt_stock
    -labst = 1.
      lt_stock
    -int = 1.
      lt_stock
    -color = 'C300'.
     
    APPEND lt_stock .

    ENDFORM

    image006[6]

    通过REUSE_ALV_FIELDCATALOG_MERGE函数创建

    TYPE-POOLS:slis.
    DATA: fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.
    DATA: layout TYPE slis_layout_alv.

    "注:如果是参照字典中的structure, table, view中的某个字段时,字段的定义只能使用
    "LIKE操作符,否则使用TYPE时,该字段在使用 REUSE_ALV_FIELDCATALOG_MERGE
    "
    函数时将被忽略,但不参照字典类型的除外。另外,内表本身的定义只能采用老式方式
    "来定义,不能采用新方式定义,否则不能被REUSE_ALV_FIELDCATALOG_MERGE找到
    DATA:BEGIN OF T_STOCK OCCURS 0,
      sel
    ,"用来做选择按钮列
     
    checkbox,"用作复选框列
      werks
    LIKE mard-werks,"工厂
      matnr
    LIKE mara-matnr,"物料
      labst
    LIKE mard-labst,"库存
      int
    TYPE i,"用来测试统计的自定义字段
     
    color(5),"用来存储颜色
     
    END OF T_STOCK.

    INITIALIZATION.
     
    PERFORM inital.

    START-OF-SELECTION.
    *REUSE_ALV_FIELDCATALOG_MERGE函数内部实现规则:
    *
    * 数据类型为 clnt 字典类型字段不是显示,即 fieldcat-no_out = space ,如果
    * 需要显示,则可以设置REUSE_ALV_FIELDCATALOG_MERGE参数i_client_never_display
    * 来显示
    * 如果参照的字典structure, table, view类型中的某字段是关键字然,则会设置
    * fieldcat-key = 'X'
    *  dictionary references to unit fields are copied if the reference
    *  fields are in the structure.
     
    CALL FUNCTION
    'REUSE_ALV_FIELDCATALOG_MERGE'
       
    EXPORTING
          i_program_name    
    = sy-repid
          i_inclname
    = sy-repid"
    一般指定为本程序名,如果显示内表参照的为字典中的类型则可省略
          i_internal_tabname
    = 'T_STOCK' "显示输出内表名,要大小
         
    "如果定义的显示输出内表是参照的字典中的structure, table, view时,才需要指定
    *     i_structure_name   =
          i_client_never_display
    = 'X'"类型为CLNT字典类型的字段将不会被设置,即不会显示
          i_bypassing_buffer
    = 'X'"另外,此函数还有缓存问题,发现在修改输出内表显示结构后,此函数不会刷新,加了以下这两个参数还是一样,只能将显示输出内表的变量名修改一下,不知道如何做才好啊
          i_buffer_active
    = ' '

       
    CHANGING
          ct_fieldcat       
    = fieldcat[].

     
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
       
    EXPORTING
          it_fieldcat
    = fieldcat[]
       
    TABLES

          t_outtab   
    = T_STOCK.

    FORM inital .
      T_STOCK
    -sel = 'X'.
      T_STOCK
    -checkbox = 'X'.
      T_STOCK
    -werks = '1001'.
      T_STOCK
    -matnr = '1001M1'.
      T_STOCK
    -labst = 4.
      T_STOCK
    -int = 2.
      T_STOCK
    -color = 'C100'.
     
    APPEND T_STOCK .

     
    CLEAR:T_STOCK.
      T_STOCK
    -sel = 'X'.
      T_STOCK
    -werks = '1001'.
      T_STOCK
    -matnr = '1001M2'.
      T_STOCK
    -labst = 3.
      T_STOCK
    -int = 1.
      T_STOCK
    -color = 'C200'.
     
    APPEND T_STOCK .

     
    CLEAR:T_STOCK.
      T_STOCK
    -checkbox = 'X'.
      T_STOCK
    -werks = '1002'.
      T_STOCK
    -matnr = '1001M1'.
      T_STOCK
    -labst = 2.
      T_STOCK
    -int = 3.
      T_STOCK
    -color = 'C300'.
     
    APPEND T_STOCK .

     
    CLEAR:T_STOCK.
      T_STOCK
    -werks = '1002'.
      T_STOCK
    -matnr = '1001M2'..
      T_STOCK
    -labst = 1.
      T_STOCK
    -int = 1.
      T_STOCK
    -color = 'C300'.
     
    APPEND T_STOCK .
    ENDFORM.

    image007[6]

    自定义ALV工具条

    默认输出的ALV已供了很多标准的按钮了:

    image008[6]

    image009[6]

    自定义ALV工具栏有两种方式:第一处是自已创建一个GUI Status通常作法是从SLVC_FULLSCREEN函数组中的拷贝STANDARD_FULLSCREENGui Status,再在此基础之上新增按钮即可);第二种是调用系统已定义好的标准ALV工具栏;

    系统已定义好的标准ALV GUI Status 在程序SAPLKKBL中,可以通过SET PF-STATUS … OF PROGRAM语句直接来调用,如:

    SET PF-STATUS 'STANDARD_FULLSCREEN' OF PROGRAM 'SAPLKKBL'.

    SAPLKKBL程序中定义的系统标准的ALV GUI Status有以下几种:

    l  STDPOPBX_FULLSCREEN

    l  STDPOPUP_FULLSCREEN

    l  STANDARD_FULLSCREEN     SLVC_FULLSCREEN函数组中的STANDARD_FULLSCREEN是一样的,都是标准的(函数组SALV中的STANDARDstatus也是标准的)

    l  STDPOPBX_FULLSCREEN

    l  STDPOPUP_FULLSCREEN

    l  STANDARD_FULLSCR_HR

    l  STDPOPBX_FS_LIGHT

    l  STDPOPUP_FS_LIGHT

    l  STD_LIGHT_FULLSCREEN

    这些工具条中的按钮都已经设置了Function Code,且都是保留字,这些Funcode都已经在ALV Guid控件中实现,不需得新分配Funcode功能代码,按钮默认功能码:

    image010[6]

    image011[6]

    ALV中自定义工具栏需要通过REUSE_ALV_GRID_DISPLAY函数I_CALLBACK_PF_STATUS_SET参数,传递设置GUI StatusForm的名称,在此Form使用SET PF-STATUS语句来重新定义ALV工具栏,该Form接口如下:
    FORM set_pf_status USING rt_extab TYPE slis_t_extab

    rt_extab是要排除掉的按钮,根据Funcode来排除。另外,也可以通过REUSE_ALV_GRID_DISPLAY函数IT_EXCLUDING内表参数来直接排除哪些预置按钮不可用,IT_EXCLUDING内表结构只有一个fcode字段,即根据保留的FunCode即可disabled掉。

     

      CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
       
    EXPORTING
          i_callback_program
    = sy-repid
          it_fieldcat       
    =
    fieldcat[]
        
     I_CALLBACK_PF_STATUS_SET 
    = 'SET_PF_STATUS'
        TABLES
          t_outtab          
    = t_stock1.

    FORM set_pf_status USING rt_extab TYPE slis_t_extab.
      "去激活Function code&ETA的详情按钮
     
    APPEND '&ETA'  TO  rt_extab.
     
    SET PF-STATUS 'STANDARD_FULLSCREEN' OF PROGRAM 'SAPLKKBL' EXCLUDING
    rt_extab.
    ENDFORM.  

    如果没有重定义ALV工具栏,则会默认使用函数组SLVC_FULLSCREEN中定义的STANDARD_FULLSCREEN工具条

    快速拷贝GUI Status

    在自定义工具栏时,通常从标准GUI Status上拷贝出来,再新加按钮。

    函数组 SLVC_FULLSCREEN中定义的STANDARD_FULLSCREEN GUI Status拷贝方式如下,通过 SE41可以快速拷贝:

    image012[6]

    如果不是ALV,是Write输出时,拷贝:

    image013[6]

    ALV事件

    ALV触发的事件(如双击某行数据、单击热点、点ALV工具栏上的自定义的按钮时),会回调I_CALLBACK_USER_COMMAND参数指定的Form,接口如下:

    FORM user_command  USING r_ucomm LIKE sy-ucomm
                                    rs_selfield
    TYPE slis_selfield
    .

    Parameter R_UCOMM 为触发的function code

    结构 RS_SELFIELD 包括了以下字段:

    • tabname  : Name of the internal output table 输出内表名
    • tabindex : Index of the internal output table            数据行索引
    • fieldname: Field name                                                     光标所在单元格所对应的的字段名
    • sumindex : If >0, the cursor is located on a subtotals line
    • value    : Value of the field on the list                        光标所在单元格的值
    • refresh  : (Exporting) List should be set up againX时,当用户在显式界面上对数据进行修改时,同时内表中的数据也随之刷新
    • col_stable:(Exporting) Keep column position when list is set up again
    • row_stable:(Exporting) Keep row position when list is set up again
    • exit      :(Exporting) Exit list (and ALV)
    • after_action : Call after standard action execution, before list setup

      CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
       
    EXPORTING
          i_callback_program
    = sy-repid
          it_fieldcat        = fieldcat[]
        
     I_CALLBACK_USER_COMMAND
    = 'USER_COMMAND'
        TABLES
          t_outtab               
    = gt_data[].
    注:只有自已新增的按钮(或双击数据行时、热点点击)再会调用,ALV 标准默认的Function Code是不会调用的(除非使用使用IT_EVENT_EXIT
    FORM user_command  USING r_ucomm LIKE sy-ucomm
                                    rs_selfield
    TYPE slis_selfield.

      MESSAGE i001(00) WITH '事件触发时当前行:' rs_selfield-tabindex.
    ENDFORM.

    所支持事件

    ALV可触发的事件可用REUSE_ALV_EVENTS_GET 函数来获得,输出一个内表,类型是slis_t_event,行项为slis_alv_event,包含两个字段:一个为事件名,另一个是事件处理的FORM

    DATA: i_events TYPE slis_t_event WITH HEADER LINE.
    CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
     
    EXPORTING
       
    "0:表示获取的是通过函数REUSE_ALV_LIST_DISPLAY产生的ALV所支持的事件
       
    "4:表示获取的是通过函数REUSE_ALV_GUID_DISPLAY产生的ALV所支持的事件
        i_list_type
    = 4
     
    IMPORTING
        et_events  
    = i_events[].

    LOOP AT i_events.
     
    WRITE:/  i_events-name,i_events-form.
    ENDLOOP.

    image014[6]

    触发USER_COMMAND事件时,会调用以下签名的Form

    触发PF_STATUS_SET事件时,会调用以下签名的Form(其中pf_status_set名是自定义的,非固定为 pf_status_set):
    FORM pf_status_set USING rt_extab TYPE slis_t_extab.

    事件名

    何时触发

    触发时所回调Form的签名要求

    回调方式

    USER_COMMAND

    用户点击工具栏中自定义按钮、预置按钮(需通过REUSE_ALV_GRID_DISPLAY函数的IT_EVENT_EXIT参数来特殊处理才会回调指定的Form)、数据行双击、单元格热点点击等一系列用户操作

    FORM user_command USING r_ucomm  LIKE sy-ucomm rs_selfield TYPE slis_selfield.

    (其中user_command名是自定义的,而不是固定为 user_command

    1.     通过REUSE_ALV_GRID_DISPLAY函数的I_CALLBACK_USER_COMMAND参数接口回调

    2.     通过REUSE_ALV_GRID_DISPLAY函数的IT_EVENTS参数接口回调

    PF_STATUS_SET 

    ALV工具栏显示前,可自定义工具条

    FORM pf_status_set USING rt_extab TYPE slis_t_extab

    (其中 pf_status_set 名是自定义的,而不是固定为  pf_status_set

    1.      通过REUSE_ALV_GRID_DISPLAY函数的I_CALLBACK_PF_STATUS_SET参数接口回调

    2.      通过REUSE_ALV_GRID_DISPLAY函数的IT_EVENTS参数接口回调

    TOP_OF_PAGE

    页眉定制

    无参数

    通过REUSE_ALV_GRID_DISPLAY函数的IT_EVENTS参数接口回调

    更多事件详细介绍可参考REUSE_ALV_GRID_DISPLAY函数的IT_EVENTS参数文档说明
    image015[6]

    image016[6]
    types: slis_t_event type slis_alv_event occurs 0.
    *--- Structure for event handling

    types: begin of slis_alv_event,
            name
    (30),"事件名
           
    form(30),"事件触发时需回调的Form
         
    end of slis_alv_event.

     

    工具条预置按钮回调出口IT_EVENT_EXIT

    点击ALV默认提供的工具栏按钮时,不会回调I_CALLBACK_USER_COMMAND = 'USER_COMMAND'参数中指定的Form ,因为那些按钮所对应的功能代码已被设为保留Funcode了,如果要想在点击这些标准的按钮时也回调指定的Form,可通过REUSE_ALV_GRID_DISPLAY函数的IT_EVENT_EXIT 参数实现的,可以IT_EVENT_EXIT参数内表填充需要被拦截的保留Funcode,及在是执行对应功能代码之前还是之后调用,具体应用请参考这里

      DATA: event_exit TYPE slis_t_event_exit WITH HEADER LINE.
      event_exit
    -ucomm = '&OAD'."Funcode为点击AlV工具栏上的选择布局按钮时image017[6]会被USER_COMMAND Form拦截
      event_exit
    -after = 'X'.
     
    APPEND event_exit.
      CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'

       
    EXPORTING
         i_callback_program
    = sy-repid
          it_fieldcat        =
    fieldcat[]
        
    i_callback_user_command
    = 'USER_COMMAND'
         
    IT_EVENT_EXIT = event_exit[]
        TABLES

          t_outtab          
    = gt_result.
    FORM user_command  USING r_ucomm LIKE sy-
    ucomm
                                    rs_selfield
    TYPE slis_selfield
    .

    ...
    ENDFORM.

    颜色

    注意:

    颜色设置中有优先级顺序,他们是单元格-->-->,即若同时使用了上述3中更改颜色的方法,则列的颜色会被行的颜色覆盖掉,而行的颜色又会被单元格的颜色覆盖掉,最终只会显示出单元格的颜色。

    如果这列被设置为关键列,就是LS_FCAT-KEY = 'X' ,那么颜色设置就不会起作用

    行颜色

    ALV中的每行数据颜色是通过LayOut来控制的。需要在显示输出内表结构中增加一列字段,用来存储数据行的颜色

    TYPE-POOLS:slis.
    DATA: gt_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.
    DATA: gs_layout TYPE slis_layout_alv.

    DATA:BEGIN OF gt_data OCCURS 0,
      val1
    (4),"颜色值
      val2
    (4),"颜色值
     
    color(4),"用来存储行颜色
     
    END OF gt_data.

    START-OF-SELECTION.
     
    PERFORM inital.
     
    DEFINE fill_fdcat.
       
    clear gt_fieldcat.
        gt_fieldcat
    -fieldname = &1.
        gt_fieldcat
    -seltext_l = &2.
       
    append gt_fieldcat.
     
    END-OF-DEFINITION.

      fill_fdcat
    'VAL1' '颜色值'.
      fill_fdcat
    'VAL2' '颜色值'.

      gs_layout
    -info_fieldname = 'COLOR'." 指定哪一列用来作为行颜色的列
     
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
       
    EXPORTING
          it_fieldcat
    = gt_fieldcat[]
          is_layout  
    =
    gs_layout
        TABLES

          t_outtab   
    = gt_data.

    FORM inital .
     
    DATA: c1,c2,c3.
     
    DO 8 TIMES.
        c1
    = sy-index - 1.
       
    DO 2 TIMES.
          c2
    = sy-index - 1.
         
    DO 2 TIMES.
            c3
    = sy-index - 1.
           
    CONCATENATE 'C' c1 c2 c3 INTO gt_data-color.
            gt_data
    -val1 = gt_data-color.
            gt_data
    -val2 = gt_data-color.
           
    APPEND gt_data.
         
    ENDDO.
       
    ENDDO.
     
    ENDDO.
    ENDFORM.

    颜色值定义为4位字符,首位固定为字母“C”,第2位为颜色,由0~7表示,不同的数字表示不同的颜色属性,如:

    0 = background color                  1 = Gray-blue     2 = Light gray    3 = yellow

    4 = blue-gray                                    5 = green                                  6 = red                              7 = orange

    3位表示输出文字是否高亮显示,由0~1表示,为1时表示高亮显示。4位测试了一下,基本上0~9颜色都差不多,唯一就是当取值为1时,底色又回到了灰色(且只是在第3位为0时才有此效果)

     

    ALV中的颜色是由4位数组成:'C'+COL+INT+INV

    *** Structure for colors
    types: begin of slis_color,
             col
    type i,
             int
    type i,
             inv
    type i,
          
    end of slis_color.

    1:固定取值为C

    2COL:颜色值,取值为0~7

    3INT高亮,即颜色是否加深取值为011表示加深显示

    4INV:颜色是否反转,即颜色是作用在背景上,还是作用在输出字符上,取值上为01。为1时表示设置的是前景色,即输出字符本身的颜色(好像只有在第3位为0时才有效?)

     

    以下是各种颜色值测试表:

    image018[6]image019[6]image020[6]image021[6]

    image022[6]image023[6]image024[6]image025[6]

    image026[6]image027[6]

    列颜色

    image028[6]

    TYPE-POOLS: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,
      curr
    TYPE ekpo-netpr,
      int
    TYPE i,
      p
    TYPE p LENGTH 5 DECIMALS 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.
       
    if &1 = 'CURR' .
         
    "设置列颜色
          gt_fieldcat
    -emphasize = 'C510'.
       
    endif.
       
    if &1 = 'INT' .
          gt_fieldcat
    -emphasize = 'C610'.
       
    endif.
       
    append gt_fieldcat.
     
    END-OF-DEFINITION.

      fill_fdcat
    'CURR' 'CURR' .
      fill_fdcat
    'INT' 'INT' .
      fill_fdcat
    'P' 'P(3.2)' .

     
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
       
    EXPORTING
          i_callback_program
    = sy-repid
          it_fieldcat       
    =
    gt_fieldcat[]
       
    TABLES

          t_outtab          
    = gt_data[].

    FORM inital .
      gt_data
    -curr = 1.
      gt_data
    -int = 1.
      gt_data
    -p = 1.
     
    APPEND gt_data.
      gt_data
    -curr = 2.
      gt_data
    -int = 2.
      gt_data
    -p = 2.
     
    APPEND gt_data.
    ENDFORM.

    单元格颜色

    除了可为整行设置行颜色外,每个单元格(不只是整列)的颜色也是可以单独进行设置。当然既然可以给单元格设置颜色,则整列相同颜色也是可以采用此方式来设置的

    image029[6]

    TYPE-POOLS:slis.
    DATA: gt_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.
    DATA: gs_layout TYPE slis_layout_alv.

    DATA:BEGIN OF gt_data OCCURS 0,
      val1
    (40),"颜色值
      val2
    (40),"颜色值
      val3
    (40),
     
    colortable TYPE slis_t_specialcol_alv, "每行中的单元格颜色内表,可对多个单元格进行不同颜色设置
     
    END OF gt_data.
    "每行中单元格颜色列表
    DATA: gt_color TYPE slis_t_specialcol_alv WITH HEADER LINE.

    START-OF-SELECTION.
     
    PERFORM inital.
     
    DEFINE fill_fdcat.
       
    clear gt_fieldcat.
        gt_fieldcat
    -fieldname = &1.
        gt_fieldcat
    -seltext_l = &2.
       
    append gt_fieldcat.
     
    END-OF-DEFINITION.

      fill_fdcat
    'VAL1' '颜色值'.
      fill_fdcat
    'VAL2' '颜色值'.
      fill_fdcat
    'VAL3' '无颜色'.

      gs_layout
    -coltab_fieldname = 'COLORTABLE'."设置输出内表中哪列为颜色列表

     
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
       
    EXPORTING
          it_fieldcat
    = gt_fieldcat[]
          is_layout  
    =
    gs_layout
       
    TABLES

          t_outtab   
    = gt_data.

    FORM inital .
     
    DATA: c1,c2.
     
    DO 7 TIMES.
        c1
    = gt_color-color-col = sy-index - 1."颜色值
       
    DO 2 TIMES.
          c2
    = gt_color-color-int sy-index - 1."颜色亮度
          gt_color
    -color-inv = '0'."颜色作用于背景
         
    CASE sy-index .
           
    WHEN 1.
              gt_color
    -fieldname = 'VAL1'."需进行颜色设置的列名(已具体到单元格)
             
    CONCATENATE 'col=' c1 ` ` 'int=' c2 ` `  'inv=0'  INTO gt_data-val1 .
           
    WHEN 2.
              gt_color
    -fieldname = 'VAL2'."需进行颜色设置的列名(已具体到单元格)
             
    CONCATENATE 'col=' c1 ` ` 'int=' c2 ` `  'inv=0'  INTO gt_data-val2 .
         
    ENDCASE.
         
    APPEND gt_color.
       
    ENDDO.
       
    "设置每行数据中单元格的颜色内表
        gt_data
    -colortable = gt_color[].
        gt_data
    -val3 = '无颜色'.
       
    APPEND gt_data.
       
    CLEAR:gt_color,gt_color[].
     
    ENDDO.
    ENDFORM.

    可编辑

    可以通过layoutslis_layout_alv)中的edit参数来设置整个网格(所有单元格)是否可编辑:

    DATA: gs_layout TYPE slis_layout_alv.
    gs_layout-edit = 'X'.

    如果只想让某列(一整列)可修改,而不是整个网格,则可对fieldcat中的edit参数来设置某列是否可编辑:

    DATA: gt_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.
    gt_fieldcat-edit = 'X'
    .

     

    如果想对某些单元格进行设置,在满足一定条件的单元格才能修改,此时只能使用以LVC结尾的REUSE_ALV_GRID_DISPLAY_LVC函数,而非REUSE_ALV_GRID_DISPLAY函数:

    "TYPE-POOLS:slis.
    DATA: gt_fieldcat TYPE lvc_t_fcat WITH HEADER LINE."注:此时的fieldcat不再引用slis_t_fieldcat_alv类型
    DATA: gs_layout TYPE lvc_s_layo."注:此时的Layout不再是引用slis_layout_alv类型

    DATA:BEGIN OF gt_data OCCURS 0,
      val1
    (40),
      val2
    (40),
      cellstab
    TYPE lvc_t_styl,"单元格可编辑控制
     
    END OF gt_data.
    "单元格可编辑控制内表
    DATA: gt_cellstab TYPE lvc_t_styl WITH HEADER LINE.

    START-OF-SELECTION.
     
    PERFORM inital.
     
    DEFINE fill_fdcat.
       
    clear gt_fieldcat.
        gt_fieldcat
    -fieldname = &1.
        gt_fieldcat
    -scrtext_l = &2.
       
    "设置单元格为可编辑状态:此处设置所有单元格都可编辑
        gt_fieldcat
    -edit = 'X'.
       
    append gt_fieldcat.
     
    END-OF-DEFINITION.

      fill_fdcat
    'VAL1' '1'.
      fill_fdcat
    'VAL2' '2'.

      gs_layout
    -stylefname = 'CELLSTAB'."设置可编辑信息
     
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
       
    EXPORTING
          is_layout_lvc  
    = gs_layout
          it_fieldcat_lvc
    =
    gt_fieldcat[]
       
    TABLES

         t_outtab       
    = gt_data.

    FORM inital .
      gt_data
    -val1 = 'cell1'.
      gt_data
    -val2 = 'cell2'.
      gt_cellstab
    -fieldname = 'VAL1'.
      "将原本可编辑的单元格切换到不可编辑样式。注:这里
      "
    只是样式的切换,不能仅仅使用cl_gui_alv_grid=>mc_style_enabled来将单元格设置为
      "
    可编辑状态,单元格真正是否可编辑是由fieldcat-editlayout-edit来决定的,而仅
      "
    设置为cl_gui_alv_grid=>mc_style_enabled是不可编辑的
      gt_cellstab
    -style = cl_gui_alv_grid=>mc_style_disabled.
     
    APPEND gt_cellstab.
      gt_data
    -cellstab = gt_cellstab[].
     
    APPEND gt_data.
    ENDFORM.

  • 相关阅读:
    java 泛型 类型作为参量 Class<T> transform
    面向对象的类方法只具有命名空间的作用
    编程语言沉思录—编程语言的体系结构
    类型约束的作用
    函数重载、多态与型变
    函数类型与型变
    型变(逆变)函数
    scala 型变
    泛型编程的几个关键概念
    泛型是包含类型参数的抽象类型—类型构造器
  • 原文地址:https://www.cnblogs.com/jiangzhengjun/p/4291337.html
Copyright © 2011-2022 走看看