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

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

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 个字段。

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

那么这甚至可以做到吗?有没有比我默认想到的更有效的方法来实现这一点(重做完整的选择)?

4

2 回答 2

2

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

答案是不。您的第二个 select 语句将替换 table 中的内容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.

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

在极少数情况下,有必要在您的内部表格中循环填写一些在您进行原始选择时不可用的字段。

于 2013-07-05T01:35:31.553 回答
1

要么SELECT是您立即需要的所有东西(如果数据来自同一个表,这是首选解决方案),要么SELECT是稍后的其他东西(如果这些东西来自第一次选择的不同表,这是一个好主意)。为了组装结果集,数据库通常需要访问整个数据集,因此选择一些额外的字段并没有什么坏处 - 与使用大量SELECT语句再次访问数据库相比(如果FOR ALL ENTRIES表变大)。还要记住 - 根据您正在执行的处理类型 - 表格的内容可能在此期间发生了变化。如果数据库事务 (LUW) 结束(对话步骤之间总是如此),您将失去数据库级别的事务隔离。

于 2013-07-04T18:16:32.433 回答