Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过SELECT语句用附加数据填充内部表的附加列?这能做到吗?_Select_Abap - Fatal编程技术网

通过SELECT语句用附加数据填充内部表的附加列?这能做到吗?

通过SELECT语句用附加数据填充内部表的附加列?这能做到吗?,select,abap,Select,Abap,此时,我在itabgt_mara中有100个条目 SELECT matnr ersda ernam laeda FROM mara INTO CORRESPONDING FIELDS OF TABLE gt_mara UP TO 100 ROWS. 在这一点上,我有59个条目。这是有道理的。这段代码有缺陷,因为它可能在运行时修改了选择条件 无论如何,我的意图是:在一个点上选择表的前4个字段,然后在另一个点上选择其他5个字段 当然,这只是一个例子。也许第二次选择将在具有相同键或不同字段数的

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

SELECT matnr ersda ernam laeda 
FROM mara 
INTO CORRESPONDING FIELDS OF TABLE gt_mara 
UP TO 100 ROWS.
在这一点上,我有59个条目。这是有道理的。这段代码有缺陷,因为它可能在运行时修改了选择条件

无论如何,我的意图是:在一个点上选择表的前4个字段,然后在另一个点上选择其他5个字段

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

那么这能做到吗?
是否有比默认情况下(重做完整选择)更有效的方法来实现这一点?

要么立即选择所需的所有内容(如果数据来自同一个表,这是首选解决方案),要么稍后选择附加内容(如果材料来自不同的表,而不是用于第一次选择,这是一个好主意)。为了组装结果集,数据库通常需要访问整个数据集,因此选择一些额外的字段并不会造成真正的伤害-这与使用大量的
select
语句再次访问数据库不同(如果所有条目的
表变大)。还请记住,根据您正在执行的处理类型,表的内容在此期间可能已更改。如果数据库事务(LUW)结束(对话框步骤之间总是如此),您就失去了数据库级事务隔离。

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

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

您所能做的最好的事情如下:

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.
这显然是非常低效的,这就是为什么在将数据返回到应用程序服务器之前,您总是试图让数据库为您做同样多的工作。显然,如果数据来自同一个表,则一次选择所有数据将是您的最佳选择。在大多数情况下,即使数据位于不同的表中因此,最好创建视图或使用联接

在极少数情况下,有必要在内部表中循环,以填充在执行原始选择时不可用的某些字段

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.