下圖是我用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: 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 methodZCL_MM_DSO_TF
=>tf_test2
;Implementation
of table function:
CLASS ZCL_MM_DSO_TF DEFINITION
PUBLICFINAL
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 FUNCTIONFOR HDB
LANGUAGE SQLSCRIPTOPTIONS
READ-ONLY
USING P_DSO12icustomerfis paddressfis ifidebtorfidata ificompanycode
.returnselect"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
.
我自己做了一個,已經跑通了。
總結
以上是生活随笔為你收集整理的关于SAP Fiori Smart Template开发的一些实际例子的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。