关于SAP Fiori Smart Template开发的一些实际例子

匿名 (未验证) 提交于 2019-12-02 23:03:14
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/i042416/article/details/85010555

下图是我用SAP Fiori Smart Template开发出来的UI。

SAP标准的用List report template做的reference application: https://sapui5.netweaver.ondemand.com/test-resources/sap/suite/ui/generic/template/demokit/demokit.html?responderOn=true&demoApp=products

Smart template是基于元数据驱动的开发,大部分时候不需要书写前端JavaScript代码。

我要创建一个view,从Service order guid拿到它的ship to party信息。后台的表我都找好了。

CRMD_PARTNER的partner_no 字段类型是CHAR32,而我要join的BUT000的partner_guid类型是RAW16.

这两个field technical类型确实不一样,但是在ABAP里CHAR32和RAW16是等价的。我理解这样设计的原因是CDS view要support所有的DB,而不仅仅是ABAP。所以报错。

这种情况下有没有其他的办法可以绕过这个错呢?换其他的field来做join肯定不能接受,因为CRMD_PARTNER上只有partner_no这个CHAR32的字段保存了正确的信息。

或者CDS 语法里有没有做类型转换的keyword?我也再继续google一下。
这个人遇到的问题和我一样:

专家回复了, 不支持。只有用CDS table function。原因也很简单,要支持所有的DB platform。

CDS 里有CAST的关键字,但是专家confirm了不能走类型这条路,因为无法保证这个类型转换在所有DB platform上都工作。

我2013年12月曾经研究过AMDP,这条路可以走通。只是当时没试过如何在CDS view里consume这个生成的procedure。
我现在正在试。

http://scn.sap.com/community/abap/blog/2013/12/10/an-example-of-amdp-abap-managed-database-procedure-in-740

大方向是这样的哈,CDS可以很容易的调用Table function(跟调用CDSview一样),然后table function具体的实现是通过AMDP实现的。
比如下面这个。

