|
#1
|
||||
|
||||
Кто виноват?
Добрый день..., пишу впервые так, что сильно не пинайте если тема баян
У меня БД на акцессе, а сама прога соответственно на делфи. Имеется пять столбцов Столбцы 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 у меня результат выходи пустым, в чем проблема не пойму В чем проблема???? в том плане куда рыть??? в делфи или в акцессе Последний раз редактировалось th_bav, 02.12.2010 в 13:53. |
#2
|
|||
|
|||
в логике запроса!
не совсем понятно что вы хотите получить в итоге ведь сами написали что: Цитата:
а в запросе пытаетесь по ним зажаться: Цитата:
Новый вирус - "БОМЖ"! Он просто роется в Корзине...и спит под ярлычком "Сетевое окружение" |
#3
|
||||
|
||||
Цитата:
Поетому я и посчитал нужным добавить %, как тогда быть???? Можно конечно к примеру поумолчанию добавлять в каждое поле какойнибудь символ, чтобы оно не было пустым, но это сами понимаите на вариант))))))))) Как тогда мне быть??? Дело в том что я пишу кросовый журнал, у меня в нем три поля заполняются в любом случае т.к. это адреса портов, а поля телефон и примичание могут быть и пустым т.к. наврятле емкость будет полностью использована, тем более сразу. Поетому я и посчитал нужным добавить %, как тогда быть???? Можно конечно к примеру поумолчанию добавлять в каждое поле какойнибудь символ, чтобы оно не было пустым, но это сами понимаите на вариант))))))))) Как тогда мне быть??? Может начать выполнение процедуры с 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
|
|||
|
|||
Вариант - использовать событие OnFilterData и фильтровать руками.
Т.е. у тебя всегда идет фильтрация по гарантированно заполненым полям, а все остальные - руками на клиенте. |
#5
|
||||
|
||||
Цитата:
|
#6
|
||||
|
||||
Дошло))))))) Вот так надо было, может кому то пригодиться
Код:
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, 03.12.2010 в 15:01. |
#7
|
||||
|
||||
Решил новую тему не создавать, а продолжить в этой так как проблема одна...
Суть вопроса такова... Имееться БД которая состоит из колонок Телефон, ФИО и т.п. .......), необходимо искать информацию по нескольким параметрам таким как 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. Проблема в том, что мне написать вместо ???, был вариант использовать Edit101.Text:='IS NOT NULL AND IS NULL' но должного результата это не принесло Как поступить???? или я совсем не в ту сторону иду и есть другой проверенный способ??? в книжках порылся, там честно говоря сложнее одного поля запроса не нашел.... Есть мысль использовать Form1QueryCrosse.SQL.Add(Memo1.Text); А текст в нем будет формироваться исходя из условий заполнения поля.... Осталось только научиться)))) P.S. почему то не могу сдвинуть текст для наглядности, поэтому поставил точки Последний раз редактировалось Admin, 07.12.2010 в 13:45. |
#8
|
|||
|
|||
можно попробовать с is null
что то типа Код:
(fio like 'bla-bla-bla%' or ((fio is null) and (1<:pr)) Новый вирус - "БОМЖ"! Он просто роется в Корзине...и спит под ярлычком "Сетевое окружение" |
#9
|
||||
|
||||
Вобщем вопрос все еще актуален....., решение от 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; 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
|
||||
|
||||
Вопрос уже не актуален, дошло:
Код:
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; |