Table 在 CDS 视图中获取第一行 MSEG 的函数
Table Function to get first row of MSEG in CDS view
我正在尝试构建一个 CDS 视图,该视图使用 VBRK 和 VBRP 发票中的各个字段。另一个需求是显示原始采购订单中列出的价格(例如,我正在向某人销售奇异果,我想显示我支付的原始采购价格)。我应该使用带有参数批处理 (MSEG-CHARG) 的 MSEG 连接。这里的假设是每批只有一个采购订单。不过,我不确定如何从发票中建立这种联系。
这是我的基本 CDS 视图:
@AbapCatalog.sqlViewName: <view_name>
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.preserveKey: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '<text>'
@VDM.viewType: #BASIC
define view <view_name> as select distinct from I_BillingDocumentItemCube( P_ExchangeRateType: 'M', P_DisplayCurrency: 'EUR' )
{
key BillingDocument,
key BillingDocumentItem,
BillingDocumentType,
_BillingDocument._Item._PricingElement[ConditionType = 'XXX1'].ConditionRateValue as cost1,
_BillingDocument._Item._PricingElement[ConditionType = 'XXX2'].ConditionRateValue as cost2,
SoldToParty,
SoldToPartyName,
Material,
BillingDocumentItemText,
Batch,
BillingDocumentDate,
BillingQuantity,
BillingQuantityUnit,
SalesDocumentItemCategory
};
我尝试使用 table 函数来 select 来自 MSEG 的响应批次,但我不确定如何将它连接到 CDS 视图。
@EndUserText.label: '<name>'
define table function <table_function>
with parameters @Environment.systemField: #CLIENT
clnt: abap.clnt,
charg: charg_d
returns {
clnt : abap.clnt;
charg_exp : charg_d;
dmbtr : dmbtr_cs;
menge : menge_d;
}
implemented by method <class> => <method>;
class:
CLASS <class_name> DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
CLASS-METHODS <method_name> FOR TABLE FUNCTION <table_function>.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS <class_name> IMPLEMENTATION.
METHOD <method_name>
BY DATABASE FUNCTION FOR HDB LANGUAGE SQLSCRIPT
OPTIONS READ-ONLY
USING nsdm_e_mseg.
RETURN select top 1 mandt as clnt, charg as charg_exp, dmbtr, menge
from nsdm_e_mseg
where mandt = :clnt
and charg = :charg
and dmbtr > 0
and menge > 0
order by mblnr;
ENDMETHOD.
ENDCLASS.
如何在我的基本 CDS 视图中使用此 table 函数将 VBRP 中的位置连接到 MSEG 中的位置?
一般链接如下:
VBRK-vbeln -> VBRP-vbeln VBFA-vbeln -> MSEG-mblnr
... VBRP-posnr VBFA-posnn -> MSEG-zeile
... ... ...
... ... vbtyp_n='R'
... VBRP-aubel -> VBFA-vbelv
... VBRP-aupos -> VBFA-posnv
但是,我现在不完全了解 I_BillingDocumentItemCube
是如何构建的,因为我对 S4HANA 分析立方体不是很熟悉,它真的投影到 VBRK/VBRP
吗?
无论如何,MSEG
table 有 MBLNR/MJAHR/ZEILE
键所以通过批次 (CHARG
) 绝对是不够的,因为它没有唯一定义采购订单,即使你假设它将是 PO:Billing 的 1:1 关系,它可以是同一批次和同一个采购订单中具有不同价格的多个相似 material (MATNR
) 个头寸。
看看 MCHB
table,只有 Plant/StorageLoc/Batch (MATNR/WERKS/LGORT
) 组合明确定义了 material doc.
所以,总而言之,至少你应该将这 4 个参数传递给方法,你将从 I_BillingDocumentItemCube
:
METHOD <method_name>
BY DATABASE FUNCTION FOR HDB LANGUAGE SQLSCRIPT
OPTIONS READ-ONLY
USING nsdm_e_mseg.
RETURN select top 1 mandt as clnt, charg as charg_exp, dmbtr, menge
from nsdm_e_mseg
where mandt = :clnt
and mblnr = :mblnr
and mjahr = :mjahr
and zeile = :zeile
and charg = :charg
and dmbtr > 0
and menge > 0
order by mblnr;
ENDMETHOD.
还有,为了符合新的S4HANA数据模型,为什么不直接读取MATDOC
table?
NSDM_E_MSEG
只不过是遗留包装器,即所谓的 compatibility view that redirects to MATDOC
table with some parameters, check 2206980 note
使用新的 tables 可能是一个很好的开始,可以更顺利地转换到 S4HANA 模型。
我正在尝试构建一个 CDS 视图,该视图使用 VBRK 和 VBRP 发票中的各个字段。另一个需求是显示原始采购订单中列出的价格(例如,我正在向某人销售奇异果,我想显示我支付的原始采购价格)。我应该使用带有参数批处理 (MSEG-CHARG) 的 MSEG 连接。这里的假设是每批只有一个采购订单。不过,我不确定如何从发票中建立这种联系。
这是我的基本 CDS 视图:
@AbapCatalog.sqlViewName: <view_name>
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.preserveKey: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '<text>'
@VDM.viewType: #BASIC
define view <view_name> as select distinct from I_BillingDocumentItemCube( P_ExchangeRateType: 'M', P_DisplayCurrency: 'EUR' )
{
key BillingDocument,
key BillingDocumentItem,
BillingDocumentType,
_BillingDocument._Item._PricingElement[ConditionType = 'XXX1'].ConditionRateValue as cost1,
_BillingDocument._Item._PricingElement[ConditionType = 'XXX2'].ConditionRateValue as cost2,
SoldToParty,
SoldToPartyName,
Material,
BillingDocumentItemText,
Batch,
BillingDocumentDate,
BillingQuantity,
BillingQuantityUnit,
SalesDocumentItemCategory
};
我尝试使用 table 函数来 select 来自 MSEG 的响应批次,但我不确定如何将它连接到 CDS 视图。
@EndUserText.label: '<name>'
define table function <table_function>
with parameters @Environment.systemField: #CLIENT
clnt: abap.clnt,
charg: charg_d
returns {
clnt : abap.clnt;
charg_exp : charg_d;
dmbtr : dmbtr_cs;
menge : menge_d;
}
implemented by method <class> => <method>;
class:
CLASS <class_name> DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
CLASS-METHODS <method_name> FOR TABLE FUNCTION <table_function>.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS <class_name> IMPLEMENTATION.
METHOD <method_name>
BY DATABASE FUNCTION FOR HDB LANGUAGE SQLSCRIPT
OPTIONS READ-ONLY
USING nsdm_e_mseg.
RETURN select top 1 mandt as clnt, charg as charg_exp, dmbtr, menge
from nsdm_e_mseg
where mandt = :clnt
and charg = :charg
and dmbtr > 0
and menge > 0
order by mblnr;
ENDMETHOD.
ENDCLASS.
如何在我的基本 CDS 视图中使用此 table 函数将 VBRP 中的位置连接到 MSEG 中的位置?
一般链接如下:
VBRK-vbeln -> VBRP-vbeln VBFA-vbeln -> MSEG-mblnr
... VBRP-posnr VBFA-posnn -> MSEG-zeile
... ... ...
... ... vbtyp_n='R'
... VBRP-aubel -> VBFA-vbelv
... VBRP-aupos -> VBFA-posnv
但是,我现在不完全了解 I_BillingDocumentItemCube
是如何构建的,因为我对 S4HANA 分析立方体不是很熟悉,它真的投影到 VBRK/VBRP
吗?
无论如何,MSEG
table 有 MBLNR/MJAHR/ZEILE
键所以通过批次 (CHARG
) 绝对是不够的,因为它没有唯一定义采购订单,即使你假设它将是 PO:Billing 的 1:1 关系,它可以是同一批次和同一个采购订单中具有不同价格的多个相似 material (MATNR
) 个头寸。
看看 MCHB
table,只有 Plant/StorageLoc/Batch (MATNR/WERKS/LGORT
) 组合明确定义了 material doc.
所以,总而言之,至少你应该将这 4 个参数传递给方法,你将从 I_BillingDocumentItemCube
:
METHOD <method_name>
BY DATABASE FUNCTION FOR HDB LANGUAGE SQLSCRIPT
OPTIONS READ-ONLY
USING nsdm_e_mseg.
RETURN select top 1 mandt as clnt, charg as charg_exp, dmbtr, menge
from nsdm_e_mseg
where mandt = :clnt
and mblnr = :mblnr
and mjahr = :mjahr
and zeile = :zeile
and charg = :charg
and dmbtr > 0
and menge > 0
order by mblnr;
ENDMETHOD.
还有,为了符合新的S4HANA数据模型,为什么不直接读取MATDOC
table?
NSDM_E_MSEG
只不过是遗留包装器,即所谓的 compatibility view that redirects to MATDOC
table with some parameters, check 2206980 note
使用新的 tables 可能是一个很好的开始,可以更顺利地转换到 S4HANA 模型。