【发布时间】:2021-06-02 23:59:56
【问题描述】:
在other question 中,我询问了如何处理可能定义或未定义表的情况。我试图遵循的建议解决方案是使用动态“查询”而不是静态查询。不幸的是,我不知道该怎么做,有人可以帮我吗?举个例子吧:
静态工作方式:
FIND Table1 WHERE Table1.field1 = 123
AND Table1.field2 = Current-Table.field2
AND UPPER(Table1.field3) = "Constant-string"
AND Table1.field4 = temp-table.field4 NO-ERROR.
IF NOT AVAILABLE Table1
THEN DO:
CREATE Table1.
ASSIGN Table1.field1 = 123
Table1.field2 = Current-Table.field2
Table1.field3 = "Constant-string"
Table1.field4 = temp-table.field4.
RELEASE Table1.
END.
动态工作方式:
CREATE BUFFER h-Table1 FOR TABLE "Table1" NO-ERROR.
IF VALID-HANDLE(h-Table1)
THEN DO:
L-Found = h-Table1:FIND-FIRST("WHERE Table1.field1 = " + STRING(123) +
"AND Table1.field2 = " + STRING(Current-Table.field2) +
"AND UPPER(Table1.field3) = 'Constant-string'" +
"AND Table1.field4 = " + temp-table.field4) NO-ERROR.
IF NOT L-Found
THEN DO:
h-Table1:BUFFER-CREATE("").
END.
ELSE MESSAGE "FOUND".
END.
是BUFFER-CREATE还是其他方法,参数怎么填(比如ASSIGN Table1.Field1 = 123),...?
【问题讨论】:
-
请注意,您正在将静态 UNIQUE 查找替换为动态 FIRST 查找。此外,在连接查询时,您确实希望使用 SUBSTITUTE 和 QUOTER 来防止查询注入。
-
@StefanDrissen:我不明白你的意思,但我刚刚发现以下查询似乎不起作用:
h-Table1:FIND-FIRST("WHERE Table1.field1 = " + STRING(field1_value) + "AND Table1.field2 = " + STRING(field2_value) + "AND UPPER(Table1.field3) = 'FIX_STRING'" + "AND Table1.field4 = " + temp_table.field4) NO-ERROR.,这是你在说什么,我该如何解决这使用了SUBSTITUTE和QUOTER(最后不是错字吗?)? -
首先删除 NO-ERROR,因为这也会隐藏查询中的语法错误。 quoter 不是错字,我会在我的答案中添加您的 find-unique 应该是什么样的。
-
@StefanDrissen:基于
QUOTER()函数的查询(我还没有使用SUBSTITUE())工作正常,但是当我尝试删除表记录时,我陷入了运行时错误 335。为此,我创建了一个新的 StackOverflow 帖子:stackoverflow.com/questions/66489158/…
标签: openedge progress-4gl dynamicquery dynamic-queries