![]() |
|
![]() ![]() ![]() |
|
Serggggg |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 136 Регистрация: 12.12.2003 Где: Донецк, Украина Репутация: нет Всего: нет |
Всем привет!
Прошу совета. Проблема не очень сущетвенная, но желательно разобраться. Как мы все знаем, у компонента TTable есть такой чудный метод, как FindKey, который после Refresh'а позволяет вернуться к нужной записи. В моем случае используется TQuery. Вышеупомянутого метода для него нет. Запрос "обновляется" посредством операций Active:=False; Active:=True; Курсор (естественно) скачет сразу на первую запись. А как мне перевести его на ту позицию (скажем, Grid'a), с которой перед обновлением запроса производилось, например, удаление записи? --------------------
C уважением, Serggggg. |
|||
|
||||
x77 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1255 Регистрация: 25.3.2002 Репутация: 1 Всего: 22 |
используя Locate по ключевому полю. в принципе, можно по любому, но Locate использует при поиске индексы, поэтому желательно, чтобы поле было как минимум индексированным, а лучше - ключевым.
-------------------- Я никогда не сопротивлялся искушению, поскольку узнал: что мне не нравится, то меня не искушает. © Джордж Бернард Шоу (Ирландия) |
|||
|
||||
Kesh |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2488 Регистрация: 31.7.2002 Где: Германия, Saarbrü cken Репутация: 3 Всего: 54 |
Имхо, для квери это не самый лучший способ...
Представь, что у тебя клиент, подсоединенный к табличке в базе, в которой записей эдак около миллиона, да еще плюсом есть какое-нить поле типа BLOB/CLOB/BFile. В Oracle при реализации такой квери ты получишь где-то N первых записей, остальные будут подгружаться по мере необходимости. А теперь представь, что ты своим FindKey обращаешься к одной из последних записей в квере... Придется пролистывать всю кверю, плюс тянуть LOB-поля, и все это по сети, а если в BLOB'e еще и картинка, еще и BMP'шная... Представь себе загрузку сети... А если у тебя при этом еще и несколько клиентов... P.S. Все это конечно же ИМХО... -------------------- ![]() |
|||
|
||||
Maverick |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1307 Регистрация: 22.9.2003 Где: Odessa, Ukraine Репутация: нет Всего: 10 |
А не лучше перед удалением запомнить номер строки, на которой стоишь... а после обновления - направиться к этому номеру... Разве порядок-нумерация строк изменится? По-моему просто сдвинется на одну запись... Значит, попадешь достаточно близко... Или сам запрос в Query меняется?
|
|||
|
||||
x77 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1255 Регистрация: 25.3.2002 Репутация: 1 Всего: 22 |
kesh, при описанной тобой ситуации, нужная запись получается отдельным запросом. ну а для всех прочих случаев... есть же, в конце концов, стандартные решения, зачем сразу в крайности?
-------------------- Я никогда не сопротивлялся искушению, поскольку узнал: что мне не нравится, то меня не искушает. © Джордж Бернард Шоу (Ирландия) |
|||
|
||||
x77 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1255 Регистрация: 25.3.2002 Репутация: 1 Всего: 22 |
Maverick, о том и речь. делаем DisableControls, запись удаляется, курсор сдвигается на строку, запоминается значения ключевого поля (полей), выключается/включается квери, курсор позиционируется на место методом Locate, делаем EnableControls.
-------------------- Я никогда не сопротивлялся искушению, поскольку узнал: что мне не нравится, то меня не искушает. © Джордж Бернард Шоу (Ирландия) |
|||
|
||||
Maverick |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1307 Регистрация: 22.9.2003 Где: Odessa, Ukraine Репутация: нет Всего: 10 |
Вы меня не поняли.... x77.... Зачем Locate.... Запомнить надо RecNo... Потом вернуться к нему же.... или RecNo+1....
Зачем искать?.... Заранее запомнить... |
|||
|
||||
x77 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1255 Регистрация: 25.3.2002 Репутация: 1 Всего: 22 |
Maverick, насколько я знаю, RecNo имеет смысл только для локальных баз (dBase, Paradox, etc.) для Interbase или Oracle RecNo равен -1 или вообще какой-нибудь чепухе.
-------------------- Я никогда не сопротивлялся искушению, поскольку узнал: что мне не нравится, то меня не искушает. © Джордж Бернард Шоу (Ирландия) |
|||
|
||||
Serggggg |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 136 Регистрация: 12.12.2003 Где: Донецк, Украина Репутация: нет Всего: нет |
Значение ключевого поля - это замечательно. Я и сам сторонник поски по ключу. Но в инспекторе объектов IndexName или IndexFieldName задаётся только для таблиц, а не для запросов. Для компонента TQuery такого свойства там не описано.
x77, база действительно на Oracle. --------------------
C уважением, Serggggg. |
|||
|
||||
Kesh |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2488 Регистрация: 31.7.2002 Где: Германия, Saarbrü cken Репутация: 3 Всего: 54 |
И все же для квери запоминать какой-то номер мне кажется не есть гуд...
Ибо для реляционых баз данных, в силу определения, нет понятия первая, предыдущая, последующая, последняя запись... Важно только условие выборки... -------------------- ![]() |
|||
|
||||
Maverick |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1307 Регистрация: 22.9.2003 Где: Odessa, Ukraine Репутация: нет Всего: 10 |
x77.... Ты прав.... Пробую под Informix - =-1.... Буду знать....
|
|||
|
||||
Петрович |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 6 Всего: 55 |
Для реляционных БД понятия "номер строки" - несуществует. Даже в локальных БД (dBase, Paradox, и п.р.) в которых действителен RecNo, такой метод не годится! Поскольку во первых, помимо тебя, в таблице могут копошиться и другие юзеры которые могут вставлять/удалять записи. И во вторых, возможны запросы манипулирующие неопределенным числом записей, например DELETE FROM TABLE Vasya WHERE Price > 100 Правильным способом будет использовать Locate. Если есть primary key, то использовать его, если нет, то можно использовать все поля. Например можно описать такой объект:
А потом его использховать, например так:
-------------------- Все знать невозможно, но хочется |
||||||
|
|||||||
Serggggg |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 136 Регистрация: 12.12.2003 Где: Донецк, Украина Репутация: нет Всего: нет |
Благодарю за совет. Стоит попробовать!
--------------------
C уважением, Serggggg. |
|||
|
||||
Maverick |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1307 Регистрация: 22.9.2003 Где: Odessa, Ukraine Репутация: нет Всего: 10 |
[QUOTE]Для реляционных БД понятия "номер строки" - несуществует. Даже в локальных БД (dBase, Paradox, и п.р.) в которых действителен RecNo, такой метод не годится! Поскольку во первых, помимо тебя, в таблице могут копошиться и другие юзеры которые могут вставлять/удалять записи. И во вторых, возможны запросы манипулирующие неопределенным числом записей, например DELETE FROM TABLE Vasya WHERE Price > 100[/QUOT]
Последнее время были задания для DBF для работы одного пользователя.... в стиле с навигатором ДОБАВИТЬ/УДАЛИТЬ.... Вот и дошел до ручки.... |
|||
|
||||
cvi |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 10.9.2003 Где: Украина, Киев Репутация: нет Всего: нет |
Вижу моего решения еще нет.
Пишу так var Save_Place : TBookMark; Save_Place := Query.(Что то типа)SaveBookMark;(точно не помню как называется) Query.Actice := False; Query.Active := True; Query.GotoBookMark(Save_Place); Query.FreeBookMark(Save_Place); точно работает по Interbase, paradox Спасибо за внимание. ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Базы данных и репортинг" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Обязательно указание: 1. Базы данных (Paradox, Oracle и т.п.) 2. Способа доступа (ADO, BDE и т.д.)
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |