sap 参考内表

参考内表

在SAP ABAP中,FOR ALL ENTRIES IN是一种优化内表处理的方法,它可以帮助您快速地从SAP数据表中选择和过滤一组记录。

使用FOR ALL ENTRIES IN,您可以选择一个与目标字段匹配的内表,并使用此内表的值来过滤数据表,以便只返回与内表中的值匹配的数据记录。

格式

SELECT <F1...FN>
	INTO CORRESPONDING FIELDS OF TABLE <itab1>
	FROM <dbtab>
	FOR ALL ENTRIES IN <itab2>
	WHERE<condation>.

上述参考内表取数时,要要先检查内表不能为空。

CHECK <itab2> IS NOT INITIAL.  "检查内表是否为空

示例

以下是一个使用FOR ALL ENTRIES IN的基本示例:

REPORT Z_EXAMPLE_REPORT.

TYPES: BEGIN OF t_sap_data,
         field1 TYPE string,
         field2 TYPE string,
         field3 TYPE string,
       END OF t_sap_data.
       
DATA: t_sap_data TYPE TABLE OF t_sap_data.

DATA: itab TYPE STANDARD TABLE OF t_sap_data,
      wa_sap_data TYPE t_sap_data,
      wa_filter TYPE t_sap_data.

START-OF-SELECTION.
  " Let's assume we have a filter table `itab` with some values
  wa_filter-field1 = 'Value1'.
  wa_filter-field2 = 'Value2'.
  APPEND wa_filter TO itab.

  " Now let's use `FOR ALL ENTRIES IN` to filter data from table `sap_data_table`
  SELECT field1 field2 field3
    FROM sap_data_table
    INTO TABLE t_sap_data
    FOR ALL ENTRIES IN itab
    WHERE field1 = itab-field1
      AND field2 = itab-field2.
  
  " Now we can process the filtered table `t_sap_data`
  LOOP AT t_sap_data INTO wa_sap_data.
    APPEND wa_sap_data TO itab.
  ENDLOOP.
  
  " Now you can do additional processing on the internal table `itab`

在上面的示例中,我们首先创建了一个过滤表itab,并将具有特定值的记录添加到该表中。然后,我们使用FOR ALL ENTRIES IN从表sap_data_table中选择具有特定值的记录,并将结果存储在内表t_sap_data中。接下来,我们使用循环将过滤后的记录复制到包含过滤器的新内表itab中,并可以在该表上执行其他处理或后续操作。

简单abap程序

REPORT Z_EXAMPLE_REPORT.

* 定义结构体
TYPES: begin of TY_MARD,
  MATNR TYPE MARD-MATNR, "物料号
  MTART TYPE MARA-MTART, "物料类型
  LABST TYPE MARD-LABST, "数量
  END OF TY_MARD.

TYPES: BEGIN OF TY_MARA,
  MATNR TYPE MARA-MATNR, "物料号
  MEINS TYPE MARA-MEINS, "单位
  END OF TY_MARA.

TYPES:BEGIN OF TY_OUT,
  MATNR TYPE MARD-MATNR, "物料号
  MTART TYPE MARA-MTART, "物料类型
  LABST TYPE MARD-LABST, "数量
  MEINS TYPE MARA-MEINS, "单位
  END OF TY_OUT.

* 定义变量和内表
DATA: WA_MARD TYPE TY_MARD.
DATA: IT_MARD TYPE STANDARD TABLE OF TY_MARD.

DATA: WA_MARA TYPE TY_MARA.
DATA: IT_MARA TYPE STANDARD TABLE OF TY_MARA.

DATA: WA_OUT TYPE TY_OUT.
DATA: IT_OUT TYPE STANDARD TABLE OF TY_OUT.

* 添加几条内表TY_MARD数据
WA_MARD-MATNR = 'S-201'.
WA_MARD-MTART = 'FERT'.
WA_MARD-LABST = 43.
APPEND WA_MARD TO IT_MARD.

WA_MARD-MATNR = 'S-203'."物料号
WA_MARD-MTART = 'HALB'. "物料类型
WA_MARD-LABST = 65.     "数量
COLLECT WA_MARD INTO IT_MARD.

WA_MARD-MATNR = 'S-208'."物料号
WA_MARD-MTART = 'HALB'. "物料类型
WA_MARD-LABST = 65.     "数量
INSERT WA_MARD INTO TABLE IT_MARD.

LOOP AT IT_MARD INTO WA_MARD.
  WRITE:/ WA_MARD-MATNR,"物料号
          WA_MARD-MTART,"物料类型
          WA_MARD-LABST."数量
ENDLOOP.

*-------------------------------------------
* 参考内表 IT_MARD 取物料的 单位
*-------------------------------------------
CHECK IT_MARD IS NOT INITIAL.  "检查内表是否为空
select MATNR
       MEINS
  INTO CORRESPONDING FIELDS OF TABLE IT_MARA
  FROM MARA
  FOR ALL ENTRIES IN IT_MARD  "参考内表
  WHERE MARA~MATNR = IT_MARD-MATNR.

*-------------------------------------------
* 数据整合  两个内表整合成新的内表
*-------------------------------------------
LOOP AT IT_MARD INTO WA_MARD.
  WA_OUT-MATNR = WA_MARD-MATNR.
  WA_OUT-MTART = WA_MARD-MTART.
  WA_OUT-LABST = WA_MARD-LABST.

  "读取内表 IT_MARA 上的一条数据 存入 WA_MARA 中
  READ TABLE IT_MARA INTO WA_MARA WITH KEY MATNR = WA_MARD-MATNR.
  IF sy-subrc = 0.
    WA_OUT-MEINS = WA_MARA-MEINS.
  ENDIF.

  APPEND WA_OUT TO IT_OUT.
  clear WA_OUT.  "清除变量存储的数据
ENDLOOP.

LOOP AT IT_OUT INTO WA_OUT.
  WRITE:/ WA_OUT-MATNR,"物料号
          WA_OUT-MTART,"物料类型
          WA_OUT-LABST,"数量
          WA_OUT-MEINS."单位
ENDLOOP.

image

posted @ 2023-05-24 15:52  三叶草body  阅读(235)  评论(0)    收藏  举报