Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.05.06;
Скачать: [xml.tar.bz2];

Вниз

Как организовать поиск по части слова по всем колонкам?   Найти похожие ветки 

 
Roman_S ©   (2007-04-14 16:57) [0]

Помогите модернизировать программу:
Как организовать поиск по части слова по всем колонкам?

procedure TForm1.FormCreate(Sender: TObject);
var i: integer;
begin
Button7.Enabled:=false;
AssignFile(NoteFile,GetProgramPath+"data\"+"adsbaz.dat"); // связываем переменную с файлом
Reset(NoteFile); // открытие файла
_Pos:=0;
 if not Eof(NoteFile) then // если в файле есть данные
  begin
   Read(NoteFile,NoteData); // чтение данных
   _Pos:=FilePos(NoteFile)-1; // определение располож. указателя
   ShowRecord; // показать данные
  end;
end;

….
if ComboBox1.Text="Фамилия"   //выборка по столбцу «Фамилия»
then
 begin
  zap:=0;
  for pPos:=0 to FileSize(NoteFile)-1 do
   begin
    Seek(NoteFile,pPos);
    Read(NoteFile,NoteData);  // чтение данных
    if NoteData.meneg="" then goto Thenext3;
    s:=NoteData.meneg;
    if s=ComboBox2.Text then  //во втором ComboBox конкретная фамилия
     begin
      ch:=ch+1;
      StringGrid1.Cells[1,ch]:=IntToStr(ch)+".";
      StringGrid1.Cells[2,ch]:=NoteData.org;
      StringGrid1.Cells[3,ch]:=NoteData.adr;
      StringGrid1.Cells[4,ch]:=NoteData.tel;
      StringGrid1.Cells[5,ch]:=NoteData.kontl;
      StringGrid1.Cells[6,ch]:=NoteData.email;
      StringGrid1.Cells[7,ch]:=NoteData.reg;
      StringGrid1.Cells[8,ch]:=NoteData.vidd;
      StringGrid1.Cells[9,ch]:=NoteData.osnprod;
      StringGrid1.Cells[10,ch]:=NoteData.meneg;
      StringGrid1.RowCount:=StringGrid1.RowCount+1;
      zap:=zap+1;
      Form1.Caption:="Выборка... ("+IntToStr(zap)+" записей из "+IntToStr(FileSize(NoteFile))+")";
      Application.ProcessMessages;
     end;
    Thenext3:
   end;
  Form1.Caption:="Выборка... ("+IntToStr(zap)+" записей из "+IntToStr(FileSize(NoteFile))+")";
  StringGrid1.RowCount:=StringGrid1.RowCount-1;
 end;
…..


 
Roman_S ©   (2007-04-14 17:37) [1]

s:=NoteData.meneg;
   if s=ComboBox2.Text then  //во втором ComboBox конкретная фамилия
    begin

- тут, конечно можно воспользоваться Pos -ом

Но как организовать перебор:
NoteData.org; NoteData.adr; NoteData.tel; NoteData.kontl; ...???


 
Roman_S ©   (2007-04-14 18:19) [2]

type
TNote=record
 org: string[200];
 adr: string[255];
 tel: string[150];
 kontl: string[150];
 email: string[100];
 reg: string[200];
 vidd: string[200];
 osnprod: string[200];
 meneg: string[150];
end;

var
NoteFile: file of TNote;
NoteData: TNote;


Вот как for ... to ... перебрать все столбцы?


 
Romm ©   (2007-04-14 18:25) [3]

Ты сам с собой разговариваешь? :)


 
Roman_S ©   (2007-04-15 08:11) [4]

Да, вот, блин, никто помочь не хочет! - Приходится в ожидании самому с собой!
-----------     (-_-)      --------------
Пробовал сам что-нибудь придумать, но почему-то поиск по части слова не срабатывает. Где ошибка?

