Текущий архив: 2007.02.25;
Скачать: CL | DM;
ВнизUpdateSql Найти похожие ветки
← →
SoulLess (2006-11-30 19:19) [0]Мастера, подскажите как правильно работать с 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! Подскажите плиз в чем дело!!!
← →
SoulLess (2006-11-30 19:55) [1]для вызова пользуюсь Query1.ApplyUpdates. на Query стоит RequestLive и CachedUpdates. Данные вносятся через Grid
← →
sniknik © (2006-11-30 21:27) [2]> Подскажите плиз в чем дело!!!
вот в этом наверное > ""+ID+""
неизвестное значение для компонента, один раз при внесении инициализируется и остается после одним и тем-же...
и вообще нафига столько полей в условии? достаточно одного ключевого поля.
p.s. двойной клик на компоненте открывает мастер составитель запросов...
← →
Desdechado © (2006-11-30 21:28) [3]Не пробовал воспользоваться визардом запросов, а не городитьих вручную?
Update Failed обычно выдается, если обновляется более одной записи или 0 записей.
← →
SoulLess (2006-11-30 21:35) [4]Пробовал конечно! Сам писать вручную начал как раз именно из-за того что через виззард было 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
Используя все поля, т.к. это необходимо для точной идентификации нужной строки
← →
SoulLess (2006-11-30 21:36) [5]
> Update Failed обычно выдается, если обновляется более одной
> записи или 0 записей.
Это я читал уже где-то... Но дело в том, что запись, удовлетворяющая всем 4 условиям одна!
← →
SoulLess (2006-11-30 21:40) [6]так... кажись нашел в чем дело... Он обновляется нормально если убрать
Rasxod = :OLD_Rasxod
а в это поле записывается число типа float. Видимо SQL не воспринимает его правильно?
← →
SoulLess (2006-11-30 21:54) [7]Боюсь поспешил с выводами... Почему-то теперь то работает апдейт, то нет...(((
← →
sniknik © (2006-11-30 21:56) [8]> Используя все поля, т.к. это необходимо для точной идентификации нужной строки
для гарантировано точной идентификации единственное, что нужно это поле/поля ключ. если у тебя этого нет... когданибудь все оно "нарвешься" на дубликаты с подобными идентификациями.
> число типа float
невозможны точные сравнения с числами с плавающей запятой.
← →
SoulLess (2006-11-30 22:16) [9]Действительно, наверно легче ввести автоинкрементный идентификатор... Спасибо.
А еще не подскажете как определить находится ли таблиуа в режиме редактирования? Почему-то
if(Query1.State in [dsEdit, dsInsert])
then Query1.post;
не помогает...
← →
SoulLess (2006-11-30 22:25) [10]Более правильным будет вопрос - как вызвать update таблицы вручную? Т.Е. у меня есть грид, в котором запись вносится в базу после выхода со строчки, которую вводил.
можно ли поставить обработчик клавиши Enter на конкретный столбец строки?
← →
ЮЮ © (2006-12-01 05:57) [11]
> как вызвать update таблицы вручную?
Таблицы в БД? У тебя же всё для этого есть:[1]
Т.Е. у меня есть грид, в котором запись вносится в базу после выхода со строчки, которую вводил.
А ты хочешь, чтобы после каждого изменения поля?
if(Query1.State in [dsEdit, dsInsert])
then Query1.post;
не помогает...
+ [1] для записи в БД. Иначе изменения останутся только в TQuery, т.е. локально
З.Ы. Query1.ApplyUpdates тоже следует применять с оглядкой на UpdatesPending
← →
VALUA (2006-12-01 08:39) [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"))");
должны быть прописаны в самом компоненте , кликни правой кнопкой мыши на компоненте и все увидишь .
← →
VALUA (2006-12-01 08:47) [13]У комонента IBQuery есть сво-во UpdateObject , надо укзать - IBUpdateSql .
← →
Desdechado © (2006-12-01 11:00) [14]VALUA (01.12.06 08:47) [13]
Какие нафиг IBQuery, если у автора [D6, MySQL]
← →
SoulLess (2006-12-01 16:09) [15]Вообще было бы очень здорово, если бы мне кто-нить объяснил как сделать так, чтоб можно было обойтись без UpdateSQL, а только через RequestLive все делать...
Но у меня при этом почему-то данные ЗАНОСЯТСЯ в таблицу, но при попытке вставить еще строку предыдущая исчезает из грида! Если бы мне кто объяснил в чем дело - убил бы UpdateSQL)))
← →
Desdechado © (2006-12-01 17:29) [16]> только через RequestLive все делать...
Это возможно только для однотабличных запросов без сортировки. Да и то, установка RequestLive=True не гарантирует, что после запроса оно такое останется.
> Но у меня при этом почему-то данные ЗАНОСЯТСЯ в таблицу,
> но при попытке вставить еще строку предыдущая исчезает из грида!
Моя не понимать, зачем ApplyUpdates делать для каждой строки...
← →
Desdechado © (2006-12-01 17:30) [17]вернее, зачем сразу после вставки строки
← →
SoulLess (2006-12-01 18:26) [18]
> вернее, зачем сразу после вставки строки
А если делать вставку в базу после внесения всех строк, например на выходе, то если вдруг на какой-то строке возникнет "Update Failed" остальные записи, кроме этой занесутся в базу или все остановится на той записи, где возникла ошибка?
← →
Desdechado © (2006-12-01 18:44) [19]Как организуешь транзакцию, так и будет. Можно откатить и исправить, можно проигнорировать.
А вообще делай так, чтоб небыло непредвиденных ситуаций Update failed.
← →
SoulLess (2006-12-01 19:15) [20]
> А вообще делай так, чтоб небыло непредвиденных ситуаций
> Update failed.
Пытаюсь! Но все равно иногда при Modify такое возникает!=(
← →
Desdechado © (2006-12-01 21:55) [21]Значит, нет первичного/уникального ключа на таблице. А без него никуда.
← →
SoulLess (2006-12-02 00:51) [22]да есть! Не знаю почему он вылетает все-таки иногда(((
Стоит первичный ключ на автоинкременте
← →
Desdechado © (2006-12-02 21:48) [23]Значит, он отсутствует в выборке. И компонент не может построить нормальный UPDATE, ему не на что опереться.
Страницы: 1 вся ветка
Текущий архив: 2007.02.25;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.04 c