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

Добавление записей в Microsoft Visual FoxPro

« Назад

Команда

APPEND [BLANK] [IN nWorkArea | cTableAlias] [NOMENU]

добавляет одну или более записей в конец таблицы. Если при выполнении команды указанная таблица не открыта, то появится Open-диалог.

APPEND без опции BLANK открывает Edit-окно, что позволяет интерактивно добавить записи.

Открытые при выполнении команды индексы автоматически обновляются.

Опции:

BLANK – обеспечивает добавление одной чистой записи в конец таблицы. При употреблении опции Edit-окно не открывается. Применяется для программного добавления записей.

IN nWorkArea | cTableAlias – описана в табл. 1.7. Если задана и если используется команда APPEND, то таблица, указанная опцией, автоматически выбирается, если же употребляется команда APPEND BLANK, то запись добавляется в указанную опцией таблицу, но таблица не выбирается (сохраняется существующий выбор).

NOMENU – вызывает удаление меню Table, препятствуя тем самым интерактивному изменению параметров Edit-окна.

Замечание. Команда APPEND BLANK неприменима при работе с таблицей Authors, поскольку при добавлении записи выполняется проверка записи AuthorId > 0, и эта проверка завершается с отрицательным результатом (при выполнении APPEND BLANK AuthorId = 0).

Пример 1. В таблицу NewBooks с полями BookId типа I(4), Book типа C(50) и Price типа N(10, 2) добавляется чистая запись и производится заполнение ее полей. Таблица NewBooks индексированна по полю BookId. Тип индекса – первичный.

Поскольку в поле BookId значения должны быть уникальны, а при выполнении APPEND BLANK добавляется запись с BookId = 0, то необходимо проверить, есть ли запись с BookId = 0. Если да, то выполнение APPEND BLANK приведет к ошибке.

При вычислении нового значения NewBookId необходимо учитывать и записи, имеющие пометку удаления. Поэтому SET DELETED устанавливается в OFF. Если этого не сделать, то может возникнуть неуникальность BookId.

&& Проверяем, открыта ли таблица NewBooks

if not Used("NewBooks") then

MessageBox("Нужно открыть таблицу NewBooks!")

return

endif

&& При вычислении newBookId нужно учитывать записи,

&& имеющие пометку удаления

set deleted off

select NewBooks

&& Проверяем, есть ли запись с BookId = 0

set order to BookId

if Seek(0) then

MessageBox("Не могу продолжить. Есть запись с BookId = 0!")

return

endif

&& Вычисляем очередное значение кода книги

calculate Max(BookId) to newBookId

newBookId = newBookId + 1

append blank                      && Добавляем чистую запись

&& Заполняем поля записи

replace BookId with newBookId ;

Book with "Новая книга" ;

Price with 200

&& Просмотр добавленной записи

browse for BookId = newBookId

Пример 2. В таблицу Books, имеющую поле BookId типа Integer (AutoInc), добавляется чистая запись и производится заполнение ее полей. Значение autoinc-поля определяется автоматически.

select Books

append blank                      && Добавляем чистую запись

&& Заполняем поля записи

replace Book with "Новая книга" ;

Price with 200 ;

Pdate with Date( )

browse last                          && Просмотр результата

Команда

APPEND FROM ARRAY ArrayName [FOR lExpression]
                   [FIELDS FieldList | FIELDS LIKE Skeleton | FIELDS EXCEPT Skeleton]

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

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

Таблица 15.5

Значения по умолчанию полей разных типов

Тип поля

Значение по умолчанию

Character

Пробелы

Numeric

0

Currency

0

Float

0

Integer

0

Double

0

Date

Пустое значение типа Date, например CTOD("")

DateTime

Пустое значение типа DateTime, например CTOT("")

Logical

.F.

Memo

Пустое значение

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

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

Замечания:

1. С таблицами, имеющими поле типа Integer (AutoInc), APPEND FROM ARRAY применяется после установки SET AUTOINCERROR в OFF или установки посредством функции CURSORSETPROP( ) свойства AutoIncError курсора в .F.

2. Поля типа Memo, General и Blob командой APPEND FROM ARRAY игнорируются. Импортирование данных в эти поля выполняется командами GATHER и APPEND GENERAL.

Пример. В таблицу NewBooks добавляются строки из одномерного массива. Перед добавлением проверяется, не приведет ли оно к нарушению уникальности поля BookId. Если такое возможно, то элемент массива, соответствующий этому полю, устанавливается равным нулю.

select NewBooks

set order to BookId             && Для проверки уникальности BookId

&&

&& Формируем пустой массив

scatter to arrayForBooks blank

&& Заполняем массив

arrayForBooks(1) = 20       && Код книги

arrayForBooks(2) = "Новая книга"         && Ее название

arrayForBooks(3) = 200     && Цена

&& Контроль уникальности поля BookId

if Seek(arrayForBooks(1)) then

arrayForBooks(1) = 0

endif

&&

&& Добавляем из массива

append from array arrayForBooks for arrayForBooks(1) > 0

Команды INSERT – SQL

INSERT INTO dbf_name [(fname1 [, fname2, ...])]
                   VALUES (eExpression1 [, eExpression2, ...])

или

INSERT INTO dbf_name FROM ARRAY ArrayName
                   | FROM MEMVAR | FROM NAME ObjectName

или

INSERT INTO dbf_name [(fname1 [, fname2, ...])]
                   SELECT SELECTClauses [UNION UnionClause SELECT SELECTClauses ...]

добавляют одну или более записей в конец таблицы, вставляя данные в указанные поля. После выполнения VFP позиционирует файл на первой добавленной записи. Несколько записей могут добавить команды INSERT INTO … FROM ARRAY и INSERT INTO … SELECT.

Команда модифицирует значение системной переменной _TALLY, сохраняя в ней число обработанных записей.

Опции и параметры:

INSERT INTO dbf_name – задает имя таблицы, в которую добавляется запись. Имя может содержать путь или быть задано как выражение с именем. Если таблица dbf_name уже открыта, то она при выполнении команды будет открыта повторно в новой рабочей области. Команда не изменяет текущую рабочую область, однако на время выполнения команды активной становится рабочая область, в которой открыта модифицируемая таблица.

[(fname1 [, fname2 [, ...]])] – имена полей новой записи, в которые добавляются данные.

VALUES (eExpression1 [, eExpression2 [, ...]]) – вставляемые значения. Если имена полей опущены, то значения в опции VALUES должны следовать в порядке, определяемом структурой таблицы. Число eExpression должно равняться числу полей, в которые добавляются данные.

Если eExpression – это имя поля, то ему должен предшествовать псевдоним таблицы.

Если в поле данные не добавляются и SET NULL установлен в ON, то VFP пытается записать в поле NULL. Если NULL для поля не предусмотрен, то возникнет ошибка. Для ее избежания следует установить SET NULL в OFF.

SELECT SELECTClauses [UNION UnionClause SELECT SELECTClauses ...] – добавляет данные в указанные поля таблицы или курсора, используя один или более SQL SELECT операторов. Опция может иметь и другие опции команды SELECT – SQL, например HAVING. Но не может включать не SQL-опции, такие, как INTO, TO, PREFERENCE, NOFILTER, READWRITE, NOCONSOLE, PLAIN и NOWAIT. Для объединения дополнительных SQL SELECT операторов используется опция UNION; детали см. в описании команды SELECT – SQL.

Замечания:

1. Если используется опция FROM NAME ObjectName и если в таблице есть поле типа Integer (AutoInc), то свойством, соответствующим такому полю, можно воспользоваться, если SET AUTOINCERROR будет установлен в OFF. В противном случае VFP генерирует ошибку. Если SET AUTOINCERROR установлен в ON и для получения объекта используется SCATTER NAME, то для избежания генерации сообщений об ошибке можно удалить свойство, соответствующие полю типа Integer (AutoInc), употребив функцию REMOVEPROPERTY( ).

2. Команда INSERT – SQL работает быстрее, чем команда APPEND BLANK с последующим выполнением команды REPLACE.

3. При использовании SQL SELECT операторов следует позаботиться о совместимости типов полей таблицы приемника данных и курсора-результата запроса. Несовместимость типов данных приводит к потере информации, возникающей в результате преобразования типов данных.

Пример 1. Добавляется новая запись в таблицу NewBooks; вставляются значения в поля Book и BookId. Предварительно находится соответствующее значение поля BookId. Поскольку в поле Price данные не добавляются и оно не принимает NULL, то SET NULL устанавливается в OFF.

set deleted off

&& Чтобы не было проблем с полем Price

set null off

select NewBooks

&& Вычисляем очередное значение кода книги

calculate Max(BookId) to newBookId

newBookId = newBookId + 1

&& Добавляем новую запись

insert into NewBooks (Book, BookId) values(newBookId, "Новая книга")

&& Просмотр добавленной записи

browse for BookId = newBookId

Пример 2. Копируется запись с BookId = 15. Обеспечивается уникальность поля BookId.

set deleted off

select NewBooks

set order to BookId

&&

if not Seek(15) then

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

return

endif

&& Копируем данные в переменные памяти

scatter memvar

&& Вычисляем очередное значение кода книги

calculate Max(BookId) to m.BookId

m.BookId = m.BookId + 1

&& Добавляем новую запись

insert into NewBooks from memvar

&& Просмотр добавленной записи

browse for BookId = m.BookId

Переменные памяти можно заменить объектом:

&& Копируем данные в объект oBook

scatter name oBook

&& Вычисляем очередное значение кода книги

calculate Max(BookId) to oBook.BookId

oBook.BookId = oBook.BookId + 1

&& Добавляем новую запись

insert into NewBooks from name oBook

&& Просмотр добавленной записи

browse for BookId = oBook.BookId

Пример 3. Добавляются две новых строки из массива. Обеспечивается уникальность поля BookId.

set deleted off

select NewBooks

dimension arrayOfBooks(2, 3)

&& Вычисляем очередное значение кода книги

calculate Max(BookId) to newBookId

&& Формируем массив формы (2´3)

for k = 1 to 2

arrayOfBooks(k, 1) = newBookId + k

arrayOfBooks(k, 2) = "Новая книга " + Transform(k)

arrayOfBooks(k, 3) = 200 + k

next

&& Добавляем две новых записи

insert into NewBooks from array arrayOfBooks

&& Просмотр добавленных записей

browse for BookId > newBookId

Пример 4. Из таблицы NewBooks ошибочно удалены записи с BookId < 10. Таблицы восстанавливает путем добавления нужных записей из имеющейся копии – таблицы BooksCopies.

&& Нужно учитывать записи, имеющие пометку удаления

set deleted off

select NewBooks

&& Проверяем, есть ль записи с BookId < 10

count to b10 for BookId < 10

if b10 > 0 then

                                            MessageBox("Есть записи с BookId < 10!")

                                            return

endif

&& Добавляем записи c BookId < 10

insert into NewBooks;

select * ;

from d:\HomeLibrary\BooksCopies.dbf ;

where BooksCopies.BookId < 10

&& Просмотр добавленных записей

browse for BookId < 10

При явном указании полей команда INSERT INTO … SELECT запишется следующим образом:

insert into NewBooks (BookId, Book, Price) ;

select BookId, Book, Price ;

    from d:\HomeLibrary\BooksCopies.dbf ;

where BooksCopies.BookId < 10

Из примера видно, что команда INSERT INTO … SELECT пригодна для быстрого добавления больших объемов данных из разных таблиц в заданную таблицу.

Команда

SET CARRY ON | OFF

или

SET CARRY TO [FieldList [ADDITIVE]]

определяет, будет ли VFP переносить данные текущей записи в новую запись, созданную INSERT, APPEND или Ctrl+Y при работе с BROWSE.

Замечания:

1. Содержимое memo- и general-полей не переносится в поля добавленной записи.

2. При работе с полями типа Integer (Autoinc) следует либо использовать SET CARRY TO FieldList, не включая в FieldList поля типа Integer (Autoinc), либо, если действует SET CARRY ON, установить SET AUTOINCERROR в OFF и программно контролировать значения autoinc-полей.

Команда оказывает влияние только на текущую таблицу.

Опции и параметр:

ON – данные текущей записи переносятся в новую запись.

OFF – (по умолчанию) данные текущей записи не переносятся в новую запись.

TO [FieldList [ADDITIVE]] – задает список полей, данные которых копируются в новую запись. Имена полей в списке разделяются запятыми.

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

Выполнение команды SET CARRY TO (со списком FieldList или без него) неявно выполняет SET CARRY ON.

Команда SET CARRY TO без списка FieldList восстанавливает установку по умолчанию – переносятся данные всех полей.

Изменение структуры таблицы при активной команде SET CARRY TO FieldList неявно влечет выполнение SET CARRY TO без списка полей. Поэтому для возврата к нужной установке после модификации структуры таблицы следует выполнить соответствующую команду SET CARRY TO FieldList.

Установка команды сохраняется с текущей сессией данных.

Функция

GETAUTOINCVALUE([nDataSessionNumber | 0])

возвращает последнее сгенерированное autoinc-значение для указанной или текущей сессии данных. Значение возвращается, даже если autoinc-поле обновить не удалось. Функция вернет NULL, если ни одного autoinc-значения не было сгенерировано.

Параметр:

nDataSessionNumber – номер сессии данных для которой возвращается результат. Если параметр опущен или равен нулю, то результат возвращается для текущей сессии данных (т. е. задает, что результат возвращается в пределах области видимости текущей функции, процедуры или метода).

Замечание. Autoinc-поля обновляются, например, при выполнение таких команд, как APPEND, INSERT – SQL, APPEND FROM или BLANK (если задана опция AUTOINC).