簡體   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