Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.04.2013, 17:37   #1
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию Как правильно обновлять dataset?

Инструменты : Delphi XE2, FibPlus, Ehlib, соответственно БД - *.fdb.
На форме: pFIBStoredProc1, pFIBDataSet1, DataSource1, DBGridEh1.
Читаю с com-порта данные в отдельном потоке и заношу в БД.
после каждого Insert закрываю и открываю dataset, т.е.
Код:
pFIBStoredProc1.StoredProcName:='insert';
pFIBStoredProc1.ParamByName() - тра-ля-ля:
***
pFIBStoredProc1.ExecProc;
pFIBDataSet1.Close;
pFIBDataSet1.Open;
pFIBDataSet1.First;
pFIBDataSet1.Last;
При таком раскладе получается перемаргивание сетки DBGridEh1 и возникает некое неудобство. Подскажите как правильно "инсертить" и обновляться.
Спасибо!
tarakan1983 вне форума Ответить с цитированием
Старый 28.04.2013, 17:44   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Может у твоего грида есть некий метод типа Refresh или Reopen?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.04.2013, 17:44   #3
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

У датасетов есть методы DisableControls и EnableControls.
Перед перечитыванием данных с сервера отключить прорисовку:
pFIBDataSet1.DisableControls, после включить: pFIBDataSet1.EnableControls.
В этом контексте First и Last лишние вызовы.

Последний раз редактировалось Прик; 28.04.2013 в 17:46.
Прик вне форума Ответить с цитированием
Старый 28.04.2013, 17:52   #4
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

Цитата:
В этом контексте First и Last лишние вызовы.
А если так не делать, то ползунок не знает где начало, а где конец. При большом объеме записей возникают проблемы при перетаскивании ползунка в начало или в конец.
tarakan1983 вне форума Ответить с цитированием
Старый 28.04.2013, 18:03   #5
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Цитата:
А если так не делать, то ползунок не знает где начало, а где конец.
Утверждение неверное. После открытия выборки (Open) "ползунок" всегда устанавливается на первую строку выборки.
И, признаться, не совсем понятно при чем здесь объем возвращаемых записей. От количества возвращаемых записей установка курсора (маркера, "ползунка") после открытия выборки не зависит никак.

Последний раз редактировалось Прик; 28.04.2013 в 18:06.
Прик вне форума Ответить с цитированием
Старый 28.04.2013, 18:07   #6
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

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

ПРИК, спасибо с DisableControls все работает отлично, вот как теперь сделать, чтобы при каждой новой записи не скакал в начало датасета, если выделена конкретная?

Последний раз редактировалось tarakan1983; 28.04.2013 в 18:14.
tarakan1983 вне форума Ответить с цитированием
Старый 28.04.2013, 18:17   #7
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Здесь вы правы. Ползунок гриды "не знает" конца выборки пока не будет достигнут конец выборки. Но если количество строк в выборке будет большим, то ваш демарш (Last, First) вызовет полный как говорится фетч всех записей, а нередко это приводит к большим задержкам и как вы говорите, к перемаргиванию гриды.
И тут возникает вопрос: "вам ехать ли шашечки?" Зачем заморачиваться на ерунду в виде "правильно" выставленного ползунка скролбара, если это приводит к заметному неудобству в работе пользователя с вашим приложением.
Прик вне форума Ответить с цитированием
Старый 28.04.2013, 18:21   #8
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

Цитата:
Зачем заморачиваться на ерунду в виде "правильно" выставленного ползунка скролбара
Согласен, я думаю, что этот вопрос можно отнести к разряду "быть или быть" и оставить на усмотрение каждого.
Можете подскажете как теперь сделать, чтобы при каждой новой записи курсор не скакал в начало датасета, если выделена конкретная?
tarakan1983 вне форума Ответить с цитированием
Старый 28.04.2013, 18:27   #9
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Запоминать местоположение курсора и возвращать его на место после перечитывания данных методом Locate.
Но, вообще-то, при добавлении записей так делать не принято (хотя, конечно, кто запретит).
В этом случае я, например, выясняю у сервера идентификатор новой строки и по нему позиционирую на вставленную запись.

Последний раз редактировалось Прик; 28.04.2013 в 18:30.
Прик вне форума Ответить с цитированием
Старый 28.04.2013, 18:31   #10
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

это если использовать DBGridEh1CellClick(Column: TColumnEh);
а у меня грид Readonly и при использовании колесика мышки курсор перемещается. И получается пользователь кликнул на ID = 145, потом колесиком пролистал до ID = 174
и при обновлении датасета курсор сбежит на id = 145. Как тут быть?
tarakan1983 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обновить DataSet? Vit@L БД в Delphi 23 25.10.2012 18:33
Как обновлять значения в ячейках автоматически? и упростить код? budmit Microsoft Office Excel 4 20.06.2011 13:20
Строку из одного DataSet в другой DataSet Abbath1349 Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 0 22.05.2011 19:26
Как рабоать с классом DataSet Droid Общие вопросы .NET 2 18.01.2011 09:24
Из DataSet работающего по циклу в DataSet maroder22 БД в Delphi 1 05.09.2010 23:22