通过SELECT语句使用附加数据填充内部表的其他列?可以这样做吗?

时间:2013-07-04 15:07:17

标签: select abap

SELECT matnr ersda ernam laeda 
FROM mara 
INTO CORRESPONDING FIELDS OF TABLE gt_mara 
UP TO 100 ROWS.

此时我在itab gt_mara中有100个条目。

SELECT aenam vpsta pstat lvorm mtart
  FROM mara
  INTO CORRESPONDING FIELDS OF TABLE gt_mara
  FOR ALL ENTRIES IN gt_mara
  WHERE matnr = gt_mara-matnr AND
        ersda = gt_mara-ersda AND
        ernam = gt_mara-ernam AND
        laeda = gt_mara-laeda.

此时我有59个条目。这是有道理的。此代码有问题,因为它可能在运行时修改选择标准。

无论如何我想要的是:在一个点上选择表格的前4个字段,然后在其他点选择其他5个字段。

当然,这只是一个例子。也许第二个选择将在具有相同键或具有不同数量的字段的不同表上完成。

甚至可以这样做吗? 有没有更有效的方法来实现这一点,而不是我默认的想法(重做完整选择)?

2 个答案:

答案 0 :(得分:2)

好的我认为你问题的实质更多的是你是否可以通过第二个select语句直接更新内部表中的某些未填充字段。

答案是否定的。您的第二个select语句将替换表gt_mara中的内容,因此您将留下一个内部表,其中前4个字段为空,最后5个字段为空。

你能做的最好的事情就是这样:

SELECT matnr ersda ernam laeda 
  FROM mara 
  INTO CORRESPONDING FIELDS OF TABLE gt_mara 
  UP TO 100 ROWS.


SELECT matnr aenam vpsta pstat lvorm mtart
  FROM mara
  INTO CORRESPONDING FIELDS OF TABLE gt_mara2
  FOR ALL ENTRIES IN gt_mara
  WHERE matnr = gt_mara-matnr AND
        ersda = gt_mara-ersda AND
        ernam = gt_mara-ernam AND
        laeda = gt_mara-laeda.

loop at gt_mara2 into ls_mara.
  modify gt_mara from ls_mara transporting aenam vpsta pstat lvorm mtart 
    where matnr = ls_mara-matnr.
endloop.

这显然效率很低,这就是为什么在将数据带回应用服务器之前,总是会尝试让数据库为您完成尽可能多的工作。显然,如果数据来自同一个表格,那么一次性选择它将是您的最佳选择。在大多数情况下,即使数据位于不同的表中,您最好还是创建视图或使用连接。

在极少数情况下,您需要在内部表格中循环以填写原始选择时无法使用的某些字段。

答案 1 :(得分:1)

SELECT你需要的所有东西(如果数据来自同一个表,这是首选的解决方案)或SELECT以后的其他东西(如果这些东西来自哪个是个好主意)不用于第一次选择的不同表格。为了组装结果集,数据库通常需要访问整个数据集,因此选择一些额外的字段并没有什么坏处 - 与使用大量SELECT语句再次访问数据库相反(如果{ {1}}表变得很大)。还要记住 - 根据您正在进行的处理类型 - 表格的内容可能在此期间发生了变化。如果数据库事务(LUW)结束(对话步骤之间总是这种情况),则会丢失数据库级事务隔离。