![]() |
|
|
![]()
|
|
| offline |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 474 Регистрация: 7.2.2005 Репутация: 7 Всего: 7 |
Мастера, подскажите, как сделать лучше.
У меня есть база Access и я подключаюсь к ней через ADO. В Access я создал запрос показать все из таблицы Tab1 и в Delphi подключился к этому запросу как к таблице. Данные выводятся в DBGrid. У меня такая задача, по нажатию клавиши произвести групповую замену в Tab1. Соответственно я это делаю через запрос на обновление. После этого запроса, приходится перечитывать данные, т.к. DBGrid отображает старую информацию. Что я делаю. 1.Отключаю визуальный контроль от ADOTable1 2.запоминаю значение ключевого поля на котором находится указатель 3.вызываю ADOTable1.Requery 4.перемещаюсь на запись на которой был курсор через ADOTable1.Locate 5.Включаю визуальный контроль на ADOTable1 В связи с этим у меня вопрос. Что лучше использовать Locate или ставить до Requery закладку, а после Requery перемещаться на не? А вообще можно каким либо другим способом перечитать данные не используя Requery и при этом остаться на текущей записи? Метод ADOTable1.Refresh не помогает. И еще вопрос. Подскажите, что лучше: создавать вычисляемые поля или обрабатывать то же самое в ADOTable1.AfterScroll при условии, что данные ни где не используются, а просто выводятся на форму? Заранее благодарю |
|||
|
||||
| DimW |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1330 Регистрация: 24.2.2005 Где: Орёл Репутация: 5 Всего: 44 |
Я делаю так:
ни когда не пересчитывал значения на этом событии ADOTable1.AfterScroll, видимо значение пересчитывается на активную запись.....(ели я правильно понял....) Используй вычислимые поля, по моему удобная способ: Двойной щелчек на TTable или TQuery, New Field---> Name='NameSum' ---> DataType='Float' (Field Type выстави calculated). Событие OnCalcFields:
|
||||
|
|||||
| offline |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 474 Регистрация: 7.2.2005 Репутация: 7 Всего: 7 |
По вычесляемым полям я знаю, как они создаются и где обрабатываются.
Да, действительно, значение пересчитывается на активной записи. Просто я хочу узнать, как быстрее это пересчитывать, на ADOTable1.AfterScroll или как вычисляемое поле, что быстрее работает. Насколько я понимаю., вычисляемое поле будет применятся ко всем полям, а это займет время, а мне нужно только текущее. Или я ошибаюсь? А по поводу кода
Я что то не понял, я поизвожу групповую замену запросом на обновление, а не одно значение текущей записи. |
|||
|
||||
| Петрович |
|
||||||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 6 Всего: 55 |
Обновление делаешь правильно.
Раз у тебя есть ключевое поле однозначно идентифицирующее тек.запись то естественно использование Locate теоретически более правильно. Однако, надо учитывать что если тек.запись была удалена, то Locate после Requery ее не найдет, и спозиционирует тебя не туда куда ты ожидаешь. С закладками, тоже есть проблемы. Если подойти формально, то сохраненная закладка после Requery становится недействительной. Однако, из опыта скажу что закладка в большинстве реализаций это просто номер записи. Соответственно, если сохранить ее до Requery а потом попытаться "прыгнуть" на нее, то опять-же результат будет не всегда ожидаемым. Например была таблица:
Тогда, текущей станет последняя запись в наборе:
Казалось бы, такое поведение более логично чем при использовании Locate. Но, тогда надо обрабатывать ситуацию, когда номер сохраненной записи станет больше чем общее число записей после Requery. Например до Requery тек.позиция была на последней записи набора:
Потом Запись3 удалили, и сделали:
В этом случае, при выполнении Bookmark := s возникнет исключение, которое надо будет самому обработать. Лично я предпочитаю последний вариант - через закладки, с обработкой исключения при Bookmark := s. -------------------- Все знать невозможно, но хочется |
||||||||||||
|
|||||||||||||
| DimW |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1330 Регистрация: 24.2.2005 Где: Орёл Репутация: 5 Всего: 44 |
это предложил вариант как оставить на текущей записи.... |
|||
|
||||
| bursa |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 98 Регистрация: 25.2.2005 Где: Липецк Репутация: 1 Всего: 1 |
Вычисление будет производиться в видимых СТРОКАХ (OnCalcFields). Если хочешь, чтобы вычислялось не во всех ПОЛЯХ, используй проверку
где Field-изменяемое поле или другой спсоб (если нужно вычислять и хранить) использовать метод OnChange самого Поля
А что быстрей и правильней зависит от задачи. |
||||||
|
|||||||
| offline |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 474 Регистрация: 7.2.2005 Репутация: 7 Всего: 7 |
Я произвожу запрос на обнавление и следовательно записи у меня не удаляются. Поэтому наверное особой разницы нет, Locate или Bookmark. Просто с Locate меньше кода писать |
|||
|
||||
![]()
|
| Правила форума "Delphi: Базы данных и репортинг" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Обязательно указание: 1. Базы данных (Paradox, Oracle и т.п.) 2. Способа доступа (ADO, BDE и т.д.)
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |