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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.12.2010, 13:50
Аватар для th_bav
th_bav th_bav вне форума
Новичок
 
Регистрация: 02.12.2010
Сообщения: 74
Репутация: 10
По умолчанию Кто виноват?

Добрый день..., пишу впервые так, что сильно не пинайте если тема баян
У меня БД на акцессе, а сама прога соответственно на делфи.
Имеется пять столбцов
Столбцы telefon и note у меня в БД пустые, в итоге когда я делаю запрос SELECT * FROM Crosse; -

Код:
Form1QueryCrosse.Active:=false;
Form1QueryCrosse.SQL.Clear;
Form1QueryCrosse.SQL.Add('SELECT *');
Form1QueryCrosse.SQL.Add('FROM Crosse');
Form1QueryCrosse.SQL.Add('WHERE grom LIKE '''+Edit2.Text+'%'' AND plint LIKE '''+Edit3.Text+'%'' AND port LIKE '''+Edit4.Text+'%'' AND type LIKE '''+Edit5.Text+'%''');
Form1QueryCrosse.Active:=true;

то при вводе параметров Grom, Plint и Port у меня все работает нормально, а если я делаю запрос с учетом пустых полей - telefon и note

Код:
Form1QueryCrosse.Active:=false;
Form1QueryCrosse.SQL.Clear;
Form1QueryCrosse.SQL.Add('SELECT *');
Form1QueryCrosse.SQL.Add('FROM Crosse');
Form1QueryCrosse.SQL.Add('WHERE telefon LIKE '''+Edit1.Text+'%'' AND grom LIKE '''+Edit2.Text+'%'' AND plint LIKE '''+Edit3.Text+'%'' AND port LIKE '''+Edit4.Text+'%'' AND type LIKE '''+Edit5.Text+'%'' AND note LIKE '''+Edit6.Text+'%''');
Form1QueryCrosse.Active:=true;

то при вводе параметров Grom, Plint и Port у меня результат выходи пустым, в чем проблема не пойму
В чем проблема???? в том плане куда рыть??? в делфи или в акцессе
Изображения
Тип файла: jpg w.JPG (18.3 Кбайт, 12 просмотров)

Последний раз редактировалось th_bav, 02.12.2010 в 13:53.
Ответить с цитированием
  #2  
Старый 02.12.2010, 17:11
Black Raider Black Raider вне форума
Местный
 
Регистрация: 31.05.2010
Адрес: Москва
Сообщения: 466
Версия Delphi: 7
Репутация: 40
По умолчанию

в логике запроса!
не совсем понятно что вы хотите получить в итоге ведь сами написали что:
Цитата:
Столбцы telefon и note у меня в БД пустые.

а в запросе пытаетесь по ним зажаться:
Цитата:
Код:
telefon LIKE '''+Edit1.Text+'%'' AND grom LIKE '''+Edit2.Text+'%'' AND plint LIKE '''+Edit3.Text+'%'' AND port LIKE '''+Edit4.Text+'%'' AND type LIKE '''+Edit5.Text+'%'' AND note LIKE '''+Edit6.Text+'%''');
но если хоть одно поле telefon или note... т.е. если оно пустое то оно не попадает в вашу выборку отсюда и пустой набор.
__________________
Новый вирус - "БОМЖ"! Он просто роется в Корзине...и спит под ярлычком "Сетевое окружение"
Ответить с цитированием
  #3  
Старый 02.12.2010, 19:33
Аватар для th_bav
th_bav th_bav вне форума
Новичок
 
Регистрация: 02.12.2010
Сообщения: 74
Репутация: 10
Радость

Цитата:
Сообщение от Black Raider
в логике запроса!
что вы хотите получить в итоге.
Дело в том что я пишу кросовый журнал, у меня в нем три поля заполняются в любом случае т.к. это адреса портов, а поля телефон и примичание могут быть и пустым т.к. наврятле емкость будет полностью использована, тем более сразу.
Поетому я и посчитал нужным добавить %, как тогда быть???? Можно конечно к примеру поумолчанию добавлять в каждое поле какойнибудь символ, чтобы оно не было пустым, но это сами понимаите на вариант))))))))) Как тогда мне быть???
Дело в том что я пишу кросовый журнал, у меня в нем три поля заполняются в любом случае т.к. это адреса портов, а поля телефон и примичание могут быть и пустым т.к. наврятле емкость будет полностью использована, тем более сразу.
Поетому я и посчитал нужным добавить %, как тогда быть???? Можно конечно к примеру поумолчанию добавлять в каждое поле какойнибудь символ, чтобы оно не было пустым, но это сами понимаите на вариант))))))))) Как тогда мне быть???
Может начать выполнение процедуры с IF?
Тобишь если поле поиска telefon пустое то выполняй этот запрос

Код:
Form1QueryCrosse.Active:=false;
Form1QueryCrosse.SQL.Clear;
Form1QueryCrosse.SQL.Add('SELECT *');
Form1QueryCrosse.SQL.Add('FROM Crosse');
Form1QueryCrosse.SQL.Add('WHERE grom LIKE '''+Edit2.Text+'%'' AND plint LIKE '''+Edit3.Text+'%'' AND port LIKE '''+Edit4.Text+'%'' AND type LIKE '''+Edit5.Text+'%''');
Form1QueryCrosse.Active:=true;

А если в поле telefon что то есть, то выполняй этот запрос
Код:
Form1QueryCrosse.Active:=false;
Form1QueryCrosse.SQL.Clear;
Form1QueryCrosse.SQL.Add('SELECT *');
Form1QueryCrosse.SQL.Add('FROM Crosse');
Form1QueryCrosse.SQL.Add('WHERE telefon LIKE '''+Edit1.Text+'%'' AND grom LIKE '''+Edit2.Text+'%'' AND plint LIKE '''+Edit3.Text+'%'' AND port LIKE '''+Edit4.Text+'%'' AND type LIKE '''+Edit5.Text+'%'' AND note LIKE '''+Edit6.Text+'%''');
Form1QueryCrosse.Active:=true;
И так же с полем note???

Вроде более простого способа нету...
Завтра если успею помучать Delphi то отпишусь, может кому пригодиться...
Кстати спасибо за совет!!!

Последний раз редактировалось th_bav, 03.12.2010 в 07:40.
Ответить с цитированием
  #4  
Старый 02.12.2010, 19:43
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Вариант - использовать событие OnFilterData и фильтровать руками.
Т.е. у тебя всегда идет фильтрация по гарантированно заполненым полям, а все остальные - руками на клиенте.
Ответить с цитированием
  #5  
Старый 03.12.2010, 06:58
Аватар для th_bav
th_bav th_bav вне форума
Новичок
 
Регистрация: 02.12.2010
Сообщения: 74
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Вариант - использовать событие OnFilterData и фильтровать руками.
Т.е. у тебя всегда идет фильтрация по гарантированно заполненым полям, а все остальные - руками на клиенте.
А можно поподробнее, хотя бы про какой объект речь идет??? Потому, что у DataSurce и DataQuery таких событий не нашел, гугль тоже молчит
Ответить с цитированием
  #6  
Старый 03.12.2010, 11:40
Аватар для th_bav
th_bav th_bav вне форума
Новичок
 
Регистрация: 02.12.2010
Сообщения: 74
Репутация: 10
По умолчанию