define table function ZI_DSO_TF   with parameters       @Environment.systemField: #CLIENT       p_client                    : abap.clnt,       p_rblsrollingaveragemonths  : abap.int1,       p_revnrollingaveragemonths  : abap.int1,       p_todaydate                 : abap.char( 8 ),       p_displaycurrency           : abap.char( 5 ),       p_exchangeratetype          : abap.char( 4 ) returns {     Client : abap.clnt;     CompanyCode  : abap.char( 4 );     Customer     : abap.char( 10 );     CalendarYear  : abap.numc( 4 ) ;     CalendarMonth  :  abap.numc( 2 );      CompanyCodeCurrency   : abap.cuky( 5 );     FinancialAccountType   :   abap.char( 1 );     ExchangeRateType     : abap.char( 4 );     CustomerCountry  : abap.char( 3 );     CustomerRegion  : abap.char( 3 );     AccountingClerk  : abap.char( 2 );     CustomerBasicAuthorizationGrp  : abap.char( 4 );     DurationUnit   :  abap.unit( 3 );     ChartofAccounts   : abap.char( 4 );     ReconciliationAccount   :  abap.char( 10 );     DisplayCurrency   : abap.cuky( 5 );      DebitAmtInDisplayCrcy         : abap.curr( 23, 2 );     CalendarYearMonth   : abap.char( 6 );   } implemented by method   ZCL_MM_DSO_TF=>tf_test2;   Implementation of table function: CLASS ZCL_MM_DSO_TF DEFINITION   PUBLIC   FINAL   CREATE PUBLIC .     PUBLIC SECTION.     INTERFACES if_amdp_marker_hdb.       CLASS-METHODS tf_test2         FOR TABLE FUNCTION ZI_DSO_TF.     PROTECTED SECTION.   PRIVATE SECTION. ENDCLASS.       CLASS ZCL_MM_DSO_TF IMPLEMENTATION.     METHOD tf_test2 BY DATABASE FUNCTION                     FOR HDB LANGUAGE SQLSCRIPT                     OPTIONS READ-ONLY                     USING P_DSO12                     icustomerfis paddressfis ifidebtorfidata ificompanycode                     .       return       select      "P_DSO12"."MANDT" AS "CLIENT",      "P_DSO12"."COMPANYCODE",      "P_DSO12"."CUSTOMER",      "P_DSO12"."CALENDARYEAR",      "P_DSO12"."CALENDARMONTH",      "P_DSO12"."COMPANYCODECURRENCY",      "P_DSO12"."FINANCIALACCOUNTTYPE",      ( :p_exchangeratetype ) AS "EXCHANGERATETYPE",      "=A1"."COUNTRY" AS "CUSTOMERCOUNTRY",      "=A1"."REGION" AS "CUSTOMERREGION",      "=A2"."ACCOUNTINGCLERK" AS "ACCOUNTINGCLERK",      "=A2"."AUTHORIZATIONGROUP" AS "CUSTOMERBASICAUTHORIZATIONGRP",      "P_DSO12"."DURATIONUNIT",      "=A3"."CHARTOFACCOUNTS" AS "CHARTOFACCOUNTS",      "=A2"."RECONCILIATIONACCOUNT" AS "RECONCILIATIONACCOUNT",      ( :p_displaycurrency ) AS "DISPLAYCURRENCY",      convert_currency( "AMOUNT" => "P_DSO12"."DEBITAMOUNTINCOMPANYCODECRCY",                "SOURCE_UNIT" => "P_DSO12"."COMPANYCODECURRENCY",                "TARGET_UNIT" => :p_displaycurrency,                "REFERENCE_DATE" => "P_DSO12"."ROLLINGAVERAGEMONTHENDDATEDATS",                "CONVERSION_TYPE" => :p_exchangeratetype,                "CLIENT" => :p_client,                "ERROR_HANDLING" => N'FAIL_ON_ERROR',                "SCHEMA" => ::CURRENT_OBJECT_SCHEMA,                "ACCURACY" => N'highest',                "LOOKUP" => N'regular',                "OPTIONS" => N'ALLOW_PRECISION_LOSS',                "STEPS" => 'convert,shift_back,shift,round' )               as "DEBITAMTINDISPLAYCRCY",      "P_DSO12"."CALENDARYEARMONTH" as "CALENDARYEARMONTH"           FROM           ( ( (                "P_DSO12"( :P_RBLSROLLINGAVERAGEMONTHS,                :p_revnrollingaveragemonths,                :p_todaydate ) "P_DSO12"                       LEFT OUTER JOIN "ICUSTOMERFIS" "=A0" ON ( "P_DSO12"."MANDT" = "=A0"."MANDT"                           AND "=A0"."CUSTOMER" = "P_DSO12"."CUSTOMER" ) )                   LEFT OUTER many TO one JOIN "PADDRESSFIS" "=A1" ON ( "P_DSO12"."MANDT" = "=A1"."MANDT"                       AND "=A0"."ADDRESSID" = "=A1"."ADDRESSID" ) )               LEFT OUTER many TO one JOIN "IFIDEBTORFIDATA" "=A2" ON ( "=A2"."COMPANYCODE" = "P_DSO12"."COMPANYCODE"                   AND "=A2"."CUSTOMER" = "P_DSO12"."CUSTOMER"                   AND "P_DSO12"."MANDT" = "=A2"."MANDT" ) )               LEFT OUTER many TO one JOIN "IFICOMPANYCODE" "=A3" ON ( "P_DSO12"."MANDT" = "=A3"."MANDT"               AND "=A3"."COMPANYCODE" = "P_DSO12"."COMPANYCODE" )               WHERE NOT ( "P_DSO12"."CALENDARYEARMONTH" IS NULL )                           AND NOT ( "P_DSO12"."CALENDARYEARMONTH" IS NULL )             ;     ENDMETHOD.   ENDCLASS. 

我自己做了一个,已经跑通了。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!