点击此处---> 群内免费提供SAP练习系统(在群公告中)
加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)
关于实体中Edm.datetime属性问题的文章很多。 提供的解决方案通常视具体情况而定,因此很难弄清出问题的原因和补救措施。
这是一个简短的讨论(我希望!),它为edm.datetime属性建立了一些规则。 如果这些规则或某些其他规则有任何例外,请发布。
规则1
使用Edm类型日期时间。 不要为了方便起见将日期保持为edm.string
规则2
如果可以使用null值,则使该属性可以为null。 如果需要一个值(强制性),则不要使其为空。
规则3
仅当后端日期包含" 00000000"作为值时,才能正确评估可为空的属性。 包含空格的ABAP日期值(很遗憾允许这样做)将不会被视为null,但也不能转换为edm.datetime-您会从服务器收到运行时错误。
规则4
请注意完整属性定义。 仅为您的"日期属性"提供edm.datetime类型是不足以确保OData解析期间正确转换的。 参见规则5、6和7。
规则5
如果date属性是用于实体定义的DDIC结构的一部分,并且该组件是DATS(基本D类型),则可以直接在其中放置一个D类型值,例如
有效ABAP:
ls_entity-date = sy-datum。
这种类型的日期可能会落入规则3中提到的"日期为空但无效"陷阱中。
规则6
如果date属性是DDIC结构的不是的一部分,并且实体定义是"自由格式",则在分配其后端数据类型时,也可以直接在其中放置D类型值:例如
此类型的日期可能属于规则3中提到的"日期为空但无效"陷阱。
规则7
如果date属性不是DDIC结构的一部分,则实体定义为"自由格式",并且没有后端数据类型,则必须像填充时间戳一样填充目标。 这是因为MPC生成的属性类型是打包类型字段。 在规则5和6中,MPC生成的属性类型是D类型。
请注意,edm.datetime将包含一个表示微秒的附加部分,除非从高分辨率时间戳(即比sy-uzeit更为详细)中抽取,否则通常不会填充该部分。
此类型的日期不能落入规则3中提到的"日期为空但无效"陷阱中。
规则8
您也可以将TIMESTAMP用作DDIC结构实体库中的组件类型,而不是DATS。 可以按照规则7进行转换。
我确定我们可以在此处添加更多内容:例如,我发现" json格式"的提要日期看起来有些"奇"-是对还是错?
致谢
罗恩。
(7.1 kB)
你好罗恩(及所有),
请注意,Edm.DateTime不再是 odata.org 的V4规范的一部分。
要预见到V4,我建议改用Edm.DateTimeOffset; NetWeaver网关已经支持此功能。
此致
Stefan
如果ABAP数据类型只是不带时间部分的日期(DATS),则一旦V4到达网关,您将要使用新类型的Edm.Date。
我的建议:将Edm.DateTimeOffset用于时间戳记(此处时区很重要),并使用Edm.DateTime作为纯日期字段的解决方法。 此外,使用sap:display-format =" Date"注释date属性,请参见 OData 2.0版的SAP注释| SCN 。 这将告诉客户,只有日期部分才有意义。
致谢!
-拉尔夫
嗨罗恩,
谢谢。 我面临一个新错误:
我们如何在Odata URL中将datetime传递为空白,其中Date是关键字段。 在这里,我使用的是自定义RFC。
当我通过Date = datetime'2014-05-14T00:00:00'传递时,我可以获取这些值, 但我想将日期字段传递为空白。
我尝试了不同的格式:
Date = datetime' 0000-00-00T00:00:00'
Date = datetime '00 -00-00T00:00:00'
Date = datetime''
日期=''
/sap/opu/odata/sap/ZSRV/GetReports(PoNo ='12345',Date = datetime'')
我只想传递参数中的一个字段,即PoNo。 日期字段是必填字段,因为这是输入参数
问候,
Tejas
更好的设计是将实体设置为" 具有单个键属性" PoNo"和非键属性" Date"的PurchaseOrders"。 然后,您可以提出很多当前设计不允许的问题:
在给定日期创建的采购订单:
GET〜/PurchaseOrders?$ filter = Date eq datetime'2014- 05-23T00:00'
在给定日期创建的订单数:
GET〜/PurchaseOrders/$ count?$ filter = Date eq datetime'2014-05-23T00: 在给定期间内创建的00'
PO:
GET〜/PurchaseOrders?$ filter = Date ge datetime'2014-01-01T00:00'and Date le datetime'2014- 03-31'
etc。
嗨罗恩,
我遵循了您的规则,但出现了Dateformatt错误-实际上我在找到您的线程之前就收到了:-)
我有一个Gateway-Hub和一个IW_BEP-Backend。
在后端,根据规则5将属性绑定到结构
Edm.DateTime <-> DATS长度8
在服务实现(读取)中,我正在这样做:
er_entity-gbdat = ls_customer-gbdat。
在调试器中看起来不错:er_entity-gbdat = 19530321(例如)
但是调用服务会导致错误"格式无效:Gbdat-值:21.03.19"
如果更改为Edm.DateTimeOffset,我将收到错误" 21.0-3.-19",不能解释为数字...
好像DATS被转换为输出(21.03.1953),然后将其放入Edm。字段...
您知道发生了什么吗?
希望
阿克塞尔
SP:
后端:
IW_BEP-> 200 08
枢纽:
SAPGW_FND-> 740 07
非常感谢。 您将我们带入了严峻的轨道:
在MPC中,我们看到字段GBDAT的内部有一个转换出口:PDATE。 导致错误。 我们创建了一个没有转换退出的新类型,它可以正常工作。
希望
Aksel
如果SAP网关中存在转换问题,我建议继续使用此KBA:
2819936-SEGW中的"检查项目一致性"按钮会导致大量警告和/或错误消息
一周热门 更多>