Дошло))))))) Вот так надо было, может кому то пригодиться
Код:
procedure TForm1.Button3Click(Sender: TObject);
var
note:integer;
begin
if Edit1.Text='' then
begin
Form1QueryCrosse.Active:=false;
Form1QueryCrosse.SQL.Clear;
Form1QueryCrosse.SQL.Add('SELECT *');
Form1QueryCrosse.SQL.Add('FROM Crosse');
Form1QueryCrosse.SQL.Add('WHERE grom LIKE '''+Edit2.Text+'%'' AND plint LIKE '''+Edit3.Text+'%'' AND port LIKE '''+Edit4.Text+'%'' AND type LIKE '''+Edit5.Text+'%''');
Form1QueryCrosse.Active:=true;
Memo1.Lines.Add(Form1QueryCrosse.SQL.Text)
end
else
begin
Form1QueryCrosse.Active:=false;
Form1QueryCrosse.SQL.Clear;
Form1QueryCrosse.SQL.Add('SELECT *');
Form1QueryCrosse.SQL.Add('FROM Crosse');
Form1QueryCrosse.SQL.Add('WHERE telefon LIKE '''+Edit1.Text+'%'' AND grom LIKE '''+Edit2.Text+'%'' AND plint LIKE '''+Edit3.Text+'%'' AND port LIKE '''+Edit4.Text+'%'' AND type LIKE '''+Edit5.Text+'%'' AND note LIKE '''+Edit6.Text+'%''');
Form1QueryCrosse.Active:=true;
end;
    end;
end.
Admin: Пользуемся тегами, иначе последуют санкции!

Последний раз редактировалось Admin, 03.12.2010 в 15:01.
Ответить с цитированием
  #7  
Старый 07.12.2010, 10:39
Аватар для th_bav
th_bav th_bav вне форума
Новичок
 
Регистрация: 02.12.2010
Сообщения: 74
Репутация: 10
По умолчанию

Решил новую тему не создавать, а продолжить в этой так как проблема одна...
Суть вопроса такова...
Имееться БД которая состоит из колонок Телефон, ФИО и т.п. .......), необходимо искать информацию по нескольким параметрам таким как Telefon, FIO и т.п......
проблема заключаеться в том, что за ранее не известно заполнено ли это поле или нет в колонке....., а у меня SQL ищет только по заполненым полям:
telefon fio
223 -15 Иванов
223-17 Сидоров
223-76
215-44
Т.е запрос выдаст мне только те телефоны и фамилии у которых все поля заполнены, а номера 215-44 и 215-76 проигнорирует так как у них нет фамилий
Мне кажеться что запрос должен меняться в зависимости от того какие поля заполнены. Я догодался только до 2 вариантов
1)Изначально заложить в программу все варианты запросов,но с таким большим количеством полей это очень неудобно., поэтому он был исключен.
2) Использовать промежуточное поле Edit, в зависимость от того введено чтонибудь в поле поиска или нет создать для промежуточного поля условие:
Код:
procedure TForm1.Button3Click(Sender: TObject);
begin
...	if Edit1.Text<>'' then Edit101.Text:=Edit1.Text + '%' ;
...	                             if Edit1.Text='' then Edit101.Text:=??? ;
...	if Edit2.Text<>'' then Edit102.Text:= Edit2.Text + '%';
...	if Edit2.Text='' then Edit102.Text:=???;
...	и т.п.
...	begin
...		Form1QueryCrosse.Active:=false;
...		Form1QueryCrosse.SQL.Clear;
...		Form1QueryCrosse.SQL.Add('SELECT *');
...		Form1QueryCrosse.SQL.Add('FROM Crosse');
...		Form1QueryCrosse.SQL.Add('WHERE telefon LIKE '''+Edit101.Text+''' AND grom LIKE '''+Edit102.Text+'''');
...		Form1QueryCrosse.Active:=true;
...	end;
end;
end.
Admin: Итак, санкции последовали, для начала 3-дневный бан. А пока читай про оформление кода...

Проблема в том, что мне написать вместо ???, был вариант использовать Edit101.Text:='IS NOT NULL AND IS NULL'
но должного результата это не принесло
Как поступить???? или я совсем не в ту сторону иду и есть другой проверенный способ??? в книжках порылся, там честно говоря сложнее одного поля запроса не нашел....
Есть мысль использовать Form1QueryCrosse.SQL.Add(Memo1.Text);
А текст в нем будет формироваться исходя из условий заполнения поля....
Осталось только научиться))))
P.S. почему то не могу сдвинуть текст для наглядности, поэтому поставил точки
Изображения
Тип файла: jpg Безымянный.JPG (18.3 Кбайт, 3 просмотров)

Последний раз редактировалось Admin, 07.12.2010 в 13:45.
Ответить с цитированием
  #8  
Старый 07.12.2010, 11:48
Black Raider Black Raider вне форума
Местный
 
Регистрация: 31.05.2010
Адрес: Москва
Сообщения: 466
Версия Delphi: 7
Репутация: 40
По умолчанию

можно попробовать с is null
что то типа
Код:
(fio like 'bla-bla-bla%' or ((fio is null) and (1<:pr))
Где то так, проверить сейчас не могу.
__________________
Новый вирус - "БОМЖ"! Он просто роется в Корзине...и спит под ярлычком "Сетевое окружение"
Ответить с цитированием
  #9  
Старый 11.01.2011, 09:53
Аватар для th_bav
th_bav th_bav вне форума
Новичок
 
Регистрация: 02.12.2010
Сообщения: 74
Репутация: 10
По умолчанию

Вобщем вопрос все еще актуален....., решение от 03.12.2010, 13:40 оказалось не вполне уместным так как не решает полностью проблемы...., просто теперь предо мной задача сделать выборку уже по 7 критериям и само-сабой какие то поля могут быть пустыми, а какие то заполнеными. Описывать все варианты просто невыносимо долго да и глупо. Вобщем решил, что SQL запрос нужно строить исходя из того, что выбрал пользователь...
Вот вариант из 2 полей Edit:
Я сначала записываю запрос в Memo1, а потом его уже запускаю:
Код:
procedure TForm1.Button3Click(Sender: TObject);
var
  k:Integer;
begin
  Form1QueryCrosse.SQL.Clear;
  Form1.Memo1.Clear;
	Memo1.Lines.Add('SELECT * FROM Crosse');
  if Edit1.Text<>'' then
      Memo1.Lines.Add('WHERE telefon LIKE '''+Edit1.Text+'%''');
      k:= Length(Memo1.text)-((Memo1.Lines.Count-1)*2);
  if Edit2.Text<>'' then
      if k>24 then
          Memo1.Lines.Add(' and  grom LIKE ''' +Edit2.Text+'%''')
      else Memo1.Lines.Add(' WHERE grom LIKE ''' +Edit2.Text+'%''')
    end;
    begin
    Form1QueryCrosse.SQL.Add(Memo1.Text);
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
	Form1QueryCrosse.SQL.Clear;
	Form1QueryCrosse.SQL.Add(Memo1.Text);
	Form1QueryCrosse.Active:=true;
end;
А проблема вся в том, что я не могу объеденить 2 процедуры воедино поетому мне приходиться все делать в 2 движения
1)Создавать запрос в поле Memo1
2)Добавлять запрос и поля Memo1
Подскажите как мне сделать это по нажатию одной кнопки а не по двум - Запрос и Вывод
Я пробывал так
Код:
procedure TForm1.Button3Click(Sender: TObject);
var
  k:Integer;
begin
  Form1QueryCrosse.SQL.Clear;
  Form1.Memo1.Clear;
	Memo1.Lines.Add('SELECT * FROM Crosse');
  if Edit1.Text<>'' then
      Memo1.Lines.Add('WHERE telefon LIKE '''+Edit1.Text+'%''');
      k:= Length(Memo1.text)-((Memo1.Lines.Count-1)*2);
  if Edit2.Text<>'' then
      if k>24 then
          Memo1.Lines.Add(' and  grom LIKE ''' +Edit2.Text+'%''')
      else Memo1.Lines.Add(' WHERE grom LIKE ''' +Edit2.Text+'%''')
    end;
    begin
    Form1QueryCrosse.SQL.Add(Memo1.Text);
    Form1QueryCrosse.Active:=true;
end;
Вот на что ругается
[Error] Fund.pas(126): Undeclared identifier: 'Form1QueryCrosse'
[Error] Fund.pas(126): Missing operator or semicolon
[Error] Fund.pas(126): Missing operator or semicolon
[Error] Fund.pas(127): Missing operator or semicolon
[Error] Fund.pas(127): Missing operator or semicolon
[Error] Fund.pas(128): '.' expected but ';' found
[Error] Fund.pas(60): Unsatisfied forward or external declaration: 'TForm1.Button5Click'
[Fatal Error] CMag.dpr(8): Could not compile used unit 'Fund.pas'
P.S. если опять не так оформил не баньте, а подскажите что за теги..., несилен я в этом
Ответить с цитированием
  #10  
Старый 12.01.2011, 06:51
Аватар для th_bav
th_bav th_bav вне форума
Новичок
 
Регистрация: 02.12.2010
Сообщения: 74
Репутация: 10
По умолчанию

Вопрос уже не актуален, дошло:
Код:
procedure TForm1.Button3Click(Sender: TObject);
var
  Grom:Integer;
  Plint:Integer;
  Port:Integer;
  Typee:Integer;
  Note:Integer;

begin
  Form1QueryCrosse.SQL.Clear;
  Form1.Memo1.Clear;
	Memo1.Lines.Add('SELECT * FROM Crosse');
  if Edit1.Text<>'' then
      Memo1.Lines.Add('WHERE telefon LIKE '''+Edit1.Text+'%''');

  Grom:= Length(Memo1.text)-((Memo1.Lines.Count-1)*2);
  if Edit2.Text<>'' then
      if Grom>22 then
          Memo1.Lines.Add(' and  grom LIKE ''' +Edit2.Text+'%''');
  if Edit2.Text<>'' then
      if Grom<24 then
          Memo1.Lines.Add('WHERE grom LIKE ''' +Edit2.Text+'%''');

	Plint:= Length(Memo1.text)-((Memo1.Lines.Count-1)*2);
  if Edit3.Text<>'' then
      if Plint>22 then
          Memo1.Lines.Add(' and  Plint LIKE ''' +Edit3.Text+'%''');
  if Edit3.Text<>'' then
      if Plint<24 then
      Memo1.Lines.Add('WHERE Plint LIKE ''' +Edit3.Text+'%''');

	  Port:= Length(Memo1.text)-((Memo1.Lines.Count-1)*2);
  if Edit4.Text<>'' then
      if Port>22 then
          Memo1.Lines.Add(' and  Port LIKE ''' +Edit4.Text+'%''');
  if Edit4.Text<>'' then
      if Port<24 then
      Memo1.Lines.Add('WHERE Port LIKE ''' +Edit4.Text+'%''');

	  Typee:= Length(Memo1.text)-((Memo1.Lines.Count-1)*2);
  if Edit5.Text<>'' then
      if Typee>22 then
          Memo1.Lines.Add(' and  Type LIKE ''' +Edit5.Text+'%''');
  if Edit5.Text<>'' then
      if Typee<24 then
      Memo1.Lines.Add('WHERE Type LIKE ''' +Edit5.Text+'%''');

	  Note:= Length(Memo1.text)-((Memo1.Lines.Count-1)*2);
  if Edit6.Text<>'' then
      if Note>22 then
          Memo1.Lines.Add(' and  Note LIKE ''' +Edit6.Text+'%''');
  if Edit6.Text<>'' then
      if Note<24 then
      Memo1.Lines.Add('WHERE Note LIKE ''' +Edit6.Text+'%''');

begin
    Form1QueryCrosse.SQL.Add(Memo1.Text);
    Form1QueryCrosse.Active:=true;
end;
end;
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter