Страница 1 из 3
Как ПРАВИЛЬНО ловить курсор в табл. после передер. сервера?
Добавлено: 28 июн 2006, 10:31
Марина
Помогите пожалуйста!
Удаляю или сохраняю запись в табличке, данные обновляются с сервера, курсор становится на 1-ю запись. Есть способы как это сделать. Вопрос в том, как ПРАВИЛЬНО это сделать, что лучше!
Добавлено: 28 июн 2006, 10:44
kdv
Вопрос в том, как ПРАВИЛЬНО это сделать, что лучше!
что сделать правильно, и куда?
запись удаляется, DataSet переоткрывается, то есть запрос выполняется ЕЩЕ РАЗ. Соответственно, какая запись была "первая", фиг знает. Если запрос вытаскивает первичный ключ записи, то еще как-то можно сохранить "позицию курсора". Но вообще сначала надо бы выяснить чем эта "табличка" выбирается - IBQuery, IBDataSet или еще чем.
Добавлено: 28 июн 2006, 11:47
WildSery
Можно попробовать попрактиковаться в телепатии

Если вопрос был "как остаться на месте", то в запросе обязательно должен быть какой-нибудь уникальный ID, перед удалением его запоминать, а после удаления, но до включения данных позиционироваться на него.
Код: Выделить всё
with Query1 do begin
DisableControls;
id:=FieldByName('id').AsInteger;
Delete;
// в этом месте делаем переоткрытие или refresh как нам надо.
Locate('id', id, []);
EnableControls;
end;
Добавлено: 28 июн 2006, 12:31
Ivan_Pisarevsky
WildSery писал(а):Можно попробовать попрактиковаться в телепатии

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

Ну думаю девушка поняла что ты хотел сказать, только неточность вышеописаную устранить надо.
Добавлено: 28 июн 2006, 12:41
CyberMax
Код по восстановлению текущей записи обычно делается так:
1. В BeforeClose набора данных вписывается код по сохранению ID текущей записи.
2. В AfterOpen набора данных вписывается код по переходу на запись с сохраненным ID.
В этом случае не надо заботиться о восстановлении позиции после вставки/удаления.
P.S. В FIBPlus есть метод FullRefresh. Он самостоятельно восстанавливает позицию текущей записи, если в запросе считывается поле первичного ключа.
Добавлено: 28 июн 2006, 12:44
kdv
В FIBPlus есть метод FullRefresh.
также у IBDataSet как и у FIBDataSet есть RefreshSQL, который помогает не перечитывать датасет при обновлении записи.
Добавлено: 28 июн 2006, 12:55
CyberMax
Вопрос у Марины такой размывчатый...
Марина писал(а):Удаляю или сохраняю запись в табличке, данные обновляются с сервера, курсор становится на 1-ю запись. Есть способы как это сделать.
Собственно на это и отвечал...
Когда Марина сообщит, какие компоненты использует, тут уже можно совет и про Refresh дать...
Добавлено: 28 июн 2006, 12:56
WildSery
Ivan_Pisarevsky писал(а):только неточность вышеописаную устранить надо.
Ага, точно. Это я ещё не проснулся.
Теперь, выпив кофе, вижу, что девушке нужно полистать умную книгу сперва. Или хотя бы сказать, что за "табличка".
Кстати, FullRefresh вовсе не по первичному ключу работает, он вызывает ReopenLocate(''), которая в случае неуказания списка полей для locate составляет список из
всех полей датасета (кроме блобов, массивов, вычисляемых, ...).
Добавлено: 04 июл 2006, 16:00
Марина
Всем привет!
Проблема такая. Я использую компоненты IBQuery, IBUpdateSQL, DataSource. Узменения в таблице произошли, транзакция подтвердилась, сервер передернули с клиента. У меня пользователь сидит в табличке или во вьюшке скажем где-то в середине - редактирует запись, т.е. впереди 100 записей, он редактирует 101-ю и сзади тоже 100 записей (всего в таблице 200 записей). Пока он ее редактировал, другой пользователь удалил его запись и еще 70 записей вперед. Т.е. теперь курсор надо поставить на 30-ю запись! Вопрос в том как ПРАВИЛЬНО это сделать! Помогите пожалуйста! )))
Добавлено: 04 июл 2006, 16:17
Dimitry Sibiryakov
После "передергивания" курсор стоит на первой записи. Двигаете его вперед пока не достигнете нужной. Критерий "нужности" определите сами. Это - лучший (точнее, единственный) метод.
Добавлено: 04 июл 2006, 16:30
kdv
Марина! я сейчас озверею, и или удалю один из дубликатов топиков, на Ваш выбор, или удалю оба. Пока подожду.
Добавлено: 04 июл 2006, 17:51
CyberMax
Да я уже предложил ей удалить тот топик... Только она, ничего не сказав, тут же запостилась здесь.
Добавлено: 04 июл 2006, 19:58
kdv
Только она, ничего не сказав, тут же запостилась здесь.
надо было просто молча кокнуть новый тред, пока там одно сообщение было

