日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【转载】 S/4 HANA中的MATDOC和MATDOC_EXTRACT

發(fā)布時(shí)間:2023/12/14 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转载】 S/4 HANA中的MATDOC和MATDOC_EXTRACT 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

S/4 HANA中的MATDOC和MATDOC_EXTRACT

最近做了銷售和物料管理方面的一些需求,因此對(duì)S/4中的MM的數(shù)據(jù)模型有了一定的了解。目前網(wǎng)絡(luò)已經(jīng)有一些介紹物料憑證表MATDOC的文章,內(nèi)容好像不是很詳細(xì),另外也沒發(fā)現(xiàn)介紹庫存變更數(shù)據(jù)表MATDOC_EXTRACT的文章。我打算把自己知道的一點(diǎn)東西寫下來分享。水平所限,如有不正確的地方,請(qǐng)務(wù)必評(píng)論指正。

本文將介紹2點(diǎn)內(nèi)容,

  • 傳統(tǒng)的物料憑證表MKPF,MSEG和新表MATDOC間的關(guān)系
  • 傳統(tǒng)的庫存表如MARD, MCHB, MSKU, MSLB, MARDH, MCHBH, MSKUH, MSLBH等和新表MATDOC以及MATDOC_EXTRACT的關(guān)系

此外,一些廣為流傳的文章(比如SAP S/4 Hana On-premise Edition 1511做了哪些簡化、SAP S/4HANA 1610后勤之變)中提出S4的SAP中的庫存數(shù)據(jù)會(huì)從MATDOC表中實(shí)時(shí)計(jì)算,本文將證明這種說法是不準(zhǔn)確的:至少對(duì)于MARD等標(biāo)準(zhǔn)表而言,其中的數(shù)據(jù)來自于對(duì)MATDOC_EXTRACT的匯總,而非MATDOC。

?

本文鏈接:https://www.cnblogs.com/hhelibeb/p/9361187.html

原創(chuàng)內(nèi)容,轉(zhuǎn)載請(qǐng)注明

回到頂部

replacement object

網(wǎng)絡(luò)上的個(gè)別文章提到S4中不再存在MKPF和MARD等表,數(shù)據(jù)都來自于CDS。這種說法不是很準(zhǔn)確,事實(shí)上MKPF等表依然是存在的,只不過其中的數(shù)據(jù)被CDS entity替換掉了,這種CDS entity就是所謂replacement object.。MKPF和MSEG中的數(shù)據(jù)全部來自MATDOC,MARD中的全部數(shù)據(jù)來自于MATDOC_EXTRACT。而類似于FAGLFLEXT這種視圖,它們的表則是真的不存在了。SE11中查看的話可以看出區(qū)別:

?

這種區(qū)別看似無所謂,實(shí)際上對(duì)開發(fā)人員而言是有區(qū)別。使用Open SQL對(duì)包含replacement object的表的訪問通常會(huì)被重定向到replacement object,但在某些情況下存在例外(具體參看文檔)。這種名實(shí)不符的情況有時(shí)會(huì)導(dǎo)致意外的bug,可以參見筆者之前的踩坑經(jīng)歷。

回到頂部

物料憑證

MKPF, MSEG和MATDOC之間的關(guān)系相對(duì)簡單,目前我試著把接到的需求里的MKPF和MSEG都轉(zhuǎn)換成MATDOC,開發(fā)效率有一些提升,程序的工作情況良好。

MKPF表的replacement object是NSDM_E_MKPF,這個(gè)CDS entity是直接從MATDOC中取數(shù)的,條件為record_type = 'MDOC'和header_counter = 1,代碼如下,可以重點(diǎn)看where語句部分,

(注:前綴NSDM的意思可能是New, Simplified Data Model)

@AbapCatalog.sqlViewName: 'NSDM_V_MKPF' @EndUserText.label: 'MKPF Compatibility View' @DataAging.noAgingRestriction: 'false'

