如何实现"create if not found"功能?



当我需要检查记录是否存在并在不存在的情况下创建它时,我想实现一个针对频繁情况的解决方案。

PROCE CreateIfNotFound:
  DEF INPUT PARAM bBuf AS HANDLE NO-UNDO.
  DEF INPUT PARAM chPred AS CHAR NO-UNDO.
  DEF INPUT PARAM iLockMode AS INT NO-UNDO:
  DEF VAR hQry AS HANDLE NO-UNDO.
  CREATE QUERY hQry.
  hQry:SET-BUFFERS(bBuf).
  hQry:QUERY-PREPARE("FOR EACH " + bBuf:NAME + " WHERE " + chPred).
  hQry:QUERY-OPEN.
  IF NOT hQry:GET-FIRST(LockMode) THEN DO:
    bBuf:BUFFER-CREATE.
    ???
  END.
END PROCE.

chPred应为:

field1 = value1 AND field2 = value2 AND [...]

其中field1、field2和[…]是唯一索引字段。在不进行chPred解析的情况下,我应该如何初始化具有给定值的已创建记录的给定字段?此外,分隔符也没有多大帮助,因为值可能包含AND=,通常还有我可以选择的任何分隔符。如果是_!^@_MY_DELIM!@^__,当然不太可能,但我真的不喜欢这个解决方案。

要用于初始化的值在chPred中是否正确?

为什么要让它变得更复杂?

在我看来,如果你知道chPred由相等匹配组成(总是使用"="),并且总是使用and条件,那么这个字符串正是你想要使用的,解析起来非常容易:

define variable x as character no-undo format "x(30)".
define variable s as character no-undo format "x(30)".
define variable a as character no-undo.
define variable b as character no-undo.
define variable i as integer no-undo.
x = "field1 = 3 and field2 = 5".
do while true:
  i = index( x, " and " ).
  if i < 0 then
    x = s.
   else
    assign
      s = substring( x, 1, i - 1 )
      x = substring( x, i + 4 )
    .
  assign
    a = entry( 1, s, "=" )
    b = entry( 2, s, "=" )
  .
  display
    s
    x
    a
    b
  .
  pause.
  if i <= 0 then leave.
end.

如果chPred字符串不包含相等匹配和and,那么显然必须通过其他参数化方案传递值。

一个简单的例子:

为表定义缓冲区btable。

找到第一个btable在哪里什么都没有锁没有错误。

如果不可用btable,那么做:

 create btable.
 assign btable.fields and so on.

结束。

相关内容

  • 没有找到相关文章

最新更新