Форум: "Базы";
Текущий архив: 2006.07.02;
Скачать: [xml.tar.bz2];
ВнизИзменение поля Найти похожие ветки
← →
seregarem © (2006-05-05 09:36) [0]Здравствуйте!
Есть две таблицы: поля одной таблицы вставляются в поля другой таблицы, при этом поля должны вставляться как в уже существующие записи, так и должны создаваться новые записи и добавляться в них.
Делаю следующее:
ZTable1.First;
while not ZTable1.Eof do
begin
ZTable2.First;
While (not ZTable2.Eof)and(ZTable1.FieldByName("id002").AsInteger<>ZTable2.FieldByName("id0 02").AsInteger) do
ZTable2.Next;
ZTable1.Edit;
for k:=0 to ZTable1.FieldCount-1 do
if (ZTable1.Fields[k].IsNull=true)and(ZTable2.Fields[k].IsNull=false) then
ZTable1.FieldByName(ZTable2.Fields[k].FieldName).Assign(ZTable2.Fields[k]);
ZTable1.Next;
end;
Проблема:
В DBGrid"е все изменения отображаются, но в самой БД изменений нет.
В чем ошибка?
← →
ANB © (2006-05-05 09:44) [1]Какой жуткий изгал. Да еще и использованием компонентов TTable.
Схема решения :
1. insert into Table1 (поля) select поля Table2 where записей, которых нет в Table1 (поможет exists)
2. update Table1
set
поле1 = (select min(поле1) from Table2 where условие связи)
,поле2 = (select min(поле2) from Table2 where условие связи)
,поле3 = (select min(поле3) from Table2 where условие связи)
,полеN = (select min(полеN) from Table2 where условие связи)
← →
seregarem © (2006-05-05 10:13) [2]Что-то я не понял. У меня есть в т1 несколько записей, в каждой из записей надо изменить РАЗНОЕ количество ячеек. У меня порядка 40 полей. Если делать через Update, то это слишком много писать. Как можно сделать не через SQL, а через программный доступ?
← →
Хозяин (2006-05-05 10:19) [3]
for i:=0 do ds.FieldCount-1 do
ds.Fields[i].asString:="!!!";
Не нужное отсеять?
← →
seregarem © (2006-05-05 10:20) [4]Что отсеять?
← →
Хозяин (2006-05-05 10:23) [5]в каждой из записей надо изменить РАЗНОЕ количество ячеек. У меня порядка 40 полей.
Ненужные ячейки.
← →
seregarem © (2006-05-05 10:24) [6]Во-первых, там поля разного типа, во-вторых, значения полей т1 должны получать значения полей т2 только при одинаковых названиях полей. Мой код работает, но почему-то в таблице изменений нет!, а Grid"е есть! Я об этом спрашиваю.
← →
seregarem © (2006-05-05 10:25) [7]Я, в принципе, так и делаю.
← →
Хозяин (2006-05-05 10:28) [8]а Grid"е есть! Я об этом спрашиваю.
Тоесть Вы ввели данные а в таблицу они не сохранились?
C MySQL чуть работал но таких проблем небыло :(
← →
seregarem © (2006-05-05 10:29) [9]Да, в Grid"е есть, а в самой БД - нет. М.б. в настройке свойств компонентов проблемы?
← →
Val © (2006-05-05 10:30) [10]коммита нет в MySQL?
← →
seregarem © (2006-05-05 10:31) [11]Использую Zeos: компоненты ZTable И ZConnection
← →
Val © (2006-05-05 10:43) [12]ситуация такова - сделанные вами изменения, какими бы они не были, произошли в буфере - на клиенте. вам нужно подтвердить эти изменения на сервере - для этого в скл-серверах существует команда commit, а на клиенте должна быть некая обертка для нее, суть которой - подтвердить изменения произошедшие в транзакции.
← →
evvcom © (2006-05-05 11:16) [13]2ANB:
> 2. update Table1
> set
> поле1 = (select min(поле1) from Table2 where условие связи)
> ,поле2 = (select min(поле2) from Table2 where условие связи)
> ,поле3 = (select min(поле3) from Table2 where условие связи)
> ,полеN = (select min(полеN) from Table2 where условие связи)
Зная, что специализируешься ты на оракле, ожидал все же в оракловом стиле увидеть ответ. Возможно в мускуле тоже что-то типа того же прокатит:
update table1
set
(поле1, поле2, ..., полеN) = (select поле1, поле2, ..., полеN from Table2 where условие связи)
Естественно, что select должен вернуть 1 запись для Оракла, для других СУБД, возможно, это не критично. Это достигается в Оракле where rownum = 1, в MSSQL select top(1), в мускуле не знаю. Ну а чтобы 0 записей не вернул тоже надо побеспокоиться.
← →
ANB © (2006-05-05 12:13) [14]
> evvcom © (05.05.06 11:16) [13]
min() решает проблему скалярности (гарантировано 1 запись)
А вот MS SQL поддерживает from в update и там это еше легче написать
Автору - 1. После заполнения поставь Post.
А также поищи методы типа Commit и ApplyUpdates;
ApplyUpdates - выполнять первым.
← →
Val © (2006-05-05 14:01) [15]>ANB © (05.05.06 12:13)
Автору - 1. После заполнения поставь Post.
у него Next в цикле вызывается, изменения в датасете - видит.
← →
ANB © (2006-05-05 16:18) [16]
> Val © (05.05.06 14:01) [15]
По идее Next сам пост вызывает, просто правило хорошего тона.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.07.02;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.011 c