powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
14 сообщений из 39, страница 2 из 2
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
    #40043531
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
istrebitel>Просто сделать DataSet.Open внутри другого потока, наверно, не получится, т.к. датасет

В отдельной нити придется не отдельный запрос формировать, а отдельный коннект, а запросы в контексте этого коннекта формировать.
И - с чего вы решили, что это поможет? Отрисовка все равно выполняется в "основной" нити, пока запрос в отдельной нити не завершится - отрисовка не начнется, плюс надо результаты запроса в дитеил-датасет вернуть, . И запрос не сформируется, пока из мастер-датасета не будут переданные значения мастер-ключа.
В общем, непонятно, как вы мультитрейдингом ускорите отображение в дитеил-гриде. Разве что в кэш в фоне потихоньку данные набирать, чтобы потом ими пользоваться, не обращаясь к базе.
...
Рейтинг: 0 / 0
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
    #40043554
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
Подчиненный датасет должен обновляться мгновенно, ведь он ограничен значением мастер-ключа. Что у вас там тормозит.

2 с половиной секунды, причем зависит от количества записей. 5 записей - 1,5 секунды, 10 - 2,5 и т.д.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
SELECT cc.*, 
(@rownum := @rownum + 1) AS rownum, 
contract_number, contract_date, cown.contragent_full_name AS cargo_owner_name, 
cargo_nomenclature_code, cargo_nomenclature_name, cargo_mark_name, cargo_mark_description, container_type_name, container_weight,
cargo_size, cargo_fraction_name, cc.conosament_number, vessel_act_number, general_act_number, 
sender.contragent_full_name AS sender_name, receiver.contragent_full_name AS receiver_name, consignment_number,
IF(cc.pauzka = 'Y', 'ДА', 'НЕТ') AS pauzka_rus,
IF(cc.cooperated = 'Y', 'ДА', 'НЕТ') AS cooperated_rus,
(CASE `c`.`cargo_status` 
WHEN 'export' THEN CONCAT(`cn`.`cargo_nomenclature_name`,' (Э)') 
WHEN 'import' THEN CONCAT(`cn`.`cargo_nomenclature_name`,' (И)') 
WHEN 'domestic' THEN CONCAT(`cn`.`cargo_nomenclature_name`,' (К)') 
ELSE `cn`.`cargo_nomenclature_name` end) AS `cargo_nom_rus`, 
(IF (((contract_date = '1899-12-30') OR (contract_date IS NULL)),
'00.00.0000', DATE_FORMAT(contract_date, '%d.%m.%Y'))) AS contract_date_rus, 
IF((MAX(COALESCE(tex.from_cargo_card_id, tex.to_cargo_card_id)) IS NOT NULL) AND (MIN(COALESCE(tex.transshipment_finish_time, '1899-12-30')) > '1899-12-30'), 'Y', 'N') all_tr_finished 
FROM cargo_card cc 
INNER JOIN vessel_cargo_card vcc ON vcc.id = cc.id 
JOIN (select @rownum := 0) AS r
INNER JOIN contract_cargo_sub ccs ON ccs.id = cc.contract_cargo_sub_id
INNER JOIN contract_cargo_consignment ccc ON ccc.id = ccs.contract_cargo_consignment_id 
INNER JOIN consignment cons ON cons.id = ccc.consignment_id 
INNER JOIN contract_cargo_head cch ON cch.id = ccc.contract_cargo_head_id
INNER JOIN contract c ON c.id = cch.contract_id 
INNER JOIN cargo_nomenclature cn ON cn.id = cch.cargo_id 
LEFT JOIN container_type ct ON ct.id = cch.container_type_id 
LEFT JOIN container_weight_type cwt ON cwt.id = ccs.container_weight_type_id 
LEFT JOIN cargo_fraction cf ON cf.id = ccs.cargo_fraction_id 
LEFT JOIN cargo_mark cm ON cm.id = ccs.cargo_mark_id 
LEFT JOIN cargo_sort cs ON cs.id = ccs.cargo_sort_id 
LEFT JOIN contragent cown ON cown.id = c.contragent_id 
LEFT JOIN contragent sender ON sender.id = cc.sender_id 
LEFT JOIN contragent receiver ON receiver.id = cc.receiver_id 
LEFT JOIN transshipment tex ON cc.id IN (tex.from_cargo_card_id, tex.to_cargo_card_id) 
WHERE vcc.plan_vessel_id = :plan_vessel_id 
GROUP BY cc.id
...
Рейтинг: 0 / 0
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
    #40043555
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
istrebitel>Просто сделать DataSet.Open внутри другого потока, наверно, не получится, т.к. датасет

В отдельной нити придется не отдельный запрос формировать, а отдельный коннект, а запросы в контексте этого коннекта формировать.
И - с чего вы решили, что это поможет? Отрисовка все равно выполняется в "основной" нити, пока запрос в отдельной нити не завершится - отрисовка не начнется, плюс надо результаты запроса в дитеил-датасет вернуть, . И запрос не сформируется, пока из мастер-датасета не будут переданные значения мастер-ключа.
В общем, непонятно, как вы мультитрейдингом ускорите отображение в дитеил-гриде. Разве что в кэш в фоне потихоньку данные набирать, чтобы потом ими пользоваться, не обращаясь к базе.

Не ускорить отображение, а убрать зависание на скроллинге, когда сделал паузу, начался дочерний запрос, и снова нажал скроллинг.
...
Рейтинг: 0 / 0
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
    #40043569
istrebitel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ъъъъъ
В отдельной нити придется не отдельный запрос формировать, а отдельный коннект, а запросы в контексте этого коннекта формировать.

Здесь есть нюанс, в зависимости от использованного драйвера и способа заполнения основного грида.
Некоторые драйверы, в определённых режимах CursorKind, не дадут обращаться к БД пока полностью не дофетчится (например MsSQL при CursorKind = ckAutomatic и не установленном NativeClient будет сыпать ошибками raised exception class EMSSQLNativeException with message '[FireDAC][Phys][ODBC][Microsoft][ODBC SQL Server Driver]Подключение занято до получения результатов для другого hstmt'. при CursorKind = ckDynamic работать будет, но медленнее).
FireDAC вроде как выстраивает в очередь запросы, так что подлагивания будут при скроле вниз, при фетчинге очередной порции. Можно сделать чтобы это было пореже установив RowsetSize побольше, а если RowsetSize будет больше, чем количество строк, то фетч будет только один, при открытии датасета.

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

Поможет избавиться от
svnvlad
Если момент скроллинга попадает на начало перерисовки нижней сетки, то происходит зависание до конца перерисовки. Раньше на каждую запись зависало, теперь только в этом случае.

Допустим запрос из БД занимает 1 секунду, а отрисовка 50 миллисекунд. Когда сработал таймер запрос, выполняющийся в главном потоке, парализует скролинг. Если запрос выполнять в отдельном потоке, то скролинг будет парализоваться только на время отрисовки грида, в момент прицепления его к DataSource. А это скорее всего меньший интервал. Но надо тестить.
ъъъъъ
В общем, непонятно, как вы мультитрейдингом ускорите отображение в дитеил-гриде.

Метод не ускорит отображение в детайле, метод уменьшит тормоза при скролинге в мастере.
С MemTable даже без отцепления грида работает.
...
Рейтинг: 0 / 0
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
    #40043609
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad
OnDataChange


Может, назначать событие после открытия формы, а OnShow/onActivate?
...
Рейтинг: 0 / 0
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
    #40043696
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad
Пересадил на FDQuery.AfterScroll - теперь при открытии формы он 50 раз вызывается, на каждую из 50 записей в сетке.
Что за бред? Может вы нам забыли сказать, что после открытия формы вы сами пробегаетесь по всем записям?
...
Рейтинг: 0 / 0
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
    #40043722
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
svnvlad
Пересадил на FDQuery.AfterScroll - теперь при открытии формы он 50 раз вызывается, на каждую из 50 записей в сетке.
Что за бред? Может вы нам забыли сказать, что после открытия формы вы сами пробегаетесь по всем записям?

Нет, не пробегаюсь. Протестировал уже на 2 формах с сетками. При создании формы AfterScroll вызывается столько раз, сколько записей в сетке.
Если только RecordCount не вызывает такое поведение.
Код: pascal
1.
EndOfQuery := (ADQueryPlans.RecordCount = 0) or (ADQueryPlans.RecordCount < ThisLimit);
...
Рейтинг: 0 / 0
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
    #40043806
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad
Если только RecordCount не вызывает такое поведение.
Чему равно ADQueryPlans.FetchOptions.RecordCountMode?
...
Рейтинг: 0 / 0
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
    #40043858
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
svnvlad
Если только RecordCount не вызывает такое поведение.
Чему равно ADQueryPlans.FetchOptions.RecordCountMode?

cmVisible
...
Рейтинг: 0 / 0
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
    #40043865
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad
Нет, не пробегаюсь. Протестировал уже на 2 формах с сетками. При создании формы AfterScroll вызывается столько раз, сколько записей в сетке.

А "сетка", небось, девэкспрессовская.
...
Рейтинг: 0 / 0
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
    #40044234
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
svnvlad
Нет, не пробегаюсь. Протестировал уже на 2 формах с сетками. При создании формы AfterScroll вызывается столько раз, сколько записей в сетке.

А "сетка", небось, девэкспрессовская.

Да.
...
Рейтинг: 0 / 0
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
    #40044245
ma1tus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad
softwarer
пропущено...

А "сетка", небось, девэкспрессовская.

Да.

4084037
...
Рейтинг: 0 / 0
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
    #40044279
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если сетка DevExpress, то я вешаю на событие DataSource.OnUpdate и TableView.OnSelectionChanged. Вроде проблем не было, но мне больше нравиться сетка EhLib а там DataSource.onDataChange
...
Рейтинг: 0 / 0
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
    #40046050
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb
мне больше нравиться сетка EhLib а там DataSource.onDataChange

Мне тоже раньше больше нравилась, более простая, понятная, но сейчас вижу недостатки, например: при обновлении сетки и Locate на прежнюю запись происходит скроллинг записи в самый верх сетки. В DevExpress запись остается посередине экрана, где и была.
...
Рейтинг: 0 / 0
14 сообщений из 39, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]