Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Clarion Programming / ГЛАВА 11 - Файлы данных1

.htm
Скачиваний:
22
Добавлен:
02.05.2014
Размер:
75.54 Кб
Скачать

ГЛАВА 11 - Файлы данных     Поиск Рубрикатор Форумы Новости сервера Учебный центр Книжный магазин Авторам Море(!) аналитической информации! :: CITFORUM.RU Вы можете приобрести полную версию сайта на CD-ROM CITFORUM.RU >>> ПРОГРАММИРОВАНИЕ      [http://www.citforum.ru/programming/clarion/cla_11_1.shtml]

Скоро! Восьмая техническая конференция

"Корпоративные базы данных 2003"

Москва, 17-18 апреля 2003 года

Компания Microsoft приглашает вас посетить бесплатный семинар

"День разработчика 2003",

который пройдет 11 марта в Санкт-Петербурге,

13 марта - в Екатеринбурге, 18 марта - в Киеве.

Cпешите зарегистрироваться! Количество мест ограничено! КОМАНДЫ РАБОТЫ С ЗАПИСЯМИ 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 используется для пакетного добавления нескольких записей в один прием (С.П.А - без обновления ключе, добавление записи, разумеется, происходит быстрее). Если на диске не хватает места для размещения новой записи, то возвращается ошибка "Доступ запрещен". Конкретное действие APPEND зависит от файлового драйвера. Возвращаемые ошибки: 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 или 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 или DELETE. Выполнение 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, RECORDS, 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 сообщает драйверу о начале транзакции. Драйвер, в свою очередь, выполняет действия, необходимые в его файловой системе для начала обработки транзакции в заданном наборе файлов. Если файловая система требует, чтобы файлы были заблокированы перед началом транзакции, то LOGOUT автоматически блокирует их (для этого и нужен ТАЙМАУТ). Только одна транзакция, инициированная через LOGOUT, может выполняться одновременно. Второй LOGOUT (без предварительного COMMIT или 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 Назад | Содержание | Вперед

  Citforum.ru приглашает вас посетить семинары:

25 марта 2003 года, Москва

ИТ-бюджетирование в банковских учреждениях. 26 марта 2003 года, Москва

Как анализировать эффективность ИТ банковских учреждений. Практический опыт проведения работ. 27 марта 2003 года, Москва

ИТ в банковских учреждениях. Разработка стратегии развития ИС. 19-21 марта 2003 года, Москва

26-28 марта 2003, Санкт-Петербург.

Теория и практика обеспечения безопасности информационных систем 17 апреля 2003 года, Москва

6 марта и 24 апреля 2003, Санкт-Петербург.

"Практическое применение международного стандарта безопасности информационных систем ISO 17799" 8 апреля 2003 года, Москва

3 апреля 2003, Санкт-Петербург.

"Обеспечение комплексной информационной безопасности предприятия" 10 апреля 2003 г., Москва.

14 апреля 2003 г., Санкт-Петербург

"Анализ рисков информационных систем компаний" Рекомендуем CD Domina Security: Управление информационными рисками корпоративных ИС Internet/Intranet Коммерческая тайна и экономическая безопасность бизнеса Применение стандарта безопасности ISO 17799

Новые поступления в разделе "Подробно о лучших книгах": Компьютерные системы передачи данных, Вильям Столлингс Качество обслуживания в сетях IP, Шринивас Вегешна Цифровая связь: теоретические основы и практическое применение, Скляр Б.

Аутентификация: от паролей до открытых ключей, Дж. Уинзор Энциклопедия SQL. 3-е изд+CD, Грофф Дж., Вайнберг П. Современные операционные системы. Изд.2, Э. Таненбаум

Поиск Рубрикатор Форумы Новости сервера Учебный центр Книжный магазин Реклама на сервере <<< В начало | Наверх Быстрый переход >>>   Internet-технологии  Сетевые технологии  Базы данных  Операционные системы  Программирование  Аппаратные платформы  Материалы конференций  Пользователям и преподавателям  Корпоративные ресурсы  Книги, которые мы выбираем   Комментарии: mailto:info@citforum.ru?Subject='From bottom of CIT FORUM' u="u266.74.spylog.com";d=document;nv=navigator;na=nv.appName;t="";p=1; sz=" width=88 height=31 "; hl=history.length;d.cookie="b=b";c=0; bv=Math.round(parseFloat(nv.appVersion)*100); if (d.cookie) c=1;n=(na.substring(0,2)=="Mi")?0:1; if((n==0)||(bv >= 300)){rn=Math.random();t=(new Date()).getTimezoneOffset();} else {rn=0;} z="p="+p+"&rn="+rn+"&t="+t+"&c="+c+"&hl="+hl; if (self != top) { fr=1;} else { fr=0;} r=escape(d.referrer);r1=""; sl="1.0";h=0; pl="";sl="1.1"; if((n==1) && (bv >= 300)) { for(var i = 0; i < nv.plugins.length; i++) pl += nv.plugins[i].name+":"; } j = (navigator.javaEnabled() ? "Y" : "N"); sl="1.2";s=screen;wh=s.width+'x'+s.height; px=(n==0)?screen.colorDepth:screen.pixelDepth;z+="&wh="+wh+"&px="+px; sl="1.3" y=""; y+=""; y+=""; y+=""; d.write(y); Copyright © Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.