出现错误 - 短语或选项与之前的短语或选项冲突。 【277】- 进步 4GL

Getting Error - Phrase or option conflicts with previous phrase or option. (277) - Progress 4GL

我正在使用以下动态查询从 table 中获取数据。但我收到编译错误 “短语或选项与之前的短语或选项冲突。(277)”。不确定我在哪里犯了错误以及如何解决它。请帮助我修改以下示例查询。

define variable hbuffer as handle    no-undo.
define variable hQuery  as handle    no-undo.
define variable cQuery  as character no-undo.

define temp-table tt_table no-undo           
field tt_week1    as character label "Week1"
.

create buffer hbuffer for table "<table>".
cQuery = "for each <table> no-lock ".
create query hQuery.
hQuery:set-buffers(hbuffer).
cQuery = cQuery + ":".
hQuery:query-prepare(cQuery).
hQuery:query-open().
if hQuery:query-open() then
do:
   do while hQuery:get-next():
      create tt_table.
      assign tt_week1 = hbuffer::qty[1] /*field name qty data type is deci-10[52].*/
      .
   end.
end.

for each tt_table :
   disp tt_week1.
end.

编译错误应该会告诉您错误来自哪一行。

在代码片段中,您没有在任何地方定义 tt_week 字段。

一般来说,如果要赋值一个(temp)table字段,应该使用table.field表示法; AVM 通常可以弄清楚你的意图,但不具体是 error-prone.

这里的 shorthand 语法有问题:

hbuffer::qty[1]

如果将其替换为:

hbuffer:buffer-field ("qty"):BUFFER-VALUE (1)

它会起作用(直到 Peter 使用未定义的字段 tt_week1 制作的那个点)。我没有找到任何参考说明 shorthand 语法是否应该与 EXTENT 字段一起使用. 可能值得检查 Progress tech-support.

所以这会让你更进一步:

assign tt_data = hbuffer:buffer-field ("qty"):BUFFER-VALUE (1) /*field name qty data type is deci-10[52].*/

正如 Mike 所指出的,您尝试引用范围会引发错误,动态范围引用使用圆括号(并且可以很好地与 shorthand 一起使用):

hbuffer::qty(1)

此外:

  1. 您不需要使用 :
  2. 来终止您的查询
  3. get-next() 默认为 no-lock
  4. 您打开查询两次
// some demo data

define temp-table db no-undo
   field qty as decimal extent 7
   .

create db. db.qty[1] = 1.
create db. db.qty[1] = 2.

// the question

define variable hb      as handle    no-undo.
define variable hq      as handle    no-undo.
define variable cquery  as character no-undo.

define temp-table tt no-undo           
    field week1 as character label 'Week1'
    .

create buffer hb for table 'db'.
cquery = substitute( 'for each &1', hb:name ).
create query hq.
hq:set-buffers( hb ).
if hq:query-prepare( cquery ) and hq:query-open() then do:

    do while hq:get-next():
        create tt.
        tt.week1 = hb::qty(1). // <-- round parentheses
    end.

end.

for each tt:
    display tt.week1.
end.

https://abldojo.services.progress.com/?shareId=626aff353fb02369b2545434