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

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

UpdateSql [D6, MySQL]


Страницы:   1 2

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


Используя все поля, т.к. это необходимо для точной идентификации нужной строки


Страницы:   1 2

Наверх

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