2013-08-26 51 views
0
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。進度4GL緩存器複製失敗

此查詢工作正常,但有一段時間它創建空記錄。緩衝區複製通過一些錯誤,爲什麼它創建空記錄,但我無法驗證錯誤,因爲代碼發生在LIVE中。請幫助我如何解決這個問題。什麼類型的錯誤buffer-copy會通過。 1000次工作正常1次將失敗。我知道這是數據缺陷,但如何修復。否則通過什麼類型的錯誤BUFFER-COPY。

+1

準確的錯誤會有很多幫助,也許你可以在一些日誌中找到它?另外:這是確切的代碼?似乎有一些語法錯誤,比如它應該是'找到第一個學生沒有鎖定的地方ST-ID =「測試」無錯誤。' – Jensd

+0

這不是一個確切的代碼,我剛剛寫了樣本 – user1506424

+2

要找到代碼中的錯誤,實際的代碼是非常有用的... – Jensd

回答

1

由於您真的不知道發生了什麼錯誤 - 您需要從那裏開始。一旦你擁有了特定的錯誤號碼,你可以搜索Progress Knowledge Base更多信息

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. 

了無錯誤的語句,你可以做這樣的事情後跟蹤常規錯誤。

0

我會寫代碼如下。如果您使用無錯誤總是處理錯誤。當分配/緩衝複製檢查沒有錯誤,然後進行驗證以確認觸發器正確觸發。錯誤處理代碼可以放在自己的過程中,然後每當你想處理錯誤消息時就調用它。 (修改了一下,因爲我會寫它,我並不總是捕獲所有錯誤,但錯誤處理取決於各種各樣的事情,但它是測試期間確保代碼安裝正確的好方法。

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.  
+0

找到ST-ID =「TEST」NO-ERROR的第一個學生NO-LOCK。 如果可用的學生 做: 創建學校沒有錯誤。 緩衝區複印學生除了學生。位置 學校指派SCHOOL.Location =「我的位置」無錯。 IF ERROR-STATUS:錯誤,那麼 DO: MESSAGE 「錯誤沒有」 錯狀態下:GET-數(i) 名爲 「txt:」 錯狀態下:獲取消息(I)VIEW-AS ALERT-BOX。 END。 END。 – user1506424

+0

感謝您的重播,我已經提供了類似的代碼,請驗證上面的代碼。 – user1506424

+0

我個人會嘗試檢查可能發生的任何情況(比如「學校」已經存在,「學生」記錄不完整等),而不是投擲一堆無錯並處理這些情況。小小的一點是,你在'緩衝區 - 複製源目標中缺少強制性的「TO」。' – Jensd

0

我不會讓從一個緩衝區拷貝到其他表挺直部署之前需要。),你可能有問題的指標,因爲我覺得你有。

更好地定義一個類似於目標表的臨時表。

然後將緩衝區複製到臨時表中。

將臨時密鑰設置到臨時表中。

然後使用正確的鍵字段將臨時表中的緩衝區副本複製到目標表中。

請試試如下:

定義像學校這樣的臨時表學校。

找到第一個學生不鎖等等。

緩衝區複製學生t學校。

指定t-school.location =「whatever」。

緩衝副本t學校上學。

瞧!

0

調試問題的一種可能方法是使用AppBuilder幫助下的「最新消息」,前提是您可以直接從中運行代碼。