Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.01.08;
Скачать: [xml.tar.bz2];

Вниз

Отвлечённый вопрос про оптимизацию.   Найти похожие ветки 

 
Котелок   (2001-11-30 02:16) [0]

Вопрос в следуюшем...

Нижеприведённый код можно как нибудь оптимизировать....???

А то написал и меня переклинило. Не чего не могу другого придумать....:-(((

procedure TFSearch.BitBtn3Click(Sender: TObject);
var
s : string;
katId, strId : integer;
filt : string;
begin
if edit2.text <> "" then
begin
dm1.q1.close;
dm1.q1.sql.clear;
dm1.q1.sql.add("select * from streets where name = :name");
dm1.q1.prepare;
dm1.q1.ParamByName("name").asstring := edit2.text;
dm1.q1.open;
strId := dm1.q1.fieldbyname("idstreet").asinteger;
end;

if edit3.text <> "" then
begin
dm1.q1.close;
dm1.q1.sql.clear;
dm1.q1.sql.add("select * from kategor where name = :name");
dm1.q1.prepare;
dm1.q1.ParamByName("name").asstring := edit3.text;
dm1.q1.open;
katId := dm1.q1.fieldbyname("idkat").asinteger;
end;

sqlsearch :=" select "+
" otd.predpr, "+
" otd.otdid, "+
" pre.idPredpr, "+
" otd.name as otdname, "+
" otd.phone, "+
" pre.katalog, "+
" otd.kindid, "+
" pre.name as orgname, "+
" otd.home, "+
" otd.office, "+
" str.name as street, "+
"(select name from katalog where Idkat = pre.katalog) as katal, "+
" kat.name as kateg "+
" from "+
" otdel otd, "+
" predpr pre, "+
" streets str, kategor kat"+
" where otd.predpr = pre.IdPredpr and otd.kindId = kat.idkat and otd.streetId = str.IdStreet";

if edit1.text <> "" then
begin
sqlsearch := sqlsearch +" and pre.name like" +" ""*"+edit1.text+"*""";
end;
if edit4.text <> "" then
sqlsearch := sqlsearch +" and otd.home = "+ """"+edit4.text+"""";
if edit5.text <> "" then
sqlsearch := sqlsearch +" and otd.office = "+""""+edit5.text+"""";
if edit6.text <> "" then
sqlsearch := sqlsearch +" and otd.name like "+"""*"+edit6.text+"*""";
if edit7.text <> "" then
sqlsearch := sqlsearch +" and otd.phone like "+"""*"+edit7.text+"*""";

dm1.qSearch.close;
dm1.qSearch.sql.clear;
dm1.qSearch.sql.add(sqlsearch);
dm1.qSearch.Prepare;

filt := "";
if edit2.text <> "" then
filt := "street = """+ edit2.text +"""";
if (edit3.text <> "") and (edit2.text <> "") then
filt := filt + " and kateg = """+edit3.text+"""";
if (edit3.text <> "") and (edit2.text = "") then
filt := filt + " kateg = """+edit3.text+"""";
dm1.qSearch.open;
if filt <> "" then
begin
dm1.qSearch.Filter := filt;
dm1.qSearch.Filtered := true;
end
else
dm1.qSearch.Filtered := false;
end;


 
kaif   (2001-11-30 04:40) [1]

Маленький комментарий. Я сильно вникать не стал. Но мне кажутся опасными конструкции типа "kateg = """+edit3.text+"""". Нужно использовать ParamByName, иначе представь, что будет, если пользователь кавычку в текст введет. Можешь попробовать, я на этом однажды крупно натянулся... А если уж совсем невмоготу, то используй лучше "kateg = "+ QuotedStr(edit3.text). Функция QuotedStr защитит тебя от сбоя при использовании кавычек юзером. Она заменяет в тексте все одиночные кавычки на двойные.


 
Котелок   (2001-11-30 08:21) [2]

Хммм.....
Не знал, про такой оператор...
TNX......

ParamByName не подходит, т.к. этот текст запроса потом используется в других вызовах на других формах...
Например для сортировки по разным полям.
Я при вызове произвожу примерно следуюшие действия:


dm1.qSearch.close;
dm1.qSearch.sql.clear;
dm1.qSearch.sql.add(sqlsearch);
dm1.qSearch.sql.add(" order by otd.home");
dm1.qSearch.Prepare;
dm1.qSearch.open;


 
kaif   (2001-12-01 02:37) [3]

ParamByName всегда можно задействовать после того, как ты добавишь " order by otd.home". Начни использовать передачу параметров в запросы (для этого достаточно обозначить их в тексте именами с двумя точками спереди ":myparam"). Ты скоро убедишься, что это очень удобно и стильно. После того, как забил текст в свойство SQL и сделаешь Prepare, для всех параметров передаешь значения, например, для строки: ParamByName("myparam").AsString := .. Самое главное достоинство параметров, что они передают правильные типы данных. Например, кто-то поменял региональную установку в Windows с "dd/mm/yy" на "mm/dd/yy". Тогда все параметры дат, переданные строкой вызовут ошибку, а переданные как AsDateTime сработают по-человечески. Потом, Prepare имеет смысл делать только если посылаешь разные параметры в запрос стем же текстом и переоткрываешь запрос (почитай о Prepare).


 
ilysha   (2001-12-01 16:29) [4]

Еще можно оптимизировать код так:


if Edit2.Text<> "" then
begin
with dm1.q1 do
begin
Close;
Sql.Clear;
Sql.Add("select * from streets where name = :name");
Prepare;
ParamByName("name").asstring := edit2.text;
Open;
strId := dm1.q1.FieldByName("idstreet").AsInteger;
end;
end;



 
Котелок   (2001-12-04 08:15) [5]

>Kaif
Гык... Я сначала так и делал, но потом пришлось отказаться т.к.
Параметры я получаю из динамически создоваемой формы. Например юзверь нажал кнопку поиск. Выскочила форма, он ввёл условия поиска. Я создал этот самый запрос, и уничтожил форму. А затем допустим тот-же самый юзверь решил отсортировать результат поиска по другому полю. И что мне делать в этом случае? Вот я через такой огород и полез. Запрос сохраняется в переменно в основной форме.
ЗЫ: Как пользоватся parambyname я знаю....;-)... И честно говоря предпочитаю этот путь.

>ilysha
Не знаю, я в своё время в паре статей видел предостережение не использовать конструкцию with при работе с базами данных. Хотя может и не прав...


 
kaif   (2001-12-04 16:10) [6]

Ну так сохрани параметры в каких-то переменных и переподставляй их сколько угодно раз, после замены текста запроса в отношении ORDER BY. Хотя в принципе, ничего плохого и в твоем варианте я не вижу. За оптимальностью кода гнаться не надо. Но за понятностью и обозримостью стоит. Вдруг понадобится через месяц вернуться к этой программе? Иногда важно свое будущее рабочее время сэкономить. Самый лучший вариант - вообще написать универсальную процедуру, которая что-то подобное делает.



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

Форум: "Базы";
Текущий архив: 2002.01.08;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.006 c
6-22302
Игорь
2001-10-11 20:10
2002.01.08
Сокеты в Delphi


6-22281
Verona
2001-10-04 12:22
2002.01.08
Отправка сообщений на e-mail


1-22234
x000d
2001-12-17 01:34
2002.01.08
Активное ,не активное.


4-22505
Delphi5.01
2001-11-07 20:14
2002.01.08
Проблемма с BitMap-ом


14-22342
Дремучий
2001-11-05 18:52
2002.01.08
Конкурс! Обои для игры (сайта) Sea Fight!





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский