Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как прервать цикл While? [D7, 95/98]


Страницы:   1 2 3

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;


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо