OO SALV的栏位功能

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

SALV的栏位功能主要是通过CL_SALV_COLUMN_TABLE和CL_SALV_COLUMNS_TABLE这两个类的实现的。
SALV的栏位属性的详细功能包括异常状态图标、图标、符号、复选框、按钮、热点、超链接、单元格类型、单元格颜色、某一栏位颜色、某一行颜色,栏位隐藏等。

关于颜色等样式属性,可以单独设置,也可以通过单元格(cell)style去设置。可以查看接口IF_SALV_C_CELL_TYPE,如下:

具体实现方法如下:
在SALV的输入参数内表中定义一个保存style的字段,字段类型为salv_t_int4_column,是个表类型,表类型中的结构(structure)定义如下,由一个列名和对应值组成。当不指定列名,只对value赋值,意味着整行的单元格都应用同一个style,如果指定列名,则对指定的与列名相同的应用style。设置好后要保存到内表中。

关于事件的实现,其中要能读到内表,所以要将内表放到能调取到的地方。具体各种事件参见类,代码以热点及双击事件作为代表。

REPORT  ZSALV02.
TABLES:VBAK.
TYPE-POOLS: ICON, SLIS,SYM.
CLASS SALV_DISPLAY DEFINITION.
  PUBLIC SECTION.
    METHODS:DATA_DISPLAY.
  PRIVATE SECTION.
    TYPES:BEGIN OF TY_DATA,
            CHECKBOX   TYPE CHAR1,
            T_COLOR    TYPE LVC_T_SCOL,
            T_CELLTYPE TYPE SALV_T_INT4_COLUMN,
            VBELN      TYPE VBAK-VBELN,
            ERDAT      TYPE VBAK-ERDAT,
            ERZET      TYPE VBAK-ERZET,
            ERNAM      TYPE VBAK-ERNAM,
            AUART      TYPE VBAK-AUART,
            NETWR      TYPE VBAK-NETWR,
          END OF TY_DATA.
    DATA:LT_DATA TYPE STANDARD TABLE OF TY_DATA,
         WA_DATA TYPE TY_DATA.
    DATA:S_ALV TYPE REF TO CL_SALV_TABLE.
    DATA:LR_FUNCTIONS           TYPE REF TO CL_SALV_FUNCTIONS,
         LR_EVENTS              TYPE REF TO CL_SALV_EVENTS_TABLE,
         LR_COLUMNS             TYPE REF TO CL_SALV_COLUMNS_TABLE,
         LR_COLUMN              TYPE REF TO CL_SALV_COLUMN_TABLE,
         LR_FUNCTIONAL_SETTINGS TYPE REF TO CL_SALV_FUNCTIONAL_SETTINGS.
    DATA: G_COLOR  TYPE LVC_S_COLO, "列颜色
          LS_COLOR TYPE LVC_S_SCOL,
          LT_COLOR TYPE LVC_T_SCOL. "行颜色及单元格颜色
    DATA: LT_CELLTYPE TYPE SALV_T_INT4_COLUMN.
    DATA: LS_CELLTYPE LIKE LINE OF LT_CELLTYPE.
    METHODS:
      COLUMN_SET CHANGING P_ALV TYPE REF TO CL_SALV_TABLE,
      ON_LINK_CLICK FOR EVENT LINK_CLICK OF CL_SALV_EVENTS_TABLE IMPORTING
                                                                     ROW"事件触发所在的行号
                                                                     COLUMN,"事件触发所在的列名
      HOTPOT_CLICK FOR EVENT LINK_CLICK OF CL_SALV_EVENTS_TABLE IMPORTING
                                                                    ROW "事件触发所在的行号
                                                                    COLUMN,"事件触发所在的列名
      DOUBLE_CLICK FOR EVENT DOUBLE_CLICK OF CL_SALV_EVENTS_TABLE IMPORTING
                                                                      ROW "事件触发所在的行号
                                                                      COLUMN."事件触发所在的列名
ENDCLASS.

CLASS SALV_DISPLAY IMPLEMENTATION.
  METHOD DATA_DISPLAY.
    DEFINE ADD_COLOR.
      CLEAR LS_COLOR.
      LS_COLOR-FNAME = &1.
      LS_COLOR-COLOR-COL = &2.
      LS_COLOR-COLOR-INT = 1.
      LS_COLOR-COLOR-INV = 0.
      LS_COLOR-NOKEYCOL = 'X'.
      APPEND LS_COLOR TO LT_COLOR.
    END-OF-DEFINITION.
    SELECT * FROM VBAK INTO CORRESPONDING FIELDS OF TABLE LT_DATA  UP TO 20 ROWS.
    WA_DATA-NETWR = 2222222222.
    APPEND WA_DATA TO LT_DATA.
    CLEAR:WA_DATA.
    LOOP AT LT_DATA INTO WA_DATA.
      IF WA_DATA-NETWR > 1000."单元格颜色条件
        LS_COLOR-FNAME = 'NETWR'.
        LS_COLOR-COLOR-COL = '5'.
        LS_COLOR-COLOR-INT = '0'."加深
        LS_COLOR-COLOR-INV = '0'."前景背景颜色反转
        APPEND LS_COLOR TO  LT_COLOR.
        WA_DATA-T_COLOR = LT_COLOR.
        MODIFY LT_DATA FROM WA_DATA.
        CLEAR:LS_COLOR,LT_COLOR."注意每次刷新内表及工作区
      ENDIF.
      IF WA_DATA-AUART = 'ZCQ'.
