OpenEdge ABL保留关键字作为临时表字段名称(从JSON数据推断)

问题描述:

我坚持以下情况: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

你可以在临时表定义中使用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

我已经知道做傻事这样的:

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

尝试命名临时表(硬编码或通过字符串追加)+'。' + hBuffer:BUFFER-FIELD(iStatus):NAME(...)

它应该有助于编译器理解你正在谈论的领域。由于它不受限制,所以应该强制它的手并允许你查询。

+0

不幸的是,这并没有在我的情况。 '(...)httSubscriber:NAME +'。' + hBuffer:BUFFER-FIELD(iStatus):NAME(...)'评估为'members.status',给出相同的错误。 – AlisaDu