Форум: "Базы";
Текущий архив: 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.011 c