Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.07.02;
Скачать: CL | DM;

Вниз

Изменение поля   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.079 c
10-1121236477
xmed
2005-07-13 10:34
2006.07.02
трехзвенная архитектура => Oracle + Автоинкремент


2-1150270626
Olleg_ator
2006-06-14 11:37
2006.07.02
Исправить структуру dbf таблицы


2-1150260316
Призрак
2006-06-14 08:45
2006.07.02
Передать THandle как Cardinal


2-1149914431
dimodimz-FurYzzZ
2006-06-10 08:40
2006.07.02
Сумма элементов ячейки в таблице


1-1148406755
Juice
2006-05-23 21:52
2006.07.02
Вывести в меню список окон моего приложения