Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 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. Хотя в принципе, ничего плохого и в твоем варианте я не вижу. За оптимальностью кода гнаться не надо. Но за понятностью и обозримостью стоит. Вдруг понадобится через месяц вернуться к этой программе? Иногда важно свое будущее рабочее время сэкономить. Самый лучший вариант - вообще написать универсальную процедуру, которая что-то подобное делает.




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




Наверх





Память: 0.74 MB
Время: 0.024 c
6-22278           garage                2001-10-02 12:27  2002.01.08  
Подскажите алгоритм замены больших букв на маленькие


4-22468           Zabl                  2001-11-02 11:56  2002.01.08  
Утечка памяти


1-22237           PVR                   2001-12-16 17:20  2002.01.08  
TListView помогите сортировать


7-22427           KLM                   2001-09-20 06:34  2002.01.08  
Защита программы от копирования


14-22365          Ketmar                2001-10-16 06:22  2002.01.08  
вот интересно: из Симферополя я тут один?