RefreshRecord for GTT

Discussion of open issues, suggestions and bugs regarding IBDAC (InterBase Data Access Components) for Delphi, C++Builder, Lazarus (and FPC)
Post Reply
mikola
Posts: 3
Joined: Wed 22 Mar 2017 06:56

RefreshRecord for GTT

Post by mikola » Wed 22 Mar 2017 08:06

Добрый день

Реализован Master-Detail c использованием TIBCQuery и двух транзакций (одна со свойством IsolationLevel iblReadOnlyReadCommitted, вторая на запись -- iblReadCommitted, транзакции общие для мастера и детейла) . В качестве мастера выступает запрос к глобальной временной таблице (уникальность строки обеспечивается двумя полями), в качестве детализированных выступают обычные таблицы.

DDL глобальной таблицы

Code: Select all

CREATE GLOBAL TEMPORARY TABLE TEMP_ID_SOTR (
    ID_TEMP  INTEGER,
    ID_SOTR  INTEGER
) ON COMMIT PRESERVE ROWS;

Для мастера задан запрос в свойстве SQL

Code: Select all

select
*
from TEMP_ID_SOTR
where ID_TEMP = :pID_TEMP
и задаю явно запрос в свойстве SQLRefresh (поле ID_TEMP не уникальное)

Code: Select all

select
*
from TEMP_ID_SOTR
WHERE 
 ID_TEMP = :pID_TEMP and 
 ID_SOTR = :OLD_ID_SOTR
Для детейла select (связь указываю в настройках TIBCQuery, через поле ID_SOTR)

Code: Select all

SELECT * FROM A_SOTR
После редактирования детейла (оно успешно), вызываю RefreshRecord в мастере, чтобы обновить некоторые поля. Выскакивает ошибка
Refresh failed. Found 32 records
. В dbMonitor показывается, что отрабатывает рефреш запрос

Code: Select all

SELECT ID_TEMP AS IBC$0 FROM TEMP_ID_SOTR TMP
WHERE
  ID_TEMP = :ID_TEMP


1. Подскажите почему не отрабатывает в ручную заданный рефреш? Как правильно сделать рефреш?

И ещё прошу разъяснить.
Заметил, согласно тому что показывает dbMonitor, что update детальной таблицы происходит в транзакции только для чтения и прописанной в свойстве Transaction, а не UpdateTransaction.

Прописано в Transaction.Params

Code: Select all

nowait
read_committed
rec_version
read
Прописано в UpdateTransaction.Params

Code: Select all

nowait
read_committed
rec_version
2. Почему update не происходит в транзакции UpdateTransaction? Почему readonly транзакция может обновить записи?

ViktorV
Devart Team
Posts: 3168
Joined: Wed 30 Jul 2014 07:16

Re: RefreshRecord for GTT

Post by ViktorV » Wed 22 Mar 2017 09:55

Пожалуйста, составьте и вышлите нам с помощью контактной формы https://www.devart.com/company/contactform.html небольшой пример, демонстрирующий указанное вами поведении, включающий скрипты для создания и заполнение объектов БД. Мы исследуем ваш пример и сможем дать вам детальный ответ.

mikola
Posts: 3
Joined: Wed 22 Mar 2017 06:56

Re: RefreshRecord for GTT

Post by mikola » Thu 23 Mar 2017 03:48

Добрый день

Тестовый пример (скрипт БД и проект Delphi) я подготовил. Не понял как его отправить, по указанной ссылке меня просит еще раз зарегистрироваться.

У меня есть лицензия до октября 2017 г.
P.S. Пример отправил на суппорт

ViktorV
Devart Team
Posts: 3168
Joined: Wed 30 Jul 2014 07:16

Re: RefreshRecord for GTT

Post by ViktorV » Mon 27 Mar 2017 14:28

1. В присланном Вами примере Вы нигде не устанавливаете свойство SQLRefresh, поэтому IBDAC будет автоматически формировать SQL-запрос при выполнении метода RefreshRecord. Если Вы вручную установите свойство SQLRefresh в требуемый Вами запрос, то именно он будет выполнен при вызове метода RefreshRecord:

Code: Select all

...
  ibqListSearch.SQL.Text := s_SQL_SelectTmp;
  ibqListSearch.SQLRefresh.Text := s_SQL_RefreshTmp;
2. На самом деле выполнение запроса Update SQL происходит в контексте транзакции, указанной в свойстве UpdateTransaction, а не свойстве Transaction. Вы можете в этом убедиться установив ReadOnly-транзацию в свойстве UpdateTransaction и выполнив запрос на изменение данных.
Данное отображение связано с реализацией связи с dbMonitor, мы рассмотрим возможность изменения такого поведения.

mikola
Posts: 3
Joined: Wed 22 Mar 2017 06:56

Re: RefreshRecord for GTT

Post by mikola » Mon 27 Mar 2017 20:26

Спасибо за помощь.

1. Действительно в примере забыл присвоить свойству SQLRefresh. Проблема была в рефреш запросе, а именно -- пропустил столбец по которому необходим был рефреш (делал через * и не посмотрел что пропустил джойн с внешней таблицей).

2. Если можно, было бы желательно видеть в dbMonitor

ViktorV
Devart Team
Posts: 3168
Joined: Wed 30 Jul 2014 07:16

Re: RefreshRecord for GTT

Post by ViktorV » Thu 30 Mar 2017 09:53

1. Рады слышать, что проблема решена.
2. Если Вы хотите, чтобы мы добавили данную функциональность, пожалуйста, напишите об этом на нашем User Voice форуме: https://devart.uservoice.com/forums/104 ... 909-common. Если Ваше предложение наберет достаточно голосов, мы рассмотрим возможность его создания.

Post Reply