Головна сторінка
Top.Mail.Ru Яндекс.Метрика
Форум: "Бази";
Поточний архів: 2002.01.08;
Завантажити: [xml.tar.bz2];

Вниз

Абстрактний питання про оптимізацію. Знайти схожі гілки


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

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

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

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

procedure TFSearch.BitBtn3Click(Sender: TObject);
було
s: string;
katId, strId : integer;
filt : string;
починати
if edit2.text <> "" then
починати
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
починати
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
починати
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
починати
dm1.qSearch.Filter := filt;
dm1.qSearch.Filtered := true;
кінець
ще
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.85 MB
Час: 0.036 c
14-22322
дрімучий
2001-11-03 14:10
2002.01.08
Хто візьметься зробити? Стати в нагоді всім.


14-22397
мертвий
2001-11-10 18:49
2002.01.08
У кого- нибудь есть GIF или JPG контурной карты мира?


14-22352
Кречет
2001-11-02 13:04
2002.01.08
У нас всі ходи записані !!!


3-21956
Севостьянов Ігор
2001-12-05 17:56
2002.01.08
Програмно виконати SHUTDOWN IMMEDIATE


6-22282
Mamed
2001-10-08 10:08
2002.01.08
ПОМОЩ ПОМОЩ !!! до 01 / 11 Як Написати програму для роботи в Pocket CE?





африкаанс албанський арабська вірменин азербайджанець баскський білоруський болгарська каталонський Китайська (спрощене письмо) Китайський традиційний) хорватський чеська данську мову нідерландський Ukranian естонець Філіппінська фінську мову французький
галісійська грузинський німецький грецький гаїтянський креольський давньоєврейську хінді угорський ісландський індонезієць ірландський італійський японський корейський латиська литовець македонець малайський мальтійський норвежець
перс полірування португальська румунський російська сербський словацький словенський іспанська суахілі шведську мову тайський турецька український урду в&#39;єтнамський валлійський ідиш бенгальський боснійський
кебуано есперанто гуджараті хауса хмонг ігбо яванський каннада кхмерская Лао латинь маорі маратхі монгольський непальська панджабі сомалійський тамільська телугу йоруба
зулуський
Англійська Французький Німецький Італійський Португальська Русский Іспанська