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

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

ПОМОГИТЕ ! Косяк с UPDATE (LocalSQL) [D3, Paradox]


62mkv ©   (2002-10-30 15:09:00) 

Большой трабл происходит, простите за жаргон.
Существуют две таблицы: клиенты и заказы, отмечаем галочками клиентов, добавляем в заказы, снимаем галочки. Работаем через TQuery, первый раз - SQL.Add(insert into orders...), второй (убрать галочки) -
SQL.Clear;
SQL.Add("update client set is_selected=false where is_selected=true AND ((KOD_UPDATER=1))");
ExecSQL; - выдает ошибку No current record, после чего в таблице появляются дубли на все записи с галочками, только с другим кодом (код автоинкремент)
а если выполнять в stand-alone, например в DBExplorer"e - то еще лохмаче - выполняется без ошибок, после чего выясняется, что все старые записи удалились! а на их месте дубли с другими кодами !
естественно, все заказы после этого ссылаются в никуда.

Мне интересно, update в принципе всегда так работает, или что то с оператором, или с настройками BDE/aliasa ?????
Engine: Paradox 7, RAD: Delphi 3


sniknik   (2002-10-31 10:40:00) [1]

да уж. но вообщето через ключевое поле наверное более правильно, в jet Access некоторые запросы только так работают, удаление повторов например, а в BDE можно на номер позиции ссылатся (довольно странно для меня), и вот случай когда "коса нашла на камень", будем иметь в виду.

а длинну поля я упоминул потому то для DBF макс. 10символов для DB точно не знаю похоже 12. но SQL движок для обоих один, просто предположил что в какойто проверке это может не учли.


62mkv   (2002-10-31 08:53:00) [2]

2sniknik:
"на длину поля" ты имеешь в виду - на длину имени поля ? вряд ли из-за этого. как бы я такое поле создал ? там другие ограничения, если интересно запостю.
насчет индексов, вряд ли.. вчера специально все грохнул и заново создал...
а вот такая штука сработала (навеяно ЮЮ) :
update client set is_selected=false where kod_klient in
(select kod_klient from client where is_selected=true
AND ((KOD_UPDATER=1)))

интересно правда ?


sniknik   (2002-10-31 08:45:00) [3]

Вполне возможно, я писал и пробовал через ADO JET у него функционала больше.

а вот насчет того что ЮЮ пишет это не может быть фичей, SQL это же для пакетного изменения данных и в хелпе встречаются конструкции посложнее и они работают.
Скорее это баг но вряд ли BDE, может у тебя индексы порушились или еще што. Нужно на другой машине попробовать (на всякий случай BDE проверить). А еще сделай анологичный запрос для другой таблицы/поля, тоже будет?

еще в парадоксе наверно по другому(побольше) но у DBF ограничение на длину поля (у новых наверно нет), у тебя это ограничение превышается (должно<=10 символов), а ведь движок SQL общий для DBF, DB. В общем еще можно сделать поля меньше и попробовать так. (опять вряд ли но на всякий случай)


62mkv   (2002-10-31 07:04:00) [4]

2sniknik :
Запрос программно формируется поэтому там две скобочки (думаю это не принципиально), а вот просто "is_selected" LocalSQL не понимает ;(( и not is_selected тож... =true надо добавлять
2ЮЮ :
а вообще интересно, это known bug или фича ?? кто нибудь в курсе ?


ЮЮ   (2002-10-31 04:32:00) [5]

Когда в древние времена я работал в такой же конфигурации:Engine: Paradox 7, RAD: Delphi 3, я тоже столкнулся с тем, что оператор update, редактирующий группу записей, поступает таким образом. Поэтому редактировать через update желательно только одну запись, явно указывая в Where код записи.


Darts   (2002-10-30 16:30:00) [6]

Или так:

SQL.Add("update client set is_selected=false where ((is_selected = TRUE) AND (KOD_UPDATER=1))");


sniknik   (2002-10-30 15:47:00) [7]

по моему запрос совершенно рабочий, я бы бы чуть по другому написал но и так должно работать.

я бы написал
SQL.Add("update client set is_selected=false where is_selected AND (KOD_UPDATER=1)");

наверное ошибка в другом.


62mkv   (2002-10-30 15:13:00) [8]

Забыл добавить : без слов "AND ((KOD_UPDATER=1))" все нормально работает.
И еще ОГРОМНАЯ ПРОСЬБА ОТВЕТИТЬ... я целый день сегодня над этим просидел, блин, работа стоит, че делать не знаю.
Спасибо заранее !


Наверх

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