ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.



 

Часть 18

Перевод всей документации выполнил Сергей АгАрков. Если возникли
какие-либо вопросы или  предложения по качеству  перевода, обра-
щайтесь:

Jew Smile MO Station 2:5040/22.3 Serg Agarkoff +7-(421)-626-8486
время работы станции с 15:00  до 23:30 по московскому времени  в
будние дни и круглосуточно в  выходные и праздники. По этому  же
телефону меня можно застать с 3:00 до 12:00 по московскому  вре-
мени. Спросить капитана Агаркова.

Домашний телефон +7-(421)-626-8486 чс 13:00 до 0:30 по москве.

		   КОМАНДЫ РАБОТЫ С ЗАПИСЯМИ

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
ADD                                      (добавить новую запись)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             ADD(файл,[длина])
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

файл                Метка файла.

длина               Целочисленная константа, переменная или  вы-
		    ражение, содержащее число байт, записываемых
                    в файл. ДЛИНА должная быть больше нуля но не
                    больше  длины  структуры  RECORD. Если ДЛИНА
                    пропущена или выходит за разрешенный  диапа-
                    зон, то она сбрасывается до длины  структуры
                    RECORD.

Оператор ADD создает в файле новую запись и заполняет ее данными
из буфера структуры RECORD. При выполнении ADD, обновляются  все
ключевые файлы (НЕ индексы!). Если происходит какая-либо ошибка,
то запись не добавляется в файл. Конкретное действие ADD зависит
от файлового драйвера.

Если на диске не хватает  места для размещения новой записи,  то
возвращается ошибка "Доступ запрещен".

Возвращаемые ошибки:
	 05 Доступ запрещен
	 37 Файл еще не открыт
	 40 Такой ключ уже есть

Пример:

  ADD(Customer)                       !Заносим данные о новом
  				      !  покупателе
  IF ERRORCODE() THEN STOP(ERROR()).  !и проверяем на нали-
				      !  чие ошибок.

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
APPEND                                   (добавить новую запись)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             APPEND(файл[,длина])
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

файл                Метка файла.

длина               Целочисленная константа, переменная или  вы-
		    ражение, содержащее число байт, записываемых
                    в файл. ДЛИНА должная быть больше нуля но не
                    больше  длины  структуры  RECORD. Если ДЛИНА
                    пропущена или выходит за разрешенный  диапа-
                    зон, то она сбрасывается до длины  структуры
                    RECORD.

Оператор APPEND вводит в файл данных новую запись из буфера, вы-
деленного под структуру  RECORD. Ключевые файлы  НЕ обновляются.
После добавления записи командой APPEND, надо перестроить  ключи
командой BUILD. Обчно APPEND используется для пакетного добавле-
ния нескольких записей в один прием (С.П.А - без обновления клю-
че, добавление записи, разумеется, происходит быстрее).

Если на диске не хватает  места для размещения новой записи,  то
возвращается ошибка "Доступ  запрещен". Конкретное действие  AP-
PEND зависит от файлового драйвера.

Возвращаемые ошибки:
	 05 Доступ запрещен
	 37 Файл еще не открыт

Пример:

  LOOP UNTIL EOF(InFile)         !Обработка входного файла
    NEXT(InFile)                 ! читаем все записи подряд
      IF ERRORCODE() THEN STOP(ERROR()).      ! Есть ошибки?
    Cus:Record = Inf:Record      !Копируем данные в буфер файла
    				 !  покупателей
    APPEND(Customer)             ! и ДОБАВЛЯЕМ новую запись в
				 !  этот файл
      IF ERRORCODE() THEN STOP(ERROR()).      ! Есть ошибки?
  .                              !Конец цикла обработки
  BUILD(Customer)                !А теперь перестроим ключи...

См. также:    BUILD

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
DELETE                                          (удалить запись)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             DELETE(файл)
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

файл                Метка файла.

Этот оператор  удаляет последнюю  запись, к  которой происходило
обращение операторами  NEXT, PREVIOUS,  GET, ADD  или PUT. Также
удаляются сведения об этой записи из ключевых файлов. DELETE  не
очищает буфер структуры RECORD, таким образом, данные  удаленной
записи остаются по-прежнему доступны до тех пор, пока содержимое
буфера RECORD не изменится.

Если не было обращения к какой-либо записи или запись блокирова-
на другой рабочей станчией, DELETE возвращает ошибку "Запись не-
доступна" и удаления записи не происходит. Точное действие  опе-
ратора DELETE зависит от файлового драйвера.

Возвращаемые ошибки:
	  05 Доступ запрещен
	  33 Запись недоступна

Пример:

Customer  FILE,DRIVER('Clarion'),PRE(Cus)
NameKey     KEY(Cus:Name),OPT
NbrKey      KEY(Cus:Number),OPT
Rec         RECORD
Name          STRING(20)
Number        SHORT
          . .

     CODE
     Cus:Number = 12345              !Инициализируем ключевое
     				     !  поле
     GET(Customer,Cus:NbrKey)        !Читаем соответствующую ему
				     !  запись
       IF ERRORCODE() THEN STOP(ERROR()).
     DELETE(Customer)                !Если это то, что нам надо,
				     !  то удаляем эту запись.

