![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
UpdateSql [D6, MySQL]
SoulLess © (2006-11-30 19:19:00)Мастера, подскажите как правильно работать с UpdateSql?
делаю следующую иницилизацию действий:
UpdateSql1.InsertSQL.Add('insert into rasxod(ID, Mater, Rasxod, Category) values ("' + ID + '", :Mater, :Rasxod, "м1")');
UpdateSql1.ModifySQL.Add('update rasxod set Mater = :Mater, Rasxod = :Rasxod where ((ID = "'+ID+'") and (Mater = :OLD_Mater) and (Rasxod = :OLD_Rasxod) and (Category = "м1"))');
UpdateSql1.DeleteSQL.Add('delete from rasxod where ((ID = "'+ID+'") and (Mater = :OLD_Mater) and (Rasxod = :OLD_Rasxod) and (Category = "м1"))');
В результате insert выполняется без проблем, а вот modify постоянно выдает ошибку Update Failed! Подскажите плиз в чем дело!!!
Desdechado (2006-12-02 21:48:00) [1]Значит, он отсутствует в выборке. И компонент не может построить нормальный UPDATE, ему не на что опереться.
SoulLess (2006-12-02 00:51:00) [2]да есть! Не знаю почему он вылетает все-таки иногда(((
Стоит первичный ключ на автоинкременте
Desdechado (2006-12-01 21:55:00) [3]Значит, нет первичного/уникального ключа на таблице. А без него никуда.
SoulLess (2006-12-01 19:15:00) [4]
> А вообще делай так, чтоб небыло непредвиденных ситуаций
> Update failed.
Пытаюсь! Но все равно иногда при Modify такое возникает!=(
Desdechado (2006-12-01 18:44:00) [5]Как организуешь транзакцию, так и будет. Можно откатить и исправить, можно проигнорировать.
А вообще делай так, чтоб небыло непредвиденных ситуаций Update failed.
SoulLess (2006-12-01 18:26:00) [6]
> вернее, зачем сразу после вставки строки
А если делать вставку в базу после внесения всех строк, например на выходе, то если вдруг на какой-то строке возникнет "Update Failed" остальные записи, кроме этой занесутся в базу или все остановится на той записи, где возникла ошибка?
Desdechado (2006-12-01 17:30:00) [7]вернее, зачем сразупосле вставки строки
Desdechado (2006-12-01 17:29:00) [8]> только через RequestLive все делать...
Это возможно только для однотабличных запросов без сортировки. Да и то, установка RequestLive=True не гарантирует, что после запроса оно такое останется.
> Но у меня при этом почему-то данные ЗАНОСЯТСЯ в таблицу,
> но при попытке вставить еще строку предыдущая исчезает из грида!
Моя не понимать, зачем ApplyUpdates делать для каждой строки...
SoulLess (2006-12-01 16:09:00) [9]Вообще было бы очень здорово, если бы мне кто-нить объяснил как сделать так, чтоб можно было обойтись без UpdateSQL, а только через RequestLive все делать...
Но у меня при этом почему-то данные ЗАНОСЯТСЯ в таблицу, но при попытке вставить еще строку предыдущая исчезает из грида! Если бы мне кто объяснил в чем дело - убил бы UpdateSQL)))
Desdechado (2006-12-01 11:00:00) [10]VALUA (01.12.06 08:47) [13]
Какие нафиг IBQuery, если у автора [D6, MySQL]
VALUA (2006-12-01 08:47:00) [11]У комонента IBQuery есть сво-во UpdateObject , надо укзать - IBUpdateSql .
VALUA (2006-12-01 08:39:00) [12]Попробуй в начале своих действий поставить оператор -> IBQuery1.Edit;
Я делала для BLOB-полей :
IBQuery1.Edit;
IBQuery1PLAN_KV.LoadFromStream(BM1);
IBUpdateSQL1.SetParams(ukModify);
IBUpdateSQL1.Apply(ukModify);
А эти действия :
UpdateSql1.InsertSQL.Add('insert into rasxod(ID, Mater, Rasxod, Category) values ("' + ID + '", :Mater, :Rasxod, "м1")');
UpdateSql1.ModifySQL.Add('update rasxod set Mater = :Mater, Rasxod = :Rasxod where ((ID = "'+ID+'") and (Mater = :OLD_Mater) and (Rasxod = :OLD_Rasxod) and (Category = "м1"))');
UpdateSql1.DeleteSQL.Add('delete from rasxod where ((ID = "'+ID+'") and (Mater = :OLD_Mater) and (Rasxod = :OLD_Rasxod) and (Category = "м1"))');
должны быть прописаны в самом компоненте , кликни правой кнопкой мыши на компоненте и все увидишь .
ЮЮ (2006-12-01 05:57:00) [13]
> как вызвать update таблицы вручную?
Таблицы в БД? У тебя же всё для этого есть:[1]
Т.Е. у меня есть грид, в котором запись вносится в базу после выхода со строчки, которую вводил.
А ты хочешь, чтобы после каждого изменения поля?
if(Query1.State in [dsEdit, dsInsert])
then Query1.post;
не помогает...
+ [1] для записи в БД. Иначе изменения останутся только в TQuery, т.е. локально
З.Ы. Query1.ApplyUpdates тоже следует применять с оглядкой на UpdatesPending
SoulLess (2006-11-30 22:25:00) [14]Более правильным будет вопрос - как вызвать update таблицы вручную? Т.Е. у меня есть грид, в котором запись вносится в базу после выхода со строчки, которую вводил.
можно ли поставить обработчик клавиши Enter на конкретный столбец строки?
SoulLess (2006-11-30 22:16:00) [15]Действительно, наверно легче ввести автоинкрементный идентификатор... Спасибо.
А еще не подскажете как определить находится ли таблиуа в режиме редактирования? Почему-то
if(Query1.State in [dsEdit, dsInsert])
then Query1.post;
не помогает...
sniknik (2006-11-30 21:56:00) [16]> Используя все поля, т.к. это необходимо для точной идентификации нужной строки
для гарантировано точной идентификации единственное, что нужно это поле/поля ключ. если у тебя этого нет... когданибудь все оно "нарвешься" на дубликаты с подобными идентификациями.
> число типа float
невозможны точные сравнения с числами с плавающей запятой.
SoulLess (2006-11-30 21:54:00) [17]Боюсь поспешил с выводами... Почему-то теперь то работает апдейт, то нет...(((
SoulLess (2006-11-30 21:40:00) [18]так... кажись нашел в чем дело... Он обновляется нормально если убрать
Rasxod = :OLD_Rasxod
а в это поле записывается число типа float. Видимо SQL не воспринимает его правильно?
SoulLess (2006-11-30 21:36:00) [19]
> Update Failed обычно выдается, если обновляется более одной
> записи или 0 записей.
Это я читал уже где-то... Но дело в том, что запись, удовлетворяющая всем 4 условиям одна!
SoulLess (2006-11-30 21:35:00) [20]Пробовал конечно! Сам писать вручную начал как раз именно из-за того что через виззард было Update Failed! Думал таким образом исправить...
Визард дает след код
update rasxod
set
Mater = :Mater,
Rasxod = :Rasxod
where
ID = :OLD_ID and
Mater = :OLD_Mater and
Rasxod = :OLD_Rasxod and
Category = :OLD_Category
Используя все поля, т.к. это необходимо для точной идентификации нужной строки