关于SAP Fiori Smart Template开发的一些实际例子
版权声明:本文为博主汪子熙原创文章,未经博主允许不得转载。 https://jerry.blog.csdn.net/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。 我现在正在试。
大方向是这样的哈,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.
我自己做了一个,已经跑通了。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 翻车!居然在这里翻车了!!!
- PAT (Advanced Level) Practice 1029 Median (25分)
- ServiceMesh的关键:边车模式(sidecar);又要开车了
- Codeforces Round #615 (Div. 3)A. Collecting Coins
- PAT (Advanced Level) Practice 1040 Longest Symmetric String (25分)
- 【Java】23 函数式编程
- 【Java】24 常用函数式接口
- mvnw,到底是什么鬼?
- 【Java】25 Stream 流
- Codeforces Round #615 (Div. 3)D. MEX maximizing
- PAT (Advanced Level) Practice 1039 Course List for Student (25分)
- Codeforces Round #615 (Div. 3) E. Obtain a Permutation
- 数据结构实验完结撒花之内部排序比较
- Codeforces Round #615 (Div. 3) F. Three Paths on a Tree
- Matlab 内联函数及匿名函数