Добавление записей в 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]
|
Тип поля |
Значение по умолчанию |
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).