S / 4 Hana最佳实践阅读表

时间:2019-06-23 14:06:38

标签: sap abap

我找到了一个程序,其中有数百条记录循环显示,它们从12个不同的表中选择字段值的描述(例如umskz,fdgrv等)。
我知道最好的方法是在通过联接获取这些字段的值时进行描述。
但是如果由于某种原因我不想这样做,这是获取描述的下一个最佳实践吗?
通过从表中选择每条记录?或
通过将它们加载到ITAB中,并为每条记录阅读ITAB并获得描述?
当然,当我完成第二种方法的描述时,我将释放ITAB。

期待您的意见。

谢谢
埃里亚斯

1 个答案:

答案 0 :(得分:3)

您的问题有点模糊,所以让我首先总结一下我的理解:

您要从一个“中央”表中选择包含1M条记录的大量数据。数据有11列,其中包含代码。您想加入这些代码的描述。

您的设置听起来像是星型模式。最好的选择(尤其是对于SAP S / 4 HANA)通常是创建一个CDS视图,该视图描述所需的联接并产生与您所需形式完全相同的输出。这样一来,数据库就可以在选择数据之前很好地执行昂贵的执行路径计算,从而使数据库可以选择为您提供数据的最佳方式。

使用SAP HANA进行此操作的第二种最有效的方法是单个OpenSQL SELECT,它可以在一个步骤中将所有数据与LEFT OUTER联接连接在一起。您已经自己找到了它,但是为了清楚起见,让我用伪代码重复一下:

SELECT 
    <central table>-<field list>,
    <first code table>-description AS description_1,
    ...
    <eleventh code table>-description AS description_11
  INTO TABLE DATA(data)
  FROM <central table>
  LEFT OUTER JOIN <first code table>
    ON <central table>-<first code field> = <first code table>-key
  ...
  LEFT OUTER JOIN <eleventh code table>
    ON <central table>-<eleventh code field> = <eleventh code table>-key.

第三个最佳选择,这是您最初要寻求的,通常是对主数据的预选,然后是对代码描述的后续选择,以及ABAP中的最终“联接”。范围表可以简化选择所需代码的过程。 SORTED表可以确保联接提供可接受的性能:

" select the main data
SELECT <central table>-<field list>
  FROM <central table>
  INTO CORRESPONDING FIELDS OF TABLE data.

" collect the codes
LOOP AT data REFERENCE INTO DATA(record).

  INSERT VALUE #(
      sign = 'I'
      option = 'EQ'
      low = record-<first code field> )
    INTO TABLE first_codes_range.

  ...

  INSERT VALUE #(
      sign = 'I'
      option = 'EQ'
      low = record-<eleventh codde field> )
    INTO TABLE eleventh_codes.

ENDLOOP.

" select the descriptions
SELECT <key>, description
  FROM <first code table>
  INTO TABLE first_descriptions
  WHERE <key> IN first_codes.

...

SELECT <key>, description
  FROM <eleventh code table>
  INTO TABLE eleventh_descriptions
  WHERE <key> IN eleventh_codes.

" join main data and descriptions
LOOP AT data REFERENCE INTO record.
  record->description_1 =
    first_descriptions[ <key> = record-><first code field> ]-description.
  ...
  record->description_11 =
    eleventh_descriptions[ <key> = record-><eleventh code field> ]-description.
ENDLOOP.

正如@Sandra Rossi所指出的那样,性能是一个高度个体化的事物,它具有微小的细节,并且经常违背最佳实践。结果,这些建议只能是:建议。当时写了13个小时的工作的程序员可能正在遵循他们的最佳实践...