Структура файла даных..................................... 11-1
FILE (описание структуры файла данных)............... 11-1
CREATE (разрешает создание файла).................... 11-3
DRIVER (задает тип файла данных)..................... 11-3
ENCRYPT (шифровать файл данных)...................... 11-4
OWNER (задает пароль для шифрования файла данных).... 11-4
RECLAIM (использовать место от удаленных записей).... 11-5
Операторы структуры файла................................. 11-6
INDEX (описывает статический индекс для файла)....... 11-6
KEY (описывает динамический индекс (ключ) для файла). 11-7
MEMO (описывает текстовое поле)...................... 11-8
RECORD (описывает структуру записи).................. 11-9
Атрибуты для INDEX, KEY и MEMO............................ 11-10
BINARY (MEMO содержит двоичные данные)............... 11-10
DUP (разрешить повторяющиеся значения полей ключа)... 11-10
NOCASE (KEY или INDEX - НЕ чувствительны к регистру). 11-11
OPT (пустые или нулевые ключевые поля отбрасываются). 11-11
Команды работы с файлами.................................. 11-12
BUILD (построить ключи и/или индексы для файла)...... 11-12
CLOSE (закрыть файл данных).......................... 11-14
COPY (копировать файл данных)........................ 11-14
CREATE (создать пустой файл данных).................. 11-15
EMPTY (очистить файл данных)......................... 11-15
FLUSH (сбросить буфера ДОС на диск).................. 11-16
LOCK (монопольный доступ к файлу).................... 11-17
OPEN (открыть файл данных)........................... 11-18
PACK (физически стереть удаленные записи)............ 11-19
REMOVE (стереть файл данных)......................... 11-19
RENAME (переименовать файл данных)................... 11-20
SHARE (открыть файл данных).......................... 11-21
STREAM (разрешить буферизацию через ДОС)............. 11-22
UNLOCK (разблокировать заблокированный файл)......... 11-23
Команды работы с записями................................. 11-24
ADD (добавить новую запись).......................... 11-24
APPEND (добавить новую запись)....................... 11-25
DELETE (удалить запись).............................. 11-26
GET (считать запись по прямому доступу).............. 11-27
HOLD (монопольный доступ к записи)................... 11-29
NEXT (прочитать следующую запись последовательности). 11-30
PREVIOUS (прочитать предыдущую запись послед-ности).. 11-31
PUT (записать запись обратно в файл)................. 11-32
RELEASE (освободить заблокированную запись).......... 11-33
RESET (сброс указателя текущей записи)............... 11-34
SET (инициировать последовательную обработку файла).. 11-35
SKIP (пропустить записи в последовательности)........ 11-37
Функции работы с файлом................................... 11-38
BOF (начало файла)................................... 11-38
BYTES (размер файла в байтах)........................ 11-39
DUPLICATE (проверить на дублирование ключевых полей). 11-40
EOF (конец файла).................................... 11-41
POINTER (относительный номер записи)................. 11-41
POSITION (номер записи в последовательности)......... 11-42
RECORDS (число записей).............................. 11-43
SEND (отправить сообщение файловому драйверу)........ 11-43
Обработка транзакций...................................... 11-44
COMMIT (завершить успешно проведенную транзакцию).... 11-44
LOGOUT (начать транзакцию)........................... 11-45
ROLLBACK (завершить ошибочную транзакцию)............ 11-46
СТРУКТУРА ФАЙЛА ДАННЫХ
----------------------------------------------------------------
FILE (описание структуры файла данных)
================================================================
метка FILE,DRIVER()[,CREATE][,RECLAIM][,OWNER()][,ENCRYPT]
[,NAME()][,PRE()]
метка [INDEX()]
метка [KEY()]
метка [MEMO()]
[метка] RECORD
fields
. .
----------------------------------------------------------------
DRIVER Задает тип файла данных. Атрибут DRIVER тре-
буется для всех описаний структуры FILE.
CREATE Позволяет создать файл командой CREATE во
время работы программы.
RECLAIM Разрешает повторно использовать место, осво-
божденное удаленными записями.
OWNER Задает пароль для шифрования данных.
ENCRYPT Шифрует файл данных.
NAME Останавливает имя файла в стандарте ДОС.
PRE Объявляет префикс метки для структуры.
INDEX Объявляет статический индекс файла, который
должен быть перестроен во время исполнения.
KEY Объявляет динамически обновляющийся индекс
файла.
MEMO Описывает текстовое поле переменной длины
до 64K длиной).
RECORD Объявляет структуру записи по полям. Струк-
тура RECORD ДОЛЖНА быть в описании каждого
файла.
fields Элементы данных в структуре RECORD.
FILE объявляет структуру файла данных. Метка структуры FILE ис-
пользуется в операторах и функциях, работающих с файлами. Струк-
тура FILE должна завершаться точкой или оператором END.
Атрибуты структур FILE, KEY, INDEX, MEMO, операторы описания дан
ных и типы данных, которые могу содержаться в файле, целиком за-
висят от конкретного файлового драйвера. Все, что не поддержива-
ется файловой системой, заданной в атрибуте DRIVER, при открытии
файла вызовет сообщение об ошибке файлового драйвера. Атрибуты и
(или) типы данных, разрешенных для конкретной файловой системы,
перечислены в документации на файловый драйвер.
Во время выполнения, под структуру RECORD выделяется память для
использования в качестве буфера, где хранятся данные, считанные
с диска. В файле обязательно должна быть структура RECORD.
Пример:
Names FILE,DRIVER('Clarion') !Описание структуры файла
Rec RECORD
Name STRING(20)
. . !Конец описания файла
----------------------------------------------------------------
CREATE (разрешает создание файла)
================================================================
CREATE
----------------------------------------------------------------
Атрибут CREATE, в описании файла, позволяет создавать файл на
диске оператором CREATE из программы, в которой этот файл опи-
сан.
Файлы, описанные без атрибута CREATE, могут быть созданы с помо-
щью Clarion Data Dictionary Administrator.
Пример:
Names FILE,DRIVER('Clarion'),CREATE!Описываем файл и разрешаем
!его создание
Rec RECORD
Name STRING(20)
. . !Конец описания файла
----------------------------------------------------------------
DRIVER (задает тип файла данных)
================================================================
DRIVER(filetype[,driver string])
----------------------------------------------------------------
filetype Строковая константа, содержащая имя менедже-
ра файлов (Btrieve, Clarion итд.).
driver string Строковая константа или переменная. содержа-
щая любые добавочные инструкции для драйве-
ра. Атрибут DRIVER задает, какой драйвер ис-
пользуется для работы с файлом. Атрибут DRI-
VER требуется во всех описаниях файлов.
Программы на Кларионе используют драйверы для доступа к файлам.
Файловый драйвер служит переводчиком между программой и файловой
системой, позволяя использовать одни и те же команды для разных
файловых систем.
Внутренняя реализация той или иной команды доступа к файлу зави-
сит от файлового драйвера. Некоторые команды могут быть недоступ
ны с определенным драйвером из-за ограничений, налагаемых файло-
вой системой. Каждый файловый драйвер документируется отдельно.
Все неподдерживаемые команды, атрибуты полей, типы данных и/или
идиосинкразии файловой системы приводятся в документации.
Пример:
Names FILE,DRIVER('Clarion') !Начало описания файла
Record RECORD
Name STRING(20)
!Конец описания файла
----------------------------------------------------------------
ENCRYPT (шифровать файл данных)
================================================================
ENCRYPT
----------------------------------------------------------------
Атрибут ENCRYPT, спользуемый совместно с атрибутом OWNER, указы-
вает на необходимость шифроания данных в файле. ENCRYPT разрешен
ТОЛЬКО с атрибутом OWNER. Даже используя 16ричный редактор,
весьма трудно расшифровать зашифрованные данные.
(С.П.А - Сильно сомневаюсь. Если ключ к шифру задан как в приме-
ре для OWNER, то расшифровка - дело нескольких минут.)
Пример:
Names FILE,DRIVER('Clarion'),OWNER('Clarion'),ENCRYPT
Record RECORD
Name STRING(20)
. .
См. также: OWNER
----------------------------------------------------------------
OWNER (задает пароль для шифрования файла данных)
================================================================
OWNER(password)
----------------------------------------------------------------
password Строковая константа или переменная.
Атрибут OWNER задает пароль, который используется атрибутом
ENCRYPT для шифрования данных. Реализация метода шифрования за-
висит от конкретного файлового драйвера.
Пример:
Customer FILE,DRIVER('Clarion'),OWNER('abCdeF'),ENCRYPT
!Шифруем данные с
!паролем "abCdeF"
Record RECORD
Name STRING(20)
. .
См. также: ENCRYPT
----------------------------------------------------------------
RECLAIM (использовать место от удаленных записей)
================================================================
RECLAIM
----------------------------------------------------------------
Атрибут RECLAIM говорит о том, что файловый драйвер будет поме-
щать новые записи в файл на место ранее удаленных, если таковые
имеются. В противном случае запись будет добавлена в конец фай-
ла. Реализация метода RECLAIM зависит от файлового драйвера и
поддерживается НЕ всем файловыми системами.
Пример:
Names FILE,DRIVER('Clarion'),RECLAIM !Помещать новые записи на
!место ранее удаленных.
Record RECORD
Name STRING(20)
. .
ОПЕРАТОРЫ СТРУКТУРЫ ФАЙЛА
----------------------------------------------------------------
INDEX (описывает статический индекс для файла)
================================================================
метка INDEX([-][field])[NAME()][,NOCASE][,OPT]
----------------------------------------------------------------
- Знак МИНУС перед компонентой индекса означа-
ет, что для полей с этой компонентой, индекс
сортируется по убыванию (от больших значений
к меньшим), по умолчанию сортировка по воз-
растанию.
field Метка поля из структуры RECORD файла, для
которого строится индекс. Поле - это компо-
нента индекса. Переменные с атрибутом DIM
(массивы) нельзя использовать в качестве ин-
дексных полей.
NAME Имя файла для индекса.
OPT В индекс не попадут сведения о тех записях,
у которых все поля, используемые как компо-
ненты индекса, пусты или содержат нуль.
NOCASE Сортировку проводить без учета регистра.
INDEX описывает "статичный" ключ для файла данных. INDEX обнов-
ляется только оператором BUILD. Он используется для доступа к
записям в порядке, отличном от физического размещения записей в
файле. INDEX можно использовать как для последовательного, так и
для произвольного доступа к файлу. В INDEX-е ВСЕГДА разрешены
записи с одинаковым значением индексных полей (duplicated entri-
es).
INDEX может строиться на основании более чем одного поля. Поря-
док, в котором заданы компоненты индекса, определяет порядок
сортировки записей по этому индексу. Самые первые компоненты МЕ-
НЕЕ значимы, самые последние - БОЛЕЕ. В общем, файл данных может
иметь до 255 индексов (и/или ключей) и каждый индекс может быть
длиной до 255 байт (имеется в виду суммарная длина всех полей,
задействованных для построения индекса), хотя точное число ин-
дексных и ключевых файлов зависит от файлового драйвера.
Если в описании INDEX не заданы имена полей, то создается "дина-
мический" индекс, который позволяет использовать любые поля
структуры RECORD в качестве своих компонент, за исключением мас-
сивов. Такие компоненты задаются во время исполнения вторым па-
раметром оператора BUILD. Такой подход позволяет произвольно ин-
дексировать файлы во время исполнения (С.П.А - и позволяет избе-
жать одинаковых, в целом, процедур, использующих разные порядки
сортировки одного и того же файла).
Пример:
Names FILE,DRIVER('Clarion'),PRE(Nam)
NameNdx INDEX(Nam:Name),NOCASE !Индекс по имени
NbrNdx INDEX(Nam:Number),OPT !Индекс по номеру
Rec RECORD
Name STRING(20)
Number SHORT
. .
См. также: KEY, BUILD
----------------------------------------------------------------
KEY (описывает динамический индекс (ключ) для файла)
================================================================
метка KEY([-][field])[NAME()][,NOCASE][,OPT]
----------------------------------------------------------------
- Знак МИНУС перед компонентой ключа означает,
что для полей с этой компонентой, индекс
сортируется по убыванию (от больших значений
к меньшим), по умолчанию сортировка по воз-
растанию.
field Метка поля из структуры RECORD файла, для
которого строится ключ. Поле - это компо-
нента ключа. Переменные с атрибутом DIM (мас
сивы) нельзя использовать в качестве ключе-
вых полей.
NAME Имя файла для ключа.
OPT В ключ не попадут сведения о тех записях, у
которых все поля, используемые как компонен-
ты ключа, пусты или содержат нуль.
NOCASE Сортировку проводить без учета регистра.
DUP В файле данных разрешены записи с одинаковы-
ми значениями ключевых полей.
KEY - это индекс файла данных, который автоматически обновляется
при добавлении, изменении или удалении записей. Он используется
для доступа к записям в порядке, отличном от физического разме-
щения записей в файле. INDEX можно использовать как для после-
довательного, так и для произвольного доступа к файлу.
KEY может строится на основании более чем одного поля. Порядок,
в котором заданы компоненты ключа, определяет порядок сортировки
записей по этому индексу. Самые первые компоненты МЕНЕЕ значимы,
самые последние - БОЛЕЕ. В общем, файл данных может иметь до 255
ключей (и индексов) и каждый ключ может быть длиной до 255 байт
(имеется в виду суммарная длина всех полей, задействованных для
построения ключа), хотя точное число ключевых и индексных файлов
зависит от файлового драйвера.
Пример:
Names FILE,DRIVER('Clarion'),PRE(Nam)
NameKey KEY(Nam:Name),NOCASE,DUP !Ключ по имени
NbrKey KEY(Nam:Number),OPT !Ключ по номеру
Rec RECORD
Name STRING(20)
Number SHORT
CODE
Nam:Name = 'Clarion Software' !Инициализируем ключевое
! поле
GET(Names,Nam:NameKey) !Читаем запись
SET(Nam:NbrKey) !Обрабатывать в порядке
! возрастания поля
! NAM:NUMBER
См. также: SET, GET, INDEX
----------------------------------------------------------------
MEMO (описывает текстовое поле)
================================================================
метка MEMO(длина)[,BINARY][,NAME()]
----------------------------------------------------------------
длина Числовая константа, задающая максимальную
длину текста в символах. Должна быть в диапа
зоне от 1 до 65,536 байт.
BINARY Указывает, что в МЕМО-поле должны храниться
двоичные данные.
NAME Задает имя файла, в котором будут находиться
МЕОМ-поля. Использование этого параметра за-
висит от файлового драйвера.
(МЕМО - англ. записка, памятка, примечание)
MEMO описывает строковое поле переменной длины, которое хранится
на диске. Параметр ДЛИНА задает максимальный размер поля приме-
чаний. МЕМО должно быть описано ПОСЛЕ описания структуры RECORD.
Память под буфер МЕМО-полей выделяется при открытии файла, к ко-
торому это примечание относится, и освобождается при его закры-
тии.
Теоретически, можно описать до 255 МЕОМ-полей для каждого файла.
Точное жже их число и способ их хранения на диске зависит от
файлового драйвера. Просматриваются MEMO-поля, обычно, с помощью
полей типа TEXT в экранах и отчетах.
Пример:
Names FILE,DRIVER('Clarion'),PRE(Nam)
NameKey KEY(Nam:Name)
NbrKey KEY(Nam:Number)
Notes MEMO(4800) !Примечание длиной до 4800 байт.
Rec RECORD
Name STRING(20)
Number SHORT
. .
----------------------------------------------------------------
RECORD (описывает структуру записи)
================================================================
[метка] RECORD[PRE()][,NAME()]
поля
.
----------------------------------------------------------------
поля Одно или более описание переменных.
PRE Задает метку-префикс структуры.
NAME Задает внешнее имя структуры RECORD. Исполь-
зование этого параметра зависит от файлового
драйвера.
Оператор RECORD описывает начало структуры файла данных. Струк-
тура RECORD обязательно должна быть в описании файла. Каждое ПО-
ЛЕ - элемент структуры RECORD. Длина структуры RECORD складыва-
ется из длин входящих в нее ПОЛЕЙ. При обращении к структуре RE-
CORD, она рассматривается, как структура типа GROUP.
Во время исполнения, под данные структуры RECORD, выделяется бу-
фер в статической памяти. ПОЛЯ, в буфере записи, дрступны неза-
висимо от того открыт файл или нет. Записи считываются в буфер
из файла операторами NEXT, PREVIOUS или GET. Данные ПОЛЕЙ обра-
батываются, а затем записываются в файл в виде цельной структуры
RECORD операторами ADD, PUT или DELETE.
Пример:
Names FILE,DRIVER('Clarion') !Описание структуры файла
Record RECORD ! начало описания записи
Name STRING(20) ! описываем поле ИМЯ
Number SHORT ! описываем поле НОМЕР
. . !Конец описаний записи и файла
АТРИБУТЫ ДЛЯ INDEX, KEY И MEMO
----------------------------------------------------------------
BINARY (MEMO содержит двоичные данные)
================================================================
BINARY
----------------------------------------------------------------
Атрибут МЕМО-поля BINARY указывает на то, что MEMO-поле может
содержать не только текстовые, но и двоичные данные. Обычно,
этот атрибут используется для хранения в МЕМО-полях небольших
картинок, которые можно выводить в IMAGE-полях на экране.
Пример:
Names FILE,DRIVER('Clarion'),PRE(Nam),
NameKey KEY(Nam:Name)
NbrKey KEY(Nam:Number)
Picture MEMO(48000),BINARY !Двоичное поле длиной
! до 48,000 байт
Rec RECORD
Name STRING(20)
Number SHORT
См. также: MEMO, IMAGE
----------------------------------------------------------------
DUP (разрешить повторяющиеся значения полей ключа)
================================================================
DUP
----------------------------------------------------------------
Атрибут DUP, в описании ключа, позволяет иметь в файле несколько
записей с одинаковым значением ключевых полей. Если атрибут DUP
пропущен, то попытка добавить или перезаписать запись с уже су-
ществующими значениями ключевых полей, вызовет ошибку "Такая за-
пись уже есть" ("Creates Duplicate Key"), и запись не будет за-
писана в файл. Во время последовательной обработки по ключу, за-
писи с одинаковыми ключевыми полями обрабаываются в том физичес-
ком порядке, в котором их ключевые поля расположены в файле клю-
ча. Операторы GET и SET обращаются к первой записи из тех, что
имеют одинаковые ключевые поля. Атрибут DUP НЕ нужен для индек-
сов, поскольку индексы ВСЕГДА допускают дублированные значения
ключевых полей.
Пример:
Names FILE,DRIVER('Clarion'),PRE(Nam)
NameKey KEY(Nam:Name),DUP
!Ключ по имени, разрешаем одинаковые имена
NbrKey KEY(Nam:Number)
!Ключ по номеру. Одинаковые номера запрещены
Rec RECORD
Name STRING(20)
Number SHORT
. .
----------------------------------------------------------------
NOCASE (KEY или INDEX - НЕ чувствительны к регистру)
================================================================
NOCASE
----------------------------------------------------------------
Атрибут NOCASE в описании KEY или INDEX означает, что сортировка
полей по алфавиту будет производиться без учета регистра букв.
При записи в ключевой файл, все буквы будут приводиться к верх-
нему регистру. Этот атрибут не влияет на данные, хранящиеся в
файле данных и на небуквы.
Пример:
Names FILE,DRIVER('Clarion'),PRE(Nam)
NameKey KEY(Nam:Name),NOCASE
!Ключ по имени без учета регистра
NbrKey KEY(Nam:Number) !Ключ по номеру
Rec RECORD
Name STRING(20)
Number SHORT
. .
См. также: INDEX,KEY
----------------------------------------------------------------
OPT (пустые или нулевые ключевые поля отбрасываются)
================================================================
OPT
----------------------------------------------------------------
Если задан атрибут ОРТ, то в ключ или индекс НЕ попадут сведения
о записях, у которых все ключевые поля пусты. В терминах атрибу-
та ОРТ, "пустое поле" означает, что числовое поле содержит нуль,
а символьное - только пробелы.
Пример:
Names FILE,DRIVER('Clarion'),PRE(Nam)!Описание структуры файла
NameKey KEY(Nam:Name),OPT !Ключ по имени, имя не может быть
! пустым
NbrKey KEY(Nam:Number),OPT !Ключ по номеру. Номера не могут
! быть нулевыми
Rec RECORD
Name STRING(20)
Number SHORT
. .
См. также: INDEX,KEY
КОМАНДЫ РАБОТЫ С ФАЙЛАМИ
----------------------------------------------------------------
BUILD (построить ключи и/или индексы для файла)
================================================================
¦ ключ ¦
BUILD( ¦индекс¦ [,компоненты])
¦ файл ¦
----------------------------------------------------------------
ключ Метка описания КЛЮЧА.
индекс Метка описания ИНДЕКСА.
файл Метка описания ФАЙЛА.
компоненты Строковая константа или переменная, содержа-
щая список полей, на основе которых постро-
ить динамический ИНДЕКС. Имена полей должны
разделяться запятыми, перед именем поля дол-
жен стоять знак плюс или минус, чтобы задать
сортировку по возрастанию или по убыванию.
Оператор BUILD строит ключи и индексы. BUILD(ключ), BUILD(ин-
декс) и BUILD(файл) требуют монопольного доступа к файлу. Т.е.,
файл должен быть заблокирован (через LOCK) или открыт с кодом
доступа 12h (ВСЕМ кроме меня запрещено чтение/запись) или 22h
(ВСЕМ кроме меня запрещена запись). BUILD(индекс,компоненты) НЕ
требует монопольного доступа к файлу.
BUILD(ключ)
BUILD(индекс) Строит только указанный КЛЮЧ или ИНДЕКС.
Файл должен быть закрыт, заблокирован или
открыт в режиме 12h или 22h.
BUILD(файл) Строит все КЛЮЧИ или ИНДЕКСЫ ФАЙЛА. Файл
должен быть закрыт, заблокирован или открыт
в режиме доступа 12h или 22h.
BUILD(индекс,компоненты)
Позволяет строить динамический ИНДЕКС. Эта
форма BUILD не требует монопольного доступа
к файлу, тем не менее файл должен быть от-
крыт в любом разрешенном режиме доступа. Ди-
намический ИНДЕКС создается как временный
файл только для строящего его пользователя.
Этот временный файл автоматически удаляется
при закрытии файла.
Возвращаемые ошибки:
37 Файл еще не открыт
40 Такой ключ уже есть
63 Требуется монопольный доступ
76 Неверные параметры для индекса
Пример:
Names FILE,DRIVER('Clarion'),PRE(Nam)!Описание структуры файла
NameKey KEY(Nam:Name).OPT !Описание ключа по имени
NbrNdx INDEX(Nam:Number),OPT !Описание индекса по но-
! меру
DynNdx INDEX() !Описываем динамический
! индекс
Rec RECORD
Name STRING(20)
Number SHORT
. .
CODE
OPEN(Names,12h) !Открываем файл с исключительным
! правом чтения/записи
BUILD(Names) !Строим все ключи для файла имен
BUILD(Nam:NbrNdx) !Строим индекс по номеру
BUILD(Nam:DynNdx.'-Nam:Number,+Nam:Name')
!Строим динамический индекс - по номеру с убыванием,
! по имени с возрастанием.
См. также: OPEN, SHARE
----------------------------------------------------------------
CLOSE (закрыть файл данных)
================================================================
CLOSE(файл)
----------------------------------------------------------------
файл Метка ФАЙЛА.
Оператор CLOSE закрывает ФАЙЛ. Обычно, это вызывает сброс диско-
вых буферов на диск и освобождение памяти, выделенной под них,
кроме буфера, хранящего данные структуры RECORD. Точный порядок
закрытия файла зависит от файлового драйвера.
Пример:
CLOSE(Customer) !Закрыть файл покупателей
----------------------------------------------------------------
COPY (копировать файл данных)
================================================================
COPY(файл,новый_файл)
----------------------------------------------------------------
файл Метка копируемого файла.
новый_файл Строковая константа или переменная, содержа-
щая полную спецификацию файла (диск, каталог
и имя). Если в спецификации отсутствуют диск
и каталог, то подразумеваются текущий ката-
лог текущего диска. Если указан только путь,
то для имени НОВОГО_ФАЙЛа используются имя и
расширение копируемого ФАЙЛа.
Оператор COPY создает копию файла, и делает соответствующую за-
пись в каталоге. Копируемый ФАЙЛ должен быть закрыт, иначе будет
фозвращена ощибка "Файл уже открыт". Если спецификация НОВО-
ГО_ФАЙЛа совпадает со спецификацией оригинала, то такой оператор
COPY игнорируется.
Поскольку некоторые файловые драйверы используют несколько физи-
ческих ФАЙЛОВ для работы с ними как с ОДНИМ ФАЙЛОМ, то подразу-
меваемые имя и расширение файла зависят от файлового драйвера.
Если происходит какая-либо ошибка, то файл не копируется.
Возвращаемые ошибки:
02 Файл не найден
03 Путь не существует
05 Доступ запрещен
52 Файл уже открыт
Пример:
COPY(Names,'A:\') !Копируем файл имен на дискету
COPY(CompText,Filename) !Копируем текстовый файл под другим
! именем
----------------------------------------------------------------
CREATE (создать пустой файл данных)
================================================================
CREATE(файл)
----------------------------------------------------------------
файл Метка файла, который надо создать.
Оператор CREATE создает в заданном каталоге пустой файл данных.
Если файл уже существует, то он удаляется и пересоздается как
файл, не содержащий данных. Файл долден быть закрыт, иначе воз-
никает ошибка "Файл уже открыт". CREATE не оставляет созданный
файл открытым.
Возвращаемые ошибки:
03 Путь не существует
04 Слишком много открытых файлов
05 Доступ запрещен
52 Файл уже открыт
54 Нет атрибута CREATE
Пример:
CREATE(Master) !Создать новый основной файл
CREATE(Detail) !Создать новый файл подробностей
----------------------------------------------------------------
EMPTY (очистить файл данных)
================================================================
EMPTY(файл)
----------------------------------------------------------------
файл Метка существующего файла.
EMPTY удаляет ВСЕ записи из заданного файла. EMPTY требует моно-
польного доступа к файлу. То есть файл должен быть открыт в ре-
жиме доступа 12h (всем, кроме меня запрещены чтение/запись) или
22h (всем, кроме меня запрещена запись)
Возвращаемые ошибки:
63 Требуется монопольный доступ
Пример:
OPEN(Master,18) !Открыть основной файл
EMPTY(Master) ! и опустошить его
См. также: OPEN, SHARE
----------------------------------------------------------------
FLUSH (сбросить буфера ДОС на диск)
================================================================
FLUSH(файл)
----------------------------------------------------------------
файл Метка файла.
Оператор FLUSH завершает операцию STREAM. Он сбрасывает буфера
ДОС, что приводит к обновлению записи каталога для данного фай-
ла. Поддержка этого оператора зависит от файловой системы и кон-
кретные результаты этой команды описаны в документации по файло-
вому драйверу.
Пример:
STREAM(History) !Используем бувера ДОС
SET(Current) !Идем в начало файла CURRENT.
LOOP UNTIL EOF(Current)
NEXT(Current)
His:Record - Cur:Record
ADD(History)
. !Конец цикла
FLUSH(History) !Заканчиваем поточную обра-
! ботку и сбрасываем буфера.
См. также: STREAM
----------------------------------------------------------------
LOCK (монопольный доступ к файлу)
================================================================
LOCK(файл[,секунды])
----------------------------------------------------------------
файл Метка файла, открытого для совместного до-
ступа.
секунды Числовая константа или переменная, которая
задает максимальное время ожидание в секун-
дах.
Оператор LOCK блокирует файл от доступа к нему других рабочих
станций в многопользовательской среде. Обычно, это блокирует за-
пись в файл или его чтение другими пользователями. Конкретная
работа оператора LOCK зависит от файлового драйвера.
LOCK(файл) Пытается заблокировать файл до тех пор, пока
это не удастся. Если файл уже заблокирован
другой станцией, то LOCK будет ждать, пока
та станция не разблокирует файл.
LOCK(файл,секунды) Если за заданное время не удалось заблокиро-
вать файл, то возвращается ошибка "Файл уже
заблокирован".
Главная проблема с блокированными файлами, это как избежать
"смертельного объятия". Это происходит, когда две станции пыта-
ются заблокировать один и тот же набор файлов в разной последо-
вательности, и обе используют оператор LOCK(файл). Одна станция
уже заблокировала файл, который хочет заблокировать другая, и
наоборот. Этой проблемы можно избежать, если использовать опера-
тор LOCK(файл,секунды) и всегда блокировать файлы в одном и том
же порядке.
Возвращаемые ошибки:
32 Файл уже заблокирован
Пример:
LOOP !Цикл во избежание "смертельного
! объятия"
LOCK(Master,1) !1 секунду пытаемся заблокировать
! основной файл
IF ERRORCODE() = 201 !Если кто-то уже блокирует его, то
BEEP(0,100) ! ждем секунду и
CYCLE ! пытаемся снова...
.
LOCK(Detail,1) !За секунду пытаемся заблокировать
! файл подробностей
IF ERRORCODE() = 201 !Если кто-то уже блокирует его, то
UNLOCK(Master) ! разблокируем занятый нами файл,
BEEP(0,100) ! подождем секунду и
CYCLE ! еще разок попробуем
. . !Конец операторов IF и LOOP
----------------------------------------------------------------
OPEN (открыть файл данных)
================================================================
OPEN(файл[,режим доступа])
----------------------------------------------------------------
файл Метка файла.
режим доступа Числовая константа, переменная или выраже-
ние, задающее уровень доступа к файлу как
для открывающего его пользователя, так и для
остальных пользователей многопользовательс-
кой системы. Если пропущен, то подразумева-
ется 22h (всем, кроме меня запрещена запись
в этот файл)
Оператор OPEN открывает структуру FILE для обработки и устанав-
ливает режим доступа. Поддержка различных уровней доступа зави-
сит от файлового драйвера. Все файлы должны быть явно открыты
перед их использованием. РЕЖИМ ДОСТУПА это битовая карта, указы-
вающая операционке, какой доступ предоставить открывающему поль-
зователю, и какой доступ запретить для остальных потенциальных
пользователей этого файла. Допустимы следующие значения режима
доступа:
Дес. 16н. Режим доступа
---- --- -------
Открывающий 0 0h Только для чтения (Read Only)
пользователь 1 1h Только для записи (Write Only)
2 2h Для чтения и записи (Read/Write)
Остальные 0 0h Любой доступ (режим FCB-совместимости)
пользователи 16 10h Запрещен любой доступ (Deny All)
32 20h Запрещена запись (Deny Write)
48 30h Запрещено чтение (Deny Read)
64 40h ??? (Deny None)
Возвращаемые ошибки:
02 Файл не найден
04 Слишком много открытых файлов
05 Доступ запрещен
52 Файл уже открыт
75 Неверный описатель типа поля
Пример:
ReadOnly EQUATE(0) !Мнемонические значения для режимов
WriteOnly EQUATE(1) ! доступа
ReadWrite EOUATE(2)
DenyAll EQUATE(10h)
DenyWrite EQUATE(20h)
DenyRead EQUATE(30h)
DenyNone EQUATE(40h)
CODE
OPEN(Names,ReadWrite+DenyNone) !Открываем полностью в
! режиме разделения.
См. также: SHARE
----------------------------------------------------------------
PACK (физически стереть удаленные записи)
================================================================
PACK(файл)
----------------------------------------------------------------
файл Метка файла.
Оператор PACK убирает удаленные записи из файла данных и пере-
страивает его ключи. Полученный файл будет компактен, насколько
это возможно. PACK требует, как минимум, вдвое больше места на
диске, чем занимает файл с ключами и МЕМО-файлами. Новые файлы
создаются из старых, а старые файлы стираются ТОЛЬКО после ус-
пешного завершения процесса. PACK требует монопольного доступа
к файлу.
Возвращаемые ошибки:
63 Требуется монопольный доступ
Пример:
OPEN(Trans,12h) !Монопольно открывает файл и
PACK(Trans) ! упаковывает его.
См. также: OPEN, SHARE
----------------------------------------------------------------
REMOVE (стереть файл данных)
================================================================
REMOVE(файл)
----------------------------------------------------------------
файл Метка файла, подлежащего удалению.
Оператор REMOVE стирает заданный файл из каталога аналогично ко-
манде ДОС Delete. Файл долюен быть закрыт, иначе будет ошибка
"Файл уже открыт". При возникновении какой-либо ошибки файл НЕ
удаляется.
Возвращаемые ошибки:
02 Файл не найден
05 Доступ запрещен
52 Файл уже открыт
Пример:
REMOVE(OldFile) !Удаляем старый файл
REMOVE(Changes) !Удаляем файл изменений
----------------------------------------------------------------
RENAME (переименовать файл данных)
================================================================
RENAME(файл,новый_файл)
----------------------------------------------------------------
файл Метка переименовываемого файла.
новый_файл Строковая константа или переменная, содержа-
щая спецификацию файла. Если в спецификации
не заданы диск и путь, то используется теку-
щий каталог текущего диска. Если указан
только путь, то в качестве имени и расшире-
ния нового файла используются имя и расшире-
ние оригинала. Файл не модет быть переимено-
ван на другой диск.
Оператор RENAME либо меняет имя файла, либо переносит его в дру-
гой каталог на этом же диске. Файл, подлежащий переминованию,
должен быть закрыт, иначе произойдет ошибка "Файл уже открыт".
Если ФАЙЛ и НОВЫЙ_ФАЙЛ идентичны, то оператор RENAME игнорирует-
ся. При возникновении какой-либо ошибки, файл не переименовыва-
ется.
Поскольку некоторые файловые драйверы используют несколько физи-
ческих ФАЙЛОВ для работы с ними как с ОДНИМ ФАЙЛОМ, то подразу-
меваемые имя и расширение файла зависят от файлового драйвера.
Возвращаемые ошибки:
02 Файл не найден
03 Путь не существует
05 Доступ запрещен
52 Файл уже открыт
Пример:
RENAME(Text,'text.bak') !Делаем резервную копию
RENAME(Master,'\newdir') !Перемещаем в другой каталог
----------------------------------------------------------------
SHARE (открыть файл данных)
================================================================
SHARE(файл[,режим доступа])
----------------------------------------------------------------
файл Метка файла.
режим доступа Числовая константа, переменная или выраже-
ние, задающее уровень доступа к файлу как
для открывающего его пользователя, так и для
остальных пользователей многопользовательс-
кой системы. Если пропущен, то подразумева-
ется 42h (всем, кроме меня, DENY NONE).
Оператор SHARE открывает файл для обработки и устанавливает ре-
жим доступа к нему. Оператор SHARE аналогичен оператору OPEN и
отличается от него только режимом доступа по умолчанию. РЕЖИМ
ДОСТУПА это битовая карта, указывающая операционке, какой доступ
предоставить открывающему пользователю, и какой доступ запре-
тить для остальных потенциальных пользователей этого файла. До-
пустимы следующие значения режима доступа:
Дес. 16н. Режим доступа
---- --- -------
Открывающий 0 0h Только для чтения (Read Only)
пользователь 1 1h Только для записи (Write Only)
2 2h Для чтения и записи (Read/Write)
Остальные 0 0h Любой доступ (режим FCB-совместимости)
пользователи 16 10h Запрещен любой доступ (Deny All)
32 20h Запрещена запись (Deny Write)
48 30h Запрещено чтение (Deny Read)
64 40h ??? (Deny None)
Возвращаемые ошибки:
02 Файл не найден
04 Слишком много открытых файлов
05 Доступ запрещен
52 Файл уже открыт
75 Неверный описатель типа поля
Пример:
ReadOnly EQUATE(0) !Мнемонические значения для режимов
WriteOnly EQUATE(1) ! доступа
ReadWrite EOUATE(2)
DenyAll EQUATE(10h)
DenyWrite EQUATE(20h)
DenyRead EQUATE(30h)
DenyNone EQUATE(40h)
CODE
SHARE(Names,ReadOnly+DenyWrite) !Открываем в режиме толь-
! ко для чтения.
См. также: OPEN
----------------------------------------------------------------
STREAM (разрешить буферизацию через ДОС)
================================================================
STREAM(файл)
----------------------------------------------------------------
файл Метка файла.
Некоторые файловые системы сбрасывают буфера при каждой записи
на диск. Оператор STREAM запрещает это автоматический сброс. Бу-
фера дОС выделяются командой BUFFERS= в файле CONFIG.SYS. Они
зранят записываемое на диск до тех пор, пока все бувера не за-
полнятся, а затем все сразу сбрасываются на диск. Элементы ката-
лога обновляются только при физической записи буферов на диск.
Операция STREAM завершается с закрытием файла, что автоматически
сбрасывает буфера на диск, либо с выполнением оператора FLUSH.
Поддержка этого оператора зависит от файловой системы и описана
в документации по файловому драйверу данной системы.
Пример:
STREAM(History) !Используем буфера ДОС
SET(Current) !Идем в начало файла CURRENT
LOOP UNTIL EOF(Current)
NEXT(Current)
His:Record - Cur:Record
ADD(History)
. !End loop
FLUSH(History) !Завершаем поточную обработку
! и сбрасываем буфера на диск
См. также: FLUSH
----------------------------------------------------------------
UNLOCK (разблокировать заблокированный файл)
================================================================
UNLOCK(файл)
----------------------------------------------------------------
файл Метка файла.
Оператор UNLOCK разблокирует ранее заблокированный оператором
LOCK файл данных. Он не может разблокировать файл, заблокирован-
ный другой станцией. Если файл не блокирован или блокирован дру-
гой станцией, то оператор UNLOCK игнорируется. UNLOCK не возвра-
щает каких-либо ошибок. Точное действие UNLOCK зависит от файло-
вого драйвера.
Пример:
LOOP !Цикл во избежание "смертельного
! объятия"
LOCK(Master,1) !1 секунду пытаемся заблокировать
! основной файл
IF ERRORCODE() = 201 !Если кто-то уже блокирует его, то
BEEP(0,100) ! ждем секунду и
CYCLE ! пытаемся снова...
.
LOCK(Detail,1) !За секунду пытаемся заблокировать
! файл подробностей
IF ERRORCODE() = 201 !Если кто-то уже блокирует его, то
UNLOCK(Master) ! разблокируем занятый нами файл,
BEEP(0,100) ! подождем секунду и
CYCLE ! еще разок попробуем
. . !Конец операторов IF и LOOP
Перевод всей документации выполнил Сергей АгАрков. Если возникли
какие-либо вопросы или предложения по качеству перевода, обра-
щайтесь:
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
Перевод всей документации выполнил Сергей АгАрков. Если возникли
какие-либо вопросы или предложения по качеству перевода, обра-
щайтесь:
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 по москве.
Знаете ли Вы, что локальность - означает, что реализация одной абстракции может быть создана и рассмотрена без необходимости анализа реализации какой-либо другой абстракции. Принцип локальности позволяет составлять программу из абстракций, создаваемых людьми, работающими независимо друг от друга. Один человек может создать абстракцию, которая использует абстракцию, созданную кем-то другим.