odata - 将空值传递给 OData V2 Edm.Time 属性
问题描述
我有一个变量类型时间,但有时这个变量没有任何东西。
当它是初始值时,它不应该是"000000"
,我想要一个没有任何东西的空值(没有零)。让我解释一下我的代码问题:
IF lwa_hora IS INITIAL.
CLEAR lwa_hora.
ls_entity-hora = lwa_hora. " Result: 000000 but I don't want any zero
ELSE.
ls_entity-hora = lwa_hora. " Result: 000000
ENDIF.
我试过了,CLEAR
但没有任何反应。
我需要这是因为在 JavaScript 前端客户端逻辑中,我需要 OData 属性包含一个虚假值(例如null
或空字符串""
)。
但它始终具有"000000"
非空字符串的值。是否可以在后端制作一些东西来“清除”变量?
解决方案
abap ( t
) 中的时间数据类型是值类型。它在内部实现为一个整数,计算自午夜以来的秒数。自午夜以来的 0 秒是一个有效值,因此它不能有空值。
但是,ABAP 允许您创建对任何值类型的引用:
hora TYPE REF TO t.
这意味着hora
将是对 的变量的引用TYPE t
。最初,此引用将是未绑定的,这在概念上与其他编程语言中的空引用非常相似。您可以通过以下方式检查:
IF ls_entity-hora IS BOUND.
...
IF ls_entity-hora IS NOT BOUND.
您可以使用 分配时间值GET REFERENCE OF lwa_hora INTO ls_entity-hora
。但是现在您有一个对现有变量的引用。改变 的值lwa_hora
, 的值ls_entity-hora
也会改变。这可能并不总是你想要的。因此,最好在内存中创建一条新数据以供我们参考:
CREATE DATA ls_entity-hora.
Nowls_entity-hora
不再是未绑定的(或者如果你想这样称呼它为“null”),它指向一个新的时间值000000
. 如果您想读取或更改此引用指向的此无名数据的值,则可以使用 dereferencing-operator 执行此操作->*
:
ls_entity-hora->* = lwa_hora.
如果您有意将引用设置为未绑定(或“将引用设置为 null”),您可以通过清除引用来实现:
CLEAR ls_entity-hora.
顺便说一句:用两个不同类型的变量表示一个时间点,d
在t
过去十年中已经过时了。这种情况的当前最佳实践是使用单个类型的变量TIMESTAMP
(如果您需要秒精度)或TIMESTAMPL
(如果您需要微秒精度)。一个timestamp of00000000000000
显然是一个非法值,所以它可以用来表示一个时间点的缺失。这种类型通常也使与 SAPUI5 前端(如您的情况)的通信变得更加容易,因为许多用于制作 oData 服务的技术都提供了 JavascriptDate
和 ABAP之间的自动转换TIMESTAMP
。
推荐阅读
- node.js - 在 PostgreSQL 上将数组绑定到 SELECT ... IN
- python - “不存在这样的文件或目录”,但显然确实存在
- r - DESeqDataSet(se, design = design, ignoreRank) 中的错误:计数矩阵应该是数字,目前它有模式:逻辑
- c++ - WTL 向动态创建的按钮添加工具提示
- logging - Solaris 10 Logadm 帮助和通配符说明
- github - Github Actions:当对主分支完成拉取请求时,在服务器上运行“git pull”
- r - 使用锁定命名空间的 R 模拟测试
- javascript - 按每个条目中的数值对数组进行排序
- python - 不使用列表将二进制数转换为十进制数
- raspberry-pi4 - 奇怪的 LCD 显示屏(RPi 4、3.5 英寸 LCD)