【发布时间】:2014-02-13 06:53:08
【问题描述】:
如何在 8.3c 中进行动态查询?我在 V8.3c 中不能做的是有一个动态缓冲区,这样我就可以像 10.2b 中的这些代码一样动态运行所有表。
将变量 QueryHandler 定义为 HANDLE NO-UNDO。 将变量 QueryBuffer 定义为 HANDLE NO-UNDO。 将变量 QueryString 定义为 CHARACTER NO-UNDO。 将变量 BufferFields 定义为 CHARACTER NO-UNDO。 _TransactMain: DO ON ERROR 撤消,离开: 创建查询查询处理程序。 _TableLoop: FOR EACH ttTableFields NO-LOCK /* 过滤系统表 */ BREAK BY 表名: IF FIRST-OF(tablename) THEN DO: 分配 QueryString = "对于每个 " + TableFields.TableName + ":" 缓冲区字段 = ""。 结尾。 /* 分隔字段 */ /* 遍历字段 -1 以避免结尾为空 */ 分配 BufferFields = TableFields.FieldName + ";" + 缓冲区。 IF LAST-OF(TableName) 然后做: /* 为选定的字段组创建缓冲区 */ CREATE BUFFER QueryBuffer FOR TABLE TableFields.TableName 无错误。 如果 ERROR-STATUS:ERROR = TRUE 则执行: 下一个 _TableLoop。 结尾。 /* 将此设置为 Query 处理的当前缓冲区 */ QueryHandler:SET-BUFFERS(QueryBuffer) 无错误。 如果 ERROR-STATUS:ERROR = TRUE 则执行: 下一个 _TableLoop。 结尾。 /* 准备查询字符串并检查语法是否正确 */ QueryHandler:QUERY-PREPARE(QueryString) 无错误。 如果 ERROR-STATUS:ERROR = TRUE 则执行: 下一个 _TableLoop。 结尾。 /* 执行查询并检查是否有效查询*/ QueryHandler:QUERY-OPEN() 无错误。 如果 ERROR-STATUS:ERROR = TRUE 则执行: 下一个 _TableLoop。 结尾。 ELSE DO: /* 如果以上都正确 */ 如果 QueryHandler:GET-FIRST(NO-LOCK) = TRUE 然后做: 运行 DoReplace(缓冲区字段)。 结尾。 否则: 下一个 _TableLoop。 结尾。 结尾。 结尾。 结尾。 结尾。这是我的 DoReplace 程序:
将输入参数 chkFields 定义为 CHARACTER NO-UNDO。 将变量 i 定义为整数 NO-UNDO。 DO WHILE 查询缓冲区:可用: DO TRANSACTION i = 1 TO NUM-ENTRIES(chkFields,";") - 1: /* 代码不完整 */ queryBuffer:BUFFER-FIELD(ENTRY(i,chkFields,";")):BUFFER-VALUE。 结尾。 QueryHandler:GET-CURRENT(NO-LOCK)。 QueryHandler:GET-NEXT(NO-LOCK)。 结尾。这些代码在 v8.3c 中无法运行,因为它不支持动态查询。 我在 v8.3c 中找不到解决方法。
【问题讨论】:
标签: progress-4gl openedge