Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
2-1150120811
nickhilo
2006-06-12 18:00
2006.07.02
Использование плагина docfile far а в проектах на delphi.


2-1150023154
Firefly
2006-06-11 14:52
2006.07.02
ASP.Net


3-1146655202
comtat
2006-05-03 15:20
2006.07.02
TMySQLClient, Как пользоваться ???


15-1149684864
DillerXX
2006-06-07 16:54
2006.07.02
Лицензии лицензии летят...


1-1148386422
sdram
2006-05-23 16:13
2006.07.02
Подскажите как работать с HTML документом





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский