![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как прервать цикл While? [D7, 95/98]
dera © (2006-02-01 14:36:00)В цикле while not Table1.Eof do ищется запись в довольно большой таблице. Таблица выведена в гриде. Как можна сделать:
1) по нажатию на ESC прервать поиск и выйти из цикла
2) на время поиска "отключить" таблицу от грида (возможно так будет быстрей искать)
dera (2006-02-01 18:23:00) [1]>Asail (01.02.06 18:00) [50]
спасибо!
Asail (2006-02-01 18:00:00) [2]Примерно так:
Положим, что поле с ключом называется PK_Field. Query должен вернуть таблицу из записей ,соответствующих условию. Каждая запись состоит из одного поля PK_Field.
Теперь, проходим циклом по Query:
...
Query.Open;
while not Query.Eof
do begin
Table.SetKey;
Table.FieldByName('PK_Field').AsVariant:=
Query.FieldByName('PK_Field').AsVariant;
Table.GotoKey;
//здесь мы оказались на следующей искомой записи в основной таблице
if MessageDLG('Запись найдена! Продолжить поиск?',
mtConfirmation,[mbYes,mbNo],0)=mrNo then break;
Query.Next;
end;
понятно, что Table.IndexFieldNames:='PK_Field'
иначе SetKey, GotoKey работать не будут.
Ega23 (2006-02-01 17:36:00) [3]
> ...нет. Подскажите.
Попробуй покопай в сторону TBookmark
dera (2006-02-01 17:30:00) [4]>1. Так-что можно реализовать поиск через SQL с возвратом списка значений ключей записей, соответствующих запросу.
Это я знаю ка сделать.А вот это...
>А потом, с помощью GotoKey прыгать по таблице только на соответствуюшие записи.
...нет. Подскажите.
dera (2006-02-01 17:27:00) [5]>А борланд десктоп может работать с таблицами Btrieve? Сомневаюсь...
правильно сомневаетесь. Не работает.
А вот SQL Explorer отлично видит и выполняет sql запросы для таблиц Btrieve. Но! Есть одно но. Если человек (обычный пользователь) не знает sql, он не сможет ничего найти. Вот я и хочу упростить ему работу - выбрал имя поля, ввел искомое значение, нажал батон - и есть результат.
Asail (2006-02-01 17:25:00) [6]
> сгенерить sql запрос и выполнить
А я про что?!! см. 40
evvcom (2006-02-01 17:21:00) [7]сгенерить sql запрос и выполнить. Имхо, лучшей производительности (скорости) не добьешься.
Asail (2006-02-01 17:19:00) [8]
> а чем не нравится для этих целей стандартные борландовсие
> "шаровары" типа десктопа
А борланд десктоп может работать с таблицами Btrieve? Сомневаюсь...
Хотя, конечно, если пошарить по сети хорошенько, можно найти неплохой viewer.
dera (2006-02-01 17:18:00) [9]>>Либо у тебя получится уродище еще то. Самому же и стыдно будет.
согласен... маловато знаю по сравнению с вами. Но пытаюсь...
Спасибо. Вы и так много помогли.
msguns (2006-02-01 17:13:00) [10]Кстати, а чем не нравится для этих целей стандартные борландовсие "шаровары" типа десктопа. Там все делается, только, думаю, бОльше, быстрее и лучше, чем в твоей программе.
Зачем изобретать велосипед ?
msguns (2006-02-01 17:10:00) [11]>dera (01.02.06 16:58) [38]
>В таблице 1.27 млн. строк. Поиск выполняется оч-ч-чень долго!
С тебя причитается на ремонт стула. Сломался ибо. Когда я упал, прочитав это.
>>Единственное, можно поставить сразу AsString, вместо AsVariant.
>а если поле не стринг попадется для поиска.
Давай все ж-таки сделаем так: ты нормально исследуешьхотя бы один, но базовый класс TDataSet вместе с TFields/TField, а только потом придешь сюда с вопросами. Ибо читать тебе тут целый курс лекций никто не будет.
А без этого (а ведь это только основы !) нечего и думать о "программе просмотра/редактирования записей"
Либо у тебя получится уродище еще то. Самому же и стыдно будет.
Asail (2006-02-01 17:07:00) [12]В таблице, я так понимаю, должен быть PrimaryKey.
1. Так-что можно реализовать поиск через SQL с возвратом списка значений ключей записей, соответствующих запросу. А потом, с помощью GotoKey прыгать по таблице только на соответствуюшие записи.
2. По причине того, что названия полей каждый раз разные, в SQL-запросе можно использовать параметры.
dera (2006-02-01 17:03:00) [13]размер таблицы 109Мб
dera (2006-02-01 16:58:00) [14]>>И как долго этот поиск выполняется?
В таблице 1.27 млн. строк. Поиск выполняется оч-ч-чень долго!
>>Единственное, можно поставить сразу AsString, вместо AsVariant.
а если поле не стринг попадется для поиска.
Это программа просмотра/редактирования записей. Юзер выбирает название поля, вводит искомое значение и ищет. Когда нашел - возможно, редактирует. Но в этом примере поиск только по одному полю, а я хочу сделать поиск макс. по 5 полям. Но сейчас это неважно. Главное - как ускорить энтот поиск по одному полю.
Asail (2006-02-01 16:57:00) [15]А какой размер таблицы?
Может и нет смысла мучаться? При DisableControls такой цикл на не слишком больших таблицах выполняется почти мгновенно, пользователь и кнопку Esc на клаве найти не успеет. Если теоретический размер таблицы не превышает нескольких десятков мегабайт, то можно и необрабатывать сообщения в цикле. Только, надо учесть, что вычисляемые поля и lookup-поля в таблице тоже могут сильно тормозить процесс, поэтому их лучше избегать в больших таблицах.
msguns (2006-02-01 16:53:00) [16]Не нравится мне вот это
FieldByName(ComboBox2.Text). AsVariant
Замени его на AsString
Другого криминала в теле цикла не узрел. Так в чем проблема-то ?
ZeroDivide (2006-02-01 16:50:00) [17]Но мне как раз надо редактировать найденную запись.
Мм... я думал ты прямо в цикле собираешься редактировать что-то... тогда Update прокатил бы...
И как долго этот поиск выполняется? Вроде как тормозить особо нечему. Единственное, можно поставить сразу AsString, вместо AsVariant. И AnsiUpperCase, но это уже не для ускорения, а для улучшения поиска.
dera (2006-02-01 16:39:00) [18]>>Где DisableControls ?
в приведенном примере его нет, т.к. он стоит до и после цикла
msguns (2006-02-01 16:36:00) [19]Где DisableControls ?
dera (2006-02-01 16:27:00) [20]>>Напиши алгоритм, который у тебя в теле цикла.
while not table1.eof do begin
Application.ProcessMessages;
if pos(Edit1.Text,Table1.FieldByName(ComboBox2.Text).AsVariant)>0 then begin
r:=MessageDLG('Запись найдена! Продолжить поиск?', mtConfirmation,[mbYes,mbNo],0);
if r=mrNo then break;
end;
Table1.Next;
end;