Поиск:

Ответ в темуСоздание новой темы Создание опроса
> механизм кэшированных изменений, работа с IBUpdateSQL или IBDataSet 
:(
    Опции темы
olek68
  Дата 13.2.2011, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 16.8.2010

Репутация: нет
Всего: нет



Я  хочу  использовать  механизм  кэшированных  изменений,  но  пока  не  знаю  как.  И  надеюсь,  что  Вам  не  будет  трудно   подсказать  мне  как  это  сделать.
Пользователю  удобнее  вносить изменения в самом гриде главной формы. Не открывая формочек для редактирования  данных.  И тут вот такие проблемки.
Ложу на форму IBDatabase1, IBTransaction1, IBQuery1, IBUpdateSQL1, DataSource1 и DBGrid1. Соединяю их,  так  что  вижу  нужные  данные  в  Гриде.Но, для  того,  чтобы  редактировать данные  изменяю свойство:
IBQuery1.CachedUpdates:= true;
IBQuery1.UpdateObject:=IBUpdateSQL1;
в  IBUpdateSQL1.ModifySQL пишу:
update My_table set
ID = :ID where ID = :OLD_ID
В  гриде  могу  изменять  но  изменения  не  прописываются  в базу.  Они  зависают  в  кеше.
Пробую: IBQuery1.ApplyUpdates; или IBQuery1.Database.ApplyUpdates([IBQuery1]);
но  в результате получаю ошибку.  Покажите  правильный  пример  обработки  кешированных  изменений.   smile 

PM MAIL   Вверх
superVad
Дата 14.2.2011, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 3
Всего: 15



Цитата(olek68 @  13.2.2011,  22:45 Найти цитируемый пост)
но  в результате получаю ошибку

Это очень сложная и практически нерешаемая проблема. По крайней мере пока ты не напишешь текст ошибки smile 

Я для этого дела юзаю датасет с включенным CachedUpdates. Но там надо с транзакция разобраться, что бы не висела длинная пишущая.
Или можно использовать фибы - там в датасете можно 2 транзакции указать - читающую и пишущую.
PM MAIL   Вверх
Deniz
Дата 14.2.2011, 06:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Цитата(olek68 @  14.2.2011,  01:45 Найти цитируемый пост)
update My_table set
ID = :ID where ID = :OLD_ID
некорректный запрос на обновление.
Если память не изменяет, в IBUpdateSQL1 есть возможность автоматически построить запросы на insert/update/delete.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
olek68
Дата 14.2.2011, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 16.8.2010

Репутация: нет
Всего: нет



Цитата

некорректный запрос на обновление.

 а мне все записи обновлять и не надо. (пример условный) а практически только поле "количество".
Делаю кнопочку:
Код

procedure TForm8.Button1Click(Sender: TObject);
begin
 try IBQuery1.Database.ApplyUpdates([IBQuery1]);
 except IBQuery1.CancelUpdates; end;
end;

удобнее наверное использовать IBQuery1AfterPost, но пока кнопка.
получаю ответ: raised exception class EIBClientError with message 'Update Failed'.
Покажите как правильно.


Это сообщение отредактировал(а) olek68 - 14.2.2011, 08:01
PM MAIL   Вверх
olek68
Дата 14.2.2011, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 16.8.2010

Репутация: нет
Всего: нет



Transaction Properties:
Read_Write Table Stability
(write
consistency)
AutoStopAction: saRollback
DefaultAction: TACommit
PM MAIL   Вверх
superVad
Дата 14.2.2011, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 3
Всего: 15



olek68, в общем проверил я у себя такую связку - вполне работает. 
Я выставлял
IBQuery1.CachedUpdates:= true;
IBQuery1.UpdateObject:=IBUpdateSQL1;
уже в самой среде, а не программно.
ModifySQL тоже в самой среде я генерил самим IBUpdateSQL1 (правой клавишей - эдитор).

Все работает, но не вижу в этом смысла. Легче использовать TIBDataSet - там все в одном.
А если хочется развести все на 2 транзакции читающую и пишущую, то надо использовать не TIBUpdateSQL, а TIBSQL там можно указать другую транзакцию.

Вот почитай - ссылка.
PM MAIL   Вверх
Deniz
Дата 14.2.2011, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Цитата(olek68 @  14.2.2011,  10:26 Найти цитируемый пост)
Transaction Properties:
Read_Write Table Stability
(write
consistency)
AutoStopAction: saRollback
DefaultAction: TACommit 
лучше
Код
write 
read commited
no wait


Добавлено через 1 минуту и 39 секунд
Хотя по ссылке superVad все понятно рассказано и именование параметров транзакции немного другие


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
olek68
Дата 14.2.2011, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 16.8.2010

Репутация: нет
Всего: нет



Да я тоже выставлял все в самой среде. За исключением коннекта с базой в IBDatabase,
  но  при запуске программы  данные  открываются  в гриде  и  можно редактировать
 но не коммитить.  Изначально делал все на IBDataSet но тоже не пошло…
Хм… Может проблема в самой базе?  Или  мне нужно заполнить все параметры  IBUpdateSQL.
 Пока положил только Modify.  Сделаю тестовую базу и попробую заново. 
Если не пойдет вышлю исходник.  Тыкнёте,  где не так? 
 smile 
PM MAIL   Вверх
olek68
Дата 15.2.2011, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 16.8.2010

Репутация: нет
Всего: нет



Большое спасибо всем, кто пытался помочь. Причину нашел.
Проблема была в некорректном запросе. На простой табличке все пошло на ура.
 smile 

Это сообщение отредактировал(а) olek68 - 15.2.2011, 09:17
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0753 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.