Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите с обновлением данныхв в FoxPro / 24 сообщений из 24, страница 1 из 1
17.05.2012, 11:11
    #37798421
klimyuk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с обновлением данныхв в FoxPro
Доброго времени суток. Срочно нужна помощь знающих и понимающих ФоксПРо.
Нужно обновить данные в одной таблице, на основе другой.
Короче в 611.dbf есть поля id, name (и другие, которые не сильно интересуют).В другой базе splat.dbf тоже есть поле id, newname. Короче нужно в 611 изменить name на newname из splat.dbf у которых 611.id = splat.id.
Вроди бы все просто, но никак не получается. Делаю так:
USE ("c:\zem\611.dbf") IN 0 ALIAS table1
USE ("c:\zem\splat.dbf") IN 0 ALIAS splat

UPDATE splat set splat.name = table1.newname WHERE table1.tin = splat.kod

ничего не получается. В чем ошибка??
...
Рейтинг: 0 / 0
17.05.2012, 11:12
    #37798429
klimyuk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с обновлением данныхв в FoxPro
ошибочка

UPDATE splat set splat.name = table1.f_fulln_u_ WHERE table1.id = splat.id
...
Рейтинг: 0 / 0
17.05.2012, 11:13
    #37798432
klimyuk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с обновлением данныхв в FoxPro
UPDATE splat set splat.name = table1.newname WHERE table1.id = splat.id
...
Рейтинг: 0 / 0
17.05.2012, 11:21
    #37798450
IgorNG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с обновлением данныхв в FoxPro
klimyuk,

Команда SQL UPDATE может изменить данные только в записях одной Таблицы.


UPDATE TargetSET Column_Name1 = eExpression1 [, Column_Name2 = eExpression2 ...] [FROM [FORCE] Table_List_Item [[, ...] | [JOIN [ Table_List_Item]]] WHERE FilterCondition1 [AND | OR FilterCondition2 ...]



Параметры
UPDATE Target
Определяет имя Базовой Таблицы, Курсора, алиаса Таблицы или Курсора, или имя файла, где выполняются требуемые изменения. Вы можете указать несколько источников данных для операции изменения в соответствующей секции FROM. Target может иметь один из следующих возможных вариантов синтаксиса:

[DatabaseName!]TableName

DatabaseName! определяет имя базы данных, к которой прикреплена соответствующая таблица, если она (таблица) не закреплена за текущей базой данных. Если рассматриваемая таблица не относится к текущей базе данных, вы должны обязательно указать имя родительской базы данных. В качестве разделителя-соединителя между именем родительской базы данных и именем дочерней таблицы используется восклицательный знак (!).

TableName определяет имя таблицы, в которой выполняются изменения.

Alias

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

FileName

FileName определяет имя файла, в котором выполняются рассматриваемые изменения данных.

SET Column_Name1= eExpression1 [, Column_Name2 = eExpression2 ...]
Определяет имя столбца в изменяемой таблице, в который заносятся новые значения. Если вы не используете секцию WHERE, каждая запись таблицы назначения будет содержать новые значения указанных столбцов.

Если вы хотите использовать значения некоторых свойств объекта исходных данных в качестве expression, вы должны определить соответствующую переменную памяти для указанного объекта, а за тем ее использовать. Например, вы можете выполнить следующее x = oColField("iid").Value и, после этого, указавать конструкцию SET как set iid = x, в рассматриваемой команде UPDATE - SQL . Если вы используете следующую нотацию при обращении к свойствам объекта objectname.property, непосредственно в выражении expression, то в этом случае возникает Ошибочная ситуация; отсутствие указанного Алиаса objectname.

В качестве выражения в конструкции SETможно использовать некоторый Подзапрос, возвращающий требуемое выражение. Если выполняемый подзапрос не возвращает никакого результата, то предполагается значение = NULL. Общий синтаксис и дополнительная информация о Подзапросах представлена в следующем разделе SELECT - SQL, команда - FROM, секция.

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


[FROM [FORCE] Table_List_Item[[, ...] | [JOIN [ Table_List_Item]]]
Определяет одну или несколько таблиц данных для выполнения операции Изменения данных.

Секция FROM имеет аналогичный синтаксис, как и в команде SQL SELECT, за исключением следующих ограничений:

Изменяемая Таблица или Курсор не может быть включена в качестве присоединяемой таблицы при соединении типа OUTER Join.

Данная операция изменения не должна "ломать" другие существующие Соединения JOIN, при выполнении операции Соединения JOIN для изменяемой таблицы.

Результирующий Курсор не должен быть результатом выполнения Подзапроса.

Дополнительная информацию имеется в следующем разделе SELECT - SQL, Команда.

FORCE - определяет, что указанные присоединяемые таблицы обрабатываются в том порядке, в котором они указаны в секции FROM.

Обратите Внимание
Если опция FORCE - отсутствует, Visual FoxPro пытается оптимизировать выполнение рассматриваемой операции Изменения. Однако, Операция Изменения данных может выполняться значительно быстрее при использовании ключевого слова FORCE, в этом слечае система Visual FoxPro отключает оптимизацию операции Изменения.


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

[DatabaseName!]Table [[AS] Local_Alias]

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

Tableопределяет имя таблицы исходных данных для проведения операции Изменения. Если указанная таблица не открыта, тогда система Visual FoxPro отображает системный дталоговый бокс Открытия требуемой таблицы, для выбора необходимого файла. После открытия указанной таблицы она остается открытой после выполнения рассматриваемой операции.

Local_Alias определяет локальный (внутренний) алиас исходной таблицы Table. Если вы используете локальный алиас для конкретной таблицы, вы должны всюду, в рамках команды UPDATE, использовать данный алиас при ссылке на эту таблицу. Локальный алиас может использоваться как для таблиц, так и для Курсоров.

Конструкция JOIN обеспечивает задание одной или нескольких присоединяемых исходных таблиц данных для операции Изменения. Нет существенных ограничений по лимитированию количества таблиц или курсоров присоединяемых секцией JOIN в одной команде UPDATE.

(Subquery) AS Subquery_Alias

Определяет некоторый Подзапрос в виде стандартного оператора SELECT, который является другим оператором выборки SELECT. Дополнительная информацию по использованию Подзапросов в стандартных операторах SELECT представлена при описании секции FROM в разделе: SELECT - SQL, Команда.

WHERE FilterCondition1 [AND | OR FilterCondition2 ...]]
Определяет одно или несколько Условий Критерия Фильтра, который отбирает удовлетворяющие записи, в которые вносятся изменения, новые значения полей. В рассматриваемой команде не ограничивается количество логических выражений, указываемых в секции WHERE .

Для отрицания логического выражения применяется логический операнд NOT. Для проверки пустого значения некоторого поля используется функция EMPTY( ). Смотрите дополнительную информацию в разделе: EMPTY( ), функция.
...
Рейтинг: 0 / 0
17.05.2012, 11:48
    #37798507
Jonny540
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с обновлением данныхв в FoxPro
klimyukДоброго времени суток. Срочно нужна помощь знающих и понимающих ФоксПРо.
Нужно обновить данные в одной таблице, на основе другой.
Короче в 611.dbf есть поля id, name (и другие, которые не сильно интересуют).В другой базе splat.dbf тоже есть поле id, newname. Короче нужно в 611 изменить name на newname из splat.dbf у которых 611.id = splat.id.
Вроди бы все просто, но никак не получается. Делаю так:
USE ("c:\zem\611.dbf") IN 0 ALIAS table1
USE ("c:\zem\splat.dbf") IN 0 ALIAS splat

UPDATE splat set splat.name = table1.newname WHERE table1.tin = splat.kod

ничего не получается. В чем ошибка??
Код: plsql
1.
UPDATE table1 set table1.name   = splat.newname  WHERE table1.tin = splat.kod


Чувствуюте разницу?
...
Рейтинг: 0 / 0
17.05.2012, 12:04
    #37798552
klimyuk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с обновлением данныхв в FoxPro
Jonny540,
UPDATE splat set splat.name = table1.newname WHERE splat.kod = table1.tin

должно быть так у меня. но как говорили выше запрост обновляет только одну запись. как все обновить
...
Рейтинг: 0 / 0
17.05.2012, 12:05
    #37798556
klimyuk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с обновлением данныхв в FoxPro
IgorNG,

я это уже понял, что обновляется только одна запись. как мне составить запрос чтобы обновит все записи. не получается что-то уменя ничего. помогите незнающему )))
...
Рейтинг: 0 / 0
17.05.2012, 12:07
    #37798561
alextashk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с обновлением данныхв в FoxPro
klimyuk,

Код: c#
1.
UPDATE splat SET splat.name = table1.newname FROM table1 WHERE splat.kod = table1.tin
...
Рейтинг: 0 / 0
17.05.2012, 12:14
    #37798578
Jonny540
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с обновлением данныхв в FoxPro
klimyukJonny540,
UPDATE splat set splat.name = table1.newname WHERE splat.kod = table1.tin

должно быть так у меня. но как говорили выше запрост обновляет только одну запись. как все обновить
Ты почитай свой вопрос Какую таблицу обновить надо?
...
Рейтинг: 0 / 0
17.05.2012, 12:17
    #37798585
klimyuk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с обновлением данныхв в FoxPro
Jonny540,

ну да попутал, нужно сплат обновить.
...
Рейтинг: 0 / 0
17.05.2012, 12:20
    #37798593
klimyuk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с обновлением данныхв в FoxPro
alextashk,

Выдает ошибку Command contains unrecognized phrase/keyword.
...
Рейтинг: 0 / 0
17.05.2012, 12:25
    #37798603
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с обновлением данныхв в FoxPro
...
Рейтинг: 0 / 0
17.05.2012, 13:00
    #37798715
klimyuk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с обновлением данныхв в FoxPro
ВладимирМ,

