Помогите, люди добрые!
Банальная задача:
Есть родительская и дочерняя таблицы в Interbase. Необходимо юзеру предоставить возможность просмотра одновременно записей из дочерней и родительской таблиц. Таблицы, есс-но, связаны. Просмотрев объединенные данные пользователь должен отредактировать дочернюю таблицу.
Как я поступил:
Для вывода использовал DBGrid. Т.к. он может выводить тольку одну таблицу, данные из родительской и дочерней таблиц я объединил через view и далее выбирал запросом в свойстве SelectSQL компонента IBDataSet. Обновление данные реализовал через запрос в свойстве ModifySQL (по-моему так, или UpdateSQL?). Что я получил - данные в DBGrid обновляются. Но после перехода к другой записи, содержимое DBGrid заменяется на повтор двух строк, поле одной из которых только что было отредактировано. Проще говоря, чушь получается.Если приложение запустить повторно, то DBGrid отображает корректные данные, т.е. изменения вносятся правильно. Т.о. я прихожу к выводу, что проблема в DBGrid, хотя возможно и в IBDataSet. Кто-нить может помочь в данном вопросе?
Обновление дочерней таблицы в DBGrid с помощью IBDataSet
- Naeel Maqsudov
- Сообщения: 2551
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Наверное в UpdateSQL неправильно введен запрос для Refresh....
Без конкретых примеров - это беспредментный разговор.
Как называются таблицы?
Какие БД-компоненты, с какими свойствами.
Однозначно ясно только одно - что компоненты "не узнают" отредактированную запись. Обычно из-за того, что неуказан первичный ключ. В данном случае таблица, как говорится "сохраняющая ключи" - это подчиненная таблица. Компоненты должны ориетнироваться на ПК подчиненной ьаблицы, чтобы выполнять refresh записи.
Без конкретых примеров - это беспредментный разговор.
Как называются таблицы?
Какие БД-компоненты, с какими свойствами.
Однозначно ясно только одно - что компоненты "не узнают" отредактированную запись. Обычно из-за того, что неуказан первичный ключ. В данном случае таблица, как говорится "сохраняющая ключи" - это подчиненная таблица. Компоненты должны ориетнироваться на ПК подчиненной ьаблицы, чтобы выполнять refresh записи.
В 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.
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
- Откуда: СПБ
- Контактная информация:
а стандартные компоненты разве умеют автоматически рефрешить измененную запись? не придётся ли после редактирования принудительно вызвать рефреш?
кстати да, добавить ID во вьюху?" писал(а):Обычно из-за того, что неуказан первичный ключ.
Получаются, что умеют - вручную вызываешь рефреш, тот же результат. А про ПК во вьюхе - проверю, но, как помню, вьюха выбирает все поля из обеих таблиц, так что ПК там тоже должен быть. У меня вот вопрос по назначению RefreshSQL - у меня он совпадает с SelectSQL. Может где-то здесь надо потрясти бубном? В чем отличие данного сво-ва от SelectSQL? В хелпе сказано типа, что SelectSQL делает select, RefreshSQL делает refresh - ничего вразумительного, в общем.Игорь Акопян писал(а):а стандартные компоненты разве умеют автоматически рефрешить измененную запись? не придётся ли после редактирования принудительно вызвать рефреш?
кстати да, добавить ID во вьюху?
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
Тысяча извинений и большее спасибо, кто ответил! С вопросом разобрался - вся проблема оказалась в том, что в IBDataSet в свойстве unidirectional стояло true и компонент не мог корректно обновиться. Даже немного нелепо...
- Игорь Акопян
- Сообщения: 1419
- Зарегистрирован: 13 окт 2004, 17:11
- Откуда: СПБ
- Контактная информация:
про селект и рефреш - если по-аналогии с фибами, то рефреш должен перечитывать текущую запись
Так и есть. А фибы это что?
- Игорь Акопян
- Сообщения: 1419
- Зарегистрирован: 13 окт 2004, 17:11
- Откуда: СПБ
- Контактная информация:
FIBPlus - набор недорогих и крайне рекомендуемых компонентов под FB/Ya
http://www.devrace.com/ru/fibplus/
http://www.devrace.com/ru/fibplus/
Ясно, спасибо за информацию.