Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2017.03.05;
Скачать: CL | DM;

Вниз

Не работает DataSet.Refresh, или можно ли обойтись без CloseOpen?   Найти похожие ветки 

 
TheEd   (2015-06-26 15:32) [0]

Уважаемые мастера!
Есть компонент A (TpFIBDataSet), у которого SelectSQL такой:
SELECT
   A.*, B.ASUM
FROM TABLE_A A
 LEFT JOIN
   (select AID, sum(SUMFIELD) as ASUM from TABLE_B group by AID) B
 ON B.AID=A.ID
WHERE
 <некоторое условие отбора>

Как Вы поняли - A - мастер, B - деталь. Соответственно в мастере поле ASUM должно отображать сумму по полю SUMFIELD у детали.
Если в детали поменялись записи в этом поле, для обновления пробовал делать A.Refresh - не работает. Помогает A.CloseOpen(true), но он переоткрывает детальную таблицу, что нежелательно...
 Как сделать полю рефреш без его переоткрытия и, соответственно без переоткрытия детали?
зы: у А есть SQLs.RefresSQL.Text:
 SELECT * FROM TABLE_A WHERE  TABLE_A.ID = :OLD_ID


 
кгшзх ©   (2015-06-26 16:10) [1]

рефреш работает,

но он не видит изменений внесенных другой транзакцией пока живет в той транзакции, с которой его открыли.

и еще тут нет никакого мастер-дитейла. это ты с прямым углом перепутал


 
TheEd   (2015-06-26 16:23) [2]


> тут нет никакого мастер-дитейла

есть. он тут <некоторое условие отбора> прячется если считать A подчиненным, а если мастером - то для таблицы TABLE_B это реализовано в компоненте B :)

а по поводу транзакций - они "быстрые", их 2 на чтение и запись. Т.о. как только внесли изменение, транзакция записи должна завершиться... Если после этого делаем рефреш - транзакция новая должна открыться и прочитать данные, или я что-то путаю?


 
кгшзх ©   (2015-06-26 16:25) [3]

снова читай [1]


 
sniknik ©   (2015-06-26 17:22) [4]

> или я что-то путаю?
да, это не "мастер-детайл", это простое объединение в запросе.


 
TheEd   (2015-06-29 09:47) [5]


> да, это не "мастер-детайл", это простое объединение в запросе.

да я про другое! Джоин в запросе - это одно. Просто есть другой запрос, связанный с данным, правильнее сказать - набор данных, и он - дочерний! Он меняет своё поле, от которого зависит то что прилепит к каждой строке join - а именно, сумму по некоторому полю у всех дочерних записей.
 Вот его то и надо обновить.
 Поскольку собаку на управлении транзакциями я ещё не съел, понимаю только в общих чертах, то конкретизирую детали проекта:
 1. работаю через FIBPlus. Есть 2 транзакции - на чтение и на запись:
taRead:
write
isc_tpb_nowait
read_committed
rec_version
TARollback
tpbReadCommitted
taWrite:
CurrentParametrs (пусто)
TARollback
tpbReadCommitted

обращения к данным - через TpFIBDataSet"ы
как обновить набор данных без переоткрытия, ели join уже не тот...?


 
кгшзх ©   (2015-06-29 11:32) [6]

1. тебе по-русски сказали "здесь нету мастердитейл"
2. переоткрытие датасета здесь вообще не при чем.
читающую транзакцию надо завершить, и начать новую.

датасет при этом умрет гарантированно.


 
TheEd   (2015-06-29 14:00) [7]

1. ладно, не спорю, хотя мы о разных вещах говорим, но в данном случае это не имеет отношения к делу. Поменять данные можно откуда угодно.
2.

читающую транзакцию надо завершить, и начать новую.
датасет при этом умрет гарантированно.

А зачем тогда Refresh, если датасет умрёт при открытии новой транзакции?


 
кгшзх ©   (2015-06-29 14:22) [8]

у жирафа нерв, который инеррвирует гортань имеет длину несколько метров.
расстояние от жирафьего мозга до гортани ~ 20 см.

почему и зачем?
потому что первые жирафы были рыбами.
а у рыб мозг, жабры и сердце очень близко.
поэтому топология прокладки нерва была такая, что нерв выходил из мозга, огибал артерию у сердца и втыкался в жабры.

когда рыбы вышли на сушу и стали жирафами ничего не поменялось.
нерв выходит из мозга, спускается по шее до сердца, огибает артерию, и поднимается обратно к гортани.

потому что так унаследовано.


 
TheEd   (2015-06-30 10:17) [9]

Спасибо за доходчивое объяснение :)
Тем не менее, жираф мог бы воспользоваться override для оптимизации своего нерва :)))
Я в принципе обошел ситуацию немного кривовато, но работает: когда в подчинённой таблице меняются данные, от которых изменятся данные в указанном запросе, сохраняю ID всех текущих записей, делаю по цепочку CloseOpen и восстанавливаю позиции. Выглядит без особых мерцаний, как если бы рефреш без переоткрытия сработал...


 
Барбара   (2015-07-01 15:26) [10]

>жираф мог бы воспользоваться override для оптимизации своего нерва

Принцип Лисков говорит, что так делать неправильно. Хотя, принцип Лисков вряд ли применим к биологии. Впрочем, и к программированию тоже.



Страницы: 1 вся ветка

Текущий архив: 2017.03.05;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.005 c
2-1435573097
Кузьмич
2015-06-29 13:18
2017.03.05
Кеш базы???


2-1434436592
pavelnk
2015-06-16 09:36
2017.03.05
Бордюр webbrowser


1-1346672822
Alexander_K
2012-09-03 15:47
2017.03.05
Печать формы на принтер


2-1435321941
TheEd
2015-06-26 15:32
2017.03.05
Не работает DataSet.Refresh, или можно ли обойтись без CloseOpen?


6-1283158606
Alik
2010-08-30 12:56
2017.03.05
Connected = False, а передача данных происходит !?