Добавлено: 05 июл 2006, 01:40
CyberMax
Такой вариант рассматривался. Пожалел девушку

. Но на будущее буду иметь ввиду.
P.S. В общем, закрыл тот дубль. Кому надо, выскажется здесь.
Добавлено: 05 июл 2006, 12:08
Марина
Я приношу свои извинения системным администраторам, второе одинаковое сообщение забабахала по чистой случайности. Теперь буду знать! Все когда то в первый раз!

Добавлено: 05 июл 2006, 12:34
Марина
А где можно достать FIBPlus? Его где-то можно бесплатно качнуть или это коммерческий проект?
Добавлено: 05 июл 2006, 12:39
kdv
коммерческий. 750 руб для частного использования, и 1740 для использования внутри фирмы.
www.devrace.com.
Однако, лечить головную боль топором, а именно fullrefresh, не советую. Хотя, конечно, в смысле облегчения "позиционирования" FIBPlus лучше чем IBX. Но я рекомендую прислушаться к моему замечанию по поводу наборов записей, где существует только порядковый номер записи при получении с сервера. Одна и та же запись в разные моменты времени может быть и 5-ой, и 10-ой, и т.д.
Добавлено: 05 июл 2006, 14:43
Ivan_Pisarevsky
Марина писал(а):Всем привет!
Привет!
Марина писал(а):Проблема такая. Я использую компоненты IBQuery, IBUpdateSQL, DataSource.
Почему это проблема? Я тоже пользую их, в том числе.
Марина писал(а):Узменения в таблице произошли, транзакция подтвердилась,
хотрошо, но ЭТО зачем:
Марина писал(а):сервер передернули с клиента.
Это как вообще понимать?
Дальше я вообще теряюсь...
Марина писал(а): У меня пользователь сидит в табличке или во вьюшке скажем где-то в середине - редактирует запись, т.е. впереди 100 записей, он редактирует 101-ю и сзади тоже 100 записей (всего в таблице 200 записей). Пока он ее редактировал, другой пользователь удалил его запись и еще 70 записей вперед.
Ладно, вполне житейская ситуация, согласен.
Марина писал(а):Т.е. теперь курсор надо поставить на 30-ю запись!
ЗАЧЕМ??? юзеру 30-я запись???
Марина писал(а):Вопрос в том как ПРАВИЛЬНО это сделать! Помогите пожалуйста! )))
Предлагаю подумать и помыслить логически, а я вот не вижу решительно никакого смысла искать запись за номером 30.

Добавлено: 05 июл 2006, 15:08
Rambos
А если так:
Код: Выделить всё
var p:Pointer;
begin
p:=IBQuery1.GetBookmark;
IBQuery1.Open;
IBQuery1.GotoBookmark(p);
end;
Тока в случае удаления не прокатит
Добавлено: 05 июл 2006, 15:21
CyberMax
Ну-ну. Получаем закладку, потом открываем набор...