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

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

« Назад

Команда

REPLACE FROM ARRAY ArrayName [FIELDS FieldList]
                   [Scope] [FOR lExpression1] [WHILE lExpression2] [NOOPTIMIZE]

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

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

При выполнении команды memo- и general-поля игнорируются. Импортирование данных в эти поля выполняется соответственно командами GATHER и APPEND GENERAL.

Команда

REPLACE FieldName1 WITH eExpression1 [ADDITIVE]
                   [, FieldName2 WITH eExpression2 [ADDITIVE]] ...
                   [Scope] [FOR lExpression1] [WHILE lExpression2]
                   [IN nWorkArea | cTableAlias] [NOOPTIMIZE]

обновляет записи таблицы.

Опции и параметры (см. также табл. 1.7 и 15.4):

FieldName1 WITH eExpression1 [, FieldName2 WITH eExpression2 ... ] – указывают, что данные в поле FieldName1 будут обновлены значением eExpression1, поля FieldName2 – значением eExpression2 и т. д.

Полям невыбранных таблиц должны предшествовать их псевдонимы, например:

select WorkType

&& Выбрана таблица WorkType, но замены выполняются

&& в таблицах Authors и Books

replace ;

Authors.InputDate with Date( ) ;

Books.Price with 250

Это правило распространяется и ряд других команд.

ADDITIVE – если опция задана, то при обновлении memo-поля значение eExpression будет добавлено к существующему значению. Если опция опущена, то memo-поле будет перезаписано.

Замечание. Замены выполнены не будут, если опция IN опущена и в текущей рабочей области файл находится в своем конце, и указано поле в другой рабочей области.

Пример. Значение поля Price таблицы Books не имеющих пометку удаления записей увеличивается на 10 %.

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

set deleted on

replace all Price with Price * 1.1 in Books

То же самое, но не изменяя установку SET DELETED, можно выполнить следующей командой:

replace all Price with Price * 1.1 for not Deleted( ) in Books

Команда

GATHER FROM ArrayName | MEMVAR | NAME ObjectName
                   [FIELDS FieldList | FIELDS LIKE Skeleton
                   | FIELDS EXCEPT Skeleton] [MEMO]

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

Опция (см. также табл. 15.4):

MEMO – указывает, что содержимое memo-полей, если таковые имеются, замещается значениями соответствующих элементов массива или переменных памяти, или свойств. Если опция MEMO опущена, то значения memo-полей остаются неизмененными. Команда всегда игнорирует general-поля.

Пример. В первой записи таблицы Authors дата увеличивается на 10 дней, а в memo-поле Information заносится текст "Изменена дата".

select Authors

&& Переходим к первой записи

go 1

&& Создаем объект oAuthor и изменяем значения его свойств

scatter name oAuthor memo

oAuthor.InputDate = oAuthor.InputDate + 10

oAuthor.Information = "Изменена дата"

&& Заносим изменения в первую запись таблицы

gather name oAuthor memo

&& Просмотр изменения

browse for AuthorId = oAuthor.AuthorId

Команда UPDATE – SQL

UPDATE Target
                   SET Column_Name1 = eExpression1 [, Column_Name2 = eExpression2 ...]

                   [FROM [FORCE] Table_List_Item [[, ...] | [JOIN [ Table_List_Item]]]
                   WHERE FilterCondition1 [AND | OR FilterCondition2 ...]

обновляет записи таблицы новыми значениями.

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

UPDATE Target – задает обновляемую таблицу или курсор. Может иметь следующий синтаксис:

  • [DatabaseName!]TableName, где DatabaseName – это имя нетекущей базы данных;
  • Alias – псевдоним обновляемой таблицы;

  • FileName – имя файла обновляемой таблицы.

SET Column_Name1= eExpression1 [, Column_Name2 = eExpression2 ...] – задает обновляемые поля. В eExpression нельзя непосредственно использовать значение свойства объекта; прежде создается переменная, хранящая это значение, которая затем применяется в eExpression, например:

x = SomeObject.Value

а затем в опции SET указать

set SomeFld = x

Если значение свойства, например SomeObject.Value, употреблено в опции SET непосредственно, то команда будет рассматривать SomeObject как псевдоним.

В опции SET поля обновляются последовательно, поэтому команда

update Table1 set Field1 = Field2, Field2 = Field1

не приведет к обмену данных полей Field1 и Field2, а запишет в указанные поля значение поля Field2.

В опции SET для указания eExpression можно задать подзапрос. Если он не возвращает результата, то в качестве eExpression будет использован NULL.

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

[FROM [FORCE] Table_List_Item[[, ...] | [JOIN [ Table_List_Item]]] – задает одну или несколько таблиц источников-данных. Опция FROM имеет тот же синтаксис, что и команда SELECT – SQL, за исключением следующих ограничений:

  • обновляемая таблица или курсор не может быть включена в OUTER-объединение в качестве второй таблицы или курсора;

  • должно быть предусмотрено выполнение всех JOIN-операций до выполнения JOIN-операции с обновляемой таблицей;

  • обновляемый курсор не может быть результатом подзапроса.

Опция FORCE указывает, что таблицы объединяются в порядке их появления в опции FROM (см. также описание опции в команде SELECT – SQL).

Параметр Table_List_Item может иметь следующий синтаксис:

  • [DatabaseName!]Table [[AS] Local_Alias], где DatabaseName – это имя нетекущей базы данных, а Local_Alias – псевдоним, используемый в команде. Если псевдоним задан, то его необходимо использовать вместо имени таблицы (курсора) в текущей UPDATE – SQL команде. Опция JOIN дает возможность указать одну или более вторичных таблиц;
  • (Subquery) AS Subquery_Alias – подзапрос; детали см. в описании команды SELECT – SQL.

WHERE FilterCondition1 [AND | OR FilterCondition2 ...]] – условия отбора; детали см. в описании команды SELECT – SQL.

После выполнения команды число обновленных записей хранит системная переменная _TALLY.

Команда UPDATE – SQL при обновлении таблицы, открытой в режиме разделяемого доступа, выполняет блокировку записей, а не всей таблицы, как команда REPLACE. Это уменьшает конфликты между пользователями, но может снизить производительность. Наибольшее быстродействие будет достигнуто, если употребить функцию FLOCK( ).

Приводимые ниже примеры построены на основе примеров, имеющихся в справке VFP.

Пример 1. После выполнения команды UPDATE – SQL поле MaxOrdAmt всех записей с MaxOrdAmt = 0 таблицы Customer будет иметь значение 25.

close databases

open database (Home(2) + 'Data\TestData')

use Customer

browse fields Company, MaxOrdAmt for MaxOrdAmt = 0 last

update Customer set MaxOrdAmt = 25 where MaxOrdAmt = 0

browse fields Company, MaxOrdAmt for MaxOrdAmt = 25 last

Пример 2. Результаты запроса направляются в таблицу d:\MyProductsList.dbf. В создаваемый затем курсор MyUpdateTable с одним целочисленным полем Prod_Unit добавляется одна запись, в которой Prod_Unit = 10. После этого обновляется поле In_Stock в записях таблицы, в которых первые два символа поля Prod_Name – это латинские буквы C и h.

close databases

open database (Home(2) + 'Data\TestData')

select In_Stock, Prod_Name ;

from Products ;

into table d:\MyProductsList.dbf

browse last for MyProductsList.Prod_Name = "Ch"

&&

create cursor MyUpdateTable (Prod_Unit I(10))

insert into MyUpdateTable (Prod_Unit) values (10)

browse last

&&

set ansi off

update MyProductsList ;

set MyProductsList.In_Stock = MyUpdateTable.Prod_Unit ;

from MyUpdateTable ;

where MyProductsList.Prod_Name = "Ch"

&&

select MyProductsList

browse last for MyProductsList.Prod_Name = "Ch"

Пример 3. Аналогичен предыдущему. Однако в курсоре несколько записей и поле In_Stock замещается средним значением поля Prod_Unit курсора. Для получения результата используется подзапрос.

&& Создаются таблица и курсор

&& Добавляем в курсор записи

insert into MyUpdateTable (Prod_Unit) values (10)

insert into MyUpdateTable (Prod_Unit) values (20)

browse last

&&

set ansi off

update MyProductsList ;

set MyProductsList.In_Stock = (select Avg(Prod_Unit) from MyUpdateTable);

where MyProductsList.Prod_Name = "Ch"

&&

select MyProductsList

browse last for MyProductsList.Prod_Name = "Ch"

Пример 4. Обновляется поле Price в записях курсора MyProducts, для которых MyProducts.ProdID = MyUpdates.ProdID, где MyUpdates – это псевдоним курсора-источника данных.

close databases all

&&

create cursor MyProducts (ProdID I , ProdCategory I NULL, Price Y NULL)

insert into MyProducts values (1, 9, 1.00)

insert into MyProducts values (2, 8, 2.00)

insert into MyProducts values (3, 7, 3.00)

&&

create cursor MyUpdates (ProdID I , Price Y)

insert into MyUpdates values (1, .50)       && Используется для обновления

insert into MyUpdates values (2, 20.00)   && Используется для обновления

insert into MyUpdates values (4, 40.00)   && Нет соответствия

insert into MyUpdates values (1, 10.00)   && 2-е соответствие; не используется

&&

update MyProducts set Price = MyUpdates.Price ;

from MyUpdates ;

where MyProducts.ProdID = MyUpdates.ProdID

&&

select MyProducts

browse last

Команда

BLANK [FIELDS FieldList] [Scope] [FOR lExpression1]
                   [DEFAULT [AUTOINC]] [WHILE lExpression2]
                   [NOOPTIMIZE] [IN nWorkArea | cTableAlias]

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

Опции (см. также табл. 1.7):

[DEFAULT [AUTOINC]] – инициализирует (опция DEFAULT) указанные или все поля их значениями по умолчанию (если таковые имеются). Если задана опция AUTOINC, то соответствующие следующие autoinc-значения получать все указанные autoinc-поля. Если опция опущена, то такие поля сохранят свои значения.

Замечания:

  1. Очистка не будет выполнена, если опция IN опущена и в текущей рабочей области файл находится в своем конце, и указано поле в другой рабочей области.

  2. Добавление чистой записи выполняется APPEND BLANK; функция ISBLANK( ) возвращает .T., если значение является чистым.

  3. Обновление autoinc-полей осуществляется, при заблокированном заголовке таблицы. Если команда BLANK выполняется с DEFAULT AUTOINC, а таблица с autoinc-полем, открытая в режиме разделяемого доступа, незаблокирована и SET MULTILOCKS установлен в OFF, то VFP сгенерирует ошибку.