Головна сторінка
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.59 MB
Час: 0.035 c
1-22158
Praco
2001-12-20 16:29
2002.01.08
TCustomGrid і все його нащадки ...


1-22010
dorixe
2001-12-17 19:21
2002.01.08
treeview on dblclick


1-22216
Ghost_Old.
2001-12-16 14:43
2002.01.08
Помогіте..кто знає як отримати завтрашню дату ..


1-22110
Катерина
2001-12-19 18:09
2002.01.08
слізно прошу допомогти


7-22429
Oleg_swap
2001-09-20 19:13
2002.01.08
віддалений запуск програми





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