Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АЛТАЙСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ.docx
Скачиваний:
11
Добавлен:
06.08.2019
Размер:
163.01 Кб
Скачать

Относительное перемещение:

Команда SKIP N_записей перемещает указатель записей относительно текущего положения на N_записей.

Например:

SKIP 4 – переместит указатель на четыре записи вниз.

SKIP -2 – переместит указатель на 2 записи вверх.

 

go bottom

?eof()

выдаст .F., т.к. команда go bottom переместит указатель записи на последнюю запись, а не после нее (в положение EOF()).

Команда  skip переведет указатель записи после последней записи – в положение EOF(), тогда функция

?recno()

выдаст на экран 6, несмотря на то, что в таблице у нас всего 5 записей, а функция EOF() вернет значение .T. Функция recno() возвращает истинные номера записей только в том случае, если функция EOF() возвращает нам .F.

 

Цикл SCAN … ENDSCAN

Цикл SCAN … ENDSCAN предназначен для последовательного перебора записей таблицы. Он перемещает указатель записи активной таблицы и выполняет блок команд для каждой записи таблицы в соответствии с указанными условиями .

Формат обращения к оператору SCAN … ENDSCAN:

 

SCAN [NOOPTIMIZE] [Scope] [FOR lExpression1] [WHILE lExpression2]

   [Commands]

   [LOOP]

   [EXIT]

ENDSCAN

Параметры:

NOOPTIMIZE – выключает оптимизацию выполнения перебора

Scope – обозначает область действия оператора SCAN… ENDSCAN. Допустимы следующие фразы: ALL, NEXT nRecords, RECORD nRecordNumber и REST. По умолчанию SCAN… ENDSCAN действует на все записи (ALL).

FOR lExpression1 – определяет условия выполнения цикла. Будут выполняться команды только для записей, которые удовлетворяют условию lExpression.

WHILE lExpression2  –  определяет условие «до тех пор». Команды будут выполняться пока условие lExpression2 не станет истинным (.T.).

Commands – обозначает блок выполняемых команд.

LOOP – прерывает выполнение блока команд и начинает новый оборот цикла.

EXIT – завершает выполнение цикла.

 

Примеры использования команды SCAN … ENDSCAN:

 

Так, например, если требуется вывести на экран все записи таблицы spisok (n_ls N(10), fio C(30), oklad Y(8), n_otd N(10)), можно использовать примерно такой код:

 

USE SPISOK IN 0 SHARED

SELECT SPISOK

SCAN

? “N_LS=”, N_LS, “   FIO=”,FIO,”  OKLAD=”, OKLAD

ENDSCAN

 

Без использования цикла SCAN…ENDSCAN ту же задачу можно выполнить при помощи цикла DO WHILE … ENDDO, конечно код в этом случае, будет более громоздким:

 

USE SPISOK IN 0 SHARED

SELECT SPISOK

GO TOP

DO WHILE NOT EOF(“SPISOK”)

? “N_LS=”, N_LS, “   FIO=”,FIO,”  OKLAD=”, OKLAD

SKIP

ENDDO

 

Нам пришлось внутрь цикла добавить команду перемещения по таблице SKIP.

 

Для чуть более сложной задачи – например, вывода на экран информации только для отдела номер 3, различие в коде будет еще более значительным:

 

Пример кода с использованием цикла SCAN…ENDSCAN:

 

USE SPISOK IN 0 SHARED

SELECT SPISOK

SCAN FOR N_LS=3

? “N_LS=”, N_LS, “   FIO=”,FIO,”  OKLAD=”, OKLAD

ENDSCAN

 

Пример кода с циклом DO WHILE … ENDDO

 

USE SPISOK IN 0 SHARED

SELECT SPISOK

GO TOP

DO WHILE NOT EOF(“SPISOK”)

            IF N_LS=3

? “N_LS=”, N_LS, “   FIO=”,FIO,”  OKLAD=”, OKLAD

            ENDIF

SKIP

ENDDO

 

Нам пришлось добавить внутрь цикла еще и условный оператор IF … ENDIF.

 

Команды поиска

Для поиска записей, удовлетворяющих определенным условиям, используют команду LOCATE FOR условие

Например, если в таблице spisok в записи с номером 12 есть поле fam со  значением "Воробьев", то команда LOCATE FOR fam = "Воробьев" установит  указатель записи на 12-й строке.

Для получения информации о том, удачно или неудачно завершилась операция поиска, предназначена функция FOUND(), она возвращает .T.  если предыдущая операция поиска завершена успешно и .F. если нет.

Так, если предыдущая команда поиска LOCATE FOR fam = "Воробьев" завершилась успешно, команда ? FOUND() вернет значение .T.

В случае неудачного поиска указатель записи помещается в положение EOF().

Обычно, в начале поиска запоминают номер текущей записи при помощи функции RECNO(), а в случае неудачного поиска возвращают запись в исходное положение командой GO …

Например, если текущая таблица имеет поля:  n_ls N(10),fam C(20), oklad N(12,2), тогда нижеприведенная программа выдаст на экран значения оклада и номер лицевого счета сотрудника с фамилией Комаров (если такой сотрудник есть) или сообщение “Не найдено”, и откроет окно просмотра BROWSE

 

old_rec = recno()

locate for fam = "Комаров"

if not found()

? “Не найдено”

go old_rec

else

?”Найдено”

? n_ls,fam, oklad

endif

browse