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

时间:2022-06-22
本文章向大家介绍关于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。 我现在正在试。

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.

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