Progress 4gl 如何实施";如果找不到,则创建";功能?

Progress 4gl 如何实施";如果找不到,则创建";功能?,progress-4gl,openedge,Progress 4gl,Openedge,当我需要检查记录是否存在并创建它(如果不存在)时,我想为频繁出现的情况实现一个解决方案 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.

当我需要检查记录是否存在并创建它(如果不存在)时,我想为频繁出现的情况实现一个解决方案

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 [...]
其中字段1、字段2和[…]是唯一的索引字段。在不进行
chPred
解析的情况下,如何使用给定值初始化已创建记录的给定字段?
此外,分隔符也帮不了什么忙,因为值可能包含
=
以及通常我可以选择的任何分隔符。如果是
,则不太可能^@_我的朋友@^__,但我真的不喜欢这个解决方案。

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

为什么要把它弄得更复杂

在我看来,如果您知道chPred由相等匹配(总是使用“=”)组成,并且总是使用和条件,那么该字符串正是您想要使用的,并且解析起来非常简单:

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.
将变量x定义为字符无撤销格式“x(30)”。
将变量s定义为字符无撤消格式“x(30)”。
将变量定义为不撤消的字符。
将变量b定义为无撤消字符。
将变量i定义为不撤消的整数。
x=“field1=3和field2=5”。
正确时执行以下操作:
i=指数(x,“和”)。
如果我<0,那么
x=s。
其他的
分配
s=子串(x,1,i-1)
x=子串(x,i+4)
.
分配
a=条目(1,s,“=”)
b=条目(2,s,“=”)
.
显示
s
x
A.
B
.
暂停。
如果我一个简单的问题:

为表定义缓冲区btable

找到第一个btable,无论在哪里都没有锁,没有错误

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

 create btable.

 assign btable.fields and so on.

结束。

是,它可能由
=
组成。我曾考虑将
CHR(2)
CHR(3)
作为分隔符,但我仍然不能称之为优雅的解决方案。如果您坚持使用一个超优雅的内置“未找到时创建”关键字,您将要等待很长时间。您需要的数据位于chPred中,并且易于解析。不需要额外的分隔符。我建议您使用它。不,问题是当过程只有一个字符串“field1=value 1和field2=value 2…”时,如何动态执行此操作