困扰许久的一个问题,终于得到了解决。一直以来,基本上每个项目都有下载BOM清单的需求。一般用的也是标准的FM,一来是省事,不用去把各个后台表做关联,二来是BOM中的Valid To字段,在STPO表中是空白的,需要去其它表取数,比较麻烦。但因此带来的问题的,性能会比较慢,使用标准的FM需要展开的内容比较多,展开一个BOM可能就要花0.5秒了。遇到的客户大部分物料都比较多,比如最近一个客户,有几千万的产品,其中十几万个产品是有BOM的,下载一次完整的BOM清单就要一个小时左右了。
测试下来一个BOM至少要0.4秒到0.5秒:
最近和一个开发在沟通时,让我们使用直接从后台表取数,这样可以大大提升性能。经过双比,50万个产品BOM清单,只需要7分钟,就能下载下来。这还不是用CDS View的情况,仅仅是用常规的读表取数的方式。 对于BOM清单中的Valid To,有两种解决方案: 1)使用STAS表,找出相应的Valid To,进行判断
```c
* to get active component from STAS that has component status and from & to dates.
SELECT
A~STLTY A~STLNR A~STLKN A~STPOZ A~SCHGT A~IDNRK A~MEINS
A~MENGE A~POSNR A~POSTP A~POTX1 A~POTX2 A~UPSKZ
A~EWAHR A~ALPST A~ALPRF STAS~STLAL
INTO CORRESPONDING FIELDS OF TABLE BOM_ITEM
FROM STPO AS A JOIN STAS ON ( A~STLTY EQ STAS~STLTY AND
A~STLNR EQ STAS~STLNR AND
A~STLKN EQ STAS~STLKN )
FOR ALL ENTRIES IN BOM_HEADER
WHERE A~STLTY = BOM_HEADER-STLTY AND
A~STLNR = BOM_HEADER-STLNR AND
A~LKENZ NE 'X' AND
STAS~STLAL = BOM_HEADER-STLAL .
IF SY-SUBRC EQ 0.
SELECT STLTY STLNR STLKN STLAL
INTO CORRESPONDING FIELDS OF TABLE I_STAS
FROM STAS
FOR ALL ENTRIES IN BOM_ITEM
WHERE STLTY EQ BOM_ITEM-STLTY AND
STLNR EQ BOM_ITEM-STLNR AND
STLKN EQ BOM_ITEM-STLKN AND
LKENZ EQ 'X' AND
DATUV LE VALIDFRO AND
AENNR NE SPACE.
LOOP AT I_STAS.
READ TABLE BOM_ITEM WITH KEY STLTY = I_STAS-STLTY
STLNR = I_STAS-STLNR
STLKN = I_STAS-STLKN
STLAL = I_STAS-STLAL.
IF SY-SUBRC EQ 0.
DELETE BOM_ITEM INDEX SY-TABIX.
ENDIF.
ENDLOOP.
ENDIF.
nn
方案2)在S/4 HANA中有一个配置,可以激发Valid To字段的计算

Run cs_bom_valid_to_calc to calculate “valid to” in STPO for existing BOMs

最终效果:

ggg