*        ADD_COLOR 'VBELN' 4."行颜色可以使用宏对每个单元格定义
*        ADD_COLOR 'ERDAT' 4.
*        ADD_COLOR 'ERZET' 4.
*        ADD_COLOR 'ERNAM' 4.
*        ADD_COLOR 'AUART' 4.
*        ADD_COLOR 'NETWR' 4.
        LS_COLOR-COLOR-COL = COL_NEGATIVE."行颜色也可以不指定列名就是整行
        LS_COLOR-COLOR-INT = '0'."加深
        LS_COLOR-COLOR-INV = '0'."前景背景颜色反转
        APPEND LS_COLOR TO  LT_COLOR.
        WA_DATA-T_COLOR = LT_COLOR.
        MODIFY LT_DATA FROM WA_DATA.
        CLEAR:LS_COLOR,LT_COLOR."注意每次刷新内表及工作区
      ENDIF.
*     ZZK的订单类型单元格设定成按钮
      IF WA_DATA-AUART = 'ZZK'.
        LS_CELLTYPE-COLUMNNAME = 'AUART'.
        LS_CELLTYPE-VALUE      = IF_SALV_C_CELL_TYPE=>BUTTON.
        APPEND LS_CELLTYPE TO LT_CELLTYPE.
        WA_DATA-T_CELLTYPE = LT_CELLTYPE.
        MODIFY LT_DATA FROM WA_DATA.
        CLEAR:LS_COLOR,LT_COLOR,LS_CELLTYPE,LT_CELLTYPE."注意每次刷新内表及工作区
      ENDIF.
*     只有用户名为80181007 ERNAM列设定hotspot
      IF WA_DATA-ERNAM = '80181007'.
        LS_CELLTYPE-COLUMNNAME = 'ERNAM'.
        LS_CELLTYPE-VALUE      = IF_SALV_C_CELL_TYPE=>HOTSPOT.
        APPEND LS_CELLTYPE TO LT_CELLTYPE.
        WA_DATA-T_CELLTYPE = LT_CELLTYPE.
        MODIFY LT_DATA FROM WA_DATA.
        CLEAR:WA_DATA,LS_COLOR,LT_COLOR,LS_CELLTYPE,LT_CELLTYPE."注意每次刷新内表及工作区
      ENDIF.
    ENDLOOP.

    TRY  .
        CL_SALV_TABLE=>FACTORY( IMPORTING R_SALV_TABLE = S_ALV CHANGING T_TABLE = LT_DATA ).
      CATCH  CX_SALV_MSG.
    ENDTRY.
    "显示ALV的标准功能
    LR_FUNCTIONS = S_ALV->GET_FUNCTIONS( ).
    LR_FUNCTIONS->SET_ALL( 'X' ).
    ME->COLUMN_SET( CHANGING P_ALV = S_ALV ).

    "=====事件注册
*    DATA:HANDLER TYPE REF TO LCL_HANDLE_EVENTS.
    LR_EVENTS = S_ALV->GET_EVENT( )."注册事件至类
*    CREATE OBJECT HANDLER.
    SET HANDLER ME->HOTPOT_CLICK FOR LR_EVENTS.
    SET HANDLER ME->DOUBLE_CLICK FOR LR_EVENTS.
    SET HANDLER ME->ON_LINK_CLICK FOR LR_EVENTS.
    S_ALV->DISPLAY( ).
  ENDMETHOD.
  METHOD COLUMN_SET.
    LR_COLUMNS = P_ALV->GET_COLUMNS( ).
