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

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

Злостный 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"а,
да еще и транзакции...


Наверх

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