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 模型。