Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-68376
acsoft
2003-08-07 19:57
2003.08.21
Как программно навести курсор на ссылку в документе, загруженном


3-68245
Aristarh
2003-07-24 19:39
2003.08.21
Оптимизация запроса FireBird


7-68562
Школьник
2003-05-20 14:04
2003.08.21
Не могу выделить более 1.7Gb виртуальной памяти.


4-68578
Igor__
2003-06-15 23:04
2003.08.21
Иконки в XP


1-68372
KPV-10k
2003-08-08 00:57
2003.08.21
Извлечение иконок из строкового потока





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский