Hybris DDIC 类型和 Model Class 的关联关系

举报
汪子熙 发表于 2022/03/28 17:32:04 2022/03/28
1.6k+ 0 0
【摘要】 在ABAP里,我们在SE11里面创建data type或者transparent table, 然后在ABAP代码里可以直接消费这些DDIC object.而Hybris是基于Java的,大家知道在Java里除了primitive type如int, boolean这些一样,万物皆对象. 数据类型是一个Java Class,而这些数据类型具体的item(transaction data)就是...

在ABAP里,我们在SE11里面创建data type或者transparent table, 然后在ABAP代码里可以直接消费这些DDIC object.
而Hybris是基于Java的,大家知道在Java里除了primitive type如int, boolean这些一样,万物皆对象. 数据类型是一个Java Class,而这些数据类型具体的item(transaction data)就是Java Class的一个个实例:
every object stored in SAP Hybris Commerce is an instance of a type.

例子:
我在catalog这个extension里定义了一个data type catalog, 里面有个字段id:

那么用ant clean all build之后,会自动在这个folder下面生成对应的Model class, 遵循naming convention Model.java:

生成的Model class - 这种套路在ABAP里随处可见了,比如我们在SEGW里做Odata model,然后直接激活生成DPC MPC.

因为我在xml里指定了read=true, write=true, 因此会生成对应的getter和setter方法:


用法很简单,在Java code里拿到model instance,直接call setter / getter:

之前我遇到一个问题,从ERP QV5到CRM X3D的response没有回来,原因是因为在ERP端的CRMRFAPCR表里面,没有到X3D的配置,新增一条配置信息:

OBJNAME = MATERIAL && DOWNLOAD = R, 这样会优先选出更Specific的到X3D的这条。

重新执行,Request就可以返回CRM端了,但是还有错:

Debug发现是因为在CRM上配的源系统跟Download过来的系统不匹配,在CRM端的CRMMLSGUID表里面:

可以看到X3D原来配的系统是QI3,之前用T-CODE SMOEAC找到的SITE里面有多个系统:

之前我想QI3已经被X3C用了,而且X3D到QI3的SM59连接测试不通过,所以就重新找了一个看起来好用的QV5,现在似乎又绕回来了。

能想到的有两个办法:
X3D继续用QV5,在X3D的CRMMLSGUID表里增加QV5配置作为workaround,测完了删掉。
X3D连QI3,报IT TICKET建立X3D/QI3的双向RFC连接,在QI3的CRMRFAPCR表里配置回到X3D的信息,考虑到X3C已经在QI3上测了,可能要用不同测Client避免冲突。

SAP Cloud for Customer里没有办法新建product:

Product detail page也无法编辑:

在C4C的business scoping里enable和ERP的integration:



在C4C里新建一个communication system:

technical information维护成ERP系统的信息:

ERP系统,tcode SRTIDOC注册IDOC inbound service:

SPRO,自动生成和C4C的integration setting:

选择使用PI作为middleware:

将主数据同步勾上:

选择C4C的tenant id:

指定PI的host name:

凡是这种tagdir =相对路径的tag都是Hybris标准开发自己做的tag,目的和BSP一样:重用。

在project folder里顺着tagdir里的路径能找到对应的.tag实现:

image

C同事问了我这个问题。
使用下列这段代码extend UI5标准的控件。

问题1:为什么new 一个JerryButton时,line 35会触发?
var oJerryButton = new JerryButton({ application: oApplication } );

答案:
debug extend的实现, 在line 330里把调用extend指定的constructor赋给fnClass

然后在line 352把fnClass赋给fnClass.prototype.constructor. 这样,每次用fnClass这个构造器new新的instance时,constructor指向的function会自动被call到。

问题2

为什么把constructor的赋值放到extend function外面,由application自己显式赋值,但是在new的时候却不会被调用到了?

答案:
原因是此时传入的constructor为undefine,因此fnClass也是undefine

所以line 352注入的实际上是line 346动态生成的函数体为fnBaseClass.apply的function,这样当然我们自定义的constructor不会执行了。
如果你非要想在extend外面指定constructor,怎么弄?
只需要这样:


【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。