繁体   English   中英

将空值传递给 OData V2 Edm.Time 属性

[英]Pass an empty value to an OData V2 Edm.Time property

我有一个变量类型时间,但有时这个变量没有任何东西。

当它是初始时,它不应该是"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.

现在ls_entity-hora不再是未绑定的(或者如果你想称之为“null”),它指向一个新的时间值000000 如果要读取或更改此引用指向的无名数据的值,则可以使用 dereferencing-operator ->*执行此操作:

ls_entity-hora->* = lwa_hora.

如果您有意将引用设置为未绑定(或“将引用设置为 null”),您可以通过清除引用来实现:

CLEAR ls_entity-hora.

顺便说一句:在过去十年中,用dt类型的两个独立变量来表示时间点已经过时了。 当前针对这种情况的最佳实践是使用TIMESTAMP (如果需要第二精度)或TIMESTAMPL (如果需要微秒精度)类型的单个变量。 时间戳00000000000000显然是非法值,因此可以用来表示时间点的缺失。 这种类型通常还可以更轻松地与 SAPUI5 前端(如您的情况)进行通信,因为许多用于制作 oData 服务的技术都提供了 Javascript Date和 ABAP TIMESTAMP之间的自动转换。

堆分配时间的另一种方法是在它旁边存储一个布尔值,指示它是否已设置:

TYPES:
     BEGIN OF optional_time,
        time    TYPE t,
        is_null TYPE abap_bool,
     END OF optional_time.

DATA(no_time) = VALUE optional_time( is_null = abap_true ).

" Setting to null:
DATA(some_time) = no_time.
" Setting to some time:
some_time = VALUE #( time = '12:30' ).

IF some_time = no_time.
   " ...
ENDIF.

这类事情在前端处理可能比在后端处理更好。 如果 OData 响应对应的属性可以为空,则 SAP Gateway 将 ABAP 日期/时间初始值序列化为 NULL。 您需要确保在此示例中将此属性设置为TRUE

在此处输入图片说明

您还可以在运行时设置此属性

TRY .
 lo_action = model->get_entity_type( iv_entity_name = 'Z_REPORTType').                                                             
 lo_property = lo_action->get_property( iv_property_name = 'Requested_Date').
 lo_property->set_nullable( iv_nullable = abap_true ).
CATCH /iwbep/cx_mgw_busi_exception /iwbep/cx_mgw_med_exception /iwbep/cx_mgw_tech_exception INTO DATA(lo_exception).
ENDTRY.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM