[英]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 | - |
现在我想做以下事情:
但由于 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.