Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.06.2009, 11:11
Gamer09 Gamer09 вне форума
Прохожий
 
Регистрация: 11.06.2009
Сообщения: 7
Репутация: 10
По умолчанию 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  
Старый 17.06.2009, 11:36
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

1. Я например не телепат, что-бы догадаться что у вас выводиться в грид. В коде программы явного указания на это нет.
2. Если предположить, что для грида используется ADOQuery1, то неочень понятен сам вопрос, т.к. в грид и выводится весь результат.
3. Поскольку вы еще и выводите в мемо все значения из первого столбца запроса, то может вы хотите выводить все столбцы?

В общем нечетко сформулированный вопрос породил кучу встречных. Что-же вы хотите?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 17.06.2009, 12:34
Gamer09 Gamer09 вне форума
Прохожий
 
Регистрация: 11.06.2009
Сообщения: 7
Репутация: 10
По умолчанию

У меня есть БД, даю фразу, она разбивается на слова, я ищу слова ч/з ADOQuery1 в этой БД, в TDBGrid выводятся результаты, но выводится результат только по последнему слову, а надо что бы по всем словам фразы.
Вот как раз в Memo1 выводятся все слова, а вот с TDBGrid так не получается.
Там же цикл используется, и получается для TDBGrid с новой итерацией происходит новый запрос и в результате только по последнему слову вывод идёт, а мне надо по всем словам...как это сделать? уже мозг не варит...

Вроде всё понятно. Если что спрашивайте.
Ответить с цитированием
  #4  
Старый 17.06.2009, 13:58
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Понятно, но если вы так сделаете, то и в мемо будут выводиться тоже по всем словам данные, т.к. в обоих случаях используется один источник 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  
Старый 18.06.2009, 05:39
Gamer09 Gamer09 вне форума
Прохожий
 
Регистрация: 11.06.2009
Сообщения: 7
Репутация: 10
По умолчанию

это не то, цикл там есть, зачем ещё один?
Ответить с цитированием
  #6  
Старый 18.06.2009, 11:38
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

А попробуйте и посмотрите, что после цикла получается в ADOQuery1.SQL.Text
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:47.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter