![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Злостный IBX
Тонио-Лунатик © (2001-12-25 08:43:00)Приветствую всех! Помогите ежели сможете, а в этом я просто уверен. Для выборки данных использую IBQuery+IBUpdateSQL, причём SQL-запрос в IBQuery таков: "Select * From PROCEDURE(:Param)". Подчёркиваю данные передаются в IBQuery процедурой выборки. Казалось бы всё хорошо, выборка осуществляется корректно, но этот паразит не пускает редактировать данные, полученные в результате. Как только меняю в запросе PROCEDURE(:Param) на какой-нить Table, всё отлично - редактируй сколько влезет! Это что же получается - при выборке из процедуры выборки "живые" обновления не возможны? (Delphi 5, IB 5.6)
Romkin (2001-12-26 10:44:00) [1]Кто сказал нельзя??!
У меня половина базы так редактируется, просто делаешь выборку, потом при нажатии на Редактировать показываешь форму с отдельным query только для текущей записи, после этого делаешь рефреш списка, и все летает...
Выборка через SP в Interbase вообще практически самый быстрый способ - все заранее подготовлено
Alexandr (2001-12-26 09:43:00) [2]все.
Запутали человека.
ну и фиг с ним...
Alexandr (2001-12-26 09:43:00) [3]все.
Запутали человека.
ну и фиг с ним...(Тионио-лунатиком)
Тонио-Лунатик (2001-12-26 09:16:00) [4]Спасибо всем за участие и пресональный Thank"s Romkin"у. Действительно в этом случае использовать выборку из хранимой процедуры незя.
Удачи
Romkin (2001-12-25 13:49:00) [5]Ошибся - CanModify, впрочем, тожесамокак RequestLive
для IB следующие ограничения (programmers guide)
To be updatable, a view must meet the following
conditions:
It derives its columns from a single table or updatable view.
It does not define a self-join of the base table.
It does not reference columns derived from arithmetic expressions.
The view’s SELECT statement does not contain:
·A WHERE clause that uses the DISTINCT predicate
·A HAVING clause
·Functions
·Nested queries
·Stored procedures
Тонио-Лунатик (2001-12-25 13:23:00) [6]"Насчет выборки - см TQuery.LiveResult - там объяснение. в IB, если не ошибаюсь, нередактируемой будет уже выборка с order by.." - если можешь, попдробнее - где и как. Может ты имеешь в виду TQuery.RequestLive? А то о TQuery.LiveResult - первый раз слышу.
Romkin (2001-12-25 12:20:00) [7]Опять двойной щелчок - выйдет диалог (похоже, все компоненты TIB оснащены установочными диалогами), выбираешь read commited, или просто вручную
в Params строки:
read_committed
rec_version
nowait
IBX4.52 - рекомендуется Borland
http://www.borland.com/devsupport/interbase/ibx_updates.html
Последние обновления IBX для D5|D6 - http://ib.demo.ru
там же много полезного
Насчет выборки - см TQuery.LiveResult - там объяснение. в IB, если не ошибаюсь, нередактируемой будет уже выборка с order by..
Тонио-Лунатик (2001-12-25 11:59:00) [8]2 Romkin: не понял по поводу второго пункта "TIBTransaction - устанавливаешь Read commited" - это где такое?
Если делать запрос - выборку из таблицы, то всё работает, но если осуществлять выборку из процедуры, то не работает.
IBX 4.52 - ссылочку подскажи.
Romkin (2001-12-25 11:32:00) [9]????
У меня все работает - сам попробовал, прежде чем писать прошлое сообщение ;-)
1. Кидаешь TIBDatabase, устанавливаешь параметры
2. TIBTransaction - устанавливаешь Read commited, и ссылку на базу
3. TIBQuery - указываешь эту транзакцию + Cashed updates = true, пишешь запрос
4. TIBUpdateSQL - прописываешь у TIBQuery его в качестве обновителя
5. Дважды щелкнув, указываешь имя таблицы и поля, генеришь SQL
6. TDataSource - к TIBQuery, + TDBGrid
7. Открываешь запрос и запускаешь прогу - все редактируется...
PS у меня IBX4.52, рекомендую обновить до него
Тонио-Лунатик (2001-12-25 11:21:00) [10]Пардон, пока писал предыдущий свой message Romkin меня опередил, получилось два раза об одном и том же. Сорри!
2 Romkin свойство UpdateObject - установлено, усё нормально, даже в DBGride свойство dgEditing := true. Однако редактировать не пущает.
Alexandr (2001-12-25 11:20:00) [11]да все правильно.
Должно работать если Cached Updates включено и UpdateObject прописан
а вообще, чем тебе IbdataSet не подходит. посмотри, по мему он тебе больше подойдет...
Тонио-Лунатик (2001-12-25 11:13:00) [12]To AlexeyV ты не так понял. IBUpdateSQL будет добавлять, редактировать и удалять записи из моей выборки только после вызова метода ApplyUpdates() компонента IBQuery - который подтверждает все сделанные изменения, вот тогда то и начинают работать все эти процедуры, прописанные в IBUpdateSQL. Когда же я корректирую данные в DBGrid"е все изменения происходят во временном буфере у клиента, не более - база остаётся неизменной.
По поводу зачем я использую процедуру выборки, вообще-то это - нормальная ситуация, тем более - обычный Select не устраивает, хотя бы потому, что я использую For Select.
Представление не могу использовать, по двум причинам:
1.Представление может быть сформировано на основе одной или нескольких таблиц, или на основе другого представления - представлений на основе процедур не существует (по крайней мере в IB).
2.В IB-представлениях нет возможности использования каких-либо переменных, только скалярные значения, а уменя результат процедуры, зависит от входного параметра!
Romkin (2001-12-25 11:07:00) [13]2AlexeyV Представления не надо - тормозит... а результат тот же
Все нормально, делать выборку процедурой очень удобно, просто редактировать можно только запросы к одной таблице, и еще есть ограничения - см описание СУБД
А UpdateSQL срабатывает по команде ApplyUpdates - у TIBQuery или TIBDatabase, естественно, предварительно надо прописать запросы.
А чтобы пускало в редактирование - надо установить св-во UpdateObject
После этого по двойному щелчку по TUpdateSQL создаются запросы, надо только указать таблицу и ключевые и обновляемые поля, а refreshSQL сделать таким же, как и select (но where оставить)
AlexeyV (2001-12-25 09:48:00) [14]А ты подумай как IBUpdateSQL будет добавлять, редактировать и удалять записи из твоей выборки. Ты создал для этого процедуры и прописал все это в IBUpdateSQL? Да и даже если пропишеть то я сомневаюсь что он сможет.
А зачем тебе вообще делать выборку процедурой? Чем плох обычный select? Или у тебя там очень сложная выборка а уже из нее ты потом выбираешь то что надо? Так тогда создай представление и выбирай из него. Если в качестве параметра твоей процедуры ты передавал что-то для выборки то также спокойно передавай это в IBQuery как параметр.
Тонио-Лунатик (2001-12-25 09:31:00) [15]На сколько я понимаю запросы на обновление в UpdateSQL активизируются при попытке сохранения скорректированных данных в базе, а в этом то вся и проблема - я не могу изменить данные в DBGrid"е он просто меня не пускает. А CachedUpdates := true - всё включено!
Alexandr (2001-12-25 09:20:00) [16]надо в UpdateSQL прописать запросы на обновление.
Включить cachedUpdates у dataset"а,
да еще и транзакции...