powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Update
9 сообщений из 9, страница 1 из 1
Update
    #32252668
pako
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте все.

У меня прога на Delphi, база на dbc-dbf.
Пишу хранимую процедуру .

Мне нужно сделать UPDATE table1 по данным table2.
На MS SQL Servere это понятно:

Код: plaintext
1.
Update table set table1.pole2=table2.pole2 from table2 where 
  table1.pole1=table2.pole2


Но как это в VFP. Ведь там можно подставить вместе table2.pole2 только
значение. REPLACE тоже не подходит. Цикл не хотелось бы использовать.
Может есть другие варианты.
...
Рейтинг: 0 / 0
Update
    #32252673
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как раз таки здесь именно REPLACE и подходит.

Код: plaintext
1.
2.
3.
select Table1
REPLACE FOR SEEK(Table1.Pole1,'Table2','Pole1') ;
	Pole2 WITH Table2.Pole2


Здесь я предполагаю, что в таблице Table2 есть индекс по полю Pole1 с именем "Pole1". Разумеется, обе таблицы должны быть открыты к моменту выполнения команды REPLACE.
...
Рейтинг: 0 / 0
Update
    #32252715
pako
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не стал использовать индексы.
Понятно seek можно заменить.
Но все же это плохо по моему.

Опять же Delete ... сначала, потом INSERT ... тоже плохо
...
Рейтинг: 0 / 0
Update
    #32252782
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самый универсальный способ это через цикл (SCAN...ENDSCAN). А если уж совсем приперло именно одной командой и без индекса, тогда так:

Код: plaintext
1.
2.
3.
select Table1
REPLACE FOR EMPTY(LOOKUP(Table2.Pole1,Table1.Pole1,Table2.Pole1))=.F. ;
	Pole2 WITH Table2.Pole2


Для функции LOOKUP() индекс не обязателен. Однако это означает, что такая команда будет выполняться медленно (очень долго).

Кроме того, даже при неудачном поиске LOOKUP() все-равно вернет значение поля, поэтому стоит проверка на EMPTY(). Соответсвенно, возвращаемое поле не должно содержать пустые значения (лучше возвращать значение ключевого поля)
...
Рейтинг: 0 / 0
Update
    #32253044
pako
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо Владимир
Похоже со времен 2.6 мало что изменилось.
...
Рейтинг: 0 / 0
Update
    #32253065
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В смысле команд семейства Select-SQL действительно. Хотя и тут есть кое-какой прогресс. Просто команда UPDATE-SQL никогда не считалась основным механизмом для модификации данных. Рассматривалась скорее как некий "довесок".

Хотя в 8 версии, например сделали возможность в команде INSERT-SQL делать выборку из подзапроса (т.е. возможность вставить сразу несколько записей), возможно модифицируют и UPDATE-SQL.
...
Рейтинг: 0 / 0
Update
    #32253067
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2pako
Зря изменилось многое... Update From правда так и не появился...
Правда без индексов он у вас все равно бы медленно выполнялся...
Да и скорость мало думаю отличалась бы от replace(update) + seek
Кстати если возможен монопольный доступ,то иногда бывает удобен такой вариант
Код: plaintext
1.
2.
3.
4.
select nvl(t1.f1,t2.f1) as f1,t1.f2,t1.f3 ;
from t1 ;
  left join t2 ;
on t1.f2 = t2.f2 ;
into table t3

С последующим копированием t3 в t1. Правда сразу накладывается условие уникальности поля f2.
...
Рейтинг: 0 / 0
Update
    #32253191
karly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2pako
Ну, если ты настаиваешь ;)

Создай в своей БД view
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Create SQL view NewTechnologyUpdate as ;
Select table1.*, table2.pole1 as NewValue  from table1, table2 where table1.pole2 = table2.pole2

DBSetProp('NewTechnologyUpdate.Pole2', 'Field', 'KeyField', .T.)
DBSetProp('NewTechnologyUpdate.Pole2', 'Field', 'Updatable', .F.)

DBSetProp('NewTechnologyUpdate.Pole1', 'Field', 'KeyField', .F.)
DBSetProp('NewTechnologyUpdate.Pole1', 'Field', 'Updatable', .T.)
DBSetProp('NewTechnologyUpdate.Pole1', 'Field', 'UpdateName', 'data1!table1.pole1')

Обновление будет выглядеть, как ты и просил - без Scan и без Replace
Код: plaintext
1.
2.
Update NewTechnologyUpdate set pole1 = NewValue

TableUpdate(.T., 'NewTechnologyUpdate')


P.S. Как и во времена 2.6 индексы существенно ускорят выполнение запроса.
Это действительно с тех пор мало изменилось

P.P.S. А что, команды FPD использовать вера не позволяет?
...
Рейтинг: 0 / 0
Update
    #32253347
pako
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за ответы.
Конечно в вопросе код должен был быть
Код: plaintext
1.
Update table set table1.pole2=table2.pole2 from table2 where 
  table1.pole1=table2.pole1

Я знаю, что индексы значительно ускоряют запросы. Писал на 2.6 в АСУПе одного завода. Там куча данных и индексы важны. А здесь данных на компах сравнительно немного, но они на 300 компах по стране. Главный сервак MS SQL Server. И между ними репликация. Поэтому не хочется индексы, view и т.д.
Чтобы можно было управлять обменом на локальных машинах, я пишу хранимую процедуру в DBC-файлах, и при необходимости, в начале обмена перекачиваю его, и с него уже выполняется обмен.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Update
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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