微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何用动态“查询”替换静态“查询”工作方式?

如何解决如何用动态“查询”替换静态“查询”工作方式?

在这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),...?

解决方法

使用:

def var hb as handle no-undo.

create buffer hb for table "mytable".
hb:buffer-create().
assign
   hb::myfield = 123
   hb::another = "ok"
   .
hb:buffer-release()

finally:
   delete object hb no-error.
end finally.

注意 hb::myfield 是

hb:buffer-field('myfield'):buffer-value

还要注意,在使用动态对象时,您要负责垃圾收集。如果你创建了它,你需要删除它。

动态查找唯一部分:

def var hb     as handle  no-undo.
def var lfound as logical no-undo.

create buffer hb for table 'Table1'.

lfound = hb:find-uniqe(
            'where field1 = 123'
            +  ' and field2 = ' + quoter( current-table.field2 ) )
            +  ' and upper( field3 ) = "constant-string"'
            +  ' and field4 = ' + quoter( temp-table.field4 ) 
         ) no-error.

或使用替代品:

lfound = hb:find-unique(
            substitute(
               'where field1 = &1':u
               +  ' and field2 = &2':u
               +  ' and upper( field3 ) = &3':u
               +  ' and field4 = &4':u,123,quoter( current-table.field2 ),quoter( 'constant-string' ),quoter( temp-table.field4 )
            )
         ) no-error.

您很快就会想要创建一个查询构建器类/函数来处理创建查询,并可能还处理您现在也负责的运行时验证。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?