@ObjectModel.usageType.sizeCategory: ‘L’
@ObjectModel.usageType.serviceQuality: #C
@ObjectModel.usageType.dataClass: #TRANSACTIONAL
@ClientHandling.algorithm: #AUTOMATED
@AccessControl.authorizationCheck: #NOT_ALLOWED
@AbapCatalog.viewEnhancementCategory: #PROJECTION_LIST
define view nsdm_e_MKPF as
select
key mandt,
key mblnr,
key mjahr,
vgart,
blart,
blaum,
bldat,
budat,
cpudt,
cputm,
aedat,
usnam,
tcode,
xblnr,
bktxt,
frath,
frbnr,
wever,
xabln,
awsys,
bla2d,
tcode2,
bfwms,
exnum,
spe_budat_uhr,
spe_budat_zone,
le_vbeln,
spe_logsys,
spe_mdnum_ewm,
gts_cusref_no,
fls_rsto,
msr_active
/
Fields which do belong to APPENDs on MSEG will be provided via EXTEND VIEW to this view.
Hence, Industries having also APPENDs can use the same technique
and just because the alphabetical sequence of APPENDs is also valid for EXTEND VIEW the compability will be ensured.
The name of the IS EXTEND VIEW has to be the same as the APPEND. Rules are:
ABAP Catalog Objekt: <Append>_V
DDL Source <Append>_DDL
CDS View = <Append>_E
The alphabetical order of the EXTEND VIEW in the final proxy view is according to the name of sqlViewAppendName
and not accroding to DDL source name or the EXTEND VIEW name! Hence there is still a restriction on 16 chars!
/
/
DDL sources of known extensions so far:
JVMKPF_DDL
MILL_MKPF_DDL
/
from matdoc
where record_type = ‘MDOC’
and header_counter = 1

?

MSEG和它差不多,replacement object是NSDM_E_MSEG,同樣從MATDOC中獲取數(shù)據(jù),條件則只有record_type = 'MDOC',代碼略過不貼。

使用MATDOC代替MKPF和MSEG,可以減少不必要的關(guān)聯(lián)次數(shù)。另外,也有stock_qty和consumption_qty等方便計(jì)算的字段,利用它們可以減少相關(guān)邏輯處理代碼,提高開發(fā)速度。

回到頂部

庫存

一些文章提到S4中的庫存數(shù)據(jù)是從MATDOC中實(shí)時(shí)匯總得出的,的確,MATDOC中包含計(jì)算庫存所需的全部數(shù)據(jù)。但是這個(gè)表的數(shù)據(jù)是物料憑證級(jí)別的,隨著時(shí)間的進(jìn)行,SAP系統(tǒng)內(nèi)會(huì)積累大量的物料憑證,從這樣海量的數(shù)據(jù)中匯總庫存,似乎有些奢侈。例如FICO模塊中的ACDOCA表,就是從年初余額開始匯總,來獲取余額的(見前文:S/4 HANA中的ACDOCT和FAGLFLEXT),而不是匯總歷史上的每一筆憑證。

通過對(duì)各個(gè)庫存表的replacement object的閱讀追蹤,我發(fā)現(xiàn)實(shí)際上庫存數(shù)據(jù)來自于另一個(gè)表:MATDOC_EXTRACT。這是一個(gè)實(shí)在的透明表,并不存在replacement object:

NOTE 2246602 中提到了這個(gè)表:

為了減輕(從MATDOC中進(jìn)行聚合運(yùn)算時(shí)因數(shù)據(jù)量大導(dǎo)致的性能下降的)影響,SAP引入了第二個(gè)表MATDOC_EXTRACT,從中計(jì)算實(shí)際庫存數(shù)據(jù)。MATDOC_EXTRACT有一小部分來自MATDOC的字段,在物料憑證過賬時(shí),每當(dāng)有數(shù)據(jù)被插入到MATDOC中,也會(huì)有數(shù)據(jù)被插入MATDOC_EXTRACT中。MATDOC_EXTRACT里的數(shù)據(jù)會(huì)被定期壓縮,比如,假設(shè)有以下兩條數(shù)據(jù):

  • Date:20.11.2015; Material:4711; Plant:0001; StorageLocation:0001; StockIdentifier:01; SpecialStock:blank; Quantity: 10,0; Unit: PC
  • Date:23.11.2015; Material:4711; Plant:0001; StorageLocation:0001; StockIdentifier:01; SpecialStock:blank; Quantity: -3,0; Unit: PC

會(huì)被壓縮為:

  • Date:PrecompactingDate; Material:4711; Plant:0001; StorageLocation:0001; StockIdentifier:01; SpecialStock:blank; Quantity: 7,0; Unit: PC

新的壓縮后的數(shù)據(jù)會(huì)被插入MATDOC_EXTRACT,兩條被壓縮的數(shù)據(jù)會(huì)被從中刪除。通過這種做法,表

MATDOC_EXTRACT中的總記錄數(shù)和用于聚合的記錄數(shù)都會(huì)定期減少,因此,對(duì)庫存的查詢(相比從MATDOC中進(jìn)行)會(huì)有更好的性能。

該過程被稱為“預(yù)壓縮”(precompacting),默認(rèn)作為期末結(jié)算(period end closing)的一部分運(yùn)行。如果因此導(dǎo)致期末結(jié)算性能下降,也可以自行安排定期后臺(tái)作業(yè)。

以下通過MARD的replacement object,NSDM_E_MARD為例,我們來觀察下它是如何從MATDOC_EXTRACT中獲取數(shù)據(jù)的。源代碼:

@AbapCatalog.sqlViewName: 'NSDM_V_MARD' @EndUserText.label: 'MARD Compatibility View' @DataAging.noAgingRestriction: 'false'

@ObjectModel.usageType.sizeCategory: ‘L’
@ObjectModel.usageType.serviceQuality: #C
@ObjectModel.usageType.dataClass: #TRANSACTIONAL
@ClientHandling.algorithm: #AUTOMATED
@AccessControl.authorizationCheck: #NOT_ALLOWED
@AbapCatalog.viewEnhancementCategory: #PROJECTION_LIST

define view nsdm_e_mard
as select from mard as t
left outer join nsdm_e_mard_diff as m on t.mandt = m.mandt
and t.matnr = m.matnr
and t.werks = m.werks
and t.lgort = m.lgort
association [0…1] to E_Productstoragelocation as _ActiveExtension on $projection.matnr = _ActiveExtension.Product
and $projection.werks = _ActiveExtension.Plant
and $projection.lgort = _ActiveExtension.StorageLocation
{
key t.mandt,
key t.matnr,
key t.werks,
key t.lgort,

t.pstat,t.lvorm,</span><span style="color: rgba(255, 0, 255, 1)">case</span><span style="color: rgba(0, 0, 255, 1)">when</span> m.gjper <span style="color: rgba(128, 128, 128, 1)">=</span> <span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">0000000</span><span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(128, 128, 128, 1)">or</span> m.gjper <span style="color: rgba(0, 0, 255, 1)">is</span> <span style="color: rgba(0, 0, 255, 1)">null</span> <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">t.lfgja</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(255, 0, 255, 1)">cast</span>(<span style="color: rgba(255, 0, 255, 1)">substring</span>(m.gjper, <span style="color: rgba(128, 0, 0, 1); font-weight: bold">1</span>, <span style="color: rgba(128, 0, 0, 1); font-weight: bold">4</span>) <span style="color: rgba(0, 0, 255, 1)">as</span> abap.numc(<span style="color: rgba(128, 0, 0, 1); font-weight: bold">4</span><span style="color: rgba(0, 0, 0, 1)">))</span><span style="color: rgba(0, 0, 255, 1)">end</span> <span style="color: rgba(0, 0, 255, 1)">as</span><span style="color: rgba(0, 0, 0, 1)"> lfgja,</span><span style="color: rgba(255, 0, 255, 1)">case</span><span style="color: rgba(0, 0, 255, 1)">when</span> m.gjper <span style="color: rgba(128, 128, 128, 1)">=</span> <span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">0000000</span><span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(128, 128, 128, 1)">or</span> m.gjper <span style="color: rgba(0, 0, 255, 1)">is</span> <span style="color: rgba(0, 0, 255, 1)">null</span> <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">t.lfmon</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(255, 0, 255, 1)">cast</span>(<span style="color: rgba(255, 0, 255, 1)">substring</span>(m.gjper, <span style="color: rgba(128, 0, 0, 1); font-weight: bold">6</span>, <span style="color: rgba(128, 0, 0, 1); font-weight: bold">2</span>) <span style="color: rgba(0, 0, 255, 1)">as</span> abap.numc(<span style="color: rgba(128, 0, 0, 1); font-weight: bold">2</span><span style="color: rgba(0, 0, 0, 1)">))</span><span style="color: rgba(0, 0, 255, 1)">end</span> <span style="color: rgba(0, 0, 255, 1)">as</span><span style="color: rgba(0, 0, 0, 1)"> lfmon,t.sperr,</span><span style="color: rgba(255, 0, 255, 1)">case</span> <span style="color: rgba(0, 0, 255, 1)">when</span> m.labst <span style="color: rgba(0, 0, 255, 1)">is</span> <span style="color: rgba(0, 0, 255, 1)">null</span> <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold">0</span> <span style="color: rgba(0, 0, 255, 1)">else</span> m.labst <span style="color: rgba(0, 0, 255, 1)">end</span> <span style="color: rgba(0, 0, 255, 1)">as</span> labst, <span style="color: rgba(128, 128, 128, 1)">//</span> vvv note <span style="color: rgba(128, 0, 0, 1); font-weight: bold">2249780</span><span style="color: rgba(255, 0, 255, 1)">case</span> <span style="color: rgba(0, 0, 255, 1)">when</span> m.umlme <span style="color: rgba(0, 0, 255, 1)">is</span> <span style="color: rgba(0, 0, 255, 1)">null</span> <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold">0</span> <span style="color: rgba(0, 0, 255, 1)">else</span> m.umlme <span style="color: rgba(0, 0, 255, 1)">end</span> <span style="color: rgba(0, 0, 255, 1)">as</span><span style="color: rgba(0, 0, 0, 1)"> umlme,</span><span style="color: rgba(255, 0, 255, 1)">case</span> <span style="color: rgba(0, 0, 255, 1)">when</span> m.insme <span style="color: rgba(0, 0, 255, 1)">is</span> <span style="color: rgba(0, 0, 255, 1)">null</span> <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold">0</span> <span style="color: rgba(0, 0, 255, 1)">else</span> m.insme <span style="color: rgba(0, 0, 255, 1)">end</span> <span style="color: rgba(0, 0, 255, 1)">as</span><span style="color: rgba(0, 0, 0, 1)"> insme,</span><span style="color: rgba(255, 0, 255, 1)">case</span> <span style="color: rgba(0, 0, 255, 1)">when</span> m.einme <span style="color: rgba(0, 0, 255, 1)">is</span> <span style="color: rgba(0, 0, 255, 1)">null</span> <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold">0</span> <span style="color: rgba(0, 0, 255, 1)">else</span> m.einme <span style="color: rgba(0, 0, 255, 1)">end</span> <span style="color: rgba(0, 0, 255, 1)">as</span><span style="color: rgba(0, 0, 0, 1)"> einme,</span><span style="color: rgba(255, 0, 255, 1)">case</span> <span style="color: rgba(0, 0, 255, 1)">when</span> m.speme <span style="color: rgba(0, 0, 255, 1)">is</span> <span style="color: rgba(0, 0, 255, 1)">null</span> <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold">0</span> <span style="color: rgba(0, 0, 255, 1)">else</span> m.speme <span style="color: rgba(0, 0, 255, 1)">end</span> <span style="color: rgba(0, 0, 255, 1)">as</span><span style="color: rgba(0, 0, 0, 1)"> speme,</span><span style="color: rgba(255, 0, 255, 1)">case</span> <span style="color: rgba(0, 0, 255, 1)">when</span> m.retme <span style="color: rgba(0, 0, 255, 1)">is</span> <span style="color: rgba(0, 0, 255, 1)">null</span> <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold">0</span> <span style="color: rgba(0, 0, 255, 1)">else</span> m.retme <span style="color: rgba(0, 0, 255, 1)">end</span> <span style="color: rgba(0, 0, 255, 1)">as</span><span style="color: rgba(0, 0, 0, 1)"> retme,</span><span style="color: rgba(255, 0, 255, 1)">case</span> <span style="color: rgba(0, 0, 255, 1)">when</span> m.vmlab <span style="color: rgba(0, 0, 255, 1)">is</span> <span style="color: rgba(0, 0, 255, 1)">null</span> <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold">0</span> <span style="color: rgba(0, 0, 255, 1)">else</span> m.vmlab <span style="color: rgba(0, 0, 255, 1)">end</span> <span style="color: rgba(0, 0, 255, 1)">as</span><span style="color: rgba(0, 0, 0, 1)"> vmlab,</span><span style="color: rgba(255, 0, 255, 1)">case</span> <span style="color: rgba(0, 0, 255, 1)">when</span> m.vmuml <span style="color: rgba(0, 0, 255, 1)">is</span> <span style="color: rgba(0, 0, 255, 1)">null</span> <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold">0</span> <span style="color: rgba(0, 0, 255, 1)">else</span> m.vmuml <span style="color: rgba(0, 0, 255, 1)">end</span> <span style="color: rgba(0, 0, 255, 1)">as</span><span style="color: rgba(0, 0, 0, 1)"> vmuml,</span><span style="color: rgba(255, 0, 255, 1)">case</span> <span style="color: rgba(0, 0, 255, 1)">when</span> m.vmins <span style="color: rgba(0, 0, 255, 1)">is</span> <span style="color: rgba(0, 0, 255, 1)">null</span> <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold">0</span> <span style="color: rgba(0, 0, 255, 1)">else</span> m.vmins <span style="color: rgba(0, 0, 255, 1)">end</span> <span style="color: rgba(0, 0, 255, 1)">as</span><span style="color: rgba(0, 0, 0, 1)"> vmins,</span><span style="color: rgba(255, 0, 255, 1)">case</span> <span style="color: rgba(0, 0, 255, 1)">when</span> m.vmein <span style="color: rgba(0, 0, 255, 1)">is</span> <span style="color: rgba(0, 0, 255, 1)">null</span> <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold">0</span> <span style="color: rgba(0, 0, 255, 1)">else</span> m.vmein <span style="color: rgba(0, 0, 255, 1)">end</span> <span style="color: rgba(0, 0, 255, 1)">as</span><span style="color: rgba(0, 0, 0, 1)"> vmein,</span><span style="color: rgba(255, 0, 255, 1)">case</span> <span style="color: rgba(0, 0, 255, 1)">when</span> m.vmspe <span style="color: rgba(0, 0, 255, 1)">is</span> <span style="color: rgba(0, 0, 255, 1)">null</span> <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold">0</span> <span style="color: rgba(0, 0, 255, 1)">else</span> m.vmspe <span style="color: rgba(0, 0, 255, 1)">end</span> <span style="color: rgba(0, 0, 255, 1)">as</span><span style="color: rgba(0, 0, 0, 1)"> vmspe,</span><span style="color: rgba(255, 0, 255, 1)">case</span> <span style="color: rgba(0, 0, 255, 1)">when</span> m.vmret <span style="color: rgba(0, 0, 255, 1)">is</span> <span style="color: rgba(0, 0, 255, 1)">null</span> <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold">0</span> <span style="color: rgba(0, 0, 255, 1)">else</span> m.vmret <span style="color: rgba(0, 0, 255, 1)">end</span> <span style="color: rgba(0, 0, 255, 1)">as</span> vmret, <span style="color: rgba(128, 128, 128, 1)">//</span> <span style="color: rgba(128, 128, 128, 1)">^^^</span> note <span style="color: rgba(128, 0, 0, 1); font-weight: bold">2249780</span><span style="color: rgba(0, 0, 0, 1)">t.kzill,t.kzilq,t.kzile,t.kzils,t.kzvll,t.kzvlq,t.kzvle,t.kzvls,t.diskz,t.lsobs,t.lminb,t.lbstf,t.herkl,t.exppg,t.exver,t.lgpbe,</span><span style="color: rgba(255, 0, 255, 1)">case</span> <span style="color: rgba(0, 0, 255, 1)">when</span> m.klabs <span style="color: rgba(0, 0, 255, 1)">is</span> <span style="color: rgba(0, 0, 255, 1)">null</span> <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold">0</span> <span style="color: rgba(0, 0, 255, 1)">else</span> m.klabs <span style="color: rgba(0, 0, 255, 1)">end</span> <span style="color: rgba(0, 0, 255, 1)">as</span> klabs, <span style="color: rgba(128, 128, 128, 1)">//</span> vvv note <span style="color: rgba(128, 0, 0, 1); font-weight: bold">2249780</span><span style="color: rgba(255, 0, 255, 1)">case</span> <span style="color: rgba(0, 0, 255, 1)">when</span> m.kinsm <span style="color: rgba(0, 0, 255, 1)">is</span> <span style="color: rgba(0, 0, 255, 1)">null</span> <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold">0</span> <span style="color: rgba(0, 0, 255, 1)">else</span> m.kinsm <span style="color: rgba(0, 0, 255, 1)">end</span> <span style="color: rgba(0, 0, 255, 1)">as</span><span style="color: rgba(0, 0, 0, 1)"> kinsm,</span><span style="color: rgba(255, 0, 255, 1)">case</span> <span style="color: rgba(0, 0, 255, 1)">when</span> m.keinm <span style="color: rgba(0, 0, 255, 1)">is</span> <span style="color: rgba(0, 0, 255, 1)">null</span> <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold">0</span> <span style="color: rgba(0, 0, 255, 1)">else</span> m.keinm <span style="color: rgba(0, 0, 255, 1)">end</span> <span style="color: rgba(0, 0, 255, 1)">as</span><span style="color: rgba(0, 0, 0, 1)"> keinm,</span><span style="color: rgba(255, 0, 255, 1)">case</span> <span style="color: rgba(0, 0, 255, 1)">when</span> m.kspem <span style="color: rgba(0, 0, 255, 1)">is</span> <span style="color: rgba(0, 0, 255, 1)">null</span> <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold">0</span> <span style="color: rgba(0, 0, 255, 1)">else</span> m.kspem <span style="color: rgba(0, 0, 255, 1)">end</span> <span style="color: rgba(0, 0, 255, 1)">as</span> kspem, <span style="color: rgba(128, 128, 128, 1)">//</span> <span style="color: rgba(128, 128, 128, 1)">^^^</span> note <span style="color: rgba(128, 0, 0, 1); font-weight: bold">2249780</span><span style="color: rgba(0, 0, 0, 1)">t.dlinl,t.prctl,t.ersda,</span><span style="color: rgba(255, 0, 255, 1)">case</span> <span style="color: rgba(0, 0, 255, 1)">when</span> m.vklab <span style="color: rgba(0, 0, 255, 1)">is</span> <span style="color: rgba(0, 0, 255, 1)">null</span> <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold">0</span> <span style="color: rgba(0, 0, 255, 1)">else</span> m.vklab <span style="color: rgba(0, 0, 255, 1)">end</span> <span style="color: rgba(0, 0, 255, 1)">as</span> vklab, <span style="color: rgba(128, 128, 128, 1)">//</span> note <span style="color: rgba(128, 0, 0, 1); font-weight: bold">2249780</span><span style="color: rgba(255, 0, 255, 1)">case</span> <span style="color: rgba(0, 0, 255, 1)">when</span> m.vkuml <span style="color: rgba(0, 0, 255, 1)">is</span> <span style="color: rgba(0, 0, 255, 1)">null</span> <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold">0</span> <span style="color: rgba(0, 0, 255, 1)">else</span> m.vkuml <span style="color: rgba(0, 0, 255, 1)">end</span> <span style="color: rgba(0, 0, 255, 1)">as</span> vkuml, <span style="color: rgba(128, 128, 128, 1)">//</span> note <span style="color: rgba(128, 0, 0, 1); font-weight: bold">2249780</span><span style="color: rgba(0, 0, 0, 1)">t.lwmkb,t.bskrf,</span><span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">X</span><span style="color: rgba(255, 0, 0, 1)">'</span> <span style="color: rgba(0, 0, 255, 1)">as</span><span style="color: rgba(0, 0, 0, 1)"> mdrue,t.mdjin,</span><span style="color: rgba(0, 128, 128, 1)">--</span><span style="color: rgba(0, 128, 128, 1)">field added for extensibility</span>

t.dummy_stl_incl_eew_ps,
–Fields added for EA-RETAIL(FASHION)
t.fsh_salloc_qty_s,
case when m./cwm/labst is null then 0 else m./cwm/labst end as /cwm/labst, // note 2413597
case when m./cwm/insme is null then 0 else m./cwm/insme end as /cwm/insme, // note 2413597
case when m./cwm/einme is null then 0 else m./cwm/einme end as /cwm/einme, // note 2413597
case when m./cwm/speme is null then 0 else m./cwm/speme end as /cwm/speme, // note 2413597
case when m./cwm/retme is null then 0 else m./cwm/retme end as /cwm/retme, // note 2413597
case when m./cwm/umlme is null then 0 else m./cwm/umlme end as /cwm/umlme, // note 2413597
case when m./cwm/klabs is null then 0 else m./cwm/klabs end as /cwm/klabs, // note 2413597
case when m./cwm/kinsm is null then 0 else m./cwm/kinsm end as /cwm/kinsm, // note 2413597
case when m./cwm/keinm is null then 0 else m./cwm/keinm end as /cwm/keinm, // note 2413597
case when m./cwm/kspem is null then 0 else m./cwm/kspem end as /cwm/kspem, // note 2413597
case when m./cwm/vmlab is null then 0 else m./cwm/vmlab end as /cwm/vmlab, // note 2413597
case when m./cwm/vmins is null then 0 else m./cwm/vmins end as /cwm/vmins, // note 2413597
case when m./cwm/vmein is null then 0 else m./cwm/vmein end as /cwm/vmein, // note 2413597
case when m./cwm/vmspe is null then 0 else m./cwm/vmspe end as /cwm/vmspe, // note 2413597
case when m./cwm/vmret is null then 0 else m./cwm/vmret end as /cwm/vmret, // note 2413597
case when m./cwm/vmuml is null then 0 else m./cwm/vmuml end as /cwm/vmuml // note 2413597

}

