Главная страница
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.047 c
1-1168220567
Sleepeer
2007-01-08 04:42
2007.02.25
Перехват процесса выполнения определённых функций из чужой DLL


2-1170659937
Officeman
2007-02-05 10:18
2007.02.25
Передать в MS Word


15-1170046608
Separator
2007-01-29 07:56
2007.02.25
Online игрушки


9-1144640430
Ландграф Павел
2006-04-10 07:40
2007.02.25
поиск пути не по клеткам (массив из rect)


6-1158300229
dwar
2006-09-15 10:03
2007.02.25
TCP сервер на INDY. 18000 одновременных подлючений