*    LR_COLUMNS->SET_OPTIMIZE( 'X' )."设置全局列宽优化
    LR_COLUMNS->SET_HEADERS_VISIBLE( 'X' ).   "设置标题栏是否可见
    LR_FUNCTIONAL_SETTINGS = S_ALV->GET_FUNCTIONAL_SETTINGS( ).
    TRY .
        LR_COLUMNS->SET_CELL_TYPE_COLUMN( 'T_CELLTYPE' ).
        LR_COLUMN ?= LR_COLUMNS->GET_COLUMN( 'VBELN' ).
        LR_COLUMN->SET_MEDIUM_TEXT( '销售订单号2')."修改列名
        LR_COLUMN->SET_VISIBLE( 'X' )."可以设置列不可见
        LR_COLUMN->SET_OPTIMIZED( 'X' )."单独设置列宽自适应
        LR_COLUMN->SET_CELL_TYPE( IF_SALV_C_CELL_TYPE=>HOTSPOT ).
        LR_COLUMN ?= LR_COLUMNS->GET_COLUMN( 'ERDAT' ).
        G_COLOR-COL = '6'.
        G_COLOR-INT = '1'.
        G_COLOR-INV = '0'.
        LR_COLUMN->SET_COLOR( G_COLOR )."设置列颜色
        LR_COLUMNS->SET_COLOR_COLUMN( 'T_COLOR' )."设置行颜色及单元格颜色
        "设置复选框栏位
        LR_COLUMN ?= LR_COLUMNS->GET_COLUMN( 'CHECKBOX' ).
        LR_COLUMN->SET_CELL_TYPE( IF_SALV_C_CELL_TYPE=>CHECKBOX_HOTSPOT ).
        LR_COLUMN->SET_LONG_TEXT( '选择' ).
        "设置热点
        LR_COLUMN ?= LR_COLUMNS->GET_COLUMN( 'VBELN' ).
        LR_COLUMN->SET_CELL_TYPE( IF_SALV_C_CELL_TYPE=>HOTSPOT ).

      CATCH CX_SALV_NOT_FOUND.
      CATCH CX_SALV_DATA_ERROR.
      CATCH CX_SALV_EXISTING.
    ENDTRY.
  ENDMETHOD.
  METHOD HOTPOT_CLICK.
*    MESSAGE '你单击了我' TYPE 'I'.
    READ TABLE ME->LT_DATA INTO WA_DATA INDEX ROW."读当前行
    CASE COLUMN."取列名
      WHEN 'VBELN'.
        SET PARAMETER ID 'AUN'  FIELD WA_DATA-VBELN.
        CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN.
    ENDCASE.
  ENDMETHOD.
  METHOD DOUBLE_CLICK.
*    MESSAGE '你双击了我' TYPE 'I'.
    READ TABLE ME->LT_DATA INTO WA_DATA INDEX ROW."读当前行
    CASE COLUMN."取列名
      WHEN 'ERNAM'.
        SET PARAMETER ID 'XUS'  FIELD WA_DATA-ERNAM.
        CALL TRANSACTION 'ZSD053' AND SKIP FIRST SCREEN.
    ENDCASE.
  ENDMETHOD.
  METHOD ON_LINK_CLICK."复选框选中操作
    READ TABLE ME->LT_DATA ASSIGNING FIELD-SYMBOL(<FS_DATA>) INDEX ROW."读当前行
    IF <FS_DATA>-CHECKBOX EQ ''.
      <FS_DATA>-CHECKBOX = 'X'.
    ELSE.
      <FS_DATA>-CHECKBOX = ''.
    ENDIF.
    ME->S_ALV->REFRESH( ).
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  DATA:LR_DISPLAY TYPE REF TO SALV_DISPLAY.
  CREATE OBJECT LR_DISPLAY.
  LR_DISPLAY->DATA_DISPLAY( ).

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

下载代码方式:https://pan.quark.cn/s/e2157c05e625 在信息技术领域中,数学问题的复杂求解在很大程度上依赖于数值计算,这在科学计算、工程分析以及数据分析等多个方面尤为重要。线性方程组的求解是数值计算中的一个核心且关键的问题,而雅克比迭代法作为一种有效策略,专门用于处理大规模稀疏线性方程组。这个资源提供了一段采用C++语言编写的雅克比迭代法源代码,配合附带的博客文章,能够帮助使用者深入掌握此方法的基本原理和实际应用。 雅克比迭代法,有时也被称作局部迭代方法,主要用于求解形式为 Ax = b 的线性方程组,其中矩阵A需满足对角占优的条件。对角占优的特性是指矩阵中每个对角线元素的绝对值要大于该行其他元素绝对值之和,这一性质确保了算法的收敛性能。该方法的实施基于矩阵A的雅克比矩阵J,其构成方式为 J = D - L - U,其中D、L和U分别代表矩阵A的对角线部分、下三角部分以及上三角部分。 迭代过程的数学表达式为:x(k+1) = J^-1 * b + (I - J^-1*A) * x(k),在此表达式中,x(k)表示第k次迭代的解向量,x(k+1)则是第k+1次迭代的解向量,I是单位矩阵。每次迭代都利用前一次得到的解来计算下一次的解,迭代会持续进行,直到解的精度达到预设标准或迭代次数达到最大限制。 在使用C++进行编程实现时,主要步骤包括: 1. 初始化阶段:设定初始解向量x(0),并明确迭代过程中的参数,例如最大迭代次数和容许的误差界限。 2. 构建雅克比矩阵:依据矩阵A的非对角元素来形成J矩阵。 3. 迭代计算:依照上述迭代公式计算新的解向量,并验证是否满足终止条件(即当前解与前一次解的差值小于设定的误差界限)。 4. 结果输出...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Murphy2023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值