Форум: "Начинающим";
Текущий архив: 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