if (ComboBox1.Text="Все") and (ComboBox2.Text<>"")
then
 begin
  StrList:=TStringList.Create;
  zap:=0;
  for pPos:=0 to FileSize(NoteFile)-1 do
   begin
    Seek(NoteFile,pPos);
    Read(NoteFile,NoteData); // чтение данных
    if NoteData.org<>"" then StrList.Add(NoteData.org);
    if NoteData.adr<>"" then StrList.Add(NoteData.adr);
    if NoteData.tel<>"" then StrList.Add(NoteData.tel);
    if NoteData.kontl<>"" then StrList.Add(NoteData.kontl);
    if NoteData.email<>"" then StrList.Add(NoteData.email);
    if NoteData.reg<>"" then StrList.Add(NoteData.reg);
    if NoteData.vidd<>"" then StrList.Add(NoteData.vidd);
    if NoteData.osnprod<>"" then StrList.Add(NoteData.osnprod);
    if NoteData.meneg<>"" then StrList.Add(NoteData.meneg);
    for t := 0 to StrList.Count-1 do begin
    if pos(ComboBox2.Text, StrList[t])<>0  then
     begin
      ch := ch+1;
      StringGrid1.Cells[1,ch]:=IntToStr(pPos+1);
      StringGrid1.Cells[2,ch]:=NoteData.org;
      StringGrid1.Cells[3,ch]:=NoteData.adr;
      StringGrid1.Cells[4,ch]:=NoteData.tel;
      StringGrid1.Cells[5,ch]:=NoteData.kontl;
      StringGrid1.Cells[6,ch]:=NoteData.email;
      StringGrid1.Cells[7,ch]:=NoteData.reg;
      StringGrid1.Cells[8,ch]:=NoteData.vidd;
      StringGrid1.Cells[9,ch]:=NoteData.osnprod;
      StringGrid1.Cells[10,ch]:=NoteData.meneg;
      StringGrid1.RowCount:=StringGrid1.RowCount+1;
      zap:=zap+1;
      Form1.Caption:="Выборка... ("+IntToStr(zap)+" записей из "+IntToStr(FileSize(NoteFile))+")";
      Application.ProcessMessages;
      break;
     end;
    end;
    //StrList.Free;
   end;
  Form1.Caption:="Выборка... ("+IntToStr(zap)+" записей из "+IntToStr(FileSize(NoteFile))+")";
  if ch>0 then StringGrid1.RowCount:=StringGrid1.RowCount-1;
 end;


 
Romm ©   (2007-04-15 11:00) [5]

нашел пару статей:

Нижеследующая функция Locate может оказаться весьма полезной (конечно, она не может предложить вам глобальную функциональность типа чуствительность к регистрам, использование индексов, закладок, но все же...).

function Locate(const oTable: TTable; const oField:
 TField; const sValue: string): Boolean;
var
 bmPos: TBookMark;
 bFound: Boolean;
begin
 Locate := FALSE;
 bFound := FALSE;
 if not oTable.Active then
   Exit;
 if oTable.FieldDefs.IndexOf(oField.FieldName) < 0 then
   Exit;
 bmPos := oTable.GetBookMark;
 with oTable do
 begin
   DisableControls;
   First;
   while not EOF do
     if oField.AsString = sValue then
     begin
       Locate := TRUE;
       bFound := TRUE;
       Break;
     end;
 end;
end
;


***

Поиск фраз и записей переменной длины
--------------------------------------------------------------------------------

Для текста переменной длины вы можете использовать DBmemo. Большинство людей это делают сканированием "на лету" (когда оператор постит запрос), но для реального ускорения процесса можно попробовать способ пре-сканирования, который делают "большие мальчики" (операторы больших баз данных):

при внесении в базу данных новой записи она сканируется на предмет определения ключевых слов (это может быть как предопределенный список ключевых слов, так и всех слов, не встречающиеся в стоп-листе [пример: "the", "of", "and"])

ключевые слова вносятся в список ключевых слов со ссылкой на номер записи, например, "hang",46 или "PC",22.

когда пользователь делает запрос, мы извлекаем все записи, где встречается каждое из ключевых слов, например, "hang" может возвратить номера записей 11, 46 и 22, тогда как "PC" - записи с номерами 91, 22 и 15.

затем мы объединяем числа из всех списков c помощью какого-либо логического оператора, например, результатом приведенного выше примера может быть запись под номером 22 (в случае логического оператора AND), или записи 11, 15, 22, 46 и 91 (в случае оператора OR). Затем извлекайте и выводите эти записи.

для синонимов определите таблицу синонимов (например, "hang","kaput"), и также производите поиск синонимов, добавляя их к тому же списку как и оригинальное слово.

слова, имеющие общие окончания (например, "hang" и "hanged"), можно также сделать синонимами, или, как это делает большинство систем, производить анализ окончаний слов, вычисляя корень по их перекрытию (например, слову "hang" соответствует любое слово, чьи первые 4 буквы равны "hang").

Конечно, есть множестно технических деталей, которые необходимо учесть, например, организация списков, их эффективное управление и объединение. Оптимизация этой характеристики может вам дать очень быстрое время поиска (примером удачный реализаций могут служить двигатели поиска Nexus, Lycos или WebCrawler, обрабатывающие сотни тысяч записей в течение секунды).

***
Поиск по нескольким полям

keyfields:="name;name_1;n_dom;n_kw";
keyvalues:=VarArrayOf([combobox1.Text, combobox2.Text, edit2.Text, edit3.text]);
if dmod.qrfiz.Locate(keyfields,keyvalues,[])=false then
 dmod.qrfiz.Locate("id",id1,[]);



читай наздоровье :) может чего полезного найдешь



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.05.06;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.06 c
15-1176019813
easy
2007-04-08 12:10
2007.05.06
Янис Прасол (aka Gero)


15-1175974828
Kostafey
2007-04-07 23:40
2007.05.06
Прозрачность иконок и SpeedButton


15-1176133542
TUser
2007-04-09 19:45
2007.05.06
Microsoft назвала слабое место Windows Vista


3-1171611402
zorik
2007-02-16 10:36
2007.05.06
Firebird 2. Declare procedure


8-1155671586
Denisich
2006-08-15 23:53
2007.05.06
DSPack





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский