zoukankan      html  css  js  c++  java
  • REUSE_ALV_GRID_DISPLAY_LVC详解

    ALV开发流程:

    1.      将得到并整理好的数据以ALV的形式显示出来       4

    1.1.  在子FORM(这里如:F_FIELDS)指定需要显示的字段 4

    1.2.  在子FORM(这里如:F_BUILD_LAYOUT)里设置ALV的全局属性        4

    1.3.  在子FORM(这里如:F_DISPLAY)里将内表中的数据进行显示   51.4.         为ALV程序添加表头标题(这里以添加HTML表头标题为主)     5

    1.4.1.        在显示ALV的函数(REUSE_ALV_GRID_DISPLAY_LVC)里添加一个参数       5

    1.4.2.        在子FORM(F_TOP_OF_PAGE)里定义好需要的变量     5

    1.4.3.        准备好所需数据,如登录用户的描述、制表日期等       6

    1.4.4.        将表头数据输出  6

    2.      函数“REUSE_ALV_GRID_DISPLAY_LVC”中输入参数的应用  7

    2.1.  排序       7

    2.1.1.        在显示ALV的子FORM里定义排序用到的变量        7

    2.1.2.        设置好需要排序的字段       8

    2.1.3.        在显示ALV的函数的输入参数里添加排序的属性   8

    2.2.  隐藏不必要的标准按钮       8

    2.2.1.        先在显示ALV的子FORM里定义隐藏按钮用到的变量   8

    2.2.2.        得到需要隐藏的标准按钮的“FCODE”   8

    2.3.  自定义“工具栏”       9

    2.3.1.        在显示ALV的函数的输入参数里指定自定义按钮的子FORM         9

    3.      热点链接、用户动作的捕捉、调用其他程序或标准事务程序       11

    3.1.        在显示ALV的函数的输入参数里指定捕捉用户动作的子FORM      11

    3.2.        在“字段和列名”的子FORM(F_FIELDS)里,对需要链接的列添加“热点”属性   11

    3.3.  操作代码       11

    3.4.  显示具体细节       12

    3.5.  调用其他事务       14

    3.6.  打开并选择文件:       14

    4.      关于设置字段和列名的子FORM(F_FIELDS)的参数设置: 15

    4.1.  单列优化宽度       15

    4.2.  单列求和或者取消求和,添加属性  15

    4.3.  对其方式       15

    4.4.  作为图标输出       16

    4.5.  固定列和关键列  16

    4.6.  列的字符宽度       16

    5.      单元格的F1、F4帮助:      17

    5.1.  F1帮助:      17

    5.2.  F4帮助:      17

    6.      输入并保存、回调修改内表(输入时的小数位错位的问题、指定数据类型、小说位数)       17

    7.        界面颜色的更改         18

    7.1.  更改单元格(字体)的前景、背景颜色  19

    7.2.  更改行的颜色和列的颜色:       19

    7.3.  利用设置字段和列名子的FORM(F_FIELDS)里来设置列的颜色 20

    8.      ALV自带的最左端复选框按钮和自定义复选框按钮        20

    8.1.  ALV自带的复选框按钮:    20

    8.2.  自定义复选框按钮       20

    9.        按照上传的模板格式导出为本地文件     21

    9.1.  定义导出为EXCEL用到的数据变量   21

    9.2.  上传模板       21

    9.3.        代码       22

    10.   为ALV标题添加图片   26

    10.1.         上传图片       26

    10.2.         在子FORM(F_TOP_OF_PAGE2)里的代码      

    ALV:ABAP LIST VIEW,一种比较美观的报表显示工具

    REUSE_ALV_LIST_DISPLAY

    Grid的是Excel单元格的格式,而list不是

    REUSE_ALV_GRID_DISPLAY 可以控制某一行 某一列,甚至某一格(CELL)的读写

    ALV用到的函数,目前我们有2个:REUSE_ALV_GRID_DISPLAY、REUSE_ALV_GRID_DISPLAY_LVC;两个函数都可以将数据用ALV的形式显示出来,只是在一些小的地方有些不同。

    其中这两个函数都用到的全局变量为:1个类型池SLIS和一个指定列数的变量

    DATA: v_pos TYPE i.  " 指定第几列   pos表示列

    第1个函数用到的全局变量如下:都是slis类型池中的类型,结尾都是alv(表示他们用于alv)

    DATA: wa_fieldcat TYPE slis_fieldcat_alv ,    " 相当于工作区

          i_fieldcat  TYPE slis_t_fieldcat_alv ,  " 存放列名的内表

          i_layout    TYPE slis_layout_alv .      " 负责整个ALV的全局属性

    第2个函数用到的全局变量:

    DATA:    wa_fieldcat TYPE lvc_s_fcat , " 相当于工作区

                 i_fieldcat_lvc  TYPE lvc_t_fcat , " 存放列名的内表

                 i_layout_lvc    TYPE lvc_s_layo . " 负责整个ALV的全局属性     

    下面以第2个函数(REUSE_ALV_GRID_DISPLAY_LVC)来介绍ALV的用法;

    1.               将得到并整理好的数据以ALV的形式显示出来

    1.1.           在子FORM(这里如:F_FIELDS)指定需要显示的字段    wa_fieldcat 工作区,可以赋值

      v_pos = v_pos + 1 . 初始值是零

      wa_fieldcat-col_pos     = v_pos .       " 指定列数

      wa_fieldcat-fieldname    = 'PSPID' .     " 需要输出的内表的字段名

      wa_fieldcat-scrtext_l     = '项目定义 '.  " 字段的描述-长字段标签 screen  text long

      wa_fieldcat-scrtext_m      = '项目定义 '.  " 字段描述-中字段标签

      wa_fieldcat-scrtext_s     = '项目定义 '.  " 字段描述-短字段标签

      wa_fieldcat-fix_column    = 'X' .         " 是否是固定列 column ['kɔləm]列

      APPEND wa_fieldcat TO i_fieldcat_lvc.

      CLEAR wa_fieldcat.

    这样逐步的将需要显示的字段都添加到内表i_fieldcat中;

    1.2.           在子FORM(这里如:F_BUILD_LAYOUT)里设置ALV的全局属性

      i_layout_lvc-zebra       = 'X' .       " 使ALV界面呈现颜色交替

      i_layout_lvc-sel_mode      = 'A' .       " 选择模式,“A”在最左端有选择按钮

      i_layout_lvc-cwidth_opt       = 'X' .       " 自动优化列宽

      i_layout_lvc-detailinit      = 'X' .       " 是否出现细节屏幕

      i_layout_lvc-detailtitl      = '详细内容' . " 细节屏幕标题

    1.3.           在子FORM(这里如:F_DISPLAY)里将内表中的数据进行显示

      CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'

        EXPORTING

          i_callback_program          = sy-repid          " 当前程序

          is_layout_lvc               = i_layout_lvc      " 属性内表

          it_fieldcat_lvc             = i_fieldcat_lvc[]  " 列明内表

          i_save                      = 'A'               " 是否保存布局

        TABLES

          t_outtab                    = i_tab             " 数据内表

        EXCEPTIONS

          program_error               = 1

          OTHERS                   = 2.

    通过这一步后,一个基本的ALV程序就完成了;下面是对ALV程序的优化和扩展。

    1.4.           为ALV程序添加表头标题(这里以添加HTML表头标题为主)

    1.4.1.                 在显示ALV的函数(REUSE_ALV_GRID_DISPLAY_LVC)里添加一个参数

    i_callback_html_top_of_page       = 'F_TOP_OF_PAGE'  

    其中“F_TOP_OF_PAGE”是书写ALV表头标题的子FORM,只是在这里使用,没有明显的“PERFORM”调用,如下:

    FORM f_top_of_page USING p_cl_dd TYPE REF TO cl_dd_document.

    1.4.2.                 在子FORM(F_TOP_OF_PAGE)里定义好需要的变量

      " 定义登录用户的描述

      DATA: l_name TYPE string ,

            name_first LIKE adrp-name_first ,

            name_last  LIKE adrp-name_last .

      " 定义登录日期

      DATA: l_date TYPE string .

      " 定义缓冲区变量

      DATA: m_p TYPE i ,

            m_buffer TYPE string .

    1.4.3.                 准备好所需数据,如登录用户的描述、制表日期等

      " 得到登录用户的描述

      SELECT SINGLE adrp~name_first

                    adrp~name_last

       INTO (name_first,name_last)

       FROM adrp

             INNER JOIN usr21 ON adrp~persnumber = usr21~persnumber

      WHERE usr21~bname = sy-uname .

      IF sy-subrc = 0 .

        CONCATENATE name_last name_first INTO l_name .

      ELSE .

        l_name = sy-uname .

      ENDIF.

      CLEAR name_first .

      CLEAR name_last .

      " 拼接制表日期

      CONCATENATE sy-datum+0(4) '.'

                  sy-datum+4(2) '.'

                  sy-datum+6(2) '.'

             INTO l_date .

    1.4.4.                 将表头数据输出

      " 开始输出表头标题

      m_buffer = '<HTML><CENTER><H1>ALV测试</H1></CENTER></HTML>' .

      CALL METHOD p_cl_dd->html_insert

        EXPORTING

          contents = m_buffer

        CHANGING

          position = m_p.

      " 输出制表人和制表日期

      CONCATENATE '<P ALIGN = CENTER >出表人:' l_name'出表日期:' l_date INTO m_buffer .

      CALL METHOD p_cl_dd->html_insert

        EXPORTING

          contents = m_buffer

        CHANGING

          position = m_p.

    现将需要显示的表头数据放到变量“M_BUFFER”中,然后调用方法“P_CL_DD->HEML_INSERT”将数据插入到HTML页面中显示,至此显示表头数据完成;

    2.               函数“REUSE_ALV_GRID_DISPLAY_LVC”中输入参数的应用

    2.1.           排序

    排序之前,如果同一列有相同的数据,则排好序以后,在该列会自动将相同的数据合并为一行显示,不再出现多行重复的情况(但是若该ALV中有字段设置了“可编辑”,合并这一

    现象会失效),步骤如下:

    2.1.1.                 在显示ALV的子FORM里定义排序用到的变量

     " 定义排序变量

      DATA: wa_sort_lvc TYPE lvc_s_sort , struture

         it_sort_lvc TYPE lvc_t_sort .    table

            

    2.1.2.                 设置好需要排序的字段

     " 设置排序参数

      wa_sort_lvc-spos        = 1 .           " 排序顺序

      wa_sort_lvc-fieldname   = 'CITYFROM' .  " 排序字段

      wa_sort_lvc-up          = 'X' .         " 升序

      APPEND wa_sort_lvc TO it_sort_lvc .

      CLEAR wa_sort_lvc .

      wa_sort_lvc-spos        = 2 .           " 排序顺序

      wa_sort_lvc-fieldname   = 'CITYTO' .  " 排序字段

      wa_sort_lvc-up          = 'X' .         " 升序

      APPEND wa_sort_lvc TO it_sort_lvc .

      CLEAR wa_sort_lvc .

    2.1.3.                 在显示ALV的函数的输入参数里添加排序的属性

    it_sort_lvc                       = it_sort_lvc

    2.2.           隐藏不必要的标准按钮

    2.2.1.                 先在显示ALV的子FORM里定义隐藏按钮用到的变量

      " 定义隐藏标准按钮的变量

      DATA: wa_excluding TYPE slis_t_extab ,

            it_excluding TYPE slis_extab .

    2.2.2.                 得到需要隐藏的标准按钮的“FCODE”

    首先用事务码“SE24”进入SAP的“类别制作器”,在“Object type”后面输入ALV的类“CL_GUI_ALV_GRID”,点击“Display”进入显示界面,点击“Attributes”选项卡,找到

    自己需要的“属性”和“初始值”,这个初始值就是我们要找的标准按钮的“FCODE”(注意:每一个标准按钮代表的FCODE是靠经验积累而 掌握的);

    1>     、     设将需要隐藏的标准按钮的“FCODE”添加到内表IT_EXCLUDING中,代码如下:

      " 设置要隐藏的按钮的“FCODE”

      wa_excluding-fcode = '&ABC' .

      APPEND wa_excluding TO it_excluding .

    2>     、     在显示ALV的函数的输入参数里添加隐藏按钮的属性参数:

    it_excluding                      = it_excluding

    1、  ALV标题,定义标题变量并赋值,然后在显示ALV的函数的输入参数里添加“小标题”的参数,代码如下:

      " 小标题

      DATA: i_grid_title TYPE lvc_title .

      i_grid_title = '小标题 '.

    **********************************

              i_grid_title = i_grid_title

    2.3.           自定义“工具栏”

    2.3.1.                 在显示ALV的函数的输入参数里指定自定义按钮的子FORM

    i_callback_pf_status_set          = 'F_SET_STATUS'

    当然该子FORM和产生表头的子FORM一样,也不显式的调用,代码如下:

    FORM f_set_status USING p_extab TYPE slis_t_extab .

      SET PF-STATUS 'Z_ALV_STATUS' .

    ENDFORM.                    " f_set_status

                 双击其中的“Z_ALV_STATUS”,进入创建工具栏的界面,输入名字后进入最终的界面在界面右侧,

    点击“应用工具条”后面的展开符号,在“项目”后面的白色方框内输入“自定义按钮”的代码后回车,选择静态文本回车,在“函数文本”后面输入想要显示的按钮的名称,在

    “图标名称”后面选择相应的图标(可选),回车在这一界面选择一个“快捷键”(必填)后回车,这样一个自定义按钮就做好了,也可以修改,记住刚刚创建的按钮的代码,在

    下面的捕捉用户的动作的自FORM(F_USER_COMMAND)会根据刚才的代码来进行相应的操作;

    1、  点开“功能键”后面的展开符号,进入功能键的设置,下图是各个动作对应的代码:

    2、  没有自定义按钮时候,函数里的“i_callback_pf_status_set  = 'F_SET_STATUS'”这个参数可以不要,这时会显示ALV标准的按钮,当然这些按钮可以部分隐藏(见三、

    2);

    3、  当我们使用自定义按钮后,ALV自带的标准按钮,就会失效,这时我们需要将一些用户要求我们必须显示的按钮一一地在“应用工具条”后面补上,如下图:

    其中“分隔符”的插入方法为:在需要插入分隔符的方框内选择菜单“Edit”“Insert”“Separator line”即可插入分隔符;

    下面是上图中的标准工具的名称、代码、图标名称、快捷键

    名称         代码         图标名称         快捷键

    刷新         REFRESH  ICON_REFRESH        F8(可随便更改)

    导出为EXCEL表格          EXCEL       无     Shift-F8(可随便更改)

    ABC 分析        &ABC       ICON_ABC        Ctrl-F1

    按升序排列     &OUP       ICON_SORT_UP       Ctrl-F4

    设置过滤器     &ILT ICON_FILTER   Ctrl-F5

    总计         &UMC      ICON_SUM       Ctrl-F6

    邮件查收件     %SL  ICON_MAIL      Ctrl-F7

    更改布局…     &OL0        ICON_ALV_VARIANTS      Ctrl-F8

    选择布局…     &OAD       ICON_ALV_VARIANT_CHOOSE        Ctrl-F9

    保存布局…     &AVE        ICON_ALV_VARIANT_SAVE      Ctrl-F10

    信息         &INFO      ICON_INFORMATION      Ctrl-F12

    明细         &ETA        ICON_SELECT_DETAIL     Ctrl-Shift-F3

    按降序排列     &ODN      ICON_SORT_DOWN         Ctrl-Shift-F4

    删除过滤器     &ILD         ICON_FILTER_UNDO        Ctrl-Shift-F5

    小计…     &SUM      ICON_INTERMEDIATE_SUM   Ctrl-Shift-F6

    Microsof  &VEXCEL ICON_XLS         Ctrl-Shift-F7

    字处理     &AQW      ICON_WORD_PROCESSING    Ctrl-Shift-F8

    本地文件         %PC ICON_EXPORT Ctrl-Shift-F9

    打印预览         &RNT_PREV    ICON_LAYOUT_CONTROL        Ctrl-Shift-F10

    图形         &GRAPH  ICON_GRAPHICS     Ctrl-Shift-F11

    上表中红色的属于自定义按钮,自定义按钮可以使用标准的图标名称,也可以不适用图标;

    3.               热点链接、用户动作的捕捉、调用其他程序或标准事务程序

    3.1.        在显示ALV的函数的输入参数里指定捕捉用户动作的子FORM

    FORM f_user_command USING p_ucomm TYPE sy-ucomm

                              p_rs_selfield TYPE slis_selfield .

    当然该子FORM和产生表头的子FORM一样,也不显式的调用;

    3.2.        在“字段和列名”的子FORM(F_FIELDS)里,对需要链接的列添加“热点”属性

      v_pos = v_pos + 1 .

      wa_fieldcat-col_pos       = v_pos .

      wa_fieldcat-fieldname     = 'CITYFROM' .

      wa_fieldcat-scrtext_l     = '起飞城市' .

      wa_fieldcat-fix_column    = 'X' .

      wa_fieldcat-hotspot       = 'X' .     " 热点,链接用

      APPEND wa_fieldcat TO i_fieldcat .

      CLEAR wa_fieldcat .

    这样在显式界面上“起飞城市”所代表的字段“CITYFROM”的下面就会出现一条下划线,同时当鼠标移动到该列时,就会变成“等待”的手势,当用户单击每一条时,就会触动子

    FORM(F_USER_COMMAND)中的动作,进而引起某些操作;

    3.3.           操作代码

    对于热点链接,所对应的动作码为“&IC1”,在子FORM(F_USER_COMMAND)中捕捉用户的动作,并进行相应的操作,代码如下:

      FORM f_user_command USING p_ucomm TYPE sy-ucomm

                              p_rs_selfield TYPE slis_selfield .

      CASE p_ucomm.

        WHEN '&IC1' .   " 判断用户的动作

          " 读取用户点击的当前行的一行内容

          READ TABLE i_tab INTO wa_tab INDEX p_rs_selfield-tabindex .

          IF p_rs_selfield-fieldname EQ 'CITYFROM'.   " 判断用户点击的是哪一列

            IF NOT wa_tab-cityfrom IS INITIAL .

              PERFORM f_show_detail USING p_rs_selfield .   " 显示具体细节

            ENDIF.

          ELSEIF p_rs_selfield-fieldname EQ 'TCODE' .

            IF NOT wa_tab-tcode IS INITIAL .

              PERFORM f_call_tran USING p_rs_selfield .     " 调用其他事务

            ENDIF .

          ELSEIF p_rs_selfield-fieldname EQ 'ICON_FOLDER' .

            PERFORM f_open_folder USING p_rs_selfield .     " 打开文件

          ENDIF.

          CLEAR wa_tab .

        WHEN '&SAVE_DATA' .

          PERFORM f_save_data .                             " 保存数据

        WHEN 'PRINT' .

          PERFORM f_print_data.                             " 打印数据

        WHEN 'EXCEL' .

          PERFORM f_export .                                " 导出数据

      ENDCASE.

      p_rs_selfield-refresh = 'X' .   " 当用户在显式界面上对数据进行修改时,同时内表中的数据也随之刷新

    ENDFORM.                    " f_user_command

    3.4.           显示具体细节

    1>     、     先定义一个存放具体内容的内表并整理好相关数据;

    2>     、     调用 一个指定大小的屏幕来显示具体的内容,代码如下:

    CALL SCREEN 0100 STARTING AT 12 12 ENDING AT 137 24 .

    3>     、     双击该屏幕号码“0100”创建该屏幕,在“属性”卡输入该屏幕的描述,在“逻辑流”卡里将系统默认注释掉的PBO、PAI事件的模块取消注释并产生这两个模块

    (双击并确定);

    4>     、     在“屏幕制作器”界面点击 进入“屏幕制作器”的图形界面,开始绘制我们需要的屏幕元素,这里我们需要一个“表控制”(最左边从下数第四个元素),该表

    格的属性设置为:

    名称:

    起始行列和高宽

    上图表示“列标题”为“具体内容”,可以水平或垂直的调节大小,有水平和垂直的分隔符,只能同时选中一行一列,带选择列(DE_BOX),最左端两列固定不滚动;

    5>     、     接下来给单元格和列标题名称并给单元格指定内表的字段,

    6>     、     屏幕的PBO、PAI事件的代码如下:

    PROCESS BEFORE OUTPUT.

      MODULE status_0100.

      LOOP AT i_detail INTO wa_detail

            WITH CONTROL vs_detail CURSOR i_detail-current_line .

      ENDLOOP.

    *

    PROCESS AFTER INPUT.

      LOOP AT i_detail .

      ENDLOOP.

      MODULE user_command_0100.

    7>     、     需要在定义变量的时候声明一下表控制和动作的接受者(OK_CODE)如下:

    * 表控制IS_MATNR

    CONTROLS vs_detail TYPE TABLEVIEW USING SCREEN 0100 .

    " 利用同名传递原理,来接受细节屏幕上的元素“ok_code”的值

    DATA: ok_code TYPE sy-ucomm .

    8>     “MODULE status_0100.”的代码如下:

    MODULE status_0100 OUTPUT.

      SET PF-STATUS '0100' .

      DESCRIBE TABLE i_detail LINES vs_detail-current_line .

    ENDMODULE.                 " status_0100  OUTPUT

    在“0100”的工具栏里,只设置 即可满足需求;

    “MODULE user_command_0100.”的代码如下:

    MODULE user_command_0100 INPUT.

      CASE ok_code.

        WHEN 'BACK' .

          SET SCREEN 0 .    " 返回主屏幕

      ENDCASE.

    ENDMODULE.                 " user_command_0100  INPUT

    完成调用细节屏幕;

    注意:在显示细节屏幕的字段的类型上,当内表中有数据为货币类型的时候,要在“格式”里指明该字段是货币类型的数据,如下图:

    3.5.           调用其他事务

    FORM f_call_tran USING p_rs_selfield TYPE slis_selfield  .

      SET PARAMETER ID 'LIB' FIELD p_rs_selfield-value .

      CALL TRANSACTION 'SE37' ."AND SKIP FIRST SCREEN .

    ENDFORM.                    " f_call_tran

    “LIB”是指参数ID,查找方法:用一个事务码进入事务界面,在输入框内按F1,在弹出来的界面中点击 ,新界面中的 就是参数ID;

    “SE37”是指我们要调用的事务代码,“AND SKIP FIRST SCREEN”表示跳过第一屏屏幕;

    3.6.           打开并选择文件:

    1>     、现则内表中定义好存放文件路径的字段(这里是FILE_PATH),当用户点击界面上设置好的打开文件图标时,就会触发子FORM(F_USER_COMMAND)里的打开文件的子FORM

    (F_OPEN_FOLDER);

    2>     子FORM(F_OPEN_FOLDER)的代码如下:

    FORM f_open_folder USING p_rs_selfield TYPE slis_selfield .

      DATA: l_file_path LIKE rlgrap-filename .

      CALL FUNCTION 'WS_FILENAME_GET'

        EXPORTING

          mode             = 'O'

          title            = '选择文件'

        IMPORTING

          filename         = l_file_path

        EXCEPTIONS

          inv_winsys       = 1

          no_batch         = 2

          selection_cancel = 3

          selection_error  = 4

          OTHERS           = 5.

      IF sy-subrc = 0.

        wa_tab-file_path = l_file_path . " 将得到的文件的路径赋给当前行的路径

        MODIFY i_tab INDEX wa_tab-numer FROM wa_tab TRANSPORTING file_path .

        CLEAR l_file_path .

      ELSE .

        MESSAGE s000 WITH '没有选择文件' .

      ENDIF.

    ENDFORM.                    " f_open_folder

    4.               关于设置字段和列名的子FORM(F_FIELDS)的参数设置:

    4.1.           单列优化宽度

    当在子FORM(F_BUILD_LAYOUT)里没有指明全局优化列宽的时候,在需要指定优化的字段的属性里指定下列属性就可以单列优化了,

    wa_fieldcat-col_opt       = 'X' .

    4.2.           单列求和或者取消求和,添加属性

    wa_fieldcat-do_sum        = 'X' .   " 求和

    wa_fieldcat-no_sum        = 'X' .   " 取消求和

    如果此时在子FORM(F_BUILD_LAYOUT)里添加下列属性,则求和后的行就会在第一行出现:

    i_layout-totals_bef       = 'X' .

    4.3.           对其方式

    wa_fieldcat-just          = 'L' .   " 左对齐

    wa_fieldcat-just          = 'C' .   " 居中对齐

    wa_fieldcat-just          = 'R' .   " 右对齐

    当然,在不指明对其方式的前提下,ABAP的各种数据类型优默认的对其方式,其中字符串是默认为左对齐,而货币、数量默认为右对齐;

    4.4.           作为图标输出

    1>     、首先在开始包含进一个包括,如下:

    " 包含图标等在内的一些信息

    INCLUDE <list> .

    2>     、然后在内表中定义一个代表图标的字段(这里如ICON_FOLDER),在整理数据的时候,需要将代表图标的代码赋给给字段,如下

        " 图标

        wa_banfn-icon_folder = icon_object_folder .

    3>     、接着在子FORM(F_FIELDS)里给需要图标显示的列添加下列属性:

      v_pos = v_pos + 1 .

      wa_fieldcat-col_pos       = v_pos .

      wa_fieldcat-fieldname     = 'ICON_FOLDER'   .

      wa_fieldcat-scrtext_l     = 'ICON' .

      wa_fieldcat-icon          = 'X' .   " 图标

      wa_fieldcat-hotspot       = 'X' .

      APPEND wa_fieldcat TO i_fieldcat .

      CLEAR wa_fieldcat .

    这样图标就可以在ALV界面中显示了,其中添加“热点”的目的是为了当用户点击该图标的时候,可以触发一系列的操作,如文件的选择等等;

    注意:图标的名称用事务码“ICON”进入后左边第二列就是图标代码,根据需要进行选择;

    4.5.           固定列和关键列

    两者都可以使具有该属性的列固定不滚动,但是前者不改变该列的颜色,而后者会将该列的颜色弄成一色,不容易确认,但它具有其他的功能,代码如下:

    wa_fieldcat-fix_column    = 'X' .   " 固定列

    wa_fieldcat-key           = 'X' .   " 关键列

    4.6.           列的字符宽度

    可以明显地指明该列的输出宽度,属性代码如下:

    wa_fieldcat-outputlen              = 10 .        " 输出宽度

    列抬头的工具提示,在列的属性添加下列参数,当用户将鼠标放到列名上时,可以显示“提示”2字,代码如下:

    wa_fieldcat-tooltip       = '提示' .

    5.               单元格的F1、F4帮助:

    5.1.           F1帮助:

    1>     、在子FORM(F_FIELDS)里列的属性添加“数据元素”这一属性,代码如下:

    wa_fieldcat-rollname      = 'PS_PSPID' .    " 指定数据元素

    就可以在ALV的显示界面将鼠标放到该字段的位置后按F1会弹出该字段的说明;

    2>     、指定数据元素之后,可以不指明字段的描述(如SCRTEXT_L、SCRTEXT_M、SCRTEXT_S),函数会自动将字段的描述显示,但是没有自己指定的灵活

    5.2.           F4帮助:

    1>     、在子FORM(F_FIELDS)里列的属性添加下列属性,代码如下:

      wa_fieldcat-ref_field     = 'PSPID' .

      wa_fieldcat-ref_table     = 'PROJ' .

    这样在ALV的显示界面,在该字段处就可以按F4来查看相关的内容了;

    6.               输入并保存、回调修改内表(输入时的小数位错位的问题、指定数据类型、小说位数)

    1、  首先在显示ALV的子FORM(F_DISPLAY)里定义“回调”的变量,如下:

      " 回调变量

      DATA: i_grid_settings TYPE  lvc_s_glay .

      i_grid_settings-edt_cll_cb  = 'X' .

    2、  在显示ALV的函数(REUSE_ALV_GRID_DISPLAY_LVC)里添加输入参数如,下:

    i_grid_settings                   = i_grid_settings

    这时只要在显示界面可编辑字段上修改了数据,回车后就会立即将内表的数据也修改了;

    3、  对于货币字段,要在其设置字段和列名的属性中再添加一个“指定数据类型”的属性,如下:

    wa_fieldcat-datatype      = 'CURR' .     " 指定数据类型

    这样在修改数据并保存时,才能将数据保持原样,否则输入的数据会自动将小数点提前2位;

    4、  对于数量字段,也要添加一个“指定数据类型”的属性,才能保持数据的正确性,如下:

      wa_fieldcat-datatype      = 'QUAN' .  " 指定数据类型

      wa_fieldcat-inttype       = 'C' .

    5、  将界面数据保存到数据库表中,触发事件见子FORM中的F_SAVE_DATA,代码如下:

    FORM f_save_date .

      DATA: i_spfli LIKE TABLE OF spfli WITH HEADER LINE .

      DATA: l_error TYPE REF TO cx_sy_open_sql_db ,

            l_error2 TYPE REF TO cx_sy_arithmetic_overflow ,

            l_error_text TYPE string .

      " 将界面上的数据转接到和被修改的数据库表的结构一样的内表中

      LOOP AT i_tab INTO wa_tab .

        i_spfli-carrid = 'ZZ' .

        i_spfli-connid = sy-tabix .

        i_spfli-cityfrom = wa_tab-cityfrom .

        i_spfli-airpfrom = wa_tab-airpfrom .

        i_spfli-cityto = wa_tab-cityto .

        i_spfli-airpto = wa_tab-airpto .

        i_spfli-distance  = wa_tab-distance .

        APPEND i_spfli .

        CLEAR i_spfli .

      ENDLOOP.

      " 保存到数据库

      TRY .

          DELETE spfli FROM TABLE i_spfli .

          INSERT spfli FROM TABLE i_spfli .

        CATCH cx_sy_open_sql_db INTO l_error .

          l_error_text = l_error->get_text( ) .

          sy-subrc = 1 .

      ENDTRY .

      IF sy-subrc NE 0 .

        ROLLBACK WORK .

        MESSAGE e000 WITH l_error_text .

        CLEAR l_error_text .

      ELSE .

        MESSAGE s000 WITH '数据保存成功!' .

      ENDIF.

      CLEAR   i_spfli .

      REFRESH i_spfli .

    ENDFORM.                    " f_save_date

    7.                        界面颜色的更改

    ALV中的颜色代码共有4位,其中C是固定的第一位(代表COLOR),第二位代表是颜色编码(1到7),第三位是加强颜色的设置(1表示打开,0表示关闭),第四位是减弱颜色(1表示打

    开,0表示关闭),个人理解,在强化关闭的情况下,相反的作用是背景和字体的变化:

    7.1.           更改单元格(字体)的前景、背景颜色

    1>     、在定义内表的时候定义一个代表单元格颜色的字段,如下:

    cell_color TYPE slis_t_specialcol_alv

    2>     、在子FORM(F_BUILD_LAYOUT)里,要指明代表单元格颜色的字段的名称,如下:

    i_layout-ctab_fname   = 'CELL_COLOR'.   " 单元格颜色设置

    3>     、在子FORM(F_CELL_COLOR)里给代表单元格颜色的字段赋值,如下:

    FORM f_cell_color .

      " 单元格颜色

      DATA: l_cellcolor TYPE slis_specialcol_alv .

      LOOP AT i_tab INTO wa_tab .

        IF wa_tab-price > 500 .

          l_cellcolor-fieldname = 'PRICE' . " 要修改颜色的字段名

          l_cellcolor-color-col = 6 .                           " 颜色(1-7)

          l_cellcolor-color-inv = 1 .       " 前景字体(int代表背景颜色)

          APPEND l_cellcolor TO wa_tab-cell_color .

          CLEAR l_cellcolor .

        ENDIF.

       MODIFY i_tab INDEX wa_tab-numer FROM wa_tab TRANSPORTING cell_color .

        CLEAR wa_tab .

      ENDLOOP.

    ENDFORM.                    " f_cell_color

    7.2.           更改行的颜色和列的颜色:

    1>     、在定义内表的时候定义一个代表行列颜色的字段,如下:

            line_color(4) TYPE c

    2>     、在子FORM(F_BUILD_LAYOUT)里,要指明代表行列颜色的字段的名称,如下:

    i_layout-info_fname   = 'LINE_COLOR'  . " 行列颜色

    3>     、在子FORM(F_LINE_COLOR)里给代表行列颜色的字段赋值,如下:

    FORM f_line_color .

      DATA: l_i TYPE i .

      LOOP AT i_tab INTO wa_tab .

        l_i = sy-tabix MOD 2 .

        IF l_i = 0 .

          wa_tab-line_color = 'C311' .

       MODIFY i_tab INDEX wa_tab-numer FROM wa_tab TRANSPORTING line_color .

          CLEAR wa_tab .

        ENDIF.

      ENDLOOP.

    ENDFORM.                    " f_line_color

    7.3.           利用设置字段和列名子的FORM(F_FIELDS)里来设置列的颜色

    wa_fieldcat-emphasize     = 'C711' .

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

    最终只会显示出单元格的颜色.

    8.               ALV自带的最左端复选框按钮和自定义复选框按钮

    8.1.           ALV自带的复选框按钮:

    在定义内表时,需要指明代表复选框的字段,这里如:BOX_NAME,然后在定义ALV全局属性的子FORM(F_BUILD_LAYOUT)里指明代表复选框的字段,如下:

    i_layout-box_fname                   =  box_fname .

    8.2.           自定义复选框按钮

    需要在子FORM(F_FIELDS)里添加下列如下语句:

      wa_fieldcat-col_pos     = v_pos .    

      wa_fieldcat-fieldname   = 'CHECKBOX' .

      wa_fieldcat-scrtext_m   = '复选框' .

      wa_fieldcat-checkbox    = 'X' .

      wa_fieldcat-edit        = 'X' .

      wa_fieldcat-just        = 'C' .

      wa_fieldcat-fix_column   = 'X' .

      APPEND wa_fieldcat TO i_fieldcat .

      CLEAR wa_fieldcat .

    该功能必须在在显示ALV的函数的子FORM(F_DISPLAY)里添加“回调”的输入参数,这样当用

    户点击复选框后才能将改变写回到内表中,代码如下

    DATA: l_grid_settings TYPE lvc_s_glay  .

      l_grid_settings-edt_cll_cb = 'X'  .

    i_grid_settings          = l_grid_settings

    9.                        按照上传的模板格式导出为本地文件

    9.1.           定义导出为EXCEL用到的数据变量

    TYPE-POOLS ole2 .

    DATA: v_excel TYPE ole2_object,

          v_sheet TYPE ole2_object,

          v_book  TYPE ole2_object,

          v_rows  TYPE ole2_object,

          v_cell  TYPE ole2_object,

          v_sheet_number TYPE i .

    9.2.           上传模板

    需要用事务码“SMW0”先上传一个EXCEL模板,步骤:

    1>     、SMW0进入界面,选择“WebRFC应用程序的二进制数据”,点击 进入现已界面;

    2>     、在“包”后面输入一个包名后点击 或者按F8进入上传模板的主界面,如下图:

    3>     、在上图中点击 或者按F5新建一个模板,弹出下图:

    输入“对象名称”(一般用程序名+。xls)和“描述”后,点击 或者按“Shift + F6”找到自己存放模板的路径双击上传即可完成模板的上传(名称为Z_ALV.XLS);

    9.3.                 代码

    当用户触动子FORM(F_USER_COMMAND)里的导出程序时,就会触动下列代码,现将模板现在下来,

    进而根据模板将数据导出到EXCEL表格中,代码中的许多部分都是固定的,其中的红色底色部分

    为需要自己填写代码如下:

    *&---------------------------------------------------------------------*

    *&      Form  f_export

    *&---------------------------------------------------------------------*

    *       导出数据

    *----------------------------------------------------------------------*

    FORM f_export .

      DATA: l_name LIKE wwwdatatab,

             l_mine LIKE w3mime OCCURS 10,

             l_title TYPE string,

             l_filename TYPE string,

             l_path TYPE string,

             l_fullpath TYPE string.

      l_name-relid = 'MI'.

      l_name-objid = 'Z_ALV.XLS'.

      l_name-text = sy-title.

      CONCATENATE 'Z_ALV测试_' sy-uname '_' sy-datum '_' sy-uzeit INTO l_title .

    *模板下载

      CALL FUNCTION 'WWWDATA_IMPORT'

        EXPORTING

          key               = l_name

        TABLES

          mime              = l_mine

        EXCEPTIONS

          wrong_object_type = 1

          import_error      = 2

          OTHERS            = 3.

      CALL METHOD cl_gui_frontend_services=>file_save_dialog

        EXPORTING

          window_title         = l_title

          default_extension    = 'xls'

          default_file_name    = l_title

          file_filter          = '(电子表格EXCEL)'

        CHANGING

          filename             = l_filename

          path                 = l_path

          fullpath             = l_fullpath

        EXCEPTIONS

          cntl_error           = 1

          error_no_gui         = 2

          not_supported_by_gui = 3

          OTHERS               = 4.

      IF sy-subrc <> 0.

        STOP.

      ENDIF.

      IF l_filename = ''.

        MESSAGE e000 WITH '已取消导出!' .

      ENDIF.

      CALL FUNCTION 'GUI_DOWNLOAD'

        EXPORTING

          filename = l_fullpath

          filetype = 'BIN'

        TABLES

          data_tab = l_mine.

    *--打开excel模板

      PERFORM f_open_excel USING l_fullpath.

    *--向excel写数据

      PERFORM f_write_excel_sheet.

    *--设置excel可见

      CALL METHOD OF v_excel 'Worksheets' = v_sheet

        EXPORTING

        #1 = 1.

      CALL METHOD OF v_sheet 'Activate'.

      SET PROPERTY OF v_excel 'Visible' = 1.

    * 关闭EXCEL并保存

      PERFORM f_save_excel USING l_fullpath.

    ENDFORM.                    " f_export

    *&---------------------------------------------------------------------*

    *&      Form  f_OPEN_EXCEL

    *&---------------------------------------------------------------------*

    *      根据本地excel路径,打开excel应用

    *----------------------------------------------------------------------*

    FORM f_open_excel  USING   pa_path.

      CREATE OBJECT v_excel 'Excel.Application'.

      CALL METHOD OF v_excel 'Workbooks' = v_book.

      CALL METHOD OF v_book 'Open' = v_book

        EXPORTING

        #1 = pa_path.

      CALL METHOD OF v_book 'Sheets' = v_sheet

        EXPORTING

        #1 = 1.

    ENDFORM.                    " f_OPEN_EXCEL

    *&---------------------------------------------------------------------*

    *&      Form  f_WRITE_EXCEL_SHEET1

    *&---------------------------------------------------------------------*

    *       向excel写入数据

    *----------------------------------------------------------------------*

    FORM f_write_excel_sheet.

      TYPES: BEGIN OF typ_name ,

                name_first(40) TYPE c ,

                name_last(40)  TYPE c ,

             END OF typ_name .

      DATA: i_name TYPE TABLE OF typ_name WITH HEADER LINE .

      DATA: l_name(40) TYPE c .

      SELECT adrp~name_first

             adrp~name_last

        INTO CORRESPONDING FIELDS OF TABLE i_name

        FROM adrp

                INNER JOIN usr21 ON adrp~persnumber = usr21~persnumber

       WHERE usr21~bname = sy-uname .

      LOOP AT i_name .

        CONCATENATE i_name-name_last i_name-name_first INTO l_name .

      ENDLOOP.

      DATA: l_chars(50) TYPE c,

            l_lines TYPE i ,

            l_num TYPE i VALUE 4. "行变化,从第几行开始导入

    *写入表头

      PERFORM f_write_cell USING 1 1 'Z_ALV测试'.

      CONCATENATE '制表日期:' sy-datum+0(4) '年' sy-datum+4(2)  '月'  sy-datum+6(2) '日' INTO l_chars.

      CONDENSE l_chars NO-GAPS .

      PERFORM f_write_cell USING 2 1 l_chars.

      CONCATENATE '制表人:' l_name INTO l_name .

      CONDENSE l_name NO-GAPS .

      PERFORM f_write_cell USING 2 5 l_name.

      "通过行列的方式把数据写入到Excel中

      LOOP AT i_tab INTO wa_tab .

        PERFORM f_write_cell USING l_num 1 wa_tab-numer .

        PERFORM f_write_cell USING l_num 2 wa_tab-cityfrom.

        PERFORM f_write_cell USING l_num 3 wa_tab-airpfrom.

        PERFORM f_write_cell USING l_num 4 wa_tab-cityto.

        PERFORM f_write_cell USING l_num 5 wa_tab-airpto.

        PERFORM f_write_cell USING l_num 6 wa_tab-distance.

        PERFORM f_write_cell USING l_num 7 wa_tab-price.

        PERFORM f_write_cell USING l_num 8 wa_tab-tcode.

        PERFORM f_write_cell USING l_num 9 wa_tab-file_path.

        l_num = l_num + 1 .

        CLEAR wa_tab .

      ENDLOOP.

    ENDFORM.                    " f_WRITE_EXCEL_SHEET1

    *&---------------------------------------------------------------------*

    *&      Form  f_SAVE_EXCEL

    *&---------------------------------------------------------------------*

    *      保存excel文档

    *----------------------------------------------------------------------*

    *      -->P_L_FULLPATH  text

    *----------------------------------------------------------------------*

    FORM f_save_excel USING  pa_fullpath.

      SET PROPERTY OF v_excel 'DisplayAlerts' = 0.

      CALL METHOD OF v_book 'SAVEAS'

        EXPORTING

        #1 = pa_fullpath.

      CALL METHOD OF v_book 'Exit' = v_book.

      FREE OBJECT v_excel.

    ENDFORM.                    " f_SAVE_EXCEL

    *&---------------------------------------------------------------------*

    *&      Form  f_WRITE_CELL

    *&---------------------------------------------------------------------*

    *  向excel指定cell写入数据

    *----------------------------------------------------------------------*

    FORM f_write_cell  USING  pa_row

                                pa_col

                                pa_val.

      CALL METHOD OF v_sheet 'Cells' = v_cell

        EXPORTING

        #1 = pa_row

        #2 = pa_col.

      SET PROPERTY OF v_cell 'Value' = pa_val.

    ENDFORM.                    " f_WRITE_CELL

    10.             为ALV标题添加图片

    要使用图片,显示ALV的函数的输入参数中的HTML表头必须换成一般表头,即:

    i_callback_html_top_of_page       = 'F_TOP_OF_PAGE1

    必须换成

    I_CALLBACK_TOP_OF_PAGE            = 'F_TOP_OF_PAGE2'

    10.1.                  上传图片

    OAER进入参数界面,在“Class name”后面输入“PICTURES”,在“Class Type”后面输入“OT”,在“Object ID”后面输入一个名字,用来标记上传的图片,点击 或按F8进入

    上传图片的主界面,点击下面的鄂“Create”展开“Standard.Doc.Types”双击“屏幕”上传自己的图片,指定好“Description”和“KeyWord”方便以后查找,完成图片的上传

    ,几下“Object ID”,后面的程序中要用到;

    10.2.                  在子FORM(F_TOP_OF_PAGE2)里的代码

    *&---------------------------------------------------------------------*

    *&      Form  f_top_of_page2

    *&---------------------------------------------------------------------*

    *       ALV表头标题

    *----------------------------------------------------------------------*

    FORM f_top_of_page2 .

      DATA: i_header  TYPE slis_t_listheader,

            wa_header TYPE slis_listheader.

      " 定义登录用户的描述

      DATA: l_name TYPE string ,

            name_first LIKE adrp-name_first ,

            name_last  LIKE adrp-name_last .

      " 定义登录日期

      DATA: l_date TYPE string .

      " 得到登录用户的描述

      SELECT SINGLE adrp~name_first

                    adrp~name_last

       INTO (name_first,name_last)

       FROM adrp

               INNER JOIN usr21 ON adrp~persnumber = usr21~persnumber

      WHERE usr21~bname = sy-uname .

      IF sy-subrc = 0 .

        CONCATENATE name_last name_first INTO l_name .

      ELSE .

        l_name = sy-uname .

      ENDIF.

      CLEAR name_first .

      CLEAR name_last .

      " 拼接制表日期

      CONCATENATE sy-datum+0(4) '.'

                  sy-datum+4(2) '.'

                  sy-datum+6(2) INTO l_date .

      " Image

      wa_header-typ  = 'H'.

      wa_header-info = 'Z_ALV测试' .

      APPEND wa_header TO i_header .

      CLEAR  wa_header .

      CONCATENATE '制表人:' l_name INTO l_name .

      CONCATENATE '制表日期:' l_date INTO l_date .

      wa_header-typ  = 'S'.

      wa_header-key  = l_name .

      wa_header-info = l_date .

      APPEND wa_header TO i_header .

      CLEAR  wa_header .

      CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'

        EXPORTING

          i_logo             = 'BEPC'   " OAER中的Object ID

          it_list_commentary = i_header

          i_alv_form         = 'X'.

    ENDFORM.                    " f_top_of_page2

    效果如下图:

    虽然可以传图片,但是灵活度没有F_TOP_OF_PAGE1高;

    注意,全部代码:

  • 相关阅读:
    为什么网站不被百度收录或收录清零?
    XmlSerializer序列化一组成员到文本文件
    windows phone不同页面间传值
    windows phone下进行Isolated的IO读写
    windows Phone 后退键历史的清除
    Window Phone ListBox的DataBinding:
    VGA的相关代码
    如何避免Quartus II自動將未宣告的信號視為wire?
    XINLINX约束心得
    VIM配置文件备份
  • 原文地址:https://www.cnblogs.com/springzt/p/4442327.html
Copyright © 2011-2022 走看看