关于SAP Fiori Smart Template开发的一些实际例子
下图是我用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。
我现在正在试。
大方向是这样的哈,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.
我自己做了一个,已经跑通了。
相关文章
- SAP UI5 SimpleForm 在 size XL 下的布局开发
- SAP UI5 sap.ui.Device.media.RANGESETS.SAP_STANDARD_EXTENDED 介绍
- SNP通过Rise with SAP迁移到Azure云实践自身转型
- SAP UI5 应用如何加载自定义 Theme
- SAP UI5 sap.m.Table 实现响应式布局的两种配置模式
- SAP Fiori Launchpad url 参数 sap-app-origin-hint 的含义
- SAP定义评估类 Valuation class详解编程语言
- SAP 将ITAB内表的数据转换为XML字符串 代码实例详解编程语言
- SAP中用json数据格式调用http接口发送短信邮件案例详解编程语言
- SAP_ABAP_查找消息号在程序中使用位置的六种方法详解编程语言
- 比较:Oracle与SAP的对比(oracle和sap)
- 数据库解决方案如何使用SAP创建Redis数据库(sap怎么创建redis)
- 聘请高级Oracle与SAP顾问,拓展业务潜力(oracle sap顾问)
- Oracle SAP系统深入探索管理系统之魅力(oracle sap系统)