在更新处理程序之前编辑值

2020-08-24 05:45发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好,

是否应该可以在更新前处理程序中操纵要编辑的实体的数据?

这在before create处理程序中是可能的,但是在before update处理程序中,只有请求的数据被写入数据库,而不是被操纵的数据。

我使用SAP Bookshop示例进行测试。

admin-handler.js

 const cds = require('@ sap/cds')

/** CatalogService的服务实现*/
 module.exports = cds.service.impl(function(){
   this.before(['CREATE','UPDATE'],'Books,function(req){
     console.log("已叫书");
     if(req.data &&!req.data.descr){
       req.data.descr ="这是一本新书|" + Math.random();
     }
   })
 })
 

发布请求:

URL:http://localhost:4004/admin/Books
正文:

 {
     " ID":200,
     标题:新书
 }
 

响应正文:

 {
     " @ odata.context":" $ metadata#Books/$ entity",
     " @ odata.metadataEtag":" W/\" EoCBnqCB08VV3GUetvB3Qy4peJ4emew + aJvvSBWdL/Q = \"",
     " modifiedAt":null,
     " createdAt":" 2020-02-06T09:35:53.781Z",
     " createdBy":"匿名",
     " modifiedBy":null,
     " ID":200,
     " title":" New Book",
     " descr":"这是一本新书| 0.9661820701464914",
     "股票":空,
     "价格":空,
     " author_ID":null,
     " currency_code":null
 }
 

放置请求:

URL:http://localhost:4004/admin/Books(200)

身体:

 {
     " title":" New Book New Title"
 }
 

响应正文:

 {
     " @ odata.context":" $ metadata#Books/$ entity",
     " @ odata.metadataEtag":" W/\" EoCBnqCB08VV3GUetvB3Qy4peJ4emew + aJvvSBWdL/Q = \"",
     " modifiedAt":" 2020-02-06T09:44:46.0​​08Z",
     " createdAt":" 2020-02-06T09:35:53Z",
     " createdBy":"匿名",
     " modifiedBy":"匿名",
     " ID":200,
     " title":" New Book New Title",
     " descr":"这是一本新书| 0.11440685991497701",
     "股票":空,
     "价格":空,
     " author_ID":null,
     " currency_code":null
 }
 

放置请求将为书籍描述返回一个新的Math.random()值,但是如果您对Books(200)发出GET请求,则书籍描述将为" This is a new Book | 0.9661820701464914",即 与创建请求后的值相同。 因此,新的Math.random()值不会持久保存到数据库中。

获取请求:

URL:http://localhost:4004/admin/Books(200)

响应正文:

 {
     " @ odata.context":" $ metadata#Books/$ entity",
     " @ odata.metadataEtag":" W/\" EoCBnqCB08VV3GUetvB3Qy4peJ4emew + aJvvSBWdL/Q = \"",
     " modifiedAt":" 2020-02-06T09:44:46Z",
     " createdAt":" 2020-02-06T09:35:53Z",
     " createdBy":"匿名",
     " modifiedBy":"匿名",
     " ID":200,
     " title":" New Book New Title",
     " descr":"这是一本新书| 0.9661820701464914",
     "股票":空,
     "价格":空,
     " author_ID":null,
     " currency_code":null
 }
 

包含我的示例的Git存储库:
https://github.com/HeneryHawk/cap-test-handler

最好的问候
Simon

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好,

是否应该可以在更新前处理程序中操纵要编辑的实体的数据?

这在before create处理程序中是可能的,但是在before update处理程序中,只有请求的数据被写入数据库,而不是被操纵的数据。

我使用SAP Bookshop示例进行测试。

admin-handler.js

 const cds = require('@ sap/cds')

/** CatalogService的服务实现*/
 module.exports = cds.service.impl(function(){
   this.before(['CREATE','UPDATE'],'Books,function(req){
     console.log("已叫书");
     if(req.data &&!req.data.descr){
       req.data.descr ="这是一本新书|" + Math.random();
     }
   })
 })
 

发布请求:

URL:http://localhost:4004/admin/Books
正文:

 {
     " ID":200,
     标题:新书
 }
 

响应正文:

 {
     " @ odata.context":" $ metadata#Books/$ entity",
     " @ odata.metadataEtag":" W/\" EoCBnqCB08VV3GUetvB3Qy4peJ4emew + aJvvSBWdL/Q = \"",
     " modifiedAt":null,
     " createdAt":" 2020-02-06T09:35:53.781Z",
     " createdBy":"匿名",
     " modifiedBy":null,
     " ID":200,
     " title":" New Book",
     " descr":"这是一本新书| 0.9661820701464914",
     "股票":空,
     "价格":空,
     " author_ID":null,
     " currency_code":null
 }
 

放置请求:

URL:http://localhost:4004/admin/Books(200)

身体:

 {
     " title":" New Book New Title"
 }
 

响应正文:

 {
     " @ odata.context":" $ metadata#Books/$ entity",
     " @ odata.metadataEtag":" W/\" EoCBnqCB08VV3GUetvB3Qy4peJ4emew + aJvvSBWdL/Q = \"",
     " modifiedAt":" 2020-02-06T09:44:46.0​​08Z",
     " createdAt":" 2020-02-06T09:35:53Z",
     " createdBy":"匿名",
     " modifiedBy":"匿名",
     " ID":200,
     " title":" New Book New Title",
     " descr":"这是一本新书| 0.11440685991497701",
     "股票":空,
     "价格":空,
     " author_ID":null,
     " currency_code":null
 }
 

放置请求将为书籍描述返回一个新的Math.random()值,但是如果您对Books(200)发出GET请求,则书籍描述将为" This is a new Book | 0.9661820701464914",即 与创建请求后的值相同。 因此,新的Math.random()值不会持久保存到数据库中。

获取请求:

URL:http://localhost:4004/admin/Books(200)

响应正文:

 {
     " @ odata.context":" $ metadata#Books/$ entity",
     " @ odata.metadataEtag":" W/\" EoCBnqCB08VV3GUetvB3Qy4peJ4emew + aJvvSBWdL/Q = \"",
     " modifiedAt":" 2020-02-06T09:44:46Z",
     " createdAt":" 2020-02-06T09:35:53Z",
     " createdBy":"匿名",
     " modifiedBy":"匿名",
     " ID":200,
     " title":" New Book New Title",
     " descr":"这是一本新书| 0.9661820701464914",
     "股票":空,
     "价格":空,
     " author_ID":null,
     " currency_code":null
 }
 

包含我的示例的Git存储库:
https://github.com/HeneryHawk/cap-test-handler

最好的问候
Simon

付费偷看设置
发送
3条回答
huskylover
1楼 · 2020-08-24 06:37.采纳回答

西蒙,尼尔,

是的,这应该可行,我们已经知道了这个问题。 目前,您可以修改" req.query.cqn.data"(仅在更新过程中!)。 抱歉给您带来不便。

最好,
塞巴斯蒂安

三十六小时_GS
2楼-- · 2020-08-24 06:44

嗨,尼尔,

该示例基于SQLite数据库,但实际上我注意到基于 HANA DB。

关于
西蒙

土豆飞人
3楼-- · 2020-08-24 06:23

嗨西蒙

这是否发生在SQLite或HANA中? 我已经成功地使用before处理程序来更改数据,然后再在HANA数据库中进行更新。 想知道它是否仅是SQLite问题?

致谢

尼尔

一周热门 更多>