См. также: ADD, GET, HOLD, NEXT, PREVIOUS, PUT

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
GET                          (считать запись по прямому доступу)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
                  іфайл,ключ                     і
             GET( іфайл,указатель_в_файле[,длина]і )
                  іключ,указатель_в_ключе        і
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

файл                Метка файла.

ключ                Метка ключа или индекса.

указатель_в_файле   Числовая константа,  переменная  или выраже-
		    ние, содержащая значение, возвращаемое функ-
                    цией POINTER(файл). Конкретное значение  за-
                    висит от файлового драйвера.

указатель_в_ключе   Числовая константа,  переменная  или выраже-
		    ние, содержащая значение, возвращаемое функ-
                    цией POINTER(ключ). Конкретное значение  за-
                    висит от файлового драйвера.

длина               Целочисленная константа, переменная или  вы-
		    ражение, содержащее число байт, записываемых
                    в файл. ДЛИНА должная быть больше нуля но не
                    больше  длины  структуры  RECORD. Если ДЛИНА
                    пропущена или выходит за разрешенный  диапа-
                    зон, то она сбрасывается до длины  структуры
                    RECORD.

Оператор GET находит заданную  запись в файле даных  и считывает
ее в буфер структуры RECORD. Прямой доступ к записи  осуществля-
естя либо по относительному номеру записи в файле либо  совпаде-
нию ключевого поля со значением заданного ключа.

GET(файл,ключ)      Получает  первую  запись  из файла (согласно
                    ключу), которая содержит значения, совпадаю-
                    щие со значениями компонент ключа.

GET(файл,указатель_в_файле[,длина])
                    Получает запись из файла на которую указыва-
                    ет указатель_в_файле. Если указатель_в_файле
                    равен нулю, то  указатель на текущую  запись
                    очищается и запись не считывается.

GET(ключ,указатель_в_ключе)
		    Получает запись на которую указывает  указа-
                    тель_в_ключе.

Значения указателя_в_файле и указателя_в_ключе зависят от файло-
фого драйвера. Это может быть: номер записи; номер байта в  фай-
ле или какой-либо другой вид "опорной точки" в файле. Если  зна-
чение указателя_в_файле или указателя_в_ключе выходят за  разре-
шенные пределы или в файле нет подходящих по значениям  записей,
возникает ошибка "Запись не найдена".

Возвращаемые ошибки:
	  35 Запись не найдена
	  37 Файл еще не открыт
	  43 Запись уже заблокирована

Пример:

Customer  FILE,DRIVER('Clarion'),PRE(Cus)
NameKey     KEY(Cus:Name),OPT
NbrKey      KEY(Cus:Number),OPT
Rec         RECORD
Name          STRING(20)
Number        SHORT
          . .
   CODE
   Cus:Name = 'Clarion'      !Инициализируем ключевое поле
   GET(Customer,Cus:NameKey) ! получаем соответствующую запись
     IF ERRORCODE() THEN STOP(ERROR()).

   GET(Customer,3)           !Читаем третью физическую запись
			     !  файла
     IF ERRORCODE() THEN STOP(ERROR()).

   GET(Cus:NameKey,3)        !Получаем третью запись в порядке,
			     !  задаваемом ключом NameKey
     IF ERRORCODE() THEN STOP(ERROR()).

См. также: POINTER, DUPLICATE

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
HOLD                               (монопольный доступ к записи)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             HOLD(файл[,секунды])
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

файл                Метка файла, открытого для совместного  дос-
                    тупа.

seconds             Числовая константа  или переменная,  которая
                    задает максимальное время ожидания в  секун-
		    дах.

Оператор HOLD включает блокирование записи для следующих за  ним
операторов GET, NEXT илиr PREVIOUS в многопользовательской  сре-
де. Когда GET, NEXT или PREVIOUS успешно захватывают запись, они
выставляют  флажок  "held"  (заблокирована).  Обычно это не дает
остальным пользователям изменять эту запись, но не мешает читать
ее. Конкретное действие HOLD зависит от файлового драйвера.

HOLD(файл)          Запускает процесс блокировки так, что после-
                    дующие GET, NEXT  или PREVIOUS пытаются  за-
                    хватить запись до тех пор, пока это не удаст
		    ся. Если запись уже захвачена другой рабочей
                    станцией,  то  эти  операторы  будут ожидать
                    освобождения этой записи.

HOLD(файл,секунды)  Запускает процесс так, что последующие  GET,
                    NEXT или PREVIOUS вернут ошибку "Запись  уже
                    заблокирована", если  за заданное  число се-
                    кунд они не смогут захватить ее.

В один момент  времени только одна  запись в каждом  файле может
быть заблокирована.  Если происходит  обращение к  другой записи
этого файла, то захваченная ранее запись автоматически  освобож-
дается.

Так же как и  для LOCK, существует проблема  "смертельного объя-
тия". Оно возникает когда две рабочих станции пытаются захватить
один и тот  же нвбор записей,  но в разной  последовательности и
обе они используют оператор HOLD(файл). Одна станция уже  захва-
тила запись, которую пытается захватить другая и наоборот.  Этой
проблемы можно избежать, используя оператор HOLD(файл,секунды) и
отслеживая возникновение ошибки "Запись уже заблокирована".

Пример:

  LOOP                        !Цикл во избежание "смертельного
  			      !  объятия"
    HOLD(Master,1)    !1 секунду пытаемся захватить запись глав-
		      !  ного файла
    GET(Master,1)             !Читаем и блокируем запись
    IF ERRORCODE() = 208      !Если кто-то уже захватил ее, то
      BEEP(0,100); CYCLE      ! подождем секунду и попробуем
			      ! снова
    .
    HOLD(Detail,1)    !1 секунду пытаемся захватить запись из
		      !  файла подробностей
    GET(Detail,1)             !Читаем и блокируем запись
    IF ERRORCODE() = 208      !Если кто-то уже захватил ее, то
      RELEASE(Master)         ! освободим захваченную ранее,
      BEEP(0,100); CYCLE      ! подождем секунду и попробуем
			      ! снова
  . .                         !Конец операторов IF и LOOP

См. также: RELEASE, GET, NEXT, PREVIOUS

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
NEXT             (прочитать следующую запись последовательности)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             NEXT(файл)
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

файл                Метка файла.

NEXT читает из файла данных следующую, в ранее заданной последо-
вательности, запись и заносит ее в буфер структуры RECORD.  Опе-
ратор SET устанавливает последовательность, в которой будут счи-
тываться записи. Первый NEXT, выполнившийся сразу после SET, чи-
тает запись в позиции, установленной оператором SET. Последующие
NEXT-ы читают следующие записи в этой последовательности. После-
довательность не изменяется операторами GET, ADD, PUT или  DELE-
TE.

Выполнение NEXT, перед которым не был выполнен SET, или  попытка
считать запись после конца файла, приводит к ошибке "Запись  не-
доступна".

Возвращаемые ошибки:
	  33 Запись недоступна
	  37 Файл еще не открыт
	  43 Запись уже заблокирована

Пример:

  SET(Cus:NameKey)         !Начинаем с начала файла, последова-
			   !  тельность задается ключом NameKey.
  LOOP UNTIL EOF(Customer) !Читаем все, что можно, до конца фай-
  			   !  ла
    NEXT(Customer)         ! последовательно читаем записи
      IF ERRORCODE() THEN STOP(ERROR()).
    DO PostTrans           ! вызываем процедуру обслуживания
			   !  транзакций.
  .                        !Конец цикла

См. также: SET, PREVIOUS, EOF, HOLD

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
PREVIOUS        (прочитать предыдущую запись последовательности)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             PREVIOUS(файл)
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

файл                Метка файла.

PREVIOUS читает из файла данных предыдущую, в ранее заданной по-
следовательности, запись и заносит ее в буфер структуры  RECORD.
Оператор SET устанавливает  последовательность, в которой  будут
считываться записи. Первый  PREVIOUS, выполнившийся сразу  после
SET, читает запись в позиции, установленной оператором SET.  По-
следующие PREVIOUS-ы :) читают следующие записи этой  последова-
тельности В ОБРАТНОМ  ПОРЯДКЕ. Последовательность не  изменяется
операторами GET, ADD, PUT или DELETE.

Выполнение PREVIOUS, перед которым не был выполнен SET, или  по-
пытка считать запись перед началом файла, приводит к ошибке "За-
пись недоступна".

Возвращаемые ошибки:
	   33 Запись недоступна
	   37 Файл еще не открыт
	   43 Запись уже заблокирована

Пример:

  SET(Trn:DateKey)      !Устанавливаем последовательность обра-
			!  ботки записей
  LOOP UNTIL BOF(Trans) !Читаем все записи в обратном порядке
    PREVIOUS(Trans)     !  читаем записи последовательно
      IF ERRORCODE() THEN STOP(ERROR()).
    DO LastInFirstOut   !  вызываем процедуру LIFO
  .                     !Конец цикла

См. также: SET, NEXT, BOF, HOLD

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
PUT                             (записать запись обратно в файл)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             PUT(файл[,указатель_в_файле][,длина])
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

файл                Метка файла.

указатель_в_файле   Числовая константа,  переменная  или выраже-
		    ние, содержащая значение, возвращаемое функ-
                    цией POINTER(файл). Конкретное значение  за-
                    висит от файлового драйвера.

длина               Целочисленная константа, переменная или  вы-
		    ражение, содержащее число байт, записываемых
                    в файл. ДЛИНА должная быть больше нуля но не
                    больше  длины  структуры  RECORD. Если ДЛИНА
                    пропущена или выходит за разрешенный  диапа-
                    зон, то она сбрасывается до длины  структуры
                    RECORD.

Оператор PUT записывает содержимое буфера RECORD в последнюю за-
пись, к которой производилось обращение.

PUT(файл)           Записывает запись в то место, к которому по-
                    следний раз обращались NEXT, PREVIOUS,  GET,
		    или ADD.  Если изменились  значения ключевых
                    полей, то ключи (НЕ индексы!) обновляются.

PUT(файл,указатель_в_файле)
		    Записывает  запись  в  то  место, на которое
		    указывает указатель_в_файле и обновляет клю-
		    чи.

PUT(файл,указатель_в_файле,длина)
                    Записывает ДЛИНА байтов в то место, на кото-
		    рое указывает указатель_в_файле и  обновляет
                    ключи.

Если к записи не было обращения операторами NEXT, PREVIOUS,  GET
и ADD или она была удалена, то возвращается ошибка "Запись недо-
ступна". PUT также модет  вернуть ошибку "Такой ключ  уже есть".
При возникновении какой-либо ошибки файл не изменяется.

Возвращаемые ошибки:
	  05 Доступ запрещен
	  33 Запись недоступна
	  40 Такой ключ уже есть

Пример:

  SET(Trn:DateKey)      !End/Beginning of file in keyed sequence
  LOOP UNTIL BOF(Trans) !Читаем все записи в обратном порядке
    PREVIOUS(Trans)     ! одну за другой
      IF ERRORCODE() THEN STOP(ERROR()).
    DO LastInFirstOut   !Вызываем процедуру LIFO
    PUT(Trans)        !Записываем транзакцию обратно в файл
      IF ERRORCODE() THEN STOP(ERROR()).
  .                     !Конец цикла

См. также:  NEXT, PREVIOUS, GET, ADD

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
RELEASE                      (освободить заблокированную запись)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             RELEASE(файл)
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

файл                Метка файла.

Оператор RELEASE освобождает захваченную ранее запись. Он не мо-
жет освободить  запись, захваченную  другим пользователем.  Если
запись не захвачена или захвачена другим пользователем, то  этот
оператор игнорируется.

Пример:

  LOOP                !Цикл во избежание "смертельного объятия"
    HOLD(Master,1)    !1 секунду пытаемся захватить главный файл
    GET(Master,1)        !получаем и блокируем запись
    IF ERRORCODE() = 208 !если кто-то успел раньше нас, то
      BEEP(0,100)        ! секунду подождем
      CYCLE              ! и попробуем еще раз
    .

    HOLD(Detail,1)       !1 секунду пытаемся захватить файл
    			 !  подробностей
    GET(Detail,1)        !получаем и блокируем запись
    IF ERRORCODEO = 208  !если кто-то успел раньше нас, то
      RELEASE(Master)    ! осободим запись, захваченную ранее
      BEEP(0,100)        ! секунду подождем
      CYCLE              ! и попробуем еще раз
  . .                    !Конец операторов IF и LOOP

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
RESET                           (сброс указателя текущей записи)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             RESET(последовательность,строка)
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

последовательность  Метка файла, ключа или индекса.

строка              Строка, возвращаемая функцией POSITION.

RESET устанавливает указатель записи на запись, задаваемую стро-
кой, возвращаемой функцией POSITION. После того, как RESET уста-
новил указатель, NEXT или PREVIOUS могут считать эту запись.

Значение, содержащееся в СТРОКЕ, и его длина зависят от файлово-
го драйвера.  RESET, обычно,  испоьзуется вместе  с POSITION для
временного изменения порядка обработки записей.

Пример:

RecordQue      QUEUE,PRE(Dsp)
QueFields        LIKE(Trn:Record),PRE(Dsp)
               .
SavPosition    STRING(260)
  CODE
  SET(Trn:DateKey)                !Top of file in keyed sequence
  LOOP                            !Последовательно читаем
    NEXT(Trans)                   ! записи, одну за другой
      IF ERRORCODE() THEN STOP(ERROR()).
    RecordQue = Trn:Record        !Помещаем запись в очередь
    ADD(RecordQue)                !
      IF ERRORCODE() THEN STOP(ERROR()).
    IF RECORDS(RecordQue) >= 20 OR EOF(Trans)
                                  !В очереди 20 записей?
      SavPosition = POSITION(Trn:DateKey)  !сохраним указатель
      					   !на текущую запись
      DO DisplayQue               !Выведем очередь на экран
      FREE(RecordQue)             ! и очистим ее
      IF EOF(Trans) THEN BREAK.
                         !Если обработаны все записи, то выходим
      RESET(Trn:DateKey,SavPosition)   !Сбрасываем указатель
  . .                                  !Конец цикла

См. также: POSITION, NEXT, PREVIOUS

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
SET              (инициировать последовательную обработку файла)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
                  і            файл           і
             SET( і         файл,ключ         і )
                  і  файл,указатель_в_файле   і
                  і            ключ           і
                  і         ключ,ключ         і
                  і  ключ,указатель_в_ключе   і
                  іключ,ключ,указатель_в_файлеі
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

файл                Метка файла. Этот параметр указывает на  то,
                    что обработка  происходит в  том порядке,  в
                    котором записи физически расположены в  фай-
                    ле.

ключ                Метка ключа или индекса. Если этот  параметр
                    стоит первым, то обработка просиходит в  по-
                    следовательности, задаваемой ключом или  ин-
                    дексом.

указатель_в_файле   Числовая константа, переменная  или выраже-
		    ние,  для  значения,  возвращаемого функцией
                    POINTER(файл).  Конкретное  значение зависит
                    от файлового драйвера.

указатель_в_ключе   Числовая константа, переменная  или выраже-
		    ние,  для  значения,  возвращаемого функцией
		    POINTER(ключ).  Конкретное  значение зависит
		    от файлового драйвера.

SET инициирует последовательную обработку файла. SET НЕ считыва-
ет запись, а только устанавливает порядок обработки и  начальную
точкц для последующих операторов NEX или PREVIOUS. Первый  пара-
метр определяет порядок обработки записей. Второй и третий - за-
дают первую обрабатываемую  запись (начальную точку  обработки).
Если они  опущены, то  обработка начнется  с начала  (или конца)
файла.

SET(файл)           Задает обработку в физической последователь-
                    ности с начала (SET .. NEXT) или конца  (SET
		    ..PREVIOUS) файла.

SET(файл,ключ)      Обработка  в физическом  порядке,  начиная с
                    первой записи, значения ключевых полей кото-
                    рой,  ближе  всего  подходят к установленным
                    ранее значениям компонент ключа.

SET(файл,указатель_в_файле)
		    Обработка  в  физическом  порядке, начиная с
                    записи,  на  которую  указывает указатель_в_
		    файле.

SET(ключ)           Обработка в  последовательности,  задаваемой
                    ключом, с начала (SET..NEXT) или конца  (SET
		    ..PREVIOUS) файла в этой последовательности.

SET(ключ,ключ)      Обработка в  последовательности,  задаваемой
                    ключом, начиная с записи, значения  ключевых
                    полей которой, наиболее близки к установлен-
                    ным значениям компонент ключа.

SET(ключ,указатель_в_ключе)
		    Обработка  в  последовательности, задаваемой
                    ключом, начиная с записи, на которую  указы-
		    вает указатель_в_ключе.

SET(ключ, ключ, указатель_в_файле)
                    Обработка по ключу, начиная с записи, содер-
                    жащей данные, наиболее близкие к содержимому
                    компонент ключа в (с - ?) конкретной записи,
                    задаваемой указателем_в_файле.

Если второй параметр - ключ, то обработка начнется с первой  за-
писи, содержащей значения,  наиболее близкие к  значениям компо-
нент ключа  или индекса.  Если найдено  ТОЧНОЕ совпадение,  то и
NEXT и PREVIOUS считают найденную запись. Если нет точного  сов-
падения, то NEXT прочитает запись с ближайшим БОЛЬШИМ значением,
а PREVIOUS - с ближайши меньшим.

Значения указателя_в_файле и указателя_в_ключе зависят от файло-
вого драйвера. Это может быть номер записи, относительный  номер
байта в файле или какой  либо иной вид "опорной точки"  в файле.
Эти параметры используются для начала обработки с конкретной за-
писи в файле.

Пример:

  SET(Customer)          !Обработка в физическом порядке

  Cus:Name = 'Smith'
  SET(Customer,Cus:NameKey)
         !Обработка в физическом порядке, начиная с записи, в
	 !  которой поле Name = 'Smith'

  SavePtr = POINTER(Customer)
  SET(Customer,SavePtr)
         !Обработка в физическом порядке, начиная с записи,
	 !  физический номер которой хранится в SavePtr

  SET(Cus:NameKey)
         !Обработка в порядке, задаваемом ключом NameKey

  SavePtr = POINTER(Cus:NameKey)
  SET(Cus:NameKey,SavePtr)
         !Обработка в порядке, задаваемом ключом NameKey, с за-
	 !  писи, относительный номер которой в ключе содержит
	 !  SavePtr

  Cus:Name = 'Smith'
  SET(Cus:NameKey,Cus:NameKey)
         !Обработка в порядке, задаваемом ключом NameKey, начи-
	 !  ная с первой записи, в которой поле = 'Smith'

  Cus:Name = 'Smith'
  SavePtr = POINTER(Customer)
  SET(Cus:NameKey,Cus:NameKey,SavePtr)
         !Обработка в порядке, задаваемом ключом NameKey,
	 ! Name = 'Smith' и номер записи = SavePtr

(С.П.А. - Я, лично, не совсем понял пятый и седьмой пункты, при-
 дется проверять экспериментально)

См. также: NEXT, PREVIOUS, KEY, RECORD, POINTER

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
SKIP                    (пропустить записи в последовательности)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             SKIP(файл,count)
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

файл                Метка файла.

count               Числовая константа или переменная. COUNT за-
                    дает число пропускаемых записей. Если значе-
                    ние  положительное,  то  записи пропускаются
                    ВПЕРЕД (аналогично NEXT). Если же COUNT  от-
                    рицательно,  то  записи  пропускаются  НАЗАД
                    (аналогично PREVIOUS).

Оператор SKIP используется для пропуска записей во время  после-
довательной обработки файла. Он пропускает записи в порядке, за-
даваемом оператором SET, перемещая  указатель записи в файле  на
COUNT записей вперед или назад. SKIP более эффективен, чем  NEXT
или PREVIOUS  при пропуске  нескольких записей,  поскольку он НЕ
считывает записи в буфер, отведенный под структуру RECORD.

Если SKIP пытается выйти за  конец или начало файла, то  функции
EOF() и BOF() возвращают истину. Если ранее не был выполнен SET,
то SKIP игнорируется.

Пример:

  SET(Itm:InvoiceKey)          !Начинаем от начала файла товаров
  LOOP UNTIL EOF(Items)        !Обрабатываем все записи
    NEXT(Items)                !Читаем запись
      IF ERRORCODE() THEN STOP(ERROR()).
    IF Itm:InvoiceNo <> SavinvNo  !Если это первый товар в зака-
    				  !  зе, то
      Hea:InvoiceNo = Itm:InvoiceNo  !инициализируем ключевое
				     ! поле и
      GET(Header,Hea:InvoiceKey)
                               !получаем соответствующий ему за-
			       ! головок столбца
        IF ERRORCODE() THEN STOP(ERROR()).
      IF Hea:InvoiceStatus = 'Cancel'   !Если заказ отменен,
        SKIP(Items,Hea:ltemCount-1)     ! то пропускаем осталь-
					! ные товары
        CYCLE                           ! и обрабатываем следую-
					!  щий заказ
    . .                                 ! конец операторов IF
    DO ItemProcess                      ! обрабатываем товар
    SavInvNo = Itm:lnvoiceNo            ! сохраняем номер счета
  .                                     !Конец цикла

		    ФУНКЦИИ РАБОТЫ С ФАЙЛОМ

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
BOF                                               (начало файла)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             BOF(файл)
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

файл                Метка файла.

Функция BOF возвращает НЕнулевое значение (истину), если  опера-
торами PREVIOUS  или SKIP(-count)  была прочитана  или пропущена
самая первая запись последовательности. В противном случае  воз-
вращается ноль (ложь).

Функция BOF наиболее часто исполльзуется для проверки условия  в
цикле LOOP UNTIL. Поскольку  условие выполнения этого цикла  вы-
числяется в НАЧАЛЕ цикла,  то BOF вернет ИСТИНУ  после прочтения
первой записи последовательности.

Тип возвращаемого результата: LONG

Пример:

  SET(Trn:DateKey)      !Пляшем от конца файла по ключу
  LOOP UNTIL BOF(Trans)        !Обрабатываем файл с конца
    PREVIOUS(Trans)            !  последовательно читая записи
      IF ERRORCODE() THEN STOP(ERROR()).
    DO LastInFirstOut          !  вызываем процедуру LIFO
  .                            !Конец цикла

См. также: PREVIOUS, SKIP, LOOP

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
BYTES                                    (размер файла в байтах)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             BYTES(файл)
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

файл                Метка файла.

Функция BYTES возвращает  размер в байтах  либо файла, либо  по-
следней записи, к которой  было обращение. Если выполнить  BYTES
сразу после открытия  файла, то она  вернет размер этого  файла.
После того, как  к файлу обратились  операторами GET, NEXT,  ADD
или PUT, BYTES верней размер в байтах запис, прочитанной в струк
туру RECORD.  Функцию BYTES  можно использовать  для того, чтобы
узнать, сколько было прочитано байт при работе с записями  пере-
менной длины.

Пример:

   OPEN(DosFile)                  !Открыть файл
   IF (BYTES(DosFile) % 80) > 0   !Check for short record
      SavPtr = INT(BYTES(DosFile)%80)+1
                                  ! compute short record pointer
   ELSE
      SavPtr = BYTES(DosFile)/80  ! compute last record pointer
   .
   GET(DosFile,SavPtr)            !Get the last record
   LastRec = BYTES(DosFile)       !Save size of the short record

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
DUPLICATE             (проверить на дублирование ключевых полей)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             DUBLICATE(іключі)
                       іфайлі
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

ключ                Метка описания ключа.

файл                Метка файла.

Функция DUPLICATE возвращает  НЕнулевое значение (истину),  если
при внесении записи в файл возникла ошибка "Такой ключ уже есть"
("CREATES DUPLICATE KEY"). Если задан параметр КЛЮЧ, то проверя-
ется заданный ключевой файл.  С параметром ФАЙЛ проверяются  все
ключи, описанные без атрибута DUP.

Функция DUPLICATE подразумевает, что содержимое структуры RECORD
аналогично содержимому  записи, на  которую указывает  указатель
текущей записи.  Таким образом,  при использовании  DUPLICATE ДО
добавления записи, указатель  текущей записи должен  быть очищен
командой GET(файл,0).

Тип возвращаемого результата: LONG

Пример:

  IF Action = 'ADD' THEN GET(Vendor,0).
                              !При добавлении очищаем указатель
  IF DUPLICATE(Vendor)        !Если такой продываец уже есть, то
    SCR:MESSAGE = 'Уже есть продавец с таки номером'
                              ! выводим сообщение
    SELECT(?)                 ! и снова ждем ввода в тоже самое
			      !  поле
  .                           !Конец оператора if

См. также: GET

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
EOF                                                (конец файла)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             EOF(файл)
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

файл                Метка файла.

Функция  EOF  возвращает  ИСТИНУ  (НЕ  ноль) если была прочитана
(оператором NEXT) или пропущена (оператором SKIP) последняя  за-
пись последовательности.  В противном  случае возвращается  ЛОЖЬ
(нулевое значение). Функция EOF обычно используется для проверки
условия в циклах LOOP UNTIL. Поскольку условие в таком цикле вы-
числяется в начале цикла, то  EOF вернет ИСТИНУ после того,  как
будет прочитана последняя запись.

Тип возвращаемого результата: LONG

Пример:

  SET(Trn:DateKey)      !Пляшем от начала файла по ключу
  LOOP UNTIL EOF(Trans)        !Обрабатываем файл с начала,
    PREVIOUS(Trans)            !  последовательно читая записи
      IF ERRORCODE() THEN STOP(ERROR()).
    DO LastInFirstOut          !  вызываем процедуру LIFO
  .                            !Конец цикла

См. также: NEXT, SKIP, LOOP

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
POINTER                             (относительный номер записи)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             POINTER(іфайлі)
                     іключі
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

файл                Метка файла. Этим указывается на  физическое
                    расположение записей в файле.

ключ                Метка ключа  или индекса.  Это указывает  на
                    порядок записей,  задаваемый ключом  или ин-
                    дексом.

POINTER возвращает относительный номер записи в файле или в  по-
следовательности либо относительное  положение указателя на  за-
пись в ключе или индексе (в последовательности "по ключу"). Зна-
чение, возвращаемое функцией, зависит от файлового драйвера. Это
может быть номер записи,  относительный номер байта в  файле или
какой-либо другой вид "опорной точки в файле".

Тип возвращаемого результата: LONG

Пример:

  SavePtr# = POINTER(Customer)   !Сохраняем указатель на запись

См. также: SET

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
POSITION                     (номер записи в последовательности)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             POSITION(последовательность)
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

последовательность  Метка файла, ключа или индекса.

POSITION возвращет строку, которая идентифицирует уникальный но-
мер записи в последовательности. POSITION возвращает положение в
файле последней записи, к которой происходило обращение (то есть
содержимое записи находится в буфере структуры RECORD).

Значение и длина возвращаемой строки зависят от файлового  драй-
вера. POSITION используется совместно с RESET для временного из-
менения порядка обработки записей, и, затем, его восстановления.

Тип возвращаемого результата: STRING

Пример:

RecordQue       QUEUE,PRE(Dsp)
QueFields         LIKE(Trn:Record),PRE(Dsp)
                .
SavPosition     STRING(260)
  CODE                            !От начала файла идем по ключу
  SET(Trn:DateKey)                !Последовательно читаем
  LOOP                            ! все записи
    NEXT(Trans)
      IF ERRORCODE() THEN STOP(ERROR()).
    RecordOue = Trn:Record        !Добавляем запись в
    ADD(RecordQue)                ! очередь
      IF ERRORCODE() THEN STOP(ERROR()).
    IF RECORDS(RecordOue) >= 20 OR EOF(Trans)
                                  !если в очереди 20 записей, то

      SavPosition = POSITION(Trn:DateKey) !сохраняем номер теку-
					  ! щей записи,
      DO DisplayQue               !показываем очередь и
      FREE(RecordQue)             ! очищаем ее
      IF EOF(Trans) THEN BREAK.
                             !Если все записи обработаны, то
			     ! заканчиваем работу
      RESET(Trn:DateKey,SavPosition) !Восстанавливаем указатель
  . .                             !Конец цикла

См. также:    RESET

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
RECORDS                                          (число записей)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             RECORDS(іфайлі)
                     іключі
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

файл                Метка файла.

ключ                Метка ключа или индекса.

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

Тип возвращаемого результата: LONG

Пример:

  SaveCount = RECORDS(Master)      !Сохраняем количество записей
  SaveNameCount = RECORDS(Nam:NameKey)
                         !Число карточек, в которых заполнено
			 ! поле NAME

См. также: KEY, INDEX, OPT

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
SEND                    (отправить сообщение файловому драйверу)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             SEND(файл,сообщение)
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

файл                Метка файла. Атрибут файла DRIVER  идентифи-
                    цирует файловый драйвер, которому адресовано
                    сообщение.

сообщение           Строковая константа или переменная, содержа-
		    щая информацию, передаваемую драйверу.

Функция SEND позволяет программе передать файловому драйверу, во
время выполнения, специфичные параметры. Примеры таких специфич-
ных параметров приведены в документации на драйвер.

Тип возвращаемого результата: STRING

Пример:

  FileCheck = SEND(ClarionFile,'RECOVER=120')
                            !Запустить восстановление для файла
			    ! в стандарте Кларион

		     ОБРАБОТКА ТРАНЗАКЦИЙ

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
COMMIT                (завершить успешно проведенную транзакцию)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             COMMIT
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

Оператор COMMIT завершает активную транзакцию. Выполнение опера-
тора COMMIT подразумевает, что транзакция успешно завершена и не
возникнет  необходимость  выполнения  ROLLBACK. После выполнения
COMMIT, выполнение ROLLBACK становится НЕВОЗМОЖНЫМ.

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

Пример:

  LOGOUT(.1,OrderHeader,OrderDetail) !Начинаем транзакцию
    DO ErrHandler                    ! нет ли ошибок?
  ADD(OrderHeader)                   !Добавим запись о родителе
    DO ErrHandler                    ! нет ли ошибок?
  LOOP X# = 1 TO RECORDS(DetailQue)
			     !Обработка сохраненных подробностей
    GET(DetailQue,X#)                !Читаем одну из очереди
      DO ErrHandler                  ! нет ли ошибок?
    Det:Record = DetailOue           !Помещаем в буфер записи
    ADD(OrderDetail)                 ! и добавляем ее в файл
      DO ErrHandler                  ! нет ли ошибок?
  .
  COMMIT                       !Завершаем успешную транзакцию

ErrHandler   ROUTINE                 !Обработчик ошибок
  IF NOT ERRORCODE() THEN EXIT.      !Ошибок нет? Вернемся.
  ROLLBACK                     !Отмена прерванной транзакции
  BEEP                               !Предупреждаем пользователя
  SHOW(25,1,'Ошибка транзакции - ' & ERROR())
  ASK                                ! и ждем нажатия клавиши
  RETURN                             ! затем возвращаемся

См. также: LOGOUT, ROLLBACK

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
LOGOUT                                       (начать транзакцию)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             LOGOUT(таймаут,файл[,файл,...,файл])
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

таймаут             Числовая константа или переменная,  задающая
                    сколько  секунд  пытаться  начать транзакцию
                    для файла(ов), прежде чем прервать ее и вер-
                    нуть ошибку.

файл                Метка файла.  Можно  задать сразу  несколько
                    параметров ФАЙЛ, рзделенных запятыми. Должны
                    быть перечислены  все файлы,  учавствующие в
                    транзакции.

Оператор LOGOUT начинает обработку транзакции для заданного фай-
ла или набора файлов. Все задействованные файлы должны  работать
с одним и тем же файловым драйвером. LOGOUT сообщает драйверу  о
начале транзакции. Драйвер, в свою очередь, выполняет  действия,
необходимые в его файловой системе для начала обработки транзак-
ции в  заданном наборе  файлов. Если  файловая система  требует,
чтобы файлы были заблокированы перед началом транзакции, то LOG-
OUT автоматически блокирует их (для этого и нужен ТАЙМАУТ).

Только одна транзакция,  инициированная через LOGOUT,  может вы-
полняться одновременно. Второй LOGOUT (без предварительного COM-
MIT или ROLLBACK) останавливает программу с сообщением об ошибке
и вываливается в DOS.

Возвращаемые ошибки:
	  32 Файл уже заблокирован

Пример:

  LOGOUT(,1,OrderHeader,OrderDetail) !Начинаем транзакцию
    DO ErrHandler                    ! нет ли ошибок?
  ADD(OrderHeader)                   !Добавим запись о родителе
    DO ErrHandler                    ! нет ли ошибок?
  LOOP X# = 1 TO RECORDS(DetailQue)
				  !Обработка сохраненных подробностей
    GET(DetailQue,X#)                !Читаем одну из очереди
      DO ErrHandler                  ! нет ли ошибок?
    Det:Record = DetailQue           !Помещаем в буфер записи
    ADD(OrderDetail)                 ! и добавляем ее в файл
      DO ErrHandler                  ! нет ли ошибок?
  .
  COMMIT                       !Завершаем успешную транзакцию

ErrHandler   ROUTINE                 !Обработчик ошибок
  IF NOT ERRORCODE() THEN EXIT.      !Ошибок нет? Вернемся.
  ROLLBACK                     !Отмена прерванной транзакции
  BEEP                               !Предупреждаем пользователя
  SHOW(25,1,'Ошибка транзакции - ' & ERROR())
  ASK                                ! и ждем нажатия клавиши
  RETURN                             ! затем возвращаемся

См. также: COMMIT, ROLLBACK

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
ROLLBACK                        (завершить ошибочную транзакцию)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             ROLLBACK
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

Оператор ROLLBACK завершает текущую транзакцию как и COMMIT. Вы-
полнение оператора ROLLBACK подразумевает, что транзакция прошла
НЕВЕРНО и база данных нуждается в восстановлении в то состояние,
в котором она была до транзакции.

ROLLBACK сообщает файловому драйверу, участвующему в транзакции,
о том, что временные  файлы, необходимые для возвращения  базы в
первоначальное состояние, должны быть использованы для восстано-
вления базы. Драйвер, в свою очередь, выполняет действия,  кото-
рые необходимы в его файловой системе для отката транзакции.

Пример:

  LOGOUT(,1,OrderHeader,OrderDetail) !Начинаем транзакцию
    DO ErrHandler                    ! нет ли ошибок?
  ADD(OrderHeader)                   !Добавим запись о родителе
    DO ErrHandler                    ! нет ли ошибок?
  LOOP X# = 1 TO RECORDS(DetailQue)
				  !Обработка сохраненных подробностей
    GET(DetailQue,X#)                !Читаем одну из очереди
      DO ErrHandler                  ! нет ли ошибок?
    Det:Record = DetailQue           !Помещаем в буфер записи
    ADD(OrderDetail)                 ! и добавляем ее в файл
      DO ErrHandler                  ! нет ли ошибок?
  .
  COMMIT                       !Завершаем успешную транзакцию

ErrHandler   ROUTINE                 !Обработчик ошибок
  IF NOT ERRORCODE() THEN EXIT.      !Ошибок нет? Вернемся.
  ROLLBACK                     !Отмена прерванной транзакции
  BEEP                               !Предупреждаем пользователя
  SHOW(25,1,'Ошибка транзакции - ' & ERROR())
  ASK                                ! и ждем нажатия клавиши
  RETURN                             ! затем возвращаемся

См. также: LOGOUT, COMMIT



Яндекс цитирования