Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.52 MB
Время: 0.05 c
15-1170601610
Ricks
2007-02-04 18:06
2007.02.25
Куда девался пункт меню Project->Resources???


15-1170289683
Рар
2007-02-01 03:28
2007.02.25
Кто знает, как прикрутить 7zip к Фару?


15-1170320275
McSimm
2007-02-01 11:57
2007.02.25
Операционные системы. Разработка и реализация (+СD). 3-е изд.


2-1170677592
Drone
2007-02-05 15:13
2007.02.25
Вопрос касается удаления записи из типизированного файла.


15-1170245285
ВотЭтаДАкающий
2007-01-31 15:08
2007.02.25
Странно, а почему это работает? Skype+firewall