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

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

Вручную перебирать БД...


able ©   (2004-12-12 13:05:00) 

Делаю нестрогий поиск по бд, вручную перемалываю все поля.
Делаю так:

for i:=1 to datam.ADOTable1.Fields.Count do
    begin
      txt:=dbgrid1.DataSource.DataSet.Fields.Fields[i].AsString;
      Find := FindCompare.IndistinctMatching(3,  txt, EditFilter.Text);
      memo1.Lines.add(txt+' '+inttostr(find));
      end;
    end;

Find - ф-ция поиска..
Он ищет только по первой строке в DBGrid'e.
Вопрос:
-как искать по всей, определённой колонке?


sniknik   (2004-12-13 18:24:00) [1]

> Хотя подозреваю, что конструкция будет что-то типа
> where поле like %искомая подстрока%

не будет
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1102698760&n=1


YurikGL   (2004-12-13 16:19:00) [2]

able ©   (13.12.04 16:02) [11]

Ты словами опиши что тебе надо.
Хотя подозреваю, что конструкция будет что-то типа

where поле like %искомая подстрока%

А вообще, сходи на http://podgoretsky.com/ddp.htmlи почитай "Мартин Грубер. Понимание SQL"


able   (2004-12-13 16:02:00) [3]

YurikGL ©   (12.12.04 22:08) [10]
Так а как сгенерить запрос where, чтобы он подходил 100%?


YurikGL   (2004-12-12 22:08:00) [4]


> able ©   (12.12.04 13:05)  

А не проще в другой датасет сделать сначала селект с where в котором все записи гарантированно будут удовлетворять твоему условию, а потом пробежаться по этому датасету и пихнуть в мемо все его записи?


able   (2004-12-12 20:08:00) [5]

Zacho ©   (12.12.04 16:11) [8]
Спасибо большое, почитаю..


Zacho   (2004-12-12 16:11:00) [6]

able ©   (12.12.04 15:53) [7]
Про учебники/документацию, подскажешь что-нибудь хорошее?


Вообще по СУБД советую К.Дж.Дейт "Введение в системы баз данных"
По SQL - М.Грабер "SQL"
По Дельфи и БД, честно говоря, кроме "Дельфи N. Руководство разработчика БД" Шумаков, Фаронов (N - номер версии Дельфи, точно знаю, что есть для 3,4,5), ничего не вспоминается. Но эта тема неоднократно поднималась здесь, поищи в архивах или спроси в "Потрепаться" - наверняка много чего насоветуют.

Да, ещё естественно Delphi Help :) особенно всё, что касается TDataSet


able   (2004-12-12 15:53:00) [7]

Zacho ©   (12.12.04 14:33) [6]
Thanks, все сделал, что надо было.
Про учебники/документацию, подскажешь что-нибудь хорошее?


Zacho   (2004-12-12 14:33:00) [8]

able ©   (12.12.04 14:08) [5]
Но как искать по определённой колонке?


Вот без этого цикла: for i:=0 to datam.ADOTable1.Fields.Count-1 do

А вместо txt:=dbgrid1.DataSource.DataSet.Fields. Fields[i].AsString; просто брать данные из нужного поля. Например, txt:=dbgrid1.SelectedField.AsString; Или txt:=dbgrid1.DataSource.DataSet.FieldByName('MY_FIELD').AsString;

И вообще, не обижайся, но сильно советую почитать учебники/документацию, а то у тебя явное незнание основ работы с БД в Дельфи.


able   (2004-12-12 14:08:00) [9]

Zacho ©   (12.12.04 13:22) [1]
Сделал

for i:=0 to datam.ADOTable1.Fields.Count-1 do

Всё работает.
Но как искать по определённой колонке?


able   (2004-12-12 14:07:00) [10]

Zacho ©   (12.12.04 13:22) [1]
Вылетает exception: "List index out of bounds (6)" :(


able   (2004-12-12 13:23:00) [11]

Zacho ©   (12.12.04 13:22) [1]
Спасибо!
Сейчас пойду тестить...


Anatoly Podgoretsky   (2004-12-12 13:23:00) [12]

First/Next


Zacho   (2004-12-12 13:22:00) [13]

able ©   (12.12.04 13:05)

Забудь ты про грид, данные находятся не в гриде, а в датасете.

Соответственно, тебе нужно сделать ещё один цикл по датасету, например так:

datam.ADOTable1.First;
while not datam.ADOTable1.Eof do
begin
 for i:=1 to datam.ADOTable1.Fields.Count do
   begin
     txt:=dbgrid1.DataSource.DataSet.Fields.Fields[i].AsString;
     Find := FindCompare.IndistinctMatching(3,  txt, EditFilter.Text);
     memo1.Lines.add(txt+' '+inttostr(find));
     end;
   end;
 datam.ADOTable1.Next;
end;


Eщё посоветую перед выполнением этого сделать datam.ADOTable1.DisableControls, а после - datam.ADOTable1.EnableControls


Наверх

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