Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тема_2_6_FoxПеременные.doc
Скачиваний:
4
Добавлен:
05.05.2019
Размер:
58.37 Кб
Скачать

4. Массивы переменных

Одним из важных инструментов программиста является возможность работы с массивами временных переменных.

Описание массивов

В FoxPro разрешается работа с одномерными и двумерными массивами переменных. Для этого они предварительно должны быть описаны специальной командой

DECLARE/DIMENSION <переменная> (<BыpNl> [,<BыpN2>]) [,<переменная> (<BыpNl> [,<BыpN2>])] ...

Нумерация элементов массива начинается с единицы. Например:

DIMENSION a(3,8), b(4)

Здесь описываются два массива: двумерный массив А (размерностью 3 х 8) и одномерный В (длиной четыре элемента). Сразу после описания массивов командой DIMENSION, все их элементы получают логический тип со значением .F. В дальнейшем элементы в результате присваивании могут получать новые типы и значения. Тип каждого отдельного элемента определяется результатом последней команды присваивания (=, STORE, SCATTER).

При описании массива и обращении к его элементам разрешено использовать круглые или квадратные скобки. Разрешается повторное описание существующего массива, причем имеющиеся данные не будут утрачены. Это может иметь смысл, если после заполнения массива оказалось, что ранее было зарезервировано больше элементов, чем необходимо.

Каждый массив использует для своего имени одну переменную и может иметь до 3600/65000 элементов (стандартная/расширенная версии). Разрешено использовать до 3600/65000 массивов. Практические ограничения зависят от доступной памяти компьютера.

Обмен данными с базой данных

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

Работа с одномерными массивами/переменными. Следующая команда последовательно переносит значения полей только из текущей записи активного файла базы данных в последовательные элементы одномерного массива (если указана опция <массив>) или переменные (если указано MEMVAR). Все такие переменные получат те же типы и размеры, что и поля базы данных. С опцией BLANK создаются пустые переменные.

SCATTER [FIELDS <поля>][МЕМО] ТО <массив>/ТО <массив> BLANK/ BLANK/MEMVAR BLANK

Если массив ранее не был описан или его длина недостаточна, он будет создан командой. Если переменные ранее не существовали, они будут созданы с теми же именами, что и соответствующие поля. Для того чтобы СУБД могла отличить одинаковые имена полей и переменных, к последним нужно обращаться с префиксом "М". Например, М->Х или М.Х для переменной X. В случаях, если префикса нет, СУБД сначала ищет поле с указанным именем, и только если его не находит - переменную.

Если использовано слово BLANK, то создается множество незаполненных переменных или элементов массива, имеющих те же типы, что и поля базы данных.

Если режим FIELDS не указан, переносятся все поля записи.

Опция MEMO указывает на то, что и мемо-поля будут копироваться. При этом необходимо следить, чтобы размер копируемого мемо-поля не был больше разрешенной длины переменной.

Пример. В результате использования следующих команд будут созданы массив А размерностью три элемента и переменные М.РАМ и М.ТАВ:

USE kadr

SCATTER FIELDS fam,tab,per TO a MEMO

SCATTER FIELDS fam,tab MEMVAR

Действие команды GATHER обратно действию команды SCATTER:

GATHER FROM <массив>/МЕМVАR [FIELDS <поля>] [MEMO]

Команда переписывает в <поля> текущей записи активного файла базы данных элементы <массива> или одноименные переменные (опция MEMVAR), созданные ранее командой SCATTER, включая и мемо-поля (если указана опция MEMO).

Типы соответствующих полей и элементов массива должны совпадать. Если отсутствует слово FIELDS, элементы переносятся в последовательные поля, начиная с первого.

Если число элементов массива и полей не совпадает, лишние игнорируются.

Рассмотренная пара команд очень удобна, если предстоит сложная обработка полей записи базы данных. В этом случае лучше перенести их в переменные, а затем, после обработки, вернуть в базу. Часто ввод/редактирование данных приходится сочетать с некоторой их трансформацией, сложными проверками и сопутствующими вычислениями, например данные из текущей записи могут понадобиться для просмотра других записей в этой же базе.

Работа с двумерным массивом. Следующая пара команд осуществляет взаимодействие с двумерными массивами. Мемо-поля командами игнорируются. Команда

COPY TO ARRAY <массив> [FIELDS <поля> [<границы>] [FOR <вырL1>] [WHILE <BыpL2>]

последовательно пересылает поля из записей текущей базы данных в последовательные элементы строк <массива>.

Команда COPY TO в отличие от команды SCATTER не создает массива, т.е. он к этому времени должен существовать. Причем такой массив должен быть описан как двумерный, даже если считывается одно поле (например, А(10,1), но не А(10)). Если количество элементов массива и полей не совпадает, то лишние игнорируются.

Команды COPY TO ARRAY и SCATTER близки по функциям, но команда COPY позволяет переслать в массив несколько записей, a SCATTER - только одну, и команда COPY сама не создает массива.

Если <массив> двумерный, действие команды заканчивается после заполнения всех строк массива или достижения конца базы.

Следующая команда:

APPEND FROM ARRAY <массив> [FOR <BыpL>] [FIELDS <поля>]

по своему действию обратна действию команды COPY TO ARRAY и добавляет к базе данных записи из <массива> так, что каждая строка массива становится записью базы.

Если массив имеет больше элементов, чем база данных полей, то лишние элементы отбрасываются, и, наоборот, если база имеет больше полей, лишние поля остаются пустыми. Если указано FOR-условие, добавление новой записи из массива произойдет только в случае, если оно истинно. <BыpL> должно содержать имя поля/полей базы данных, но проверяются элемент/элементы массива, которые направляются в это поле. Если условие ложно, строка массива пропускается. Если <массив> двумерный, действие команды заканчивается после просмотра всех строк массива.

Следующая команда во всех смыслах APPEND FROM ARRAY, но переносит данные из массива в уже существующие поля базы данных - строку за строкой.

REPLACE FROM ARRAY <массив> [<границы>] [FIELDS <поля>] [FOR <BыpLl>] [WHILE <BыpL2>]

4