Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Изменение поля [D7, MySQL]


seregarem ©   (2006-05-05 09:36:00) 

Здравствуйте!
Есть две таблицы: поля одной таблицы вставляются в поля другой таблицы, при этом поля должны вставляться как в уже существующие записи, так и должны создаваться новые записи и добавляться в них.
Делаю следующее:
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 16:18:00) [1]


> Val ©   (05.05.06 14:01) [15]

По идее Next сам пост вызывает, просто правило хорошего тона.


Val   (2006-05-05 14:01:00) [2]

>ANB ©   (05.05.06 12:13)
Автору - 1. После заполнения поставь Post.
у него Next в цикле вызывается, изменения в датасете - видит.


ANB   (2006-05-05 12:13:00) [3]


> evvcom ©   (05.05.06 11:16) [13]

min() решает проблему скалярности (гарантировано 1 запись)
А вот MS SQL поддерживает from в update и там это еше легче написать

Автору - 1. После заполнения поставь Post.
А также поищи методы типа Commit и ApplyUpdates;
ApplyUpdates - выполнять первым.


evvcom   (2006-05-05 11:16:00) [4]

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 записей не вернул тоже надо побеспокоиться.


Val   (2006-05-05 10:43:00) [5]

ситуация такова - сделанные вами изменения, какими бы они не были, произошли в буфере - на клиенте. вам нужно подтвердить эти изменения на сервере - для этого в скл-серверах существует команда commit, а на клиенте должна быть некая обертка для нее, суть которой - подтвердить изменения произошедшие в транзакции.


seregarem   (2006-05-05 10:31:00) [6]

Использую Zeos: компоненты ZTable И ZConnection


Val   (2006-05-05 10:30:00) [7]

коммита нет в MySQL?


seregarem   (2006-05-05 10:29:00) [8]

Да, в Grid'е есть, а в самой БД - нет. М.б. в настройке свойств компонентов проблемы?


Хозяин   (2006-05-05 10:28:00) [9]

а Grid'е есть! Я об этом спрашиваю.

Тоесть Вы ввели данные а в таблицу они не сохранились?

C MySQL чуть работал но таких проблем небыло :(


seregarem   (2006-05-05 10:25:00) [10]

Я, в принципе, так и делаю.


seregarem   (2006-05-05 10:24:00) [11]

Во-первых, там поля разного типа, во-вторых, значения полей т1 должны получать значения полей т2 только при одинаковых названиях полей. Мой код работает, но почему-то в таблице изменений нет!, а Grid'е есть! Я об этом спрашиваю.


Хозяин   (2006-05-05 10:23:00) [12]

в каждой из записей надо изменить РАЗНОЕ количество ячеек. У меня порядка 40 полей.
Ненужные ячейки.


seregarem   (2006-05-05 10:20:00) [13]

Что отсеять?


Хозяин   (2006-05-05 10:19:00) [14]

for i:=0 do ds.FieldCount-1 do
 ds.Fields[i].asString:='!!!';


Не нужное отсеять?


seregarem   (2006-05-05 10:13:00) [15]

Что-то я не понял. У меня есть в т1 несколько записей, в каждой из записей надо изменить РАЗНОЕ количество ячеек. У меня порядка 40 полей. Если делать через Update, то это слишком много писать. Как можно сделать не через SQL, а через программный доступ?


ANB   (2006-05-05 09:44:00) [16]

Какой жуткий изгал. Да еще и использованием компонентов 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 условие связи)


Наверх

Титульная страница Поиск, карта сайта Написать письмо