[英]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.
順便說一句:在過去十年中,用d
和t
類型的兩個獨立變量來表示時間點已經過時了。 當前針對這種情況的最佳實踐是使用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.