- •Начало работы в среде разработчика FoxPro
- •Константы и переменные
- •Примеры
- •Примеры
- •Примеры
- •Комментарии
- •Процедуры и функции
- •Примеры:
- •Индексы массива
- •Примеры
- •Примеры
- •Примеры
- •2. Считывание информации из файла.
- •3. Перемещение по файлу
- •Примеры
- •Примеры
- •Примеры
- •Примеры
- •Примеры
- •Примеры
- •Задание
- •Примеры
- •Задание
- •Графические функции
- •Шрифтовые свойства
- •Метод line
- •Метод box
- •Метод Circle
- •Функции даты и времени
- •Use [файл | ?] [in рабочаяОбласть] [again] [alias Псевдоним] [exclusive | shared] [noupdate]
- •Добавление и изменение значений полей
- •Относительное перемещение:
- •Контрольные работы
Относительное перемещение:
Команда 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