Page 1 of 1

RefreshRecord for GTT

Posted: Wed 22 Mar 2017 08:06
by mikola
Добрый день

Реализован 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 транзакция может обновить записи?

Re: RefreshRecord for GTT

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

Re: RefreshRecord for GTT

Posted: Thu 23 Mar 2017 03:48
by mikola
Добрый день

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

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

Re: RefreshRecord for GTT

Posted: Mon 27 Mar 2017 14:28
by ViktorV
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, мы рассмотрим возможность изменения такого поведения.

Re: RefreshRecord for GTT

Posted: Mon 27 Mar 2017 20:26
by mikola
Спасибо за помощь.

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

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

Re: RefreshRecord for GTT

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