Ситуация. Имеется ADOQuery, DataSet и DBGrid. В ADOQuery определён SQL, собирающий в запросе поля по нескольким таблицам. При попытке отредактировать поле в DBGrid ADOQuery выбрасывает ошибку, сообщающую, что попытка вставить значение в столбец отвергнута по ряду причин, что совершенно логично, так как произвольный запрос — не таблица и не view.
Вопрос — как перехватить или заблокировать на уровне ADOQuery отправку изменённых данных с целью самостоятельной их обработки? Есть ли возможность не отсылать изменения автоматом?
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> ли возможность не отсылать изменения автоматом?
Здравствуйте, MaxLife, Вы писали:
ML>Доброго времени.
ML>Ситуация. Имеется ADOQuery, DataSet и DBGrid. В ADOQuery определён SQL, собирающий в запросе поля по нескольким таблицам. При попытке отредактировать поле в DBGrid ADOQuery выбрасывает ошибку, сообщающую, что попытка вставить значение в столбец отвергнута по ряду причин, что совершенно логично, так как произвольный запрос — не таблица и не view.
Здравствуйте, Shadowspan, Вы писали:
S>Здравствуйте, MaxLife, Вы писали:
ML>>Доброго времени.
ML>>Ситуация. Имеется ADOQuery, DataSet и DBGrid. В ADOQuery определён SQL, собирающий в запросе поля по нескольким таблицам. При попытке отредактировать поле в DBGrid ADOQuery выбрасывает ошибку, сообщающую, что попытка вставить значение в столбец отвергнута по ряду причин, что совершенно логично, так как произвольный запрос — не таблица и не view.
S>Поставь LockType в ltBathOptimistic
А что это даст? (объясните пожалуйста, к сожалению на рабочей машине делфи нет поэтому попробовать самостоятельно нет возможности. А домой попаду только к вечеру.)
Дело в том что у меня стоит похожая задача — на матерах делфи посоветовали обрабатывать событие BeforePost — но я непонял как отменить выполнения операции самим датасетом (даже если я уже сам обработал эту операцию в событии)
У меня в голову закрадывается смутная — что самое простое решение это написать свой датасет Но пока лично для меня это не самое простое решение. Поэтому ищу совета и альтернативных решений.
Здравствуйте, 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 >>
— сколько программистов надо чтобы заменить сгоревшую лампочку?
— сколько не бери, а лампочку не поменять — проблема аппаратная, программным путем не решается...
Здравствуйте, _MarlboroMan_, Вы писали:
_MM_>Здравствуйте, mvg_first, Вы писали:
_>>Дело в том что у меня стоит похожая задача — на матерах делфи посоветовали обрабатывать событие BeforePost — но я непонял как отменить выполнения операции самим датасетом (даже если я уже сам обработал эту операцию в событии)
_MM_>почитай про:
_MM_>TDataSet.Cancel и еще в SysUtils есть процедура Abort
_MM_>получится что-то типа:
_MM_>
_MM_>тока не забываем что abort — суть exception. так что ни в какие другие Eventы ты не попадешь и весь "стек" Event-ов будет "почищен" до самого верха
Т.е. в метде BeforePost я должен вызвать Cancel — на экране в гирде исчезнет добавленная запись??? А разве это нормальное поведение программы со стороны пользователя?
Если использовать Abort — грид не выходит из редактирование (т.е. если пользователь пробует уйти из записи — то грид не уходит).
Если вас не затруднит — распишите пожалуйста вкратце алгоритм работы что должна сделать программа когда пользователь в гриде добавляет запись?
Здравствуйте, mvg_first, Вы писали:
_>Т.е. в метде BeforePost я должен вызвать Cancel — на экране в гирде исчезнет добавленная запись??? А разве это нормальное поведение программы со стороны пользователя? _>Если использовать Abort — грид не выходит из редактирование (т.е. если пользователь пробует уйти из записи — то грид не уходит). _>Если вас не затруднит — распишите пожалуйста вкратце алгоритм работы что должна сделать программа когда пользователь в гриде добавляет запись?
Сделать Cancel, abort, перечитать с сервера датасет, спозиционироваться на свежевставленную/отредактированную запись.
ну либо пользуйся чем-нить вроде MemDataSet от DevExpress.
... << RSDN@Home 1.1.2 stable >>
— сколько программистов надо чтобы заменить сгоревшую лампочку?
— сколько не бери, а лампочку не поменять — проблема аппаратная, программным путем не решается...
Здравствуйте, _MarlboroMan_, Вы писали:
_MM_>Здравствуйте, mvg_first, Вы писали:
_>>Т.е. в метде BeforePost я должен вызвать Cancel — на экране в гирде исчезнет добавленная запись??? А разве это нормальное поведение программы со стороны пользователя? _>>Если использовать Abort — грид не выходит из редактирование (т.е. если пользователь пробует уйти из записи — то грид не уходит). _>>Если вас не затруднит — распишите пожалуйста вкратце алгоритм работы что должна сделать программа когда пользователь в гриде добавляет запись?
_MM_>Сделать Cancel, abort, перечитать с сервера датасет, спозиционироваться на свежевставленную/отредактированную запись.
_MM_>ну либо пользуйся чем-нить вроде MemDataSet от DevExpress.
А не могли бы Вы подсказаь какие нибудь компоненты которые еще могут предоставить подобную функциональность (крмое DevExpress???)
Здравствуйте, mvg_first, Вы писали:
_MM_>>ну либо пользуйся чем-нить вроде MemDataSet от DevExpress. _>А не могли бы Вы подсказаь какие нибудь компоненты которые еще могут предоставить подобную функциональность (крмое DevExpress???)
вроде в RxLib был датасет, который в памяти жил... не помню... сам пользую devexpress.
... << RSDN@Home 1.1.2 stable >>
— сколько программистов надо чтобы заменить сгоревшую лампочку?
— сколько не бери, а лампочку не поменять — проблема аппаратная, программным путем не решается...
Здравствуйте, _MarlboroMan_, Вы писали:
_MM_>Здравствуйте, mvg_first, Вы писали:
_MM_>>>ну либо пользуйся чем-нить вроде MemDataSet от DevExpress. _>>А не могли бы Вы подсказаь какие нибудь компоненты которые еще могут предоставить подобную функциональность (крмое DevExpress???)
_MM_>вроде в RxLib был датасет, который в памяти жил... не помню... сам пользую devexpress.
А что с ним будет если ему подсуну таблицу размером так 1 000 000 записей а?
Здравствуйте, mvg_first, Вы писали:
_MM_>>вроде в RxLib был датасет, который в памяти жил... не помню... сам пользую devexpress. _>А что с ним будет если ему подсуну таблицу размером так 1 000 000 записей а?
видимо прочитает в память.
но тут возникает другой вопрос: нахрена на клиента 1e6 записей загонять? IMHO: это плохой дизайн.
... << RSDN@Home 1.1.2 stable >>
— сколько программистов надо чтобы заменить сгоревшую лампочку?
— сколько не бери, а лампочку не поменять — проблема аппаратная, программным путем не решается...
Здравствуйте, 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
Здравствуйте, _MarlboroMan_, Вы писали:
_MM_>Здравствуйте, mvg_first, Вы писали:
_MM_>>>вроде в RxLib был датасет, который в памяти жил... не помню... сам пользую devexpress. _>>А что с ним будет если ему подсуну таблицу размером так 1 000 000 записей а?
_MM_>видимо прочитает в память.
_MM_>но тут возникает другой вопрос: нахрена на клиента 1e6 записей загонять? IMHO: это плохой дизайн
Честно говоря я так делать и не буду — но под 3-4 записей будет Я пока собираюсь писать систему для обработки прайсов — и вот в ней в каждом прайсе по 3-5 тыс товаров, причем пользователь будет их группировать переносить групповым образом назначать цены, контроллировать превышение цен — в этих случаях мне кажется очень разумным — пказыать ему весь прайс — а это уже 3-5 тыс записей на клиенте и никуда ты от этого не денешся.
Здравствуйте, 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.
А что произойдет с отложенными обновлениями которые в кеше? Куда они денутся и почему (ивзините за такие вопросы — но я неимею сейчас доступа к справке что бы почитать)
Здравствуйте, mvg_first, Вы писали:
S>>ADO RecordSet переходит в режим отложенных обновлений. То есть Post не посылает изменения в БД а сохраняет в локальном кэше. После этого вручную обновляешь БД и делаешь обновление текущей записи в RecordSet. _>А что произойдет с отложенными обновлениями которые в кеше? Куда они денутся и почему (ивзините за такие вопросы — но я неимею сейчас доступа к справке что бы почитать)
а что бывает после вызова метода Free??? вот то и будет. тебе-то оно зачем? ты же уже в базу всё залил что надо...
... << RSDN@Home 1.1.2 stable >>
— сколько программистов надо чтобы заменить сгоревшую лампочку?
— сколько не бери, а лампочку не поменять — проблема аппаратная, программным путем не решается...
Здравствуйте, _MarlboroMan_, Вы писали:
_MM_>Здравствуйте, mvg_first, Вы писали:
S>>>ADO RecordSet переходит в режим отложенных обновлений. То есть Post не посылает изменения в БД а сохраняет в локальном кэше. После этого вручную обновляешь БД и делаешь обновление текущей записи в RecordSet. _>>А что произойдет с отложенными обновлениями которые в кеше? Куда они денутся и почему (ивзините за такие вопросы — но я неимею сейчас доступа к справке что бы почитать)
_MM_>а что бывает после вызова метода Free??? вот то и будет. тебе-то оно зачем? ты же уже в базу всё залил что надо...
Непонятен момент почему и у кого будет вызван метод Free? На основании чего — только того что я выдову метод Refresh или закрою и отрою дата сет?
В борьбе бобра с ослом — всегда побеждает бобро!
Re[11]: Отмена автоматического Update'а в ADOQuery
Здравствуйте, mvg_first, Вы писали: _MM_>>но тут возникает другой вопрос: нахрена на клиента 1e6 записей загонять? IMHO: это плохой дизайн _>Честно говоря я так делать и не буду — но под 3-4 записей будет Я пока собираюсь писать систему для обработки прайсов — и вот в ней в каждом прайсе по 3-5 тыс товаров, причем пользователь будет их группировать переносить групповым образом назначать цены, контроллировать превышение цен — в этих случаях мне кажется очень разумным — пказыать ему весь прайс — а это уже 3-5 тыс записей на клиенте и никуда ты от этого не денешся.
У тебя в качестве СУБД что? Пользуй MS SQL, в нем view + instead of триггеры. И волосы твои станут мягкими и шелковистыми.
... << RSDN@Home 1.1.2 beta 3 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, MaxLife, Вы писали:
ML>Доброго времени.
ML>Ситуация. Имеется ADOQuery, DataSet и DBGrid. В ADOQuery определён SQL, собирающий в запросе поля по нескольким таблицам. При попытке отредактировать поле в DBGrid ADOQuery выбрасывает ошибку, сообщающую, что попытка вставить значение в столбец отвергнута по ряду причин, что совершенно логично, так как произвольный запрос — не таблица и не view.
ML>Вопрос — как перехватить или заблокировать на уровне ADOQuery отправку изменённых данных с целью самостоятельной их обработки? Есть ли возможность не отсылать изменения автоматом?
Вообщем прикинул я получается самый правильный вариант (с моей точки зрения) — написать потомка от TCustomADODataSet с полной функциональностью TADOQuery — но с расширением метода InternalPost. Суть расширения — отмена выполнения метдоа Recordset.AddNew — и выполнение своей команды на вставку записи
Но возникли сложности — неполучается переписать этот метод — inherited я вызвать не могу потому что он как раз выполняет этот метод, поэтому приходится полностью копировать — а когда копируешь — он использует приватные данные в процедуре UpdateData.
Вообщем проблема — соответствующий топик я поднял так как тема уже себя исчерпала и перешла в другое русло. Поэтому если есть мысли — ответьте в другом топике пожалуйста.
Здравствуйте, 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 делаешь свою обработку,
подправляешь, если надо, текущий датасет.