0

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

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!@^__,但我真的不喜欢这个解决方案。

4

2 回答 2

0

您要用于初始化的值在 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,那么您显然将不得不通过其他一些参数化方案传递值。

于 2013-08-23T13:46:13.783 回答
0

一个简单的:

为表定义缓冲区 btable。

找到第一个 btable 任何无锁无错误的地方。

如果 btable 不可用,则执行以下操作:

 create btable.

 assign btable.fields and so on.

结尾。

于 2013-08-30T14:41:53.450 回答