Распечатать страницу

Копирование записей в Visual FoxPro

« Назад

Команда

COPY TO ARRAY ArrayName [FIELDS FieldList
                   | FIELDS LIKE Skeleton | FIELDS EXCEPT Skeleton]
                   [Scope] [FOR lExpression1] [WHILE lExpression2] [NOOPTIMIZE]

копирует данные текущей таблицы в массив ArrayName. Если опция FIELDS не задана и если массив имеет достаточное число столбцов, то копируются все поля.

Каждой копируемой записи соответствует строка массива ArrayName.

При копировании значение первого поля записи таблицы или списка FIELDS устанавливается в первый элемент соответствующей строки массива, второго – во второй и т. д.

Если число элементов в строке массива больше числа полей, то они остаются неизмененными, если меньше, то избыточные поля игнорируются.

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

Одномерный массив, если он задан для копирования одной строки, интерпретируется как двумерный с одной строкой.

Команды COPY TO ARRAY и SCATTER аналогичны. Разница в том первая копирует несколько записей, а вторая – только одну. Обе создают новый массив ArrayName, если массив с таким именем не существует.

Пример. В двумерный массив arrayForBooks копируются все записи таблицы Books, отвечающие книгам, названия которых начинаются с буквы Р.

select books

&& Определяем число строк массива

count for Left(Book, 1) = "Р" to nRows

if nRows = 0 then

wait 'В таблице нет книг, начинающихся в буквы Р.' window

return

endif

&&

&& Копируем данные в массив arrayForBooks; массив будет создан

copy to array arrayForBooks for Left(Book, 1) = "Р"

&& Выводим результат

display memory like arrayForBooks

Команда

SCATTER [FIELDS FieldNameList | FIELDS LIKE Skeleton
                   | FIELDS EXCEPT Skeleton] [MEMO] TO ArrayName
                   | TO ArrayName BLANK | MEMVAR | MEMVAR BLANK
                   | NAME ObjectName [BLANK] [ADDITIVE]

копирует данные текущей записи  таблицы в набор переменных памяти, свойств объекта или в одномерный массив ArrayName. Если опция FIELDS опущена, то копируются значения всех, кроме general, полей; значения memo-полей копируются, если включена опция MEMO.

Если размер memo-полей велик, то при включенной опции MEMO может возникнуть ошибка, вызванная недостатком памяти. В этом случае значение переменной или элемента массива, предназначенного для хранения значения memo-поля устанавливается равным .F.

Опции:

TO ArrayName – указывает, что копирование записи выполняется в массив ArrayName. Если массив не существует, то он будет создан. Если массив существует, но его размер недостаточен, то он будет соответствующим образом увеличен. Если же размер избыточен, то лишние элементы останутся неизмененными.

TO ArrayName BLANK – указывает, что массив ArrayName будет содержать пустые элементы в количестве, равном числу копируемых полей. Тип каждого элемента определяется типом соответствующего поля.

MEMVAR – обеспечивает копирование полей записи в переменные памяти. При этом полю FieldName соответствует переменная памяти m.FieldName.

Замечание. Не указывайте TO перед MEMVAR, поскольку в этом случае будет создан массив с именем memVar.

MEMVAR BLANK – создает пустые переменные памяти.

NAME ObjectName [BLANK] [ADDITIVE] – копирует данные в объект. При этом данные поля FieldName копируются в свойство ObjectName.FieldName. Если задана опция BLANK, то значения свойств будут пустыми, в противном случае свойства будут содержать значения соответствующих полей.

Если объект не существует, то он будет создан. Если существует, но его свойства не полностью соответствуют полям таблицы, то необходимые свойства будут добавлены.

Однако в ряде случаев SCATTER не может создать всех необходимых свойств (например, когда имя поля совпадает с именем метода (события) существующего объекта или с именем самого объекта) или установить их значения (например, когда свойства помечены как Hidden или Protected). В такой ситуации VFP генерирует ошибку. Чтобы избежать ошибок подобного рода не следует использовать в NAME имен объектов, созданных на базе классов VFP.

Опция ADDITIVE используется, если необходимо обновить значения свойств существующего объекта (это должен быть объект VFP, но не COM-объект) и добавить несуществующие. Если одновременно используются ADDITIVE и BLANK, то SCATTER пропускает существующие свойства объекта, имеющие соответствующие им поля. Несуществующие свойства будут добавлены с пустыми значениями.

NAME ADDITIVE не генерирует ошибку, если обрабатывается свойство существующего объекта, имеющее статус "только для чтения". Однако значение свойства остается неизмененным.

Если объект имеет то же имя, что и открытая таблица, то для обращения к свойству следует дополнительно использовать префикс "m.", например:

use Customer

scatter name Customer

? Customer.Company         && Значение поля таблицы Customer

? m.Customer.Company     && Значение свойства объекта Customer

Пример. Создается объект, содержащий одновременно свойства, соответствующие полям таблиц Books, BooksContent и WorkType. Значения свойств, отвечающих книге с кодом 2, выводятся на печать.

Фрагменты таблиц, иллюстрирующие ситуацию, приведены на рис. 15.6.

211.1.-Иллюстрация-к-примеру

Рис. 15.6. Иллюстрация к примеру

close databases

close tables all

open database 'd:\HomeLibrary\HomeLibrary'

use Books order BookId in 0

use BooksContent order BookId in 0

use WorkType order TypeId in 0

select Books

if not Seek(2) then

MessageBox("Нет записи с BookId = 2!")

return

endif

&& Создаем объект oBook

&& Первоначально он имеет свойства BookId, Book и Price

scatter name oBook

&& Устанавливаем связь 1:1 между BooksContent и WorkType

select BooksContent

set relation to TypeId into WorkType

&& Выбираем все произведения, имеющиеся в книге с BookId = 2

scan for BookId = 2

&& Добавляем (при первой итерации) в объект oBook свойство Work

&& Во время последующих итераций значение этого свойства обновляется

scatter Work name oBook additive

select WorkType

&& Добавляем (при первой итерации) в объект свойство WorkType

&& Во время последующих итераций значение этого свойства обновляется

scatter WorkType name oBook additive

&& Отображаем сведения об объекте

display objects like oBook

endScan

Возможный результат:

Object: OBOOK

 

 

 

 

 

 

Properties:

 

 

 

BOOK

C

"Дочь Ивана, мать Ивана (повесть). Рассказы"

 

BOOKID

N

2

(2.00000000)

PRICE

N

210.00

(210.00000000)

WORK

C

"Дочь Ивана, Мать Ивана"

 

WORKTYPE

C

"Повесть"

 

 

 

 

 

Object: OBOOK

 

 

 

 

 

 

Properties:

 

 

 

BOOK

C

"Дочь Ивана, мать Ивана (повесть). Рассказы"

 

BOOKID

N

2

(2.00000000)

PRICE

N

210.00

(210.00000000)

WORK

C

"В ту же землю"

 

WORKTYPE

C

"Рассказ"

 

 

 

 

См. также примеры для команд INSERT INTO и GATHER.