2017-07-31 111 views
0

我堅持以下情況:OpenEdge ABL保留關鍵字作爲臨時表字段名稱(從JSON數據推斷)

我的方法接收來自外部REST API調用的響應。 JSON響應結構如下:

{ 
"members": [ 
    { 
     "email_address": "[email protected]", 
     "status": "randomstatus" 
    }, 
    ...etc... 
]} 

我讀這臨時表與READ-JSON(從推斷JSON數據ABL模式),並嘗試處理臨時表。而這就是我卡住的地方: 當我試圖放在一起包含臨時表字段「狀態」的查詢時,會引發錯誤。 實施例:

hQuery:QUERY-PREPARE('FOR EACH ' + httSubscriber:NAME + ' WHERE ' + hBuffer:BUFFER-FIELD(iStatus):NAME + ' = "randomstatus"'). 

給出:

**後無法理解 - 「成員WHERE」(247)

我曾嘗試通過名稱直接引用爲好,相同的結果。

可能是「狀態」是ABL中的保留關鍵字。可能是這種情況?並且我怎樣才能解決這個問題,以引用「狀態」字段?

不幸的是,JSON響應的格式和鍵名不在我的控制之下,我必須使用它。

+0

你確定你的緩衝值是正確的嗎?當我在動態查詢中擁有「狀態」時,我沒有收到該錯誤。可能是httSubscriber:NAME和/或hBuffer:FIELD-VALUE(iStatus):NAME沒有返回你認爲它們的值。 – TheDrooper

回答

1

你可以在臨時表定義中使用SERIALIZE-NAME在內部討論的領域重新命名。那麼你必須用另一個名字來引用這個字段,但是它的序列化形式仍然會被稱爲status

下面是一個示例,其中status-字段被重命名爲exampleStatus

DEFINE TEMP-TABLE ttExample NO-UNDO 
    FIELD exampleStatus AS CHARACTER SERIALIZE-NAME "status". 

/* Code to read json goes here... */ 

/* Access the field */ 
FOR EACH ttExample: 
    DISPLAY ttExample.exampleStatus. 
END. 
+0

謝謝,這很好地解決了我的問題。 – AlisaDu

1

我已經知道做傻事這樣的:

JSONData = replace(JSONData, '"status":', '"xstatus":'). 
0

嘗試命名臨時表(硬編碼或通過字符串追加)+'。' + hBuffer:BUFFER-FIELD(iStatus):NAME(...)

它應該有助於編譯器理解你正在談論的領域。由於它不受限制,所以應該強制它的手並允許你查詢。

+0

不幸的是,這並沒有在我的情況。 '(...)httSubscriber:NAME +'。' + hBuffer:BUFFER-FIELD(iStatus):NAME(...)'評估爲'members.status',給出相同的錯誤。 – AlisaDu

相關問題