进度4GL BUFFER-COPY FAILS

时间:2013-08-26 08:07:36

标签: progress-4gl openedge

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.

END。

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

4 个答案:

答案 0 :(得分: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以获取更多信息。

答案 1 :(得分:0)

我会编写如下代码。如果使用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.    

答案 2 :(得分:0)

我不打算从一个表到另一个表的缓冲区副本,你可能会有索引问题,因为我认为你有。

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

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

将rigth键设置为临时表。

然后从临时表中使用正确的键字段将缓冲区复制到目标表。

尝试如下:

像学校一样定义临时表学校。

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

将学生缓冲复制到学校。

分配t-school.location =“无论什么”。

缓冲复制t-school到学校。

瞧!

答案 3 :(得分:0)

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