繁体   English   中英

为什么不能对 CL_SALV_TABLE 中的 integer 进行小计?

[英]Why isn't it possible to do a subtotal over an integer in CL_SALV_TABLE?

假设我们在 ABAP 中有下表:

PERNR 工作时间 Other_Fields
00012 12,00 -
00110 5,00 -
00120 22,00 -

PERNR 在其 DB 表上保存为带有前导 0 的 NUMC。 由于一些必备功能,在显示带有 CL_SALV_TABLE 的 SALV 表之前必须删除前导 0(因为它以后无法访问)。 所以基本上我们有以下示例数据:

PERNR 工作时间 Other_Fields
12 12,00 -
110 5,00 -
120 22,00 -

现在我想做以下事情:

  1. 总共超过WORKHOURS
  2. 对 PERNR 进行小计

但由于 PERNR 是 NUMC,所以结果如下:

PERNR 工作时间 Other_Fields
110 5,00 -
12 12,00 -
120 22,00 -

AFAIK,NUMC 从左到右进行比较,然后这个顺序是有意义的。 可悲的是,当我为此或我自己的域创建自己的数据元素时,我无法更改这一点(至少我没有看到...的选项)。

但是,当我将 PERNR 转换为 INTEGER 或 DEC 时,排序工作正常,并且顺序符合预期。 另外,无需删除前导 0,因为这些数据类型不显示或没有前导 0。 但是当我尝试执行步骤 1 和 2 时,尝试步骤 2 时出现以下错误:“无法在可聚合列上计算小计”

...为什么? 我认为没有理由不汇总这些值。 到目前为止,我还没有找到任何文档说明为什么不允许(或可能)这样做。 我发现许多网站解释了如何通过编码来完成,但是当我尝试通过编码进行小计时,我得到了同样的错误,所以我很困惑。

是否仍有可能对 PERNR 列进行小计?

编辑:@Suncatcher Sry,我在我的数据字典中使用了一个表格类型,不想让帖子太大。 我将尝试尽可能短地定义我的编码。 将其定义为结构的结构类型和表格类型:

@EndUserText.label : 'Structure for test salv'
@AbapCatalog.enhancementCategory : #NOT_EXTENSIBLE
define type ZS_SALV_STRUCTURE {
pernr        : abap.numc(8);
workhours    : abap.dec(4,2);
other_fields : abap.string(256);
}

在此示例中,表类型称为ZT_SALV_STRUCTURE 报告缩短如下(我从 NUMC 中删除前导 0 的示例):

REPORT zsalv_test.
DATA: gv_okcode TYPE sy-ucomm,
      gx_salv   TYPE REF TO cl_salv_table,
      gt_data   TYPE zt_salv_structure.

START-OF-SELECTION.
  "Example 1: Delete leading 0's
  "Create example data to substitute the CDS-View
  gt_data = VALUE #( ( pernr = '012' workhours = 12 other_fields = '-' )
                     ( pernr = '110' workhours = 5  other_fields = '-' )
                     ( pernr = '120' workhours = 22 other_fields = '-' ) ).
  "Delete leading 0's
  LOOP AT gt_data ASSIGNING FIELD-SYMBOL(<ls_data>).
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
      EXPORTING
        input  = <ls_data>-pernr
      IMPORTING
        output = <ls_data>-pernr.
  ENDLOOP.
  "Example 1 END

  "The Dynpro has gv_okcode for the OKCODE and is filled with a single custom container named 'CONTAINER'
  CALL SCREEN 0100.

*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  IF gx_salv IS INITIAL.
    cl_salv_table=>factory(
      EXPORTING
        r_container    = NEW cl_gui_custom_container( container_name = 'CONTAINER' )
        container_name = 'CONTAINER'
      IMPORTING
        r_salv_table   = gx_salv
      CHANGING
        t_table        = gt_data
    ).
    gx_salv->get_functions( )->set_all( abap_true ).
    gx_salv->get_columns( )->set_optimize( abap_true ).
    DATA(lt_columns) = gx_salv->get_columns( )->get( ).
    LOOP AT lt_columns ASSIGNING FIELD-SYMBOL(<ls_column>).
      CASE <ls_column>-columnname.
        WHEN 'PERNR'.
          <ls_column>-r_column->set_long_text( 'PERNR' ).
        WHEN 'WORKHOURS'.
          <ls_column>-r_column->set_long_text( 'WORKHOURS' ).
        WHEN 'OTHER_FIELDS'.
          <ls_column>-r_column->set_long_text( 'OTHER_FIELDS' ).
      ENDCASE.
    ENDLOOP.
    gx_salv->display( ).
  ELSE.
    gx_salv->refresh( ).
  ENDIF.

ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
MODULE user_command_0100 INPUT.

ENDMODULE.

当我将 INTEGER 或 DEC 用于 PERNR 时,我将 Structuretype 更改如下,并且不删除前导 0:INTEGER:

pernr        : abap.int4;

十二月:

pernr        : abap.dec(8,0);

我通过CAST -Expression INTEGER 在我的消费视图中“投射”我的数据:

cast(PersonnelNumber as abap.int4) as pernr;

十二月:

cast(PersonnelNumber as abap.dec(8,0) as pernr;

至于我如何排序并进行(子)总计:我在运行报告时使用 dynpro 上的 CL_SALV_TABLE class 提供的 function (SALV 顶部的小按钮)。

小计仅适用于数字数据类型。 NUMC 它是一个类似字符的字段,只允许数字,但它是一个字符。

如果你有这张桌子... | PERNR | 月 | 小时 | |-------|-------|--------| | 0010 | 十二月 | 160 | | 0010 | 十一月 | 100 | | 0020 | 十二月 | 80 |

您必须拥有此分类汇总选项 Group by PERNR | PERNR | 月 | 小时 | |-------|-------|--------| | 0010 | | 260 | | 0020 | | 80 |

按月分组 | PERNR | 月 | 小时 | |-------|-------|--------| | | 十二月 | 240 | | | 十一月 | 100 |

如果您想以零前导显示 PERNR,您可以强制 ALPHA 作为 fieldcat 中的转换出口。

此致。

塞巴斯蒂安

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM