【问题标题】:OpenEdge progress database insert row - BeginnerOpenEdge 进度数据库插入行 - 初学者
【发布时间】:2015-09-01 08:28:03
【问题描述】:

我需要在我的数据库中插入新行。

    OUTPUT TO c:\temp\SMLeiste_bearbeiten.csv.
DEFINE VARIABLE size AS CHARACTER NO-UNDO FORMAT "x(3)"
  LABEL "Size".
for each S_Artikel
where S_Artikel.Selektion matches "KSE*"
or S_Artikel.Selektion matches "ZSE*"
or S_Artikel.Selektion matches "SSE*",
EACH BS_Zuord
     where BS_Zuord.SMLeiste = "SE"
     AND BS_Zuord.Owning_Obj = S_Artikel.S_Artikel_Obj
  EXCLUSIVE-LOCK.

 ASSIGN BS_Zuord.Merkmal = "Größe".

 PUT UNFORMATTED
   'First Loop - set row with Merkmal "Größe"' + '|' + STRING(BS_Zuord.Owning_Obj) + '|' + String(S_Artikel.S_Artikel_Obj)
SKIP.
END.

所以现在的问题是,我不知道如何在不遍历“BS_Zuord”中的每个项目的情况下添加具有大小的行

一个 S_Artikel 对象有多个 BS_Zuord 对象

我只想查询哪个 S_Artikel 符合我的条件,然后添加一个等于 Owning_Obj = S_Artikel_Obj 的 BS_Zuord

我想我可能需要加入表格或类似的东西,但我不知道如何在进行中做到这一点

提前致谢!

编辑:

我需要更换吗

EACH BS_Zuord
     where BS_Zuord.SMLeiste = "SE"
     AND BS_Zuord.Owning_Obj = S_Artikel.S_Artikel_Obj
  EXCLUSIVE-LOCK.

 ASSIGN BS_Zuord.Property = "Size".

CREATE BS_Zuord.
BS_Zuord.OwningObj = S_Artikel_Obj.
ASSIGN BS_Zuord.Property = "Size".

**

最新版本的完整代码

**

    OUTPUT TO c:\temp\SMLeiste_bearbeiten.csv.
DEFINE VARIABLE groesse AS CHARACTER NO-UNDO FORMAT "x(7)"
  LABEL "Groesse".
for each S_Artikel
where S_Artikel.Selektion matches "KSE*"
or S_Artikel.Selektion matches "ZSE*"
or S_Artikel.Selektion matches "SSE*",

EACH BS_Zuord
     where BS_Zuord.SMLeiste = "SE"
     AND BS_Zuord.Owning_Obj = S_Artikel.S_Artikel_Obj
  EXCLUSIVE-LOCK.

 ASSIGN BS_Zuord.Merkmal = "Size". 

 PUT UNFORMATTED
   'Erste Schleife - Größe anlegen' + '|' + STRING(BS_Zuord.Owning_Obj) + '|' + String(S_Artikel.S_Artikel_Obj)
SKIP.
END.


for each S_Artikel
where S_Artikel.Selektion matches "KSE*"
or S_Artikel.Selektion matches "ZSE*"
or S_Artikel.Selektion matches "SSE*",
EACH BS_Zuord
     where BS_Zuord.SMLeiste = "SE"
     AND BS_Zuord.Merkmal = "Größe"
     AND BS_Zuord.Owning_Obj = S_Artikel_Obj 
  EXCLUSIVE-LOCK.
    IF SUBSTRING(STRING(S_Artikel.Selektion),8,1) = "/" THEN groesse = SUBSTRING(STRING(S_Artikel.Selektion),5,7).
        ELSE groesse = SUBSTRING(STRING(S_Artikel.Selektion),5,3).

    BS_Zuord.Auspr = groesse.

        PUT UNFORMATTED 
        'Zweite Schleife - Größe ausfüllen' + '|' + string(S_Artikel.Artikel) + '|' + string(S_Artikel.Selektion) + '|' + STRING(groesse) + '|' + STRING(BS_Zuord.SMLeiste) + '|' + STRING (BS_Zuord.Merkmal) + '|' + STRING(BS_Zuord.Auspr)
        SKIP.    
END.

如果我替换它说的部分

,
EACH BS_Zuord
     where BS_Zuord.SMLeiste = "SE"
     AND BS_Zuord.Merkmal = "Größe"
     AND BS_Zuord.Owning_Obj = S_Artikel_Obj 
  EXCLUSIVE-LOCK.
    IF SUBSTRING(STRING(S_Artikel.Selektion),8,1) = "/" THEN groesse = SUBSTRING(STRING(S_Artikel.Selektion),5,7).
        ELSE groesse = SUBSTRING(STRING(S_Artikel.Selektion),5,3).

    BS_Zuord.Auspr = groesse.

和你的

/* 找到合适的 BS_Zuord 如果存在 */

exclusive-lock.
  find BS_Zuord where BS_Zuord.SMLeiste = "SE" and BS_Zuord.Owning_Obj =      S_Artikel.S_Artikel_Obj no-error.

  /* if it does not already exist create it and initialize the key */
  if not available BS_Zuord then   
    do:
      create BS_Zuord.
      assign
        BS_Zuord.SMLeiste = "SE"
        BS_Zuord.Owning_Obj = S_Artikel.S_Artikel_Obj
      .
    end.
  /* set the property field */
  BS_Zuord.Property = "Size".

并为每个输出注释第二个

此消息将出现: 它说“对于财产(在我的情况下为 Merkmal)“Größe”没有“Ausprägung”(这是财产“Merkmal”的实际价值。不允许使用“价值”。 http://i.stack.imgur.com/FDL4S.png

所以 1 S_Artikel 有多个具有不同“Merkmal”的 BS_Zuord。每个“Merkmal”都有多个值。

如果我运行工作代码,它会为每个 S_Artikel x-Merkmal 时间运行并说,例如,如果 S_Artikel 有 6 个“Merkmal”,它会创建正确的“Merkmal”,并将“Größe”作为值,然后它会尝试创建它的次数增加了 5 倍,但它说它存在。然后每个汽车的第二个创建将在 BS_Zuord.Auspr 中填充的值。

我希望你能理解我试图告诉你的内容。英语不是我的母语:(

【问题讨论】:

    标签: progress-4gl openedge progress-db


    【解决方案1】:

    我认为这就是你想要做的:

    /* loop through S_Artikel records matching criteria */
    
    for each S_Artikel no-lock where
       where S_Artikel.Selektion matches "KSE*"
          or S_Artikel.Selektion matches "ZSE*"
          or S_Artikel.Selektion matches "SSE*":
    
      /* find the appropriate BS_Zuord if it exists */
    
      find BS_Zuord exclusive-lock where BS_Zuord.SMLeiste = "SE" and BS_Zuord.Owning_Obj = S_Artikel.S_Artikel_Obj no-error.
    
      /* if it does not already exist create it and initialize the key */
    
      if not available BS_Zuord then   
        do:
          create BS_Zuord.
          assign
            BS_Zuord.SMLeiste = "SE"
            BS_Zuord.Owning_Obj = S_Artikel.S_Artikel_Obj
          .
        end.
    
      /* set the property field */
    
      BS_Zuord.Property = "Size".
    
    end.  /* end of loop */
    

    (假设 BS_Zuord.SMLeiste 和 BS_Zuord.Owning_Obj 形成一个唯一键。)

    【讨论】:

    • 我认为这可以解决问题,但我一直告诉我属性“大小”没有参数值。例如,如果我尝试使用 BS_Zuord.Auspr = "400" 添加参数值,它仍然会一直告诉我它不存在。我已经尝试通过 GUI 创建它并且它有效。我可以用 BS_Zuord.Auspr = "400" 更改 BS_Zuord.Auspr 的值。对于已经存在的记录。有什么想法吗?
    • 准确的错误信息是什么?显示全文.. 我怀疑您没有名为“BS_Zuord.property”的字段。从您的评论中猜测,您可能有一个名为“BS_Zuord.size”的代码,而您确实需要编码“BS_Zuord.size = 400”。但我无法从目前可用的信息中判断出来。
    • 我把它翻译成英文。该表是 BS_Zuord。字段是“Owning_Object”、“SMLeiste”和“Merkmal”(我已经翻译成大小)。 Owning_Object 和 SMLeiste 形成一个唯一键来标识一行。我编辑我的原始帖子以添加我的代码。
    • 该消息意味着您分配的值无效。它可能是由 proAlpha 为该表定义的数据库触发器生成的。
    • 非常感谢!他们不会告诉我如何触发它。所以我将使用我的第一个代码。它会产生一些开销,但在测试数据库中工作。
    【解决方案2】:

    没错。删除

    EACH BS_Zuord
         where BS_Zuord.SMLeiste = "SE"
           AND BS_Zuord.Owning_Obj = S_Artikel.S_Artikel_Obj
         EXCLUSIVE-LOCK.
    ASSIGN BS_Zuord.Property = "Size". 
    

    因为它将更改所有符合循环条件的 BS_Zuord 记录的值。 另外,第二个 EACH 将循环您已有的记录。由于您想创建一个新的,您最后发布的 CREATE 和 ASSIGN 应该可以解决问题。 如果相应地提供了表中的主键和必填字段,但假设您只需要代码中的 pk,那么根据您的解释,您提供的代码似乎可以满足您的需求。

    【讨论】:

    • 我认为这可以解决问题,但我一直告诉我属性“大小”没有参数值。例如,如果我尝试使用 BS_Zuord.Auspr = "400" 添加参数值,它仍然会一直告诉我它不存在。我已经尝试通过 GUI 创建它并且它有效。我可以用 BS_Zuord.Auspr = "400" 更改 BS_Zuord.Auspr 的值。对于已经存在的记录。有什么想法吗?
    猜你喜欢
    • 2013-10-23
    • 2020-09-24
    • 2021-11-20
    • 2020-04-09
    • 1970-01-01
    • 2019-07-30
    • 2011-12-12
    • 2012-03-14
    • 2012-10-12
    相关资源
    最近更新 更多