Обновление дочерней таблицы в DBGrid с помощью IBDataSet

VCL, KOL, CLX и др. Свои компоненты
Ответить
_drug_
Сообщения: 6
Зарегистрирован: 13 апр 2009, 06:55

13 апр 2009, 07:17

Помогите, люди добрые!
Банальная задача:
Есть родительская и дочерняя таблицы в Interbase. Необходимо юзеру предоставить возможность просмотра одновременно записей из дочерней и родительской таблиц. Таблицы, есс-но, связаны. Просмотрев объединенные данные пользователь должен отредактировать дочернюю таблицу.
Как я поступил:
Для вывода использовал DBGrid. Т.к. он может выводить тольку одну таблицу, данные из родительской и дочерней таблиц я объединил через view и далее выбирал запросом в свойстве SelectSQL компонента IBDataSet. Обновление данные реализовал через запрос в свойстве ModifySQL (по-моему так, или UpdateSQL?). Что я получил - данные в DBGrid обновляются. Но после перехода к другой записи, содержимое DBGrid заменяется на повтор двух строк, поле одной из которых только что было отредактировано. Проще говоря, чушь получается.Если приложение запустить повторно, то DBGrid отображает корректные данные, т.е. изменения вносятся правильно. Т.о. я прихожу к выводу, что проблема в DBGrid, хотя возможно и в IBDataSet. Кто-нить может помочь в данном вопросе?
Аватара пользователя
Naeel Maqsudov
Сообщения: 2551
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

13 апр 2009, 09:44

Наверное в UpdateSQL неправильно введен запрос для Refresh....
Без конкретых примеров - это беспредментный разговор.
Как называются таблицы?
Какие БД-компоненты, с какими свойствами.
Однозначно ясно только одно - что компоненты "не узнают" отредактированную запись. Обычно из-за того, что неуказан первичный ключ. В данном случае таблица, как говорится "сохраняющая ключи" - это подчиненная таблица. Компоненты должны ориетнироваться на ПК подчиненной ьаблицы, чтобы выполнять refresh записи.
_drug_
Сообщения: 6
Зарегистрирован: 13 апр 2009, 06:55

13 апр 2009, 10:11

В SelectSQL запрос вроде:
select Field1
, Field2
***
, FieldN
from ViewName;


В UpdateSQL у меня запрос
update TableName
set Field1 = :Field1
, Field2 = :Field2
where KeyField = :KeyField;

При этом Field1, Field2 не являются ключами. Где здесь еще нужно указывать первичный ключ? Дело в том, что таблицы связаны во View вроде этого:
create view ViewName (
, FieldName1
, FieldName2
, FieldName3
, FieldName4 )
AS
SELECT tn1.Field1 as FieldName1
, tn1.Field2 as FieldName2
, tn2.Field1 as FieldName3
, tn2.Field1 as FieldName4
FROM TableName1 tn1
, TableName2 tn2
WHERE TableName1.KeyField = TableName2.KeyField;



Извиняюсь, что не привожу реальные запросы - они на другой машине, поэтому привожу по памяти. :(
БД компоненты: IBDatabase, IBTransaction, IBDataset, DataSource, DBGrid.
Аватара пользователя
Игорь Акопян
Сообщения: 1419
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

13 апр 2009, 11:12

а стандартные компоненты разве умеют автоматически рефрешить измененную запись? не придётся ли после редактирования принудительно вызвать рефреш?
&quot писал(а):Обычно из-за того, что неуказан первичный ключ.
кстати да, добавить ID во вьюху?
Изображение
_drug_
Сообщения: 6
Зарегистрирован: 13 апр 2009, 06:55

13 апр 2009, 11:25

Игорь Акопян писал(а):а стандартные компоненты разве умеют автоматически рефрешить измененную запись? не придётся ли после редактирования принудительно вызвать рефреш?

кстати да, добавить ID во вьюху?
Получаются, что умеют - вручную вызываешь рефреш, тот же результат. А про ПК во вьюхе - проверю, но, как помню, вьюха выбирает все поля из обеих таблиц, так что ПК там тоже должен быть. У меня вот вопрос по назначению RefreshSQL - у меня он совпадает с SelectSQL. Может где-то здесь надо потрясти бубном? В чем отличие данного сво-ва от SelectSQL? В хелпе сказано типа, что SelectSQL делает select, RefreshSQL делает refresh - ничего вразумительного, в общем.
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
Тысяча извинений и большее спасибо, кто ответил! С вопросом разобрался - вся проблема оказалась в том, что в IBDataSet в свойстве unidirectional стояло true и компонент не мог корректно обновиться. Даже немного нелепо... :)
Аватара пользователя
Игорь Акопян
Сообщения: 1419
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

17 апр 2009, 13:59

про селект и рефреш - если по-аналогии с фибами, то рефреш должен перечитывать текущую запись
Изображение
_drug_
Сообщения: 6
Зарегистрирован: 13 апр 2009, 06:55

17 апр 2009, 14:24

Так и есть. А фибы это что?
Аватара пользователя
Игорь Акопян
Сообщения: 1419
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

20 апр 2009, 12:21

FIBPlus - набор недорогих и крайне рекомендуемых компонентов под FB/Ya
http://www.devrace.com/ru/fibplus/
Изображение
_drug_
Сообщения: 6
Зарегистрирован: 13 апр 2009, 06:55

20 апр 2009, 12:53

Ясно, спасибо за информацию.
Ответить