|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
ADOQuery вывод в TDBGrid
Как сделать так, чтобы в Grid выводился весь результат запроса, а не только по последнему слову?
Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ADODB, DB, Grids, DBGrids; type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; Edit1: TEdit; Edit2: TEdit; ADOConnection1: TADOConnection; ADOTable1: TADOTable; ADOQuery1: TADOQuery; DataSource1: TDataSource; DBGrid1: TDBGrid; DBGrid2: TDBGrid; DataSource2: TDataSource; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} function StringToWords(T: string; List: Tstrings = nil): integer; var i, z: integer; s: string; c: Char; procedure Check; begin if (s > '') and (List <> nil) then begin List.Add(S); z := z + 1; end; s := ''; end; begin i := 0; z := 0; s := ''; if t > '' then begin while i <= Length(t) + 1 do begin c := t[i]; if (c in ['a'..'z']) or (c in ['A'..'Z']) or (c in ['а'..'я']) or (c in ['А'..'Я']) and (c <> ' ') then s := s + c else Check; i := i + 1; end; end; result := z; end; procedure TForm1.Button1Click(Sender: TObject); var Source, Dest, k1,k2,k3: Tstrings; i,k,j: integer; begin Source := TstringList.Create; Dest := TstringList.Create; // список слов фразы k1 := TstringList.Create; // все окончания k2 := TstringList.Create; // список окончаний k3 := TstringList.Create; k1.Add('ее|ие|ые|ое|ими|ыми|ей|ий|ый|ой|ем|им|ым|ом|его|ого|ему|ому|их|ых|ую|юю|ая|яя|ою|ею'); Source.Add('приветливый малыш с умом чудесным'); //Source.Add(Edit1.Text); Edit1.Text:= 'приветливый малыш с умом чудесным'; for i := 0 to Source.Count - 1 do begin StringToWords(Source[i], Dest); StringToWords(k1[i],k2); Application.ProcessMessages; end; for i := 0 to k1.Count - 1 do begin StringToWords(k1[i],k2); Application.ProcessMessages; end; { for i := 0 to Dest.Count - 1 do begin ShowMessage(Dest[i]); end; } //*******КОНЕЦ ОБРАБОТКИ СЛОВ for i:=0 to Dest.Count - 1 do for k:=0 to k2.Count - 1 do if StringReplace(Dest[i],k2[k],'',[rfIgnoreCase])<>Dest[i] then begin Memo1.Lines.Add(StringReplace(Dest[i],k2[k],'',[rfIgnoreCase])); // ShowMessage(InttoStr(i)); Dest.Strings[i]:=StringReplace(Dest[i],k2[k],'',[rfIgnoreCase]); end; // ShowMessage(Dest.Text); Edit2.Text:=Dest.DelimitedText; // exit; // end; //********* организация запроса к БД for i:=0 to Dest.Count - 1 do begin with Form1.ADOQuery1 do // for k:=0 to k2.Count - 1 do //ShowMessage(InttoStr(Length(Dest[i]))); if Length(Dest[i])>1 then begin //k3[j]:=Dest[i]+k2[j]; ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('SELECT Name'); ADOQuery1.SQL.Add('FROM WORDS'); //ADOQuery1.SQL.Add(Format('WHERE Name LIKE %s',[QuotedStr(Dest[i]+k2[k])])); ADOQuery1.SQL.Add(Format('WHERE Name LIKE %s',[QuotedStr(Dest[i]+'%')])); //ADOQuery1.SQL.Add(Format('WHERE Name LIKE %s',[QuotedStr(s[i]+'%')])); ADOQuery1.Open; while not Form1.ADOQuery1.eof do begin Memo1.Lines.Add(Form1.ADOQuery1.Fields[0].Text); ADOQuery1.Next; end; end; end; //exit; end; end. |
#2
|
||||
|
||||
1. Я например не телепат, что-бы догадаться что у вас выводиться в грид. В коде программы явного указания на это нет.
2. Если предположить, что для грида используется ADOQuery1, то неочень понятен сам вопрос, т.к. в грид и выводится весь результат. 3. Поскольку вы еще и выводите в мемо все значения из первого столбца запроса, то может вы хотите выводить все столбцы? В общем нечетко сформулированный вопрос породил кучу встречных. Что-же вы хотите? Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#3
|
|||
|
|||
У меня есть БД, даю фразу, она разбивается на слова, я ищу слова ч/з ADOQuery1 в этой БД, в TDBGrid выводятся результаты, но выводится результат только по последнему слову, а надо что бы по всем словам фразы.
Вот как раз в Memo1 выводятся все слова, а вот с TDBGrid так не получается. Там же цикл используется, и получается для TDBGrid с новой итерацией происходит новый запрос и в результате только по последнему слову вывод идёт, а мне надо по всем словам...как это сделать? уже мозг не варит... Вроде всё понятно. Если что спрашивайте. |
#4
|
||||
|
||||
Понятно, но если вы так сделаете, то и в мемо будут выводиться тоже по всем словам данные, т.к. в обоих случаях используется один источник AdoQuery1.
Как я понял искрмыми словами является массив Dest? значит надо в условие отбора включить все значения из этого массива, т.е. вместо: Код:
ADOQuery1.SQL.Add(Format('WHERE Name LIKE %s',[QuotedStr(Dest[i]+'%')])); Код:
for i := 0 to Dest.Count-1 do begin if i = 0 then ADOQuery1.SQL.Add(Format('WHERE Name LIKE %s',[QuotedStr(Dest[i]+'%')])) else ADOQuery1.SQL.Add(Format(' or Name LIKE %s',[QuotedStr(Dest[i]+'%')])) end; Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#5
|
|||
|
|||
это не то, цикл там есть, зачем ещё один?
|
#6
|
||||
|
||||
А попробуйте и посмотрите, что после цикла получается в ADOQuery1.SQL.Text
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |