Поиск:

Ответ в темуСоздание новой темы Создание опроса
> BookMark полсе .Close/.Open, как реализовать грамотно 
:(
    Опции темы
demoded
Дата 20.2.2009, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 7.12.2006

Репутация: нет
Всего: нет



грид привязан к ADODataSet, после добавления/удаления записи делаю
Close и Open

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

сейчас реализовано так:
при редактировании - нормально BookMark срабатывает
при добавлении - получаю ID добавленной записи и руками встаю на нее
проблемы начинаются при удалении... можно конечно запомнить ID следующей и предыдущей записи... но что то как-то некрасиво мне кажется так будет.
PM MAIL   Вверх
pseud
Дата 20.2.2009, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



Цитата(demoded @  20.2.2009,  14:46 Найти цитируемый пост)
как реализовать восстановление курсора на туже позицию?

важно курсор установить на нужную позицию в конечном визуализаторе (TDBGrid, TdxDBTreeList, etc.), а не в датасете.


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
demoded
Дата 22.2.2009, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 7.12.2006

Репутация: нет
Всего: нет



Цитата(pseud @ 20.2.2009,  17:20)
Цитата(demoded @  20.2.2009,  14:46 Найти цитируемый пост)
как реализовать восстановление курсора на туже позицию?

важно курсор установить на нужную позицию в конечном визуализаторе (TDBGrid, TdxDBTreeList, etc.), а не в датасете.

можно поподробнее... как запомнить положение курсора в гриде и как его потом восстановить
PM MAIL   Вверх
Hexel
Дата 23.2.2009, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 30.10.2007
Где: UA

Репутация: нет
Всего: нет



Еслия я правильно понял, ты хочешь восстановить курсор не на ту запись, которую удалил) Тогда на мой взгляд лучше Locate ничего не придумать, его ж не просто так придумали. Вот сохраняешь ID записи, потом его находишь снова

 smile если все же удаляешь именно эту запись, то после делете делаешь next и запоминаешь уже вновь полученный ID
PM MAIL   Вверх
Kbl4AH
Дата 24.2.2009, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 6
Всего: 15



Код

var
  N, C: Integer;
begin
  N := ADODataSet1.RecNo;
  C := ADODataSet1.RecordCount;
  ... // добавление/удаление записи, Close и Open 
  if ADODataSet1.RecordCount > C then // вставка
    ADODataSet1.RecNo := N + 1;
  if ADODataSet1.RecordCount = C then // редактирование
    ADODataSet1.RecNo := N;
  if ADODataSet1.RecordCount < C then // удаление
    if N = 1 then
      ADODataSet1.RecNo := N          // 1-й записи
    else
      ADODataSet1.RecNo := N - 1;     // не 1-й записи
end;


Это сообщение отредактировал(а) Kbl4AH - 24.2.2009, 22:14
PM MAIL ICQ   Вверх
Deniz
Дата 25.2.2009, 06:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Цитата(pseud @  20.2.2009,  20:20 Найти цитируемый пост)
важно курсор установить на нужную позицию в конечном визуализаторе (TDBGrid, TdxDBTreeList, etc.), а не в датасете. 
это шутка такая?  smile 

Kbl4AH, весьма спорный код.
В многопользовательской работе даже добавив запись RecordCount после Close/Open может вернуть меньшее кол-во.

demoded, а чем так не нравится locate?
При добавлении/удалении DataSet перемещается на нужную запись.
После удаления вопрос, что хочет увидеть пользователь? Первую, последнюю, следующую после удаленной, предыдущую?
Спроси у заказчика что ему надо, обычно нужно следующую после удаленной.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Kbl4AH
Дата 25.2.2009, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 6
Всего: 15



Цитата(Deniz @  25.2.2009,  06:55 Найти цитируемый пост)
Kbl4AH, весьма спорный код.В многопользовательской работе даже добавив запись RecordCount после Close/Open может вернуть меньшее кол-во.

Бесспорно... Для многопользовательской работы не подойдет...
Как, по-моему, и не подойдет Locate для такой работы... Никогда с ним не сталкивался, сейчас глянул... Как после открытия датасета искать запись, которой в результате многопользования может уже не быть?
Deniz, приведи пример с использованием Locate, а то я более-менее однозначный алгоритм не могу сочинить (а мне иногда требуется, как и demoded, четкий алгоритм  для таких же целей).

Это сообщение отредактировал(а) Kbl4AH - 25.2.2009, 09:09
PM MAIL ICQ   Вверх
demoded
Дата 25.2.2009, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 7.12.2006

Репутация: нет
Всего: нет



Цитата(Deniz @ 25.2.2009,  06:55)
demoded, а чем так не нравится locate?
При добавлении/удалении DataSet перемещается на нужную запись.
После удаления вопрос, что хочет увидеть пользователь? Первую, последнюю, следующую после удаленной, предыдущую?
Спроси у заказчика что ему надо, обычно нужно следующую после удаленной.

locate всем устраивает и использется, но при удалении (допустим надо перейти на следующую запись) приходится руками отслеживать ситуацию если удалили последнюю запись в ДатаСете и надо перейти не на следующую а на предыдущую.
хотелось завернуть это дело раз и навсегда в какой-нибудь собственный BookMark, но что-то опыта маловато. оставил пока так:
Код

  ADODataSet1.DisableControls;
  ID:=ADODataSet1['BookNMKID'];
  ADODataSet1.Next;
  nextID:=ADODataSet1['BookNMKID'];
  if ID=nextID then begin ADODataSet1.Prior; nextID:=ADODataSet1['BookNMKID']; end;
  Update; // тут какраз .Close/.Open
  if not ADODataSet1.Locate('BookNMKID',ID,[loCaseInsensitive]) then
    if not ADODataSet1.Locate('BookNMKID',nextID,[loCaseInsensitive]) then ADODataSet1.First;
  ADODataSet1.EnableControls;


Это сообщение отредактировал(а) demoded - 25.2.2009, 13:35
PM MAIL   Вверх
Deniz
Дата 25.2.2009, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Цитата(Kbl4AH @  25.2.2009,  12:05 Найти цитируемый пост)
Deniz, приведи пример с использованием Locate, а то я более-менее однозначный алгоритм не могу сочинить
все достаточно тривиально, но на один select больше.
Сделаем некоторые допущения:
1. Алгоритм работает для удаления (для insert/update не вижу смысла)
2. После удаления, должна быть активна следующая за удаленной запись.
3. Если удаляемая запись была последней, то активной будет последняя.
4. Есть набор полей, по которым сортируется набор данных
5. Добавление к ним ID сделает набор уникальным. (для примера возмем сортировку по уникальному табельному номеру, тогда добавление ID не потребуется)
Идея:
1. Сохраняем в параметры набор полей из допущения 4
2. Удаляем запись.
3. Close Open
4. В дополнительном запросе делаем что-то типа 
Код
select min(ID) from table where tabnum > :tabnum_parameter

5. 
Код
if not dataset.locate (id, 'ID', []) then dataset.last

Примерно такой алгоритм будет работать в многопользовательской среде, и в четверге тоже  smile 
Можно дорабатывать.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Akella
Дата 25.2.2009, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



DatasSet1.lookup(....) работает быстрее за счёт того, что курсор не бегает по набору данных
PM MAIL   Вверх
pseud
Дата 25.2.2009, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



demoded, 
Если речь идет о TDBGrid, то ИМХО стоит привязываться за DataSet.RecNo
что-то типа
Код

i := DataSet.RecNo;
// удаление
// обновление
if not DataSet.IsEmpty then
begin
  if i > DataSet.RecordCount then
    i := DataSet.RecordCount;
  DataSet.RecNo := i;
end;

  
Если в качестве визуализатора использовать нечто типа "DBTreeList", то фокусировка должна завязываться за свойства трилиста.
FocusedNode... и т.д. 
Если актуально - дораспишу.



--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Kbl4AH
Дата 25.2.2009, 17:01 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 6
Всего: 15



Не понял, зачем тут доп. запрос...
А если после открытия датасет в нем ни одной записи не останется - ошибка?
ЗЫ. Пост для Deniz.

Это сообщение отредактировал(а) Kbl4AH - 25.2.2009, 19:32
PM MAIL ICQ   Вверх
pseud
Дата 25.2.2009, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



Цитата(Kbl4AH @  25.2.2009,  17:01 Найти цитируемый пост)
А если после открытия датасет в нем ни одной записи не останется - ошибка?

для этого и написана проверка
Код

if not DataSet.IsEmpty then



--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Kbl4AH
Дата 25.2.2009, 19:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 6
Всего: 15



Цитата(pseud @  25.2.2009,  18:14 Найти цитируемый пост)
для этого и написана проверка

pseud, я длительное время не обновлял форум, поэтому, адресуя сообщения Deniz, не заметил сообщения Akella и твое...
Хотя и из контекста видно, что мой пост являлся ответом не на твой...
Так что не сердись smile 
PM MAIL ICQ   Вверх
Deniz
Дата 26.2.2009, 06:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Цитата(Akella @  25.2.2009,  19:36 Найти цитируемый пост)
DatasSet1.lookup(....) работает быстрее за счёт того, что курсор не бегает по набору данных 
все равно перемещаться придется.

Цитата(Kbl4AH @  25.2.2009,  20:01 Найти цитируемый пост)
Не понял, зачем тут доп. запрос...
доп. запрос нужен для определения сл. записи после удаленной.

Цитата(Kbl4AH @  25.2.2009,  20:01 Найти цитируемый пост)
А если после открытия датасет в нем ни одной записи не останется - ошибка?
я, конечно, могу за тебя весь код написать, со всеми проверками и т.д., но стОит ли?

Цитата(pseud @  25.2.2009,  19:53 Найти цитируемый пост)
Если речь идет о TDBGrid, то ИМХО стоит привязываться за DataSet.RecNo
все таки привязываться к номеру записи не лучший вариант.

Это сообщение отредактировал(а) Deniz - 26.2.2009, 06:42


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0566 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.