Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.08.21;
Скачать: CL | DM;

Вниз

Сложный динамический запрос SQL (со значениями всех или 1 edita)   Найти похожие ветки 

 
Lenid   (2003-07-28 21:22) [0]

Имеется форма с 2 maskedit, 2 edit’ами.
По нажатию на кнопку «Поиск» должен происходить динамический поиск.
Поиск может происходить по разному. Если в один из mask или edit было введено значение, то ищется по тому значению, если по 2 edit, то по 2, если введены значения во все 4, то по всем. Как можно записать это условие.
Могу написать по подробнее. Кто знает или умеет подскажите.


 
AbrosimovA ©   (2003-07-29 08:34) [1]

var S1,S2,S3,S4,F: string;
( Sender: TObject)
var S1,S2,S3,S4,F: string;
SMask1,SMask1: string;

procedure TForm1.FormCreate(Sender: TObject);
begin
SMask1:=MaskEdit1.EditText;
SMask2:=MaskEdit2.EditText;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
S1:= Edit1.Text;
S2:= Edit2.Text;
if MaskEdit1.EditText<>SMask1 then S3:= MaskEdit1.EditText
else S3:="";
if MaskEdit2.EditText<>SMask2 then S4:= MaskEdit2.EditText
else S3:="";
F:="Address="""+S1+S2+S3+S4+"*""";//Фильтр
end;


 
Alone Corsar ©   (2003-07-29 09:14) [2]

Если можно то поподробней, на сколько я понял то надо формировать динамички SQL запрос,или все же достаточно фильтров.


 
VAleksey ©   (2003-07-29 09:19) [3]


> AbrosimovA © (29.07.03 08:34)

фигня.
или просто тут не все.


 
AbrosimovA ©   (2003-07-29 09:37) [4]

Я не использую для поиска в таблице SQL-запросы, мне достаточно сформировать фильтр, к примеру такой, как я указал выше, и затем:

Table1.Filtered:=true;
Table1.Filter:=F;
Table1.Filtered:=false;


Но предлагаемый вариант используется, если у тебя на форме компонент TTable.


 
stud ©   (2003-07-29 09:41) [5]

такой же вариант можно использовать и для sql-запроса


 
AbrosimovA ©   (2003-07-29 09:56) [6]

SQL-запрос:

Query1.Close;
Query1.SQL.Clear;
F:="SELECT FIO,Address from Table.db WHERE Address="+S1+S2+S3+S4;
Query1.SQL.Add(F);
Query1.Open;


 
Соловьев ©   (2003-07-29 10:01) [7]

...OnfilterRecord
...
l1, l2, l3, l4: boolean;
begin
l1 := Edit1.Text = FieldByName("Field1").AsString;
...
accept := l1 or l2 or l3 or l4;
end
а можно поробовать динамически формировать SQL:
ButtonClick
...
if Edit1.Text <> "" then sql := "(Field1 = " + Edit1.Text + ")";
...
if EditN.Text <> "" then
if sql <> "" then
sql := sql + "or (FieldN = " + Edit1.Text + ")";
else
sql := "(FieldN = " + Edit1.Text + ")";
...
Query.SQL.Text := Format("select * from table %s",[slq]);


 
AbrosimovA ©   (2003-07-29 10:07) [8]


> Соловьев © (29.07.03 10:01)


В случае c MaskEdit условие вида if EditN.Text <> "" then некорректно, так как поле ввода может быть непустым, например так: (___)___-____


 
Соловьев ©   (2003-07-29 10:11) [9]


> AbrosimovA © (29.07.03 10:07)

там много чего не так. это только каркас. дальше автор поста пусть сам отлажевает.


 
AbrosimovA ©   (2003-07-29 10:15) [10]

Очень жаль, что мы так и не услышали начальника автотранспортного цеха(Lenid).


 
Vikol   (2003-07-29 10:20) [11]

Вариант 1.

procedure GenWhere()
var
sw:string;
begin
Query1.Close;
Query1.SQL.CLear;
Query1.SQL.Add("SELECT F1, F2, F3 FROM Table");
sw="";
if Length(Trim(Edit1.Text))>0
then sw:="(F1 = "+Edit1.Text+")";
if Length(Trim(Edit2.Text))>0
then
begin
if Length(sw)>0 then sw:=sw+" AND ";
sw:=sw+"(F2 = "+Edit1.Text+")";
end;
if Length(Trim(Edit3.Text))>0
then
begin
if Length(sw)>0 then sw:=sw+" AND ";
( F3 = "+Edit3.Text+") Вариант 1.

procedure GenWhere()
var
sw:string;
begin
Query1.Close;
Query1.SQL.CLear;
Query1.SQL.Add("SELECT F1, F2, F3 FROM Table");
sw="";
if Length(Trim(Edit1.Text))>0
then sw:="(F1 = "+Edit1.Text+")";
if Length(Trim(Edit2.Text))>0
then
begin
if Length(sw)>0 then sw:=sw+" AND ";
sw:=sw+"(F2 = "+Edit1.Text+")";
end;
if Length(Trim(Edit3.Text))>0
then
begin
if Length(sw)>0 then sw:=sw+" AND ";
sw:=sw+"(F3 = "+Edit3.Text+")";
end;
//и т.д. для каждого условия,
//если поле строковое или дата не забудь про кавычки
...
Query1.SQl.ADD(SW);
Query1,SQL.ADD("ORDER BY F1");
//для проверки можно
Query1.SQL.SaveToFile("Test.sql");
//если ок
Query1.Open;
end;



 
Vikol   (2003-07-29 10:28) [12]

Вариант 2.
условие на одно поле которое может содержать несколько значений

procedure GenWhere()
var
sw:string;
begin
Query1.Close;
Query1.SQL.CLear;
Query1.SQL.Add("SELECT F1, F2, F3 FROM Table");
sw="";
if Length(Trim(Edit1.Text))>0
then sw:=Edit1.Text;
if Length(Trim(Edit2.Text))>0
then
begin
if Length(sw)>0 then sw:=sw+", ";
sw:=sw+Edit1.Text;
end;
if Length(Trim(Edit3.Text))>0
then
begin
if Length(sw)>0 then sw:=sw+", ";
( "+sw+") Вариант 2.
условие на одно поле которое может содержать несколько значений

procedure GenWhere()
var
sw:string;
begin
Query1.Close;
Query1.SQL.CLear;
Query1.SQL.Add("SELECT F1, F2, F3 FROM Table");
sw="";
if Length(Trim(Edit1.Text))>0
then sw:=Edit1.Text;
if Length(Trim(Edit2.Text))>0
then
begin
if Length(sw)>0 then sw:=sw+", ";
sw:=sw+Edit1.Text;
end;
if Length(Trim(Edit3.Text))>0
then
begin
if Length(sw)>0 then sw:=sw+", ";
sw:=sw+Edit3.Text;
end;
//и т.д. для каждого условия,
//если поле строковое или дата не забудь про кавычки
...
SW:="F1 IN ("+sw+")";
Query1.SQl.ADD(SW);
Query1,SQL.ADD("ORDER BY F1");
//для проверки можно
Query1.SQL.SaveToFile("Test.sql");
//если ок
Query1.Open;
end;


 
KDS ©   (2003-07-29 10:51) [13]

Проверяй на заполненность компонентов ТЭдит.
Если он заполнен то включайего в условие запроса.
У меня, например, Комбобоксы, Эдиты, Радиогроупы и Чекбоксы
определяют фильтр. Над каждым комбобоксом стоит чекбокс,
если в нем стоит флажок, значит использовать его комбобокс...
procedure TfmArch.CreateSchetsFilters;
var FltQrStr,BegRngDt,EndRngDt, ShortName: ansistring;
begin
FltQrStr:=""; EngineDM.qrScetList.Close;
if cbSchNum.Checked then FltQrStr:="("SchetNumber"="""+edSchNum.Text+""")";
if cbSchDate.Checked then begin
BegRngDt:=DateToStr(SchDateFrom.Date);
EndRngDt:=DateToStr(SchDateTo.Date);
if FltQrStr <>"" then FltQrStr:=FltQrStr+"and";
FltQrStr:=FltQrStr+"("FDate">="""+BegRngDt+""")and("FDate"<="""+EndRngDt+""")";
end;
// Filtered by FirmName
if cbArSFirma.Checked then begin
if FltQrStr<>"" then FltQrStr:=FltQrStr+"and";
FltQrStr:=FltQrStr+"("firma"="""+IntToStr(cbxSchFirma.ItemIndex+1)+""")";
end;
// Filtered by BNKlientShortName
if cbSchBNKlients.Checked then begin
if EngineDM.ibqBNKlients.Locate(""ShortName"", cbxSchBNKlients.Text, [loCaseInsensitive,loPartialKey])
then begin
if FltQrStr<>"" then FltQrStr:=FltQrStr+"and";
FltQrStr:=FltQrStr+"("Name"="""+EngineDM.ibqBNKlientsName.AsString+""")";
end
else MessageDlg("Клиента с таким именем не сужествует."#13#10+
"Параметр проигнорирован нахерен.",mtInformation,[mbOK],0)
end;
if not rbAll.Checked then begin
if FltQrStr<>"" then FltQrStr:=FltQrStr+"and";
if rbSch.Checked then FltQrStr:=FltQrStr+"("IsOtpravka"=""0"")"
else FltQrStr:=FltQrStr+"("IsOtpravka"=""1"")";
end;

if FltQrStr<>"" then FltQrStr:=FltQrStr+"and";
if cbBNErr.Checked then FltQrStr:=FltQrStr+"("Error_flag"=""1"")"
( "Error_flag"=""0"")
Проверяй на заполненность компонентов ТЭдит.
Если он заполнен то включайего в условие запроса.
У меня, например, Комбобоксы, Эдиты, Радиогроупы и Чекбоксы
определяют фильтр. Над каждым комбобоксом стоит чекбокс,
если в нем стоит флажок, значит использовать его комбобокс...
procedure TfmArch.CreateSchetsFilters;
var FltQrStr,BegRngDt,EndRngDt, ShortName: ansistring;
begin
FltQrStr:=""; EngineDM.qrScetList.Close;
if cbSchNum.Checked then FltQrStr:="("SchetNumber"="""+edSchNum.Text+""")";
if cbSchDate.Checked then begin
BegRngDt:=DateToStr(SchDateFrom.Date);
EndRngDt:=DateToStr(SchDateTo.Date);
if FltQrStr <>"" then FltQrStr:=FltQrStr+"and";
FltQrStr:=FltQrStr+"("FDate">="""+BegRngDt+""")and("FDate"<="""+EndRngDt+""")";
end;
// Filtered by FirmName
if cbArSFirma.Checked then begin
if FltQrStr<>"" then FltQrStr:=FltQrStr+"and";
FltQrStr:=FltQrStr+"("firma"="""+IntToStr(cbxSchFirma.ItemIndex+1)+""")";
end;
// Filtered by BNKlientShortName
if cbSchBNKlients.Checked then begin
if EngineDM.ibqBNKlients.Locate(""ShortName"", cbxSchBNKlients.Text, [loCaseInsensitive,loPartialKey])
then begin
if FltQrStr<>"" then FltQrStr:=FltQrStr+"and";
FltQrStr:=FltQrStr+"("Name"="""+EngineDM.ibqBNKlientsName.AsString+""")";
end
else MessageDlg("Клиента с таким именем не сужествует."#13#10+
"Параметр проигнорирован нахерен.",mtInformation,[mbOK],0)
end;
if not rbAll.Checked then begin
if FltQrStr<>"" then FltQrStr:=FltQrStr+"and";
if rbSch.Checked then FltQrStr:=FltQrStr+"("IsOtpravka"=""0"")"
else FltQrStr:=FltQrStr+"("IsOtpravka"=""1"")";
end;

if FltQrStr<>"" then FltQrStr:=FltQrStr+"and";
if cbBNErr.Checked then FltQrStr:=FltQrStr+"("Error_flag"=""1"")"
else FltQrStr:=FltQrStr+"("Error_flag"=""0"")";
with EngineDM.iboSchetHeaders do begin
if FltQrStr<>"" then begin
filter:= FltQrStr;
filtered:=true;
end
else Filtered:=false;
if not Active then Open else Refresh;
end;
end;



Страницы: 1 вся ветка

Текущий архив: 2003.08.21;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.013 c
1-68379
Borealis
2003-08-07 22:13
2003.08.21
Caption для кнопок


1-68267
JS
2003-08-06 15:30
2003.08.21
Активизация приложения


7-68563
SergeyI
2003-06-02 14:54
2003.08.21
Доброго времени суток , вопрос по работе с реестром


3-68247
Pavel
2003-07-25 16:53
2003.08.21
как присвоить параметр в TADOQuery ?


4-68592
dimonf
2003-06-18 10:48
2003.08.21
Как реали-ть drag-grop из моего приложения в win проводик???