Casa
Top.Mail.Ru Yandeks.Metrika
Fórum: "Bases";
Arquivo atual: 2002.01.08;
Download: [xml.tar.bz2];

Para baixo

Отвлечённый вопрос про оптимизацию. Encontre agências semelhantes


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

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

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

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

procedure TFSearch.BitBtn3Click(Sender: TObject);
var
s: string;
katId, strId : integer;
filt : string;
começar
se edit2.text <> "" então
começar
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;

se edit3.text <> "" então
começar
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";

se edit1.text <> "" então
começar
sqlsearch := sqlsearch +" and pre.name like" +" ""*"+edit1.text+"*""";
end;
se edit4.text <> "" então
sqlsearch := sqlsearch +" and otd.home = "+ """"+edit4.text+"""";
se edit5.text <> "" então
sqlsearch := sqlsearch +" and otd.office = "+""""+edit5.text+"""";
se edit6.text <> "" então
sqlsearch := sqlsearch +" and otd.name like "+"""*"+edit6.text+"*""";
se edit7.text <> "" então
sqlsearch := sqlsearch +" and otd.phone like "+"""*"+edit7.text+"*""";

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

filt := "";
se edit2.text <> "" então
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
começar
dm1.qSearch.Filter := filt;
dm1.qSearch.Filtered := true;
final
outro
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 filial inteira

Fórum: "Bases";
Arquivo atual: 2002.01.08;
Download: [xml.tar.bz2];

em cima









Memória: 0.85 MB
Hora: 0.04 c
1-22178
Anastasia
2001-12-15 21:38
2002.01.08
Precisa de informações!


14-22374
Nikols
2001-11-01 16:03
2002.01.08
Como os programadores descansam? E quando?


14-22363
Denso
2001-11-02 18:16
2002.01.08
Bem ...


14-22391
Serg5
2001-11-10 10:29
2002.01.08
Quem não é preguiçoso, vá para http://forum.ru-board.com/, ele realmente trava, ou filtragem de IP, eles não me deixam.


1-22053
Greenrul
2001-12-18 19:29
2002.01.08
ANTIALSING para fontes TTF.





afrikaans albanês Arabic armênio azerbaijano basco belarusian Bulgarian catalão Chinês simplificado) Chinês tradicional) croata checo dinamarquês Dutch Inglês estoniano filipino Finnish French
Galego georgiano German grego crioulo haitiano hebraico hindi húngaro islandês Indonesian irlandês Italian Japanese Korean letão lituano macedónio Malay maltês Norwegian
persa polonês Portuguese romeno Russa sérvio Slovak esloveno espanhol swahili sueco tailandês turco ucraniano urdu vietnamita galês ídiche bengali bósnio
cebuano esperanto gujarati hausa hmong igbo javanês kannada khmer lao latino maori marata mongol Nepali punjabi somali tâmil telugu yoruba
zulu
Английский francês Alemão Italiano Португальский russo Espanhol