【问题标题】:Progress 4GL BUFFER-COPY FAILS进度 4GL 缓冲区复制失败
【发布时间】:2014-03-04 01:18:19
【问题描述】:
DO ON ENDKEY UNDO, LEAVE:
    FIND FIRST STUDENT NO-LOCK WHERE ST-ID = "TEST" NO-ERROR.
    IF AVAILABLE STUDENT THEN    
    DO:
       CREATE SCHOOL no-error.
       BUFFER-COPY STUDENT EXCEPT STUDENT.Location
       SCHOOL ASSIGN SCHOOL.Location = "MY LOCATION" NO-ERROR.
       IF ERROR-STATUS:ERROR THEN 
       DO:
           DO i = 1 TO ERROR-STATUS:NUM-MESSAGES:   
              MESSAGE 
                " Error no " ERROR-STATUS:GET-NUMBER(i) 
               " txt: " ERROR-STATUS:GET-MESSAGE(i) VIEW-AS ALERT-BOX.
               STOP.
          END.
       END.
   END.

结束。

此查询运行良好,但有时它正在创建空记录。通过一些错误进行缓冲区复制,为什么它会创建空记录,但我无法验证错误,因为代码是在 LIVE 中发生的。请帮我解决这个问题。将通过什么类型的错误缓冲区复制。 1000 次工作正常 1 次它会失败。我知道这是数据缺陷,但如何修复。否则BUFFER-COPY通过什么类型的错误。

【问题讨论】:

  • 确切的错误会有很大帮助,也许你可以在一些日志中找到它?另外:这是确切的代码吗?似乎有一些语法错误,可能应该是FIND FIRST STUDENT NO-LOCK WHERE ST-ID = "TEST" NO-ERROR.
  • 这不是我刚刚为示例编写的确切代码
  • 要查找代码中的错误,实际代码非常有用...
  • 如果没有确切的错误和确切的代码,很难说。可能与 UNIQUE 索引冲突(试图创建基本上已经存在的记录)。
  • NO-ERROR 仅抑制某些操作——例如错误消息和引发错误条件。错误仍然发生,仍然可以检测和处理——其中包括 Jensd 为您发布的代码。

标签: progress-4gl openedge


【解决方案1】:

既然你真的不知道会发生什么错误 - 你需要从那里开始。

要在 NO-ERROR 语句之后跟踪一般错误,您可以执行以下操作:

IF ERROR-STATUS:ERROR THEN DO:
  DO i = 1 TO ERROR-STATUS:NUM-MESSAGES:
    /* Replace MESSAGE with some kind of logging */
    MESSAGE 
      "Error number " i 
      " error no " ERROR-STATUS:GET-NUMBER(i) 
      " txt: " ERROR-STATUS:GET-MESSAGE(i) VIEW-AS ALERT-BOX.
  END.
END.

获得特定错误编号后,您可以搜索Progress Knowledge Base 以获取更多信息。

【讨论】:

    【解决方案2】:

    我将编写如下代码。如果你使用 no-error 总是处理错误。分配/缓冲副本时检查是否没有错误,然后进行验证以确认触发器正确触发。错误处理代码可以放在它自己的过程中,然后在每次您希望处理错误消息时调用。 (按照我的写作方式对其进行了一些修改,我并不总是捕获所有错误,但错误处理取决于各种因素,但这是在测试期间确保代码设置正确的好方法。之后可以在不正确的地方删除错误处理部署前需要。)

    FIND FIRST STUDENT NO-LOCK WHERE ST-ID = "TEST" NO-ERROR.
    IF AVAILABLE STUDENT THEN    
    DO:
      CREATE SCHOOL.
      BUFFER-COPY STUDENT EXCEPT STUDENT.Location
               TO SCHOOL ASSIGN   SCHOOL.Location = "MY LOCATION" 
      NO-ERROR.
      IF ERROR-STATUS:ERROR THEN 
      DO:
        /* insert error handling - for example as as per @Jensd */
        /* this is in case there is something wrong with buffer copy */
        /* maybe a required field is left empty? */
      END.
      ELSE DO:
          VALIDATE SCHOOL NO-ERROR. /* good idea as it raises any issues with triggers */
          IF ERROR-STATUS:ERROR THEN 
          DO:
            /* insert error handling - for example as as per @Jensd */
          END.
      END.
    END.    
    

    【讨论】:

    • 在 ST-ID = "TEST" 无错误的情况下找到第一个无锁学生。 IF AVAILABLE STUDENT THE NO : CREATE SCHOOL 没有错误。 BUFFER-COPY STUDENT STUDENT.Location SCHOOL ASSIGN SCHOOL.Location = "MY LOCATION" NO-ERROR。 IF ERROR-STATUS:ERROR THEN DO: MESSAGE " Error no " ERROR-STATUS:GET-NUMBER(i) " txt: " ERROR-STATUS:GET-MESSAGE(i) VIEW-AS ALERT-BOX。结尾。结束。
    • 感谢重播,我已经制作了类似的代码,请验证上面的代码。
    • 我个人会尝试检查可能发生的任何情况(例如“学校”已经存在,“学生”记录不完整等),而不是抛出一堆 NO-ERRORS 并处理这些情况。需要注意的是,您在 BUFFER-COPY source TO target. 中缺少强制性的“TO”
    • 添加了 TO :-) 来自不使用编译器。我相信在测试期间,根据需要添加验证和尽可能多的错误处理是很好的。当您解决了所有小问题并准备好进行最终测试和部署时,您可以决定在哪里进行错误捕获和报告。缓冲区复制最常见的错误是当 TO 表具有未初始化的必填字段时。如果没有验证语句,您将不会立即知道触发器是否存在任何问题。这可能不是问题,具体取决于您在链条上的位置。
    【解决方案3】:

    我不会直接从一个表复制到另一个表,您可能会遇到我认为您遇到的索引问题。

    最好定义一个像目标表一样的临时表。

    然后将缓冲区复制到临时表。

    将右键设置到临时表中。

    然后从带有正确键字段的临时表复制缓冲区到目标表。

    尝试如下:

    像学校一样定义临时表 t-school。

    找到第一个学生无锁等等。

    将学生缓冲复制到 t-school。

    分配 t-school.location = "whatever"。

    将 t-school 缓冲复制到学校。

    瞧!

    【讨论】:

      【解决方案4】:

      调试问题的一种可能方法是使用 AppBuilder 中帮助下的“最近消息”,前提是您能够直接从中运行代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多