OData日期时间属性的规则

2020-09-04 12:22发布

         点击此处--->   EasySAP.com群内免费提供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)

         点击此处--->   EasySAP.com群内免费提供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)
付费偷看设置
发送
7条回答
亦是此间程序员
1楼 · 2020-09-04 13:01.采纳回答

你好罗恩(及所有),

请注意,Edm.DateTime不再是 odata.org 的V4规范的一部分。

要预见到V4,我建议改用Edm.DateTimeOffset; NetWeaver网关已经支持此功能。

此致

Stefan

Violet凡
2楼-- · 2020-09-04 12:59

如果ABAP数据类型只是不带时间部分的日期(DATS),则一旦V4到达网关,您将要使用新类型的Edm.Date。

我的建议:将Edm.DateTimeOffset用于时间戳记(此处时区很重要),并使用Edm.DateTime作为纯日期字段的解决方法。 此外,使用sap:display-format =" Date"注释date属性,请参见 OData 2.0版的SAP注释| SCN 。 这将告诉客户,只有日期部分才有意义。

致谢!

-拉尔夫

能不能别闹
3楼-- · 2020-09-04 13:03

嗨罗恩,

谢谢。 我面临一个新错误:


我们如何在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

nice_wp
4楼-- · 2020-09-04 13:06

更好的设计是将实体设置为" 具有单个键属性" 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。


愤怒的猪头君
5楼-- · 2020-09-04 12:52

嗨罗恩,

我遵循了您的规则,但出现了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

葫芦娃快救爷爷
6楼-- · 2020-09-04 13:01

非常感谢。 您将我们带入了严峻的轨道:

在MPC中,我们看到字段GBDAT的内部有一个转换出口:PDATE。 导致错误。 我们创建了一个没有转换退出的新类型,它可以正常工作。

希望

Aksel

SAP小菜
7楼-- · 2020-09-04 13:08

如果SAP网关中存在转换问题,我建议继续使用此KBA:

2819936-SEGW中的"检查项目一致性"按钮会导致大量警告和/或错误消息

一周热门 更多>