1

我正在尝试构建一个 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
};

我尝试使用表函数从 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_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 视图中使用此表函数将 VBRP 中的位置连接到 MSEG 中的位置?

4

1 回答 1

0

一般链接如下:

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表有MBLNR/MJAHR/ZEILE键,因此传递批次 ( CHARG) 肯定是不够的,因为它没有唯一地定义采购订单,即使您假设它是 PO:Billing 的 1:1 关系,它也可以是多个类似MATNR的材料 () 位置相同的批次和相同的采购订单具有不同的价格。

MCHB表,只有 Plant/StorageLoc/Batch ( MATNR/WERKS/LGORT) 组合明确定义了材料文档。

因此,总而言之,至少您应该将这 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直接读表呢? NSDM_E_MSEG只不过是遗留包装器,所谓的兼容性视图MATDOC,它使用一些参数重定向到表,检查2206980 注释 在此处输入图像描述

使用新表更顺畅地转换到 S4HANA 模型可能是一个不错的开始。

于 2020-06-30T10:02:51.953 回答