Поиск/InterBase/Delphi

Александр Катловай
Дата: 25.05.2011 21:50:41
Здравствуйте
Как должен выглядеть запрос и код программы чтобы реализовать поиск в DBGrid'e по всем строкам/столбцам таблицы через один Edit и Button?

я пробую
procedure TForm1.Button1Click(Sender: TObject);
begin
if Length(Edit1.Text)>0 then
begin
IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Add('Select * from таблица where СТОЛБЕЦ1 LIKE ' + QuotedStr('%' + Edit1.Text +'%') + ' or СТОЛБЕЦ2 LIKE ' + QuotedStr('%' + Edit1.Text +'%') + ' or СТОЛБЕЦ3 LIKE '  + QuotedStr('%' + Edit1.Text +'%') + ' or СТОЛБЕЦ4 LIKE ' + QuotedStr('%' + Edit1.Text +'%') + ' or СТОЛБЕЦ5 LIKE ' + QuotedStr('%' + Edit1.Text +'%'));
IBQuery1.Open;

По цифрам находит, а если буквы ввожу то выдает ошибку.
Картинка с другого сайта.
Александр Катловай
Дата: 25.05.2011 21:51:22
Ой, простите что растянул форум...
Нелояльный
Дата: 25.05.2011 22:19:40
Поиск не дал ответа?
DmSer
Дата: 25.05.2011 22:27:09
автор
По цифрам находит, а если буквы ввожу то выдает ошибку.


Судя по ошибке, некоторые поля имеют числовой тип. Перед применением LIKE попробуйте выполнить преобразование в строку, например таким образом: WHERE CAST(СТОЛБЕЦ1 AS VARCHAR(100)) LIKE ' + QuotedStr('%' + Edit1.Text +'%'), либо фильтруйте ввод символов в Edit'ы.
Нелояльный
Дата: 25.05.2011 22:38:10
DmSer
Судя по ошибке, некоторые поля имеют числовой тип.
Это проблема не с цифрами, а с буквами, их кодировкой.
Александр Катловай
Дата: 25.05.2011 23:34:50
Помогите, что нужно сделать?
Dimitry Sibiryakov
Дата: 26.05.2011 01:22:25

Александр Катловай
что нужно сделать?

Читать FAQ на http://ibase.ru и особенно внимательно - посвящённые работе с русскими
буквами и юникодом.

Posted via ActualForum NNTP Server 1.4

КолКин
Дата: 26.05.2011 07:11:05
Во первых какая у тебя кодировка базы? у меня под WIN1251 все крутится, только я делаю чуть по другому, я привожу к одному регистру 'upper(name_short) like ''%'+AnsiUpperCase(fndClientName.Text)+'%'''. Еще можешь попробовать попробовать не выполнять запрос, а делать фильтрацию общего запроса.
MaratIsk
Дата: 26.05.2011 07:56:54
Александр Катловай,

вот так

procedure TfrmFrame.acFindExecute(Sender: TObject);
var
  s          : string;
  bm         : TBookmark;
begin
  if not MemData.Active then Exit;
  if MemData.RecordCount = 0 then exit;
  if EditFind.Text = '' then exit;
  MemData.DisableControls;
  Screen.Cursor := crHourGlass;
  bm            := MemData.GetBookmark;
  try
    MemData.Next;
    while not (MemData.Eof) do begin
      s := MemData.FindField(DBGrid.SelectedField.FieldName).AsString;
      if pos(AnsiUpperCase(EditFind.Text), AnsiUpperCase(s))>0 then
        begin
          bm := MemData.GetBookmark;
          Break;
        end;
      MemData.Next;
    end; // while not (FDataSet.Eof)
   if MemData.Eof then
      begin
        MemData.GotoBookmark(bm);
        MsgBox('Достигнут конец списка для поиска!', MB_ICONINFORMATION);
      end; // if MemData.Eof
    MemData.GotoBookmark(bm);
  except
    on E:Exception do begin
      MsgBox('Ошибка поиска значения!', MB_ICONWARNING);
    end;
  end; // try
  Screen.Cursor := crDefault;
  MemData.FreeBookmark(bm);
  MemData.EnableControls;
end;