Отмена автоматического Update'а в ADOQuery
От: MaxLife Россия  
Дата: 13.01.04 11:43
Оценка:
Доброго времени.

Ситуация. Имеется ADOQuery, DataSet и DBGrid. В ADOQuery определён SQL, собирающий в запросе поля по нескольким таблицам. При попытке отредактировать поле в DBGrid ADOQuery выбрасывает ошибку, сообщающую, что попытка вставить значение в столбец отвергнута по ряду причин, что совершенно логично, так как произвольный запрос — не таблица и не view.

Вопрос — как перехватить или заблокировать на уровне ADOQuery отправку изменённых данных с целью самостоятельной их обработки? Есть ли возможность не отсылать изменения автоматом?
Re: Отмена автоматического Update'а в ADOQuery
От: Diouzshev Россия  
Дата: 19.01.04 14:51
Оценка:
Hello, MaxLife!
You wrote on Tue, 13 Jan 2004 11:43:33 GMT:

M> Доброго времени.


M> Ситуация. Имеется ADOQuery, DataSet и DBGrid. В ADOQuery определён

M> SQL, собирающий в запросе поля по нескольким таблицам. При попытке
M> отредактировать поле в DBGrid ADOQuery выбрасывает ошибку,
M> сообщающую, что попытка вставить значение в столбец отвергнута по
M> ряду причин, что совершенно логично, так как произвольный запрос — не
M> таблица и не view.

M> Вопрос — как перехватить или заблокировать на уровне ADOQuery

M> отправку изменённых данных с целью самостоятельной их обработки? Есть
M> ли возможность не отсылать изменения автоматом?

ReadOnly := True;
?

With best regards, Alexander Diouzshev-Maltsev.
Posted via RSDN NNTP Server 1.8 beta
Re: Отмена автоматического Update'а в ADOQuery
От: Shadowspan Россия  
Дата: 19.01.04 15:52
Оценка:
Здравствуйте, MaxLife, Вы писали:

ML>Доброго времени.


ML>Ситуация. Имеется ADOQuery, DataSet и DBGrid. В ADOQuery определён SQL, собирающий в запросе поля по нескольким таблицам. При попытке отредактировать поле в DBGrid ADOQuery выбрасывает ошибку, сообщающую, что попытка вставить значение в столбец отвергнута по ряду причин, что совершенно логично, так как произвольный запрос — не таблица и не view.


Поставь LockType в ltBathOptimistic
... << RSDN@Home 1.1.0 stable >>
Re[2]: Отмена автоматического Update'а в ADOQuery
От: mvg_first Россия  
Дата: 20.01.04 07:27
Оценка:
Здравствуйте, Shadowspan, Вы писали:

S>Здравствуйте, MaxLife, Вы писали:


ML>>Доброго времени.


ML>>Ситуация. Имеется ADOQuery, DataSet и DBGrid. В ADOQuery определён SQL, собирающий в запросе поля по нескольким таблицам. При попытке отредактировать поле в DBGrid ADOQuery выбрасывает ошибку, сообщающую, что попытка вставить значение в столбец отвергнута по ряду причин, что совершенно логично, так как произвольный запрос — не таблица и не view.


S>Поставь LockType в ltBathOptimistic


А что это даст? (объясните пожалуйста, к сожалению на рабочей машине делфи нет поэтому попробовать самостоятельно нет возможности. А домой попаду только к вечеру.)
Дело в том что у меня стоит похожая задача — на матерах делфи посоветовали обрабатывать событие BeforePost — но я непонял как отменить выполнения операции самим датасетом (даже если я уже сам обработал эту операцию в событии)

У меня в голову закрадывается смутная — что самое простое решение это написать свой датасет Но пока лично для меня это не самое простое решение. Поэтому ищу совета и альтернативных решений.
В борьбе бобра с ослом — всегда побеждает бобро!
Re[3]: Отмена автоматического Update'а в ADOQuery
От: _MarlboroMan_ Россия  
Дата: 20.01.04 07:43
Оценка:
Здравствуйте, mvg_first, Вы писали:

_>Дело в том что у меня стоит похожая задача — на матерах делфи посоветовали обрабатывать событие BeforePost — но я непонял как отменить выполнения операции самим датасетом (даже если я уже сам обработал эту операцию в событии)


почитай про:

TDataSet.Cancel и еще в SysUtils есть процедура Abort

получится что-то типа:

procedure ...BeforePost(DataSet: TDataSet);
begin
    <твои личные действия>
    DataSet.Cancel;
    abort;
end;


тока не забываем что abort — суть exception. так что ни в какие другие Eventы ты не попадешь и весь "стек" Event-ов будет "почищен" до самого верха
... << RSDN@Home 1.1.2 stable >>

— сколько программистов надо чтобы заменить сгоревшую лампочку?
— сколько не бери, а лампочку не поменять — проблема аппаратная, программным путем не решается...
Re[4]: Отмена автоматического Update'а в ADOQuery
От: mvg_first Россия  
Дата: 20.01.04 07:58
Оценка:
Здравствуйте, _MarlboroMan_, Вы писали:

_MM_>Здравствуйте, mvg_first, Вы писали:


_>>Дело в том что у меня стоит похожая задача — на матерах делфи посоветовали обрабатывать событие BeforePost — но я непонял как отменить выполнения операции самим датасетом (даже если я уже сам обработал эту операцию в событии)


_MM_>почитай про:


_MM_>TDataSet.Cancel и еще в SysUtils есть процедура Abort


_MM_>получится что-то типа:


_MM_>
_MM_>procedure ...BeforePost(DataSet: TDataSet);
_MM_>begin
_MM_>    <твои личные действия>
_MM_>    DataSet.Cancel;
_MM_>    abort;
_MM_>end;
_MM_>


_MM_>тока не забываем что abort — суть exception. так что ни в какие другие Eventы ты не попадешь и весь "стек" Event-ов будет "почищен" до самого верха


Т.е. в метде BeforePost я должен вызвать Cancel — на экране в гирде исчезнет добавленная запись??? А разве это нормальное поведение программы со стороны пользователя?
Если использовать Abort — грид не выходит из редактирование (т.е. если пользователь пробует уйти из записи — то грид не уходит).
Если вас не затруднит — распишите пожалуйста вкратце алгоритм работы что должна сделать программа когда пользователь в гриде добавляет запись?
В борьбе бобра с ослом — всегда побеждает бобро!
Re[5]: Отмена автоматического Update'а в ADOQuery
От: _MarlboroMan_ Россия  
Дата: 20.01.04 08:07
Оценка:
Здравствуйте, mvg_first, Вы писали:

_>Т.е. в метде BeforePost я должен вызвать Cancel — на экране в гирде исчезнет добавленная запись??? А разве это нормальное поведение программы со стороны пользователя?

_>Если использовать Abort — грид не выходит из редактирование (т.е. если пользователь пробует уйти из записи — то грид не уходит).
_>Если вас не затруднит — распишите пожалуйста вкратце алгоритм работы что должна сделать программа когда пользователь в гриде добавляет запись?

Сделать Cancel, abort, перечитать с сервера датасет, спозиционироваться на свежевставленную/отредактированную запись.

ну либо пользуйся чем-нить вроде MemDataSet от DevExpress.
... << RSDN@Home 1.1.2 stable >>

— сколько программистов надо чтобы заменить сгоревшую лампочку?
— сколько не бери, а лампочку не поменять — проблема аппаратная, программным путем не решается...
Re[6]: Отмена автоматического Update'а в ADOQuery
От: mvg_first Россия  
Дата: 20.01.04 10:04
Оценка:
Здравствуйте, _MarlboroMan_, Вы писали:

_MM_>Здравствуйте, mvg_first, Вы писали:


_>>Т.е. в метде BeforePost я должен вызвать Cancel — на экране в гирде исчезнет добавленная запись??? А разве это нормальное поведение программы со стороны пользователя?

_>>Если использовать Abort — грид не выходит из редактирование (т.е. если пользователь пробует уйти из записи — то грид не уходит).
_>>Если вас не затруднит — распишите пожалуйста вкратце алгоритм работы что должна сделать программа когда пользователь в гриде добавляет запись?

_MM_>Сделать Cancel, abort, перечитать с сервера датасет, спозиционироваться на свежевставленную/отредактированную запись.


_MM_>ну либо пользуйся чем-нить вроде MemDataSet от DevExpress.

А не могли бы Вы подсказаь какие нибудь компоненты которые еще могут предоставить подобную функциональность (крмое DevExpress???)
В борьбе бобра с ослом — всегда побеждает бобро!
Re[7]: Отмена автоматического Update'а в ADOQuery
От: _MarlboroMan_ Россия  
Дата: 20.01.04 10:10
Оценка:
Здравствуйте, mvg_first, Вы писали:

_MM_>>ну либо пользуйся чем-нить вроде MemDataSet от DevExpress.

_>А не могли бы Вы подсказаь какие нибудь компоненты которые еще могут предоставить подобную функциональность (крмое DevExpress???)

вроде в RxLib был датасет, который в памяти жил... не помню... сам пользую devexpress.
... << RSDN@Home 1.1.2 stable >>

— сколько программистов надо чтобы заменить сгоревшую лампочку?
— сколько не бери, а лампочку не поменять — проблема аппаратная, программным путем не решается...
Re[8]: Отмена автоматического Update'а в ADOQuery
От: mvg_first Россия  
Дата: 20.01.04 10:38
Оценка:
Здравствуйте, _MarlboroMan_, Вы писали:

_MM_>Здравствуйте, mvg_first, Вы писали:


_MM_>>>ну либо пользуйся чем-нить вроде MemDataSet от DevExpress.

_>>А не могли бы Вы подсказаь какие нибудь компоненты которые еще могут предоставить подобную функциональность (крмое DevExpress???)

_MM_>вроде в RxLib был датасет, который в памяти жил... не помню... сам пользую devexpress.

А что с ним будет если ему подсуну таблицу размером так 1 000 000 записей а?
В борьбе бобра с ослом — всегда побеждает бобро!
Re[9]: Отмена автоматического Update'а в ADOQuery
От: _MarlboroMan_ Россия  
Дата: 20.01.04 10:43
Оценка:
Здравствуйте, mvg_first, Вы писали:

_MM_>>вроде в RxLib был датасет, который в памяти жил... не помню... сам пользую devexpress.

_>А что с ним будет если ему подсуну таблицу размером так 1 000 000 записей а?

видимо прочитает в память.

но тут возникает другой вопрос: нахрена на клиента 1e6 записей загонять? IMHO: это плохой дизайн.
... << RSDN@Home 1.1.2 stable >>

— сколько программистов надо чтобы заменить сгоревшую лампочку?
— сколько не бери, а лампочку не поменять — проблема аппаратная, программным путем не решается...
Re[3]: Отмена автоматического Update'а в ADOQuery
От: Shadowspan Россия  
Дата: 20.01.04 10:47
Оценка:
Здравствуйте, mvg_first, Вы писали:

_>Здравствуйте, Shadowspan, Вы писали:


S>>Здравствуйте, MaxLife, Вы писали:


ML>>>Доброго времени.


ML>>>Ситуация. Имеется ADOQuery, DataSet и DBGrid. В ADOQuery определён SQL, собирающий в запросе поля по нескольким таблицам. При попытке отредактировать поле в DBGrid ADOQuery выбрасывает ошибку, сообщающую, что попытка вставить значение в столбец отвергнута по ряду причин, что совершенно логично, так как произвольный запрос — не таблица и не view.


S>>Поставь LockType в ltBathOptimistic


_>А что это даст? (объясните пожалуйста, к сожалению на рабочей машине делфи нет поэтому попробовать самостоятельно нет возможности. А домой попаду только к вечеру.)


ADO RecordSet переходит в режим отложенных обновлений. То есть Post не посылает изменения в БД а сохраняет в локальном кэше. После этого вручную обновляешь БД и делаешь обновление текущей записи в RecordSet.
... << RSDN@Home 1.1.0 stable >>
Re[10]: Отмена автоматического Update'а в ADOQuery
От: mvg_first Россия  
Дата: 20.01.04 10:49
Оценка:
Здравствуйте, _MarlboroMan_, Вы писали:

_MM_>Здравствуйте, mvg_first, Вы писали:


_MM_>>>вроде в RxLib был датасет, который в памяти жил... не помню... сам пользую devexpress.

_>>А что с ним будет если ему подсуну таблицу размером так 1 000 000 записей а?

_MM_>видимо прочитает в память.


_MM_>но тут возникает другой вопрос: нахрена на клиента 1e6 записей загонять? IMHO: это плохой дизайн

Честно говоря я так делать и не буду — но под 3-4 записей будет Я пока собираюсь писать систему для обработки прайсов — и вот в ней в каждом прайсе по 3-5 тыс товаров, причем пользователь будет их группировать переносить групповым образом назначать цены, контроллировать превышение цен — в этих случаях мне кажется очень разумным — пказыать ему весь прайс — а это уже 3-5 тыс записей на клиенте и никуда ты от этого не денешся.
В борьбе бобра с ослом — всегда побеждает бобро!
Re[4]: Отмена автоматического Update'а в ADOQuery
От: mvg_first Россия  
Дата: 20.01.04 10:54
Оценка:
Здравствуйте, Shadowspan, Вы писали:

S>Здравствуйте, mvg_first, Вы писали:


_>>Здравствуйте, Shadowspan, Вы писали:


S>>>Здравствуйте, MaxLife, Вы писали:


ML>>>>Доброго времени.


ML>>>>Ситуация. Имеется ADOQuery, DataSet и DBGrid. В ADOQuery определён SQL, собирающий в запросе поля по нескольким таблицам. При попытке отредактировать поле в DBGrid ADOQuery выбрасывает ошибку, сообщающую, что попытка вставить значение в столбец отвергнута по ряду причин, что совершенно логично, так как произвольный запрос — не таблица и не view.


S>>>Поставь LockType в ltBathOptimistic


_>>А что это даст? (объясните пожалуйста, к сожалению на рабочей машине делфи нет поэтому попробовать самостоятельно нет возможности. А домой попаду только к вечеру.)


S>ADO RecordSet переходит в режим отложенных обновлений. То есть Post не посылает изменения в БД а сохраняет в локальном кэше. После этого вручную обновляешь БД и делаешь обновление текущей записи в RecordSet.

А что произойдет с отложенными обновлениями которые в кеше? Куда они денутся и почему (ивзините за такие вопросы — но я неимею сейчас доступа к справке что бы почитать)
В борьбе бобра с ослом — всегда побеждает бобро!
Re[5]: Отмена автоматического Update'а в ADOQuery
От: _MarlboroMan_ Россия  
Дата: 20.01.04 11:01
Оценка:
Здравствуйте, mvg_first, Вы писали:

S>>ADO RecordSet переходит в режим отложенных обновлений. То есть Post не посылает изменения в БД а сохраняет в локальном кэше. После этого вручную обновляешь БД и делаешь обновление текущей записи в RecordSet.

_>А что произойдет с отложенными обновлениями которые в кеше? Куда они денутся и почему (ивзините за такие вопросы — но я неимею сейчас доступа к справке что бы почитать)

а что бывает после вызова метода Free??? вот то и будет. тебе-то оно зачем? ты же уже в базу всё залил что надо...
... << RSDN@Home 1.1.2 stable >>

— сколько программистов надо чтобы заменить сгоревшую лампочку?
— сколько не бери, а лампочку не поменять — проблема аппаратная, программным путем не решается...
Re[6]: Отмена автоматического Update'а в ADOQuery
От: mvg_first Россия  
Дата: 20.01.04 11:55
Оценка:
Здравствуйте, _MarlboroMan_, Вы писали:

_MM_>Здравствуйте, mvg_first, Вы писали:


S>>>ADO RecordSet переходит в режим отложенных обновлений. То есть Post не посылает изменения в БД а сохраняет в локальном кэше. После этого вручную обновляешь БД и делаешь обновление текущей записи в RecordSet.

_>>А что произойдет с отложенными обновлениями которые в кеше? Куда они денутся и почему (ивзините за такие вопросы — но я неимею сейчас доступа к справке что бы почитать)

_MM_>а что бывает после вызова метода Free??? вот то и будет. тебе-то оно зачем? ты же уже в базу всё залил что надо...

Непонятен момент почему и у кого будет вызван метод Free? На основании чего — только того что я выдову метод Refresh или закрою и отрою дата сет?
В борьбе бобра с ослом — всегда побеждает бобро!
Re[11]: Отмена автоматического Update'а в ADOQuery
От: Sinclair Россия https://github.com/evilguest/
Дата: 20.01.04 16:29
Оценка:
Здравствуйте, mvg_first, Вы писали:
_MM_>>но тут возникает другой вопрос: нахрена на клиента 1e6 записей загонять? IMHO: это плохой дизайн
_>Честно говоря я так делать и не буду — но под 3-4 записей будет Я пока собираюсь писать систему для обработки прайсов — и вот в ней в каждом прайсе по 3-5 тыс товаров, причем пользователь будет их группировать переносить групповым образом назначать цены, контроллировать превышение цен — в этих случаях мне кажется очень разумным — пказыать ему весь прайс — а это уже 3-5 тыс записей на клиенте и никуда ты от этого не денешся.
У тебя в качестве СУБД что? Пользуй MS SQL, в нем view + instead of триггеры. И волосы твои станут мягкими и шелковистыми.
... << RSDN@Home 1.1.2 beta 3 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: Отмена автоматического Update'а в ADOQuery
От: mvg_first Россия  
Дата: 21.01.04 15:20
Оценка:
Здравствуйте, MaxLife, Вы писали:

ML>Доброго времени.


ML>Ситуация. Имеется ADOQuery, DataSet и DBGrid. В ADOQuery определён SQL, собирающий в запросе поля по нескольким таблицам. При попытке отредактировать поле в DBGrid ADOQuery выбрасывает ошибку, сообщающую, что попытка вставить значение в столбец отвергнута по ряду причин, что совершенно логично, так как произвольный запрос — не таблица и не view.


ML>Вопрос — как перехватить или заблокировать на уровне ADOQuery отправку изменённых данных с целью самостоятельной их обработки? Есть ли возможность не отсылать изменения автоматом?


Вообщем прикинул я получается самый правильный вариант (с моей точки зрения) — написать потомка от TCustomADODataSet с полной функциональностью TADOQuery — но с расширением метода InternalPost. Суть расширения — отмена выполнения метдоа Recordset.AddNew — и выполнение своей команды на вставку записи
Но возникли сложности — неполучается переписать этот метод — inherited я вызвать не могу потому что он как раз выполняет этот метод, поэтому приходится полностью копировать — а когда копируешь — он использует приватные данные в процедуре UpdateData.

Вообщем проблема — соответствующий топик я поднял так как тема уже себя исчерпала и перешла в другое русло. Поэтому если есть мысли — ответьте в другом топике пожалуйста.
... << RSDN@Home 1.1.2 stable >>
В борьбе бобра с ослом — всегда побеждает бобро!
Re: Отмена автоматического Update'а в ADOQuery
От: Big  
Дата: 30.01.04 06:52
Оценка:
Здравствуйте, MaxLife, Вы писали:

ML>Доброго времени.


ML>Ситуация. Имеется ADOQuery, DataSet и DBGrid. В ADOQuery определён SQL, собирающий в запросе поля по нескольким таблицам. При попытке отредактировать поле в DBGrid ADOQuery выбрасывает ошибку, сообщающую, что попытка вставить значение в столбец отвергнута по ряду причин, что совершенно логично, так как произвольный запрос — не таблица и не view.


ML>Вопрос — как перехватить или заблокировать на уровне ADOQuery отправку изменённых данных с целью самостоятельной их обработки? Есть ли возможность не отсылать изменения автоматом?



В компоненте TDataSource есть свойство AutoEdit (по умолчанию = True): Determines if a data source component automatically calls a dataset’s Edit method when a data-aware control associated with the data source receives focus.
Re: Отмена автоматического Update'а в ADOQuery
От: Аноним  
Дата: 30.01.04 10:51
Оценка:
Здравствуйте, MaxLife, Вы писали:

Не мучайся.

Как тебе уже сказали:
LockType=ltBatchOptimistic

На OnBeforePost делаешь свою обработку,
подправляешь, если надо, текущий датасет.

А записи сидят в памяти до
ADOQuery.Refresh;
ADOQuery.Close;
ADOQuery.Free;
ADOQuery.CancelBatch;
ADOQuery.UpdateBatch.

(Может пропустил что-нибудь)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.