SAP ABAP Infoset查询 - SELECT SUM和Duplicate行

时间:2014-10-30 18:26:49

标签: select sap abap infoset

我无法确定从哪里开始/如何获得正确的输出。 我对ABAP编码很新。我正在尝试创建一个Infoset查询,需要在SQ02中进行一些编码。

我有两个表连接 - 一个是RBKP作为发票收据的标题另一个是发票凭证项的RBDRSEG。

查询需要按照一些不相关的参数/变体运行,但是当它这样做时需要 - - -

在RBDRSEG中查找所有相同的文档编号RBKP-BELNR EQ RBDRSEG-RBLNR

在这样做时,RBDRSEG可能会或可能不会为每个Doc No。

提供多行结果

我需要为每个Doc No. Result 总计RBDRSEG-DMBTR字段。 (如果Doc.No。有5行; DMBTR对每个需要总计的值都有不同的值)

此时我需要输出仅显示(以及RBKP中的其他字段)每个Doc的DMBTR字段的SUM的一行。否

然后,我需要另一个字段显示字段RBKP的差异 - RMWWWR,即发票总计和先前为该Doc计算的总计。现场DMBTR的编号。

如果你能提供帮助,我将非常感激。

1 个答案:

答案 0 :(得分:1)

首先,您需要定义一个包含您的选择数据的结构。您需求的示例结构可能如下所示:

enter image description here

不要忘记激活结构并确保它不包含错误。

现在创建选择报告。要将报告用作数据选择方法,您需要添加两条评论*<QUERY_HEAD>*<QUERY_BODY>*<QUERY_HEAD>必须放置在您的选择开始通常位于*<QUERY_BODY>的循环内,该循环将选定的行放入与SE11中定义的结构同名的内部表中。 / p>

我做了一个示例报告来说明这是如何工作的:

REPORT  ZSTACK_RBKP_INFOSET_QUERY.

tables:
  rbkp,
  ZSTACK_RBKP_INFOSET_STR.

select-OPTIONS:
  so_belnr for rbkp-belnr,
  so_gjahr for rbkp-gjahr.

data:
      itab type standard table of ZSTACK_RBKP_INFOSET_STR,
      wa_itab type ZSTACK_RBKP_INFOSET_STR.

data:
      lv_diff type dmbtr.

*here your selection starts.

*<QUERY_HEAD>

select rbkp~belnr
   rbkp~gjahr
   rbkp~rmwwr
   rbkp~waers
   sum( RBDRSEG~DMBTR ) as DMBTR
   from RBKP left outer join RBDRSEG
     on RBDRSEG~RBLNR eq RBKP~BELNR and
        RBDRSEG~RJAHR eq RBKP~GJAHR
   into corresponding fields of table itab
  where rbkp~belnr in so_belnr and
    rbkp~gjahr in so_gjahr
  group by rbkp~belnr rbkp~gjahr rbkp~rmwwr rbkp~waers.


loop at itab into wa_itab.

  lv_diff = wa_itab-dmbtr - wa_itab-rmwwr.

  move lv_diff to wa_itab-diff.
  modify itab from wa_itab.

endloop.



* this is the part that forwards your result set to the infoset
LOOP AT itab INTO ZSTACK_RBKP_INFOSET_STR.


*<QUERY_BODY>

ENDLOOP.

示例报告首先为RBKP中的每个文档选择RBDRSEG-DMBTR行以及RBKP的总和。之后,loop会更新DIFF列,其中包含所选列RMWWRDMBTR之间的差异。

不幸的是,在我们的SAP系统中,表RBDRSEG是空的,因此我无法测试报告的这一部分。但是,只需在第一个loop之前添加断点,然后启动报告,即可在系统中测试报告。然后,您应该能够查看内部表ITAB中的选定行,并查看选择是否按预期工作。

示例报告中的警告:RBKPRBDRSEG都引用了不同的货币字段。因此,RMWWRDMBTR中的值可能采用不同的货币(RMWWR采用文档货币,DMBTR似乎采用默认公司货币)。如果是这种情况,您必须在计算差异之前将它们转换为适当的货币。请务必使用RBKP / RBDRSEG中的文档编号和BELNR / RBLNR中的文档编号加入GJAHRRJAHR(字段RBDRSEG中的RJAHRGJAHR而不是GJAHRRBDRSEG中也存在LINETOTAL

当您的报告按预期工作时,请根据您的报告创建信息集。然后,您可以像任何其他信息集一样使用信息集。

更新: 我刚刚意识到,因为你写过关于ABAP的新手,我立刻认为你需要为你的信息集创建一个报告。根据您的实际要求,情况可能并非如此。您可以在表RBKP上创建一个简单的信息集查询,然后使用信息集编辑器为行总数和差异添加两个字段,然后添加一些abap代码,用于选择RBDRSEG中所有相应行的总和并计算RMWWR之间的差异和总和。这可能比定制的abap报告慢,因为必须为RBKP中的每一行重复选择,因此它实际上取决于用户要查询的数据量。定制的ABAP报告很好,灵活且快速,但可能过度,并且能够更改报告的人数小于能够修改信息集的人数。


使用信息集设计器的变体的其他信息

首先创建一个简单的信息集只读表RBKP(因此在信息集定义中没有表连接)。现在转到特定于应用程序的增强功能:

enter image description here

在我的示例中,我已添加了两个字段DIFFERENCERBDRSEG-DMBTR。两者都具有与RBDRSEG-DMBTR相同的属性。确保包含RBKP总和的字段的序列(此处为&#39; 1&#39;)低于包含差异的字段。序列确定首先计算哪些字段。

单击第一个字段的编码按钮,然后添加编码以选择单个{{1}}条目的总和:

enter image description here

然后对差异字段执行相同的操作:

enter image description here

现在,您的字段列表中有两个字段,您可以将它们添加到右侧的字段组中:

enter image description here

如前所述,您刚刚输入的代码将在RBKP中为每一行处理。因此,这可能会对运行时性能产生巨大影响,具体取决于初始结果集的大小。