可以看到,labst等度量,完全來自于與透明表MARD左連接的CDS entity:nsdm_e_mard_diff,觀察這個(gè)entity,可以看到,labst等entity其實(shí)原本都是stock_qty,只是根據(jù)lbbsa字段和sobkz字段的值的不同,被分成不同的度量列。

@AbapCatalog.sqlViewName: 'NSDM_V_MARD_DIFF' @EndUserText.label: 'MARD Compatibility View: Differentiation' @DataAging.noAgingRestriction: 'false'

@ObjectModel.usageType.sizeCategory: ‘L’
@ObjectModel.usageType.serviceQuality: #C
@ObjectModel.usageType.dataClass: #TRANSACTIONAL
@ClientHandling.algorithm: #AUTOMATED
@AccessControl.authorizationCheck: #NOT_ALLOWED
@AbapCatalog.viewEnhancementCategory: #PROJECTION_LIST
define view nsdm_e_mard_diff as
select from nsdm_e_mard_agg
{
key mandt,
key matnr,
key werks,
key lgort,

max(gjper_max) as gjper,

sum(case lbbsa when ‘01’ then case sobkz when ‘’ then stock_qty else 0 end else 0 end) as labst,
sum(case lbbsa when ‘04’ then case sobkz when ‘’ then stock_qty else 0 end else 0 end) as umlme,
sum(case lbbsa when ‘02’ then case sobkz when ‘’ then stock_qty else 0 end else 0 end) as insme,
sum(case lbbsa when ‘08’ then case sobkz when ‘’ then stock_qty else 0 end else 0 end) as einme,
sum(case lbbsa when ‘07’ then case sobkz when ‘’ then stock_qty else 0 end else 0 end) as speme,
sum(case lbbsa when ‘03’ then case sobkz when ‘’ then stock_qty else 0 end else 0 end) as retme,

cast(0 as abap.quan(13, 3)) as vmlab,
cast(0 as abap.quan(13, 3)) as vmuml,
cast(0 as abap.quan(13, 3)) as vmins,
cast(0 as abap.quan(13, 3)) as vmein,
cast(0 as abap.quan(13, 3)) as vmspe,
cast(0 as abap.quan(13, 3)) as vmret,

sum(case lbbsa when ‘01’ then case sobkz when ‘K’ then stock_qty else 0 end else 0 end) as klabs,
sum(case lbbsa when ‘02’ then case sobkz when ‘K’ then stock_qty else 0 end else 0 end) as kinsm,
sum(case lbbsa when ‘08’ then case sobkz when ‘K’ then stock_qty else 0 end else 0 end) as keinm,
sum(case lbbsa when ‘07’ then case sobkz when ‘K’ then stock_qty else 0 end else 0 end) as kspem,

sum(case lbbsa when ‘01’ then case sobkz when ‘’ then stock_vkwrt else 0 end else 0 end) as vklab,
sum(case lbbsa when ‘04’ then case sobkz when ‘’ then stock_vkwrt else 0 end else 0 end) as vkuml,

sum(case lbbsa when ‘01’ then case sobkz when ‘’ then /cwm/stock_qty else 0 end else 0 end) as /cwm/labst,
sum(case lbbsa when ‘04’ then case sobkz when ‘’ then /cwm/stock_qty else 0 end else 0 end) as /cwm/umlme,
sum(case lbbsa when ‘02’ then case sobkz when ‘’ then /cwm/stock_qty else 0 end else 0 end) as /cwm/insme,
sum(case lbbsa when ‘08’ then case sobkz when ‘’ then /cwm/stock_qty else 0 end else 0 end) as /cwm/einme,
sum(case lbbsa when ‘07’ then case sobkz when ‘’ then /cwm/stock_qty else 0 end else 0 end) as /cwm/speme,
sum(case lbbsa when ‘03’ then case sobkz when ‘’ then /cwm/stock_qty else 0 end else 0 end) as /cwm/retme,
cast(0 as abap.quan(13, 3)) as /cwm/vmlab,
cast(0 as abap.quan(13, 3)) as /cwm/vmuml,
cast(0 as abap.quan(13, 3)) as /cwm/vmins,
cast(0 as abap.quan(13, 3)) as /cwm/vmein,
cast(0 as abap.quan(13, 3)) as /cwm/vmspe,
cast(0 as abap.quan(13, 3)) as /cwm/vmret,
sum(case lbbsa when ‘01’ then case sobkz when ‘K’ then /cwm/stock_qty else 0 end else 0 end) as /cwm/klabs,
sum(case lbbsa when ‘02’ then case sobkz when ‘K’ then /cwm/stock_qty else 0 end else 0 end) as /cwm/kinsm,
sum(case lbbsa when ‘08’ then case sobkz when ‘K’ then /cwm/stock_qty else 0 end else 0 end) as /cwm/keinm,
sum(case lbbsa when ‘07’ then case sobkz when ‘K’ then /cwm/stock_qty else 0 end else 0 end) as /cwm/kspem,

‘X’ as mdrue

}
group by mandt, matnr, werks, lgort

這個(gè)lbbsa字段是什么意思呢?它是貨物移動(dòng)的庫存類型(庫存標(biāo)識(shí)符),域是NSDM_LBBSA,包含固定值(第一行為空值):

? ?? ?? 與庫存不相關(guān)
01?? ?未限制使用的庫存
02?? ?在檢庫存
03?? ?退貨
04?? ?庫存調(diào)撥(存儲(chǔ)位置)
05?? ?庫存調(diào)撥(工廠)
06?? ?在途存貨
07?? ?已凍結(jié)的庫存
08?? ?限制使用的存貨
09?? ?配套空包裝
10?? ?評(píng)估收貨已凍結(jié)庫存

sobkz為特殊庫存標(biāo)識(shí)。也就是說這是一種行轉(zhuǎn)列的變換。舉個(gè)例子,代碼sum(case lbbsa when '01' then case sobkz when '' then stock_qty else 0 end else 0 end) as labst, 代表著如果庫存類型是“未限制使用的庫存”,特殊庫存標(biāo)識(shí)為“K”,則它屬于MARD中的LABST,即“未限制使用的估價(jià)的庫存”

繼續(xù)查看下一層entity:nsdm_e_mard_agg ,

@AbapCatalog.sqlViewName: 'NSDM_V_MARD_AGG' @EndUserText.label: 'MARD Compatibility View: Aggregation' @DataAging.noAgingRestriction: 'false'

@ObjectModel.usageType.sizeCategory: ‘L’
@ObjectModel.usageType.serviceQuality: #C
@ObjectModel.usageType.dataClass: #TRANSACTIONAL
@ClientHandling.algorithm: #AUTOMATED
@AccessControl.authorizationCheck: #NOT_ALLOWED
@AbapCatalog.viewEnhancementCategory: #PROJECTION_LIST

define view nsdm_e_mard_agg as
select from matdoc_extract
{
key mandt,
key matbf as matnr,
key werks,
key lgort_sid as lgort,

lbbsa_sid as lbbsa,
sobkz,

sum(stock_qty_l2) as stock_qty,
sum(stock_vkwrt_l2) as stock_vkwrt,
max(gjper_curr_per) as gjper_max,
sum(/cwm/stock_qty_l2) as /cwm/stock_qty
}
where stock_ind_l2 = ‘’
and (((sobkz = ‘’ or sobkz = ‘K’)
and (lbbsa_sid = ‘01’ or lbbsa_sid = ‘02’ or lbbsa_sid = ‘07’ or lbbsa_sid = ‘08’))
or (sobkz = ‘’
and (lbbsa_sid = ‘03’ or lbbsa_sid = ‘04’)))

group by mandt, matbf, werks, lgort_sid, lbbsa_sid, sobkz

此時(shí)透明表MATDOC_EXTRACT終于現(xiàn)身,上文中的stock_qty即該表中stock_qty_12字段的分組匯總結(jié)果。

我們可以看到按照一定的條件從MATDOC_EXTRACT中篩選、分組匯總、轉(zhuǎn)換后得到的,即是MARD中的數(shù)據(jù),當(dāng)然這一切都是實(shí)時(shí)計(jì)算而得到的。其它庫存表中的數(shù)據(jù)來源也是一樣,計(jì)算方法相似。有興趣的話可以查看相關(guān)CDS entity的代碼。

從不同的庫存表中查詢匯總數(shù)據(jù)做統(tǒng)一處理,會(huì)導(dǎo)致代碼冗長,維護(hù)和擴(kuò)展極為不變。相比之下,使用MATDOC_EXTRACT來進(jìn)行統(tǒng)一的查詢處理,無論是開發(fā)效率還是程序的運(yùn)行效率,都可能要好不少。

?

參考閱讀:2238690 - S/4HANA MM-IM migration by SUM

     2206980 - Material Inventory Managment: change of data model in S/4HANA

     2246602 - Precompacting scheduling in case system performance gets slowed down during a posting period

?

分類: abap 標(biāo)簽: sap, S4, MM, 庫存, MATDOC, Replacement Objects, 原創(chuàng), abap cds, HANA <div id="blog_post_info">

總結(jié)

以上是生活随笔為你收集整理的【转载】 S/4 HANA中的MATDOC和MATDOC_EXTRACT的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。