منزل
Top.Mail.Ru Yandeks.Metrika
المنتدى: "القواعد";
الأرشيف الحالي: 2002.01.08;
تنزيل: [xml.tar.bz2];

إلى

سؤال مجرد عن التحسين. البحث عن فروع مماثلة


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

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

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

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

procedure TFSearch.BitBtn3Click(Sender: TObject);
فار
s: string؛
katId, strId : integer;
filt : string;
بدأ
إذا edit2.text <> "" بعد ذلك
بدأ
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;
الغاية؛

إذا edit3.text <> "" بعد ذلك
بدأ
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;
الغاية؛

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";

إذا edit1.text <> "" بعد ذلك
بدأ
sqlsearch := sqlsearch +" and pre.name like" +" ""*"+edit1.text+"*""";
الغاية؛
إذا edit4.text <> "" بعد ذلك
sqlsearch := sqlsearch +" and otd.home = "+ """"+edit4.text+"""";
إذا edit5.text <> "" بعد ذلك
sqlsearch := sqlsearch +" and otd.office = "+""""+edit5.text+"""";
إذا edit6.text <> "" بعد ذلك
sqlsearch := sqlsearch +" and otd.name like "+"""*"+edit6.text+"*""";
إذا edit7.text <> "" بعد ذلك
sqlsearch := sqlsearch +" and otd.phone like "+"""*"+edit7.text+"*""";

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

filt := "";
إذا edit2.text <> "" بعد ذلك
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;
الغاية؛



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 سيعمل بشكل إنساني. بعد ذلك ، يكون الإعداد Precept المنطقي فقط إذا قمت بإرسال معلمات مختلفة إلى الطلب بنفس النص وأعد فتح الطلب (اقرأ عن 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 ميغابايت
الوقت: 0.036 ج
14-22416
عدو
2001-11-14 11:47
2002.01.08
بحاجة الى برنامج من هذا النوع


1-21999
فيل
2001-12-15 02:02
2002.01.08
C ++ أو دلفي


4-22472
يوجين
2001-10-27 17:03
2002.01.08
كيفية جعل خادم وكيل الخاص بك قليلا؟


1-22178
اناستازيا
2001-12-15 21:38
2002.01.08
بحاجة الى معلومات!


1-22133
دودة الرمل
2001-12-19 14:55
2002.01.08
هيكل





الأفريكانية الألبانية عربي الأرميني أذربيجان الباسكي البيلاروسية Bulgarian التشيكية الصينية المبسطة) تقاليد صينية) الكرواتية التشيكية دانماركي Dutch أنجليزي الإستونية الفلبينية Finnish جيب
الجاليكية الجورجية الألمانيّة اليونانيّة الكريولية الهايتية اللغة العبرية الهندية الهنغارية أيسلندي Indonesian الأيرلندية Italian اليابانيّة الكوريّة اللاتفية اللتوانية المقدونية الملايو المالطية Norwegian
اللغة الفارسية بولنديّة البرتغاليّة رومانية Russian صربي السلوفاكيّة سلوفيني إسباني السواحيلي Swedish Thai التركية الأوكراني الأردية الفيتنامية ويلزي اليديشية البنغالي البوسنية
السيبيونو الاسبرانتو الغوجاراتية الهوسا همونغ الإيبو جاوي الكانادا الخمير لاو لاتينية الماوري المهاراتية المنغولية النيبالية البنجابية الصومالية التاميل التيلجو اليوروبا
زولو
Английский Французский ألماني Итальянский البرتغالية Русский Испанский