Форум: "Базы";
Текущий архив: 2003.08.21;
Скачать: [xml.tar.bz2];
ВнизСложный динамический запрос 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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.008 c