【问题标题】:Openedge 8.3c Dynamic QueryOpenedge 8.3c 动态查询
【发布时间】: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


    【解决方案1】:

    动态查询直到 9.0 才可用,因此您的 8.* 应用程序不走运。

    【讨论】:

      【解决方案2】:

      当然,第 8 版是史前的。

      在版本 8 和更早的版本中,您可以通过“即时编译”(需要编译器许可证)来实现这种东西。

      类似:

      /* q.p
       */
      
      for each {1} no-lock {2}:
        display {3}.
      end.
      

      然后您将其称为将变量位作为参数传递,如下所示:

      run q.p "customer" "where customer.state = 'ma'" "name".
      

      这比 v9+ 动态查询粗略得多,编译器要求阻止了很多用途,但无论您正在做什么,它都可能足够好。

      【讨论】:

      • 这就是我要找的。谢谢!
      猜你喜欢
      • 1970-01-01
      • 2013-08-18
      • 2012-03-19
      • 1970-01-01
      • 2010-11-26
      • 2021-05-07
      • 2022-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多