это хорошо, но у меня 7 версия,
UPDATE splat set name = table1.f_fulln_u_ where SEEK (splat.kod,"table1","kod")


выдает Index tag is not found.
...
Рейтинг: 0 / 0
17.05.2012, 13:13
    #37798759
alextashk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с обновлением данныхв в FoxPro
klimyuk

Версия VFP какая?
...
Рейтинг: 0 / 0
17.05.2012, 13:18
    #37798776
klimyuk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с обновлением данныхв в FoxPro
alextashk,

7.0
...
Рейтинг: 0 / 0
17.05.2012, 15:36
    #37799243
Jonny540
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с обновлением данныхв в FoxPro
klimyukВладимирМ,

это хорошо, но у меня 7 версия,
UPDATE splat set name = table1.f_fulln_u_ where SEEK (splat.kod,"table1","kod")


выдает Index tag is not found.
А что, индексировать не судьба?
...
Рейтинг: 0 / 0
17.05.2012, 16:24
    #37799367
klimyuk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с обновлением данныхв в FoxPro
Jonny540,

А как ее сделать?
я просто только второй день работаю с этим ФоксПро, на работе просто понадобилось обновить в базе около 2000 строк, так вот я и занялся им, а то как то в ручную не вариант править столько инф.
...
Рейтинг: 0 / 0
17.05.2012, 16:50
    #37799452
Jonny540
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с обновлением данныхв в FoxPro
klimyuk,

авторINDEX ON eExpression TO TAG kod

eExpression
Задает выражение индекса, которое может содержать имя поля (имена полей) из текущей таблицы. На основе этого выражения индекса в файле индекса для каждой записи таблицы создается ключ индекса. Visual FoxPro использует эти ключи для отображения записей таблицы и для доступа к ним.

Вот как-то так. TAG kod - это судя по Вашему примеру
...
Рейтинг: 0 / 0
17.05.2012, 16:55
    #37799470
Человек-триплоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с обновлением данныхв в FoxPro
После 1-й Вашей строчки добавьте
index on id to 611_id
set index to 611_id
...
Рейтинг: 0 / 0
17.05.2012, 17:06
    #37799513
Человек-триплоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с обновлением данныхв в FoxPro
Ну и после USE ("c:\zem\splat.dbf") IN 0 ALIAS splat надо добавить типа:

index on id to plat_id_
set index to plat_id_
...
Рейтинг: 0 / 0
17.05.2012, 18:40
    #37799728
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с обновлением данныхв в FoxPro
klimyukя просто только второй день работаю с этим ФоксПро, на работе просто понадобилось обновить в базе около 2000 строк, так вот я и занялся им, а то как то в ручную не вариант править столько инф.
Если это "чужая" база от работающего приложения, то не надо никаких индексов делать. Вообще не стоит как-то менять структуру данных.

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
USE ("c:\zem\611.dbf") IN 0 ALIAS table1
USE ("c:\zem\splat.dbf") IN 0 ALIAS splat

select table1
SCAN
    select splat
    REPLACE FOR splat.k = table1.tin ;
            splat.name WITH table1.newname
ENDSCAN


Это будет работать вне зависимости от того, есть индексы или нет. Просто без индексов это будет работать медленнее. Иногда существенно медленнее. Однако для 2 тысяч записей и разовой задачи - вполне приемлимое решение.
...
Рейтинг: 0 / 0
17.05.2012, 20:56
    #37799864
Redrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с обновлением данныхв в FoxPro
klimyuk,

земля? ;)
...
Рейтинг: 0 / 0
17.05.2012, 23:33
    #37799997
olavrov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с обновлением данныхв в FoxPro
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
*  У топикстартера много путаницы в полях и таблицах. Приходится много коментарить.
* Данный пример обновляет в таблице splat  у всех записей поле newname из справочника Table1 по ключу id. !!! Важно чтобы поля id у таблиц имели одинаковую размерность.

USE ("c:\zem\611.dbf") IN 0 ALIAS table1
USE ("c:\zem\splat.dbf") IN 0 ALIAS splat

* формируем справочник  из таблицы table1
Select Distinct Id,NewName From table1 into cursor tmp_spr

* индексируем по ключу ID
index on id tag id


* связываем таблицы ( если у таблицы table1 есть индекс по полю ID (посмотри в свойствах таблицы через окно  VIEW) , то создание справочника и его индексация не нужны, т.е. можно соединиться сразу напрямую к таблице Table1)
select splat
Set relation to id into tmp_spr

* меняем все записи
Replace name with tmp_spr.NewName ALL

* освобождаем память от курсора
Use in Select('tmp_spr')

* данный пример не трогает структуру Table1 (не создает на ней новые индексы). Однократный Replace на больших таблицах будет гораздо быстрее многократных SCAN .... Replace for .... Endscan
...
Рейтинг: 0 / 0
23.05.2012, 10:27
    #37807230
klimyuk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с обновлением данныхв в FoxPro
Redrik,

ага)
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите с обновлением данныхв в FoxPro / 24 сообщений из 24, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]