Как ПРАВИЛЬНО ловить курсор в табл. после передер. сервера?

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Марина
Сообщения: 32
Зарегистрирован: 14 дек 2005, 13:08

Как ПРАВИЛЬНО ловить курсор в табл. после передер. сервера?

Сообщение Марина » 28 июн 2006, 10:31

Помогите пожалуйста!
Удаляю или сохраняю запись в табличке, данные обновляются с сервера, курсор становится на 1-ю запись. Есть способы как это сделать. Вопрос в том, как ПРАВИЛЬНО это сделать, что лучше!

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 28 июн 2006, 10:44

Вопрос в том, как ПРАВИЛЬНО это сделать, что лучше!
что сделать правильно, и куда?
запись удаляется, DataSet переоткрывается, то есть запрос выполняется ЕЩЕ РАЗ. Соответственно, какая запись была "первая", фиг знает. Если запрос вытаскивает первичный ключ записи, то еще как-то можно сохранить "позицию курсора". Но вообще сначала надо бы выяснить чем эта "табличка" выбирается - IBQuery, IBDataSet или еще чем.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 28 июн 2006, 11:47

Можно попробовать попрактиковаться в телепатии :)
Если вопрос был "как остаться на месте", то в запросе обязательно должен быть какой-нибудь уникальный ID, перед удалением его запоминать, а после удаления, но до включения данных позиционироваться на него.

Код: Выделить всё

with Query1 do begin
  DisableControls;
  id:=FieldByName('id').AsInteger;
  Delete; 
  // в этом месте делаем переоткрытие или refresh как нам надо.
  Locate('id', id, []);
  EnableControls;
end;

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 28 июн 2006, 12:31

WildSery писал(а):Можно попробовать попрактиковаться в телепатии :)
Если вопрос был "как остаться на месте", то в запросе обязательно должен быть какой-нибудь уникальный ID, перед удалением его запоминать, а после удаления, но до включения данных позиционироваться на него.

Код: Выделить всё

with Query1 do begin
  DisableControls;
  id:=FieldByName('id').AsInteger;
  Delete; 
  // в этом месте делаем переоткрытие или refresh как нам надо.
  Locate('id', id, []);
  EnableControls;
end;
Ты сам-то понял что написал? Сохраняем ид записи, потом ИМЕННО ЕЕ удаляем, потом пытаемся найти ее же локейтом... :) Ну думаю девушка поняла что ты хотел сказать, только неточность вышеописаную устранить надо.

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 28 июн 2006, 12:41

Код по восстановлению текущей записи обычно делается так:
1. В BeforeClose набора данных вписывается код по сохранению ID текущей записи.
2. В AfterOpen набора данных вписывается код по переходу на запись с сохраненным ID.
В этом случае не надо заботиться о восстановлении позиции после вставки/удаления.
P.S. В FIBPlus есть метод FullRefresh. Он самостоятельно восстанавливает позицию текущей записи, если в запросе считывается поле первичного ключа.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 28 июн 2006, 12:44

В FIBPlus есть метод FullRefresh.
также у IBDataSet как и у FIBDataSet есть RefreshSQL, который помогает не перечитывать датасет при обновлении записи.

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 28 июн 2006, 12:55

Вопрос у Марины такой размывчатый...
Марина писал(а):Удаляю или сохраняю запись в табличке, данные обновляются с сервера, курсор становится на 1-ю запись. Есть способы как это сделать.
Собственно на это и отвечал...
Когда Марина сообщит, какие компоненты использует, тут уже можно совет и про Refresh дать...

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 28 июн 2006, 12:56

Ivan_Pisarevsky писал(а):только неточность вышеописаную устранить надо.
Ага, точно. Это я ещё не проснулся.
Теперь, выпив кофе, вижу, что девушке нужно полистать умную книгу сперва. Или хотя бы сказать, что за "табличка".

Кстати, FullRefresh вовсе не по первичному ключу работает, он вызывает ReopenLocate(''), которая в случае неуказания списка полей для locate составляет список из всех полей датасета (кроме блобов, массивов, вычисляемых, ...).

Марина
Сообщения: 32
Зарегистрирован: 14 дек 2005, 13:08

Сообщение Марина » 04 июл 2006, 16:00

Всем привет!
Проблема такая. Я использую компоненты IBQuery, IBUpdateSQL, DataSource. Узменения в таблице произошли, транзакция подтвердилась, сервер передернули с клиента. У меня пользователь сидит в табличке или во вьюшке скажем где-то в середине - редактирует запись, т.е. впереди 100 записей, он редактирует 101-ю и сзади тоже 100 записей (всего в таблице 200 записей). Пока он ее редактировал, другой пользователь удалил его запись и еще 70 записей вперед. Т.е. теперь курсор надо поставить на 30-ю запись! Вопрос в том как ПРАВИЛЬНО это сделать! Помогите пожалуйста! )))

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 04 июл 2006, 16:17

После "передергивания" курсор стоит на первой записи. Двигаете его вперед пока не достигнете нужной. Критерий "нужности" определите сами. Это - лучший (точнее, единственный) метод.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 04 июл 2006, 16:30

Марина! я сейчас озверею, и или удалю один из дубликатов топиков, на Ваш выбор, или удалю оба. Пока подожду.

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 04 июл 2006, 17:51

Да я уже предложил ей удалить тот топик... Только она, ничего не сказав, тут же запостилась здесь.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 04 июл 2006, 19:58

Только она, ничего не сказав, тут же запостилась здесь.
надо было просто молча кокнуть новый тред, пока там одно сообщение было :)

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 05 июл 2006, 01:40

Такой вариант рассматривался. Пожалел девушку :). Но на будущее буду иметь ввиду.
P.S. В общем, закрыл тот дубль. Кому надо, выскажется здесь.

Марина
Сообщения: 32
Зарегистрирован: 14 дек 2005, 13:08

Сообщение Марина » 05 июл 2006, 12:08

Я приношу свои извинения системным администраторам, второе одинаковое сообщение забабахала по чистой случайности. Теперь буду знать! Все когда то в первый раз! :D

Марина
Сообщения: 32
Зарегистрирован: 14 дек 2005, 13:08

Сообщение Марина » 05 июл 2006, 12:34

А где можно достать FIBPlus? Его где-то можно бесплатно качнуть или это коммерческий проект?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 05 июл 2006, 12:39

коммерческий. 750 руб для частного использования, и 1740 для использования внутри фирмы. www.devrace.com.
Однако, лечить головную боль топором, а именно fullrefresh, не советую. Хотя, конечно, в смысле облегчения "позиционирования" FIBPlus лучше чем IBX. Но я рекомендую прислушаться к моему замечанию по поводу наборов записей, где существует только порядковый номер записи при получении с сервера. Одна и та же запись в разные моменты времени может быть и 5-ой, и 10-ой, и т.д.

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 05 июл 2006, 14:43

Марина писал(а):Всем привет!
Привет!
Марина писал(а):Проблема такая. Я использую компоненты IBQuery, IBUpdateSQL, DataSource.
Почему это проблема? Я тоже пользую их, в том числе.
Марина писал(а):Узменения в таблице произошли, транзакция подтвердилась,
хотрошо, но ЭТО зачем:
Марина писал(а):сервер передернули с клиента.

Это как вообще понимать?

Дальше я вообще теряюсь...
Марина писал(а): У меня пользователь сидит в табличке или во вьюшке скажем где-то в середине - редактирует запись, т.е. впереди 100 записей, он редактирует 101-ю и сзади тоже 100 записей (всего в таблице 200 записей). Пока он ее редактировал, другой пользователь удалил его запись и еще 70 записей вперед.
Ладно, вполне житейская ситуация, согласен.
Марина писал(а):Т.е. теперь курсор надо поставить на 30-ю запись!
ЗАЧЕМ??? юзеру 30-я запись???
Марина писал(а):Вопрос в том как ПРАВИЛЬНО это сделать! Помогите пожалуйста! )))
Предлагаю подумать и помыслить логически, а я вот не вижу решительно никакого смысла искать запись за номером 30. :)

Rambos
Сообщения: 11
Зарегистрирован: 17 июн 2006, 13:02

Сообщение Rambos » 05 июл 2006, 15:08

А если так:

Код: Выделить всё

  var p:Pointer;
begin
  p:=IBQuery1.GetBookmark;
  IBQuery1.Open;
  IBQuery1.GotoBookmark(p);
end;
Тока в случае удаления не прокатит

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 05 июл 2006, 15:21

Ну-ну. Получаем закладку, потом открываем набор...

Ответить