2013-08-26 5 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. 

끝.진행률 4GL 버퍼 오버플로

이 쿼리는 정상적으로 작동하지만 빈 레코드가 생성되고 있습니다. 일부 오류를 통해 버퍼 복사 - 왜 빈 레코드를 만들지 만 코드가 LIVE에서 발생했기 때문에 오류를 확인할 수 없습니다. 문제를 해결하는 방법을 알려주세요. 어떤 타입의 에러 버퍼 - 카피가 통과 할 것인가. 1000 번 괜찮 으면 1 번 실패합니다. 나는 이것이 데이터 결함이지만 어떻게 고정되는지 알고있다. 그렇지 않으면 어떤 유형의 오류가 버퍼를 통해 복사됩니까?

+1

정확한 오류는 많은 도움이 될 것입니다. 아마도 일부 로그에서 찾을 수 있습니까? 또한 :이 정확한 코드입니까? 아마도 'ST-ID = "TEST"NO-ERROR 인 경우 FIRST FIRST STUDENT NO-LOCK을 찾아야하는 것과 같은 구문 오류가있는 것 같습니다.' – 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. 

:

당신이 뭔가를 할 수있는 NO-ERROR 문 뒤에 일반적인 오류를 추적 할 수 있습니다.

0

다음 코드를 작성합니다. no-error를 사용하면 항상 오류를 처리하십시오./buffer copy를 지정할 때 오류가 없는지 확인한 후 트리거가 올바르게 실행되는지 확인하기 위해 유효성 검사를 수행하십시오. 오류 처리 코드는 자체 프로 시저에 넣을 수 있으며 오류 메시지를 처리 ​​할 때마다 호출됩니다. (필자가 작성한 것처럼 약간 수정되었지만 항상 모든 오류를 잡아 내지는 못하지만 오류 처리는 여러 가지 사항에 따라 다르지만 코드가 올바르게 설정되었는지 테스트하는 좋은 방법입니다. 나중에 오류 처리를 제거 할 수 있습니다. 난 당신이 가진 생각으로 배포하기 전에 필요합니다.) 나는 다른 테이블 stright 하나에서 버퍼 복사를하지 않습니다

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 인 학생은 아무런 문제가 없습니다. 해당하는 경우 DO : CREATE SCHOOL no-error. 학생을 제외하고 BUFFER-COPY 학생. 위치 SCHOOL ASSIGN SCHOOL.Location = "MY LOCATION"NO-ERROR. 오류 상태 경우 : ERROR THEN 는 DO : 메시지 오류 상태 "오류 없다"GET-번호 (I) "TXT를 :"ERROR-상태 : GET-MESSAGE (I) VIEW-AS ALERT-BOX. END. END. – user1506424

+0

재생 해 주셔서 감사합니다. 이미 위 코드를 확인하십시오. – user1506424

+0

개인적으로 NO-ERRORS를 던지기보다는 ("학교"가 이미 존재하고, "학생"기록이 불완전하다는 등) 발생할 수있는 조건을 확인하려고합니다. 작은 메모는'BUFFER-COPY source TO target '에 필수 "TO"가 누락되었다는 것입니다. – Jensd

0

, 당신은 인덱스 문제가있을 수 있습니다.

목표 테이블과 같은 임시 테이블을 정의하는 것이 좋습니다.

그런 다음 임시 테이블에 버퍼 복사본을 만듭니다.

임시 테이블에 강성 키를 설정하십시오.

그런 다음 올바른 키 필드가있는 임시 테이블에서 대상 테이블로 버퍼 복사본을 만듭니다. 다음과 같은

봅니다 :

학교와 같은 임시 테이블 t-학교를 정의합니다.

첫 번째 학생 잠금 없음 등을 찾습니다.

학생을 t-school으로 복사합니다.

t-school.location = "무엇이든지"를 지정하십시오.

t-school을 (를) t- 학교로 복사합니다.

Voila!

0

문제를 디버그 할 수있는 방법 중 하나는 AppBuilder의 도움말에서 "최근 메시지"를 사용하는 것입니다.이 코드는 직접 코드를 실행할 수 있어야합니다.