Progress 4GL СБОЙ КОПИРОВАНИЯ БУФЕРА

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.

КОНЕЦ.

Этот запрос работает нормально, но какое-то время он создавал пустую запись. buffer-copy через некоторую ошибку, поэтому он создает пустую запись, но я не могу проверить ошибку, потому что код произошел в LIVE. пожалуйста, помогите мне, как ИСПРАВИТЬ проблему. какой тип буфера-копии ошибок будет проходить. 1000 раз работает нормально, 1 раз он НЕ СБОЙ. Я знаю, что это дефект данных, но как это исправить. иначе какой тип ошибок БУФЕР-КОПИРОВАТЬ.


person user1506424    schedule 26.08.2013    source источник
comment
Точная ошибка будет очень полезна, может быть, вы найдете ее в каком-нибудь журнале? Также: это точный код? Кажется, есть какие-то синтаксические ошибки, вероятно, это должно быть FIND FIRST STUDENT NO-LOCK WHERE ST-ID = "TEST" NO-ERROR.   -  person Jensd    schedule 26.08.2013
comment
это не точный код, который я написал для примера   -  person user1506424    schedule 26.08.2013
comment
Чтобы найти ошибки в коде, очень помогает сам код ...   -  person Jensd    schedule 26.08.2013
comment
Я имею в виду, что логика кода такая же ......... не могли бы вы сказать мне, через какие ошибки будет проходить BUFFER-COPY. в то же время один и тот же код работает нормально в течение некоторого времени из-за ошибки   -  person user1506424    schedule 26.08.2013
comment
Без точной ошибки и точного кода сказать сложно. Может быть конфликт с индексами UNIQUE (попытка создания записей, которые в основном уже существуют).   -  person Jensd    schedule 26.08.2013
comment
есть ли PDF-файл для списка ошибок   -  person user1506424    schedule 26.08.2013
comment
в любом случае спасибо за повтор, Дженсд ......   -  person user1506424    schedule 26.08.2013
comment
Если у вас есть номер ошибки, укажите его в сообщении. Затем я могу проверить, чему соответствует этот номер ошибки.   -  person Jensd    schedule 26.08.2013
comment
Если у меня есть номер ошибки, я могу решить проблему. это не приведет к ошибке, потому что БУФЕРНАЯ КОПИЯ не имеет ОШИБКИ.   -  person user1506424    schedule 26.08.2013
comment
Возможны десятки тысяч ошибок, и их нет в формате PDF.   -  person Tom Bascom    schedule 26.08.2013
comment
NO-ERROR подавляет только определенные действия - например, сообщение об ошибке и повышение состояния ошибки. Ошибка все еще возникает, и ее все еще можно обнаружить и обработать, включая код, который Дженсд любезно опубликовал для вас.   -  person Tom Bascom    schedule 26.08.2013


Ответы (4)


Поскольку вы действительно не знаете, какие ошибки возникают - вам нужно начинать с этого.

Чтобы отслеживать общие ошибки после оператора 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.

Если у вас есть конкретные номера ошибок, вы можете поискать дополнительную информацию в базе знаний о ходе выполнения.

person Jensd    schedule 26.08.2013

Я бы написал следующий код. Если вы используете режим без ошибок, всегда обрабатывайте ошибку. При назначении / копировании буфера проверьте, нет ли ошибок, затем выполните проверку, чтобы убедиться, что триггеры срабатывают правильно. Код обработки ошибок можно поместить в отдельную процедуру, а затем просто вызывать каждый раз, когда вы хотите обрабатывать сообщения об ошибках. (немного изменил его, как я бы написал, я не всегда улавливаю все ошибки, но обработка ошибок зависит от разных вещей, но это хороший способ во время тестирования убедиться, что код настроен правильно. После этого можно удалить обработку ошибок там, где нет необходимо перед развертыванием.)

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.    
person AquaAlex    schedule 27.08.2013
comment
НАЙТИ ПЕРВОГО СТУДЕНТА БЕЗ БЛОКИРОВКИ, ГДЕ ST-ID = ТЕСТ БЕЗ ОШИБКИ. ЕСЛИ ДОСТУПНЫ УЧАЩИЕСЯ, ТО СДЕЛАЙТЕ: СОЗДАЙТЕ ШКОЛУ без ошибок. БУФЕРНАЯ КОПИЯ СТУДЕНТ, ЗА ИСКЛЮЧЕНИЕМ СТУДЕНТА.Location SCHOOL ASSIGN SCHOOL.Location = MY LOCATION NO-ERROR. ЕСЛИ СОСТОЯНИЕ ОШИБКИ: ОШИБКА, ТО СДЕЛАТЬ: СООБЩЕНИЕ Ошибка нет СОСТОЯНИЕ ОШИБКИ: ПОЛУЧИТЬ НОМЕР (i) txt: СОСТОЯНИЕ ОШИБКИ: ПОЛУЧИТЬ-СООБЩЕНИЕ (i) ПРОСМОТР-КАК ПРЕДУПРЕЖДЕНИЕ. КОНЕЦ. КОНЕЦ. - person user1506424; 27.08.2013
comment
спасибо за воспроизведение, я уже сделал код, например, проверьте приведенный выше код. - person user1506424; 27.08.2013
comment
Я лично попытался бы проверить любые условия, которые могут произойти (например, школа уже существует, данные об учениках неполные и т. Д.), Вместо того, чтобы бросать кучу НЕТ-ОШИБОК и обрабатывать их. Небольшое примечание: вам не хватает обязательного TO в BUFFER-COPY source TO target. - person Jensd; 27.08.2013
comment
добавил ТО :-) Отказ от использования компилятора. Я считаю, что во время тестирования полезно добавить проверку и обработку ошибок по мере необходимости. Когда вы решите все мелкие проблемы и будете готовы к окончательному тестированию и развертыванию, вы решите, где имеет смысл выполнять перехват ошибок и составление отчетов. Наиболее распространенные ошибки при копировании буфера возникают, когда в таблице TO есть обязательные поля, которые не инициализируются. А без утверждения проверки вы не сразу узнаете, есть ли проблемы с вашими триггерами. Что может не быть проблемой в зависимости от того, на каком уровне цепочки вы находитесь. - person AquaAlex; 29.08.2013

Я не буду делать буферную копию из одной таблицы в другую, у вас могут быть проблемы с индексом, как я думаю, у вас есть.

Лучше определите временную таблицу, такую ​​как целевая таблица.

Затем сделайте буферную копию во временную таблицу.

Вставьте правый ключ в временный стол.

Затем сделайте буферную копию из временной таблицы с правильными ключевыми полями в целевую таблицу.

Попробуйте следующее:

Определите временную школу как школу.

найти первого ученика без блокировки и так далее.

буферная копия ученика в t-школу.

Назначьте t-school.location = "something".

буферная копия т-школы в школу.

Вуаля!

person Carlos    schedule 30.08.2013

Один из возможных способов отладки проблемы - использовать «Недавние сообщения» в справке в AppBuilder при условии, что вы можете запускать код прямо из него.

person kiran    schedule 03.03.2014