powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TFDQuery.Refresh()
18 сообщений из 18, страница 1 из 1
TFDQuery.Refresh()
    #39968816
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеется грид, к которому привязан TFDQuery со сложным запросом, который собирает данные из нескольких таблиц через LEFT JOIN в том числе.

Для того чтобы было проще описать проблему пусть будет запрос вида:
Код: pascal
1.
SELECT A.ID AID, A.DATA, B.ID BID, B.INFO FROM A LEFT JOIN B ON B.A_ID = A.ID


И есть следующая проблема: когда обновляются данные, то, при наличии нескольких записей с одинаковым AID, текущая запись в гриде (которую он берёт из TFDQuery, как я понимаю) перескакивает на первую по порядку запись с тем-же AID, что был до вызова Refresh().

Пытался это победить получая Bookmark в BeforeRefresh() и восстанавливая его в AfterRefresh() - помогло, но теперь грид позиционирует эту запись в центре, т.е. курсор всё равно визуально "прыгает" после обновления, разве что запись теперь не меняется.
Ещё это нормально работает, если запрос засунуть во вьюху, но хотелось бы всё-таки его иметь на клиенте.

Можно это как-нибудь заставить работать нормально, т.е. чтобы при обновлении данных выбранной оставалась та же запись что и была и курсор не менял позицию?
...
Рейтинг: 0 / 0
TFDQuery.Refresh()
    #39968819
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запихнуть данные в МемориТайбл. Отсылать запрос на обновление в базу и в случае положительного ответа изменять значение в МемориТайбл.
То есть не перечитывать весь датасет
...
Рейтинг: 0 / 0
TFDQuery.Refresh()
    #39968855
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr
Запихнуть данные в МемориТайбл. Отсылать запрос на обновление в базу и в случае положительного ответа изменять значение в МемориТайбл.
То есть не перечитывать весь датасет

А как узнать изменившиеся записи, если не перечитывать датасет?
...
Рейтинг: 0 / 0
TFDQuery.Refresh()
    #39968856
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpМожно это как-нибудь заставить работать нормально, т.е. чтобы при обновлении данных
выбранной оставалась та же запись что и была и курсор не менял позицию?

Да. Убрать обновление данных. Или убрать TDBGrid и обновлять данные аккуратно ручками так
как надо.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
TFDQuery.Refresh()
    #39968864
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Да. Убрать обновление данных. Или убрать TDBGrid и обновлять данные аккуратно ручками так
как надо.

Т.е. это не баг, а фича? Почему на простых запросах он позицию запоминает, а на сложных - нет?.. Хотя букмарки прекрасно работают.
...
Рейтинг: 0 / 0
TFDQuery.Refresh()
    #39968873
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpПочему на простых запросах он позицию запоминает, а на сложных - нет?..

Посмотреть ему в исподники - совсем mission impossible? (Хотя и по симптомам легко
догадаться, что внутри идёт locate по полю, считающемуся ключом.)

alekcvpХотя букмарки прекрасно работают.

Да, на первый взгляд может показаться, что они работают, но на самом деле это баг.
Букмарки не переживают закрытие датасета, так что позиционирование после переоткрытия
идёт, фактически, по мусору.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
TFDQuery.Refresh()
    #39968875
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Посмотреть ему в исподники - совсем mission impossible? (Хотя и по симптомам легко
догадаться, что внутри идёт locate по полю, считающемуся ключом.)

Ага, а ключём он почему-то считает не уникальное поле :(
...
Рейтинг: 0 / 0
TFDQuery.Refresh()
    #39968890
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpа ключём он почему-то считает не уникальное поле :(

Наверное потому, что уникального-то и нет?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
TFDQuery.Refresh()
    #39968906
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

alekcvpа ключём он почему-то считает не уникальное поле :(

Наверное потому, что уникального-то и нет?..

Ну он его вообще выбирает по каким-то флагам, получаемым с сервера, как я понял. Там в исходниках сложно копаться, потому что всё через интерфейсы, реализацию хрен найдёшь.
Была бы возможность задавать вручную... но я её не нашёл, точнее что-то нашёл, но оно доступно только при каких-то странных условиях.
...
Рейтинг: 0 / 0
TFDQuery.Refresh()
    #39969250
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно это как-нибудь заставить работать нормально, т.е. чтобы при обновлении данных выбранной оставалась та же запись что и была и курсор не менял позицию? И каков критерий этой той же ?

Все нормально. Ничего не надо переделывать. К чему эта ненужная эстетика ?
...
Рейтинг: 0 / 0
TFDQuery.Refresh()
    #39969260
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L_argo
Можно это как-нибудь заставить работать нормально, т.е. чтобы при обновлении данных выбранной оставалась та же запись что и была и курсор не менял позицию?
И каков критерий этой той же ?

Все нормально. Ничего не надо переделывать. К чему эта ненужная эстетика ?
Что нормально? Что пользователь нажимает F5, а потом вынужден снова искать нужную запись?
Критерий "той же" либо тот, что используется в закладках, либо по выбранными мной ключевым полям.
...
Рейтинг: 0 / 0
TFDQuery.Refresh()
    #39969406
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
Ага, а ключём он почему-то считает не уникальное поле :(
А RefreshSQL ему никуда нельзя прописать?
...
Рейтинг: 0 / 0
TFDQuery.Refresh()
    #39969429
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
alekcvp
Ага, а ключём он почему-то считает не уникальное поле :(
А RefreshSQL ему никуда нельзя прописать?

А смысл, если запрос тот же самый?
...
Рейтинг: 0 / 0
TFDQuery.Refresh()
    #39969443
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запрос совсем не тут же самый, но в данном случае это иррелевантно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
TFDQuery.Refresh()
    #39969455
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
А смысл, если запрос тот же самый?
Тебе нужно обновить весь датасет или только текущую запись?
...
Рейтинг: 0 / 0
TFDQuery.Refresh()
    #39969597
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Критерий "той же" либо тот, что используется в закладках, либо по выбранными мной ключевым полям. Букмарки действительны только в текущей выборке. Обновление это уже ДРУГАЯ ВЫБОРКА и совершенно другой результат (н-р сортировка поменяла порядок строк). Поэтому единственный критерий - уникальный ключ записи. Запомните его и станьте на него после обновления.
Для обновления текущей записи есть специальный механизм (и в АДО и в ФайрДАКе). Но он все равно потребует этот же ключ.
...
Рейтинг: 0 / 0
TFDQuery.Refresh()
    #39969624
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
alekcvp
А смысл, если запрос тот же самый?
Тебе нужно обновить весь датасет или только текущую запись?

Естественно весь.

L_argo
Поэтому единственный критерий - уникальный ключ записи. Запомните его и станьте на него после обновления.
Проблема в том что в этом случае курсор в гриде визуально "прыгает" в центр грида (вместе с записью). Когда это восстановление позиции происходит внутри FDQuery - он остаётся на месте.
...
Рейтинг: 0 / 0
TFDQuery.Refresh()
    #39969628
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
датасет вполне может в букмарках хранить ключи тем самым не инвалидируя их при своем обновлении
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TFDQuery.Refresh()
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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