ホーム
Top.Mail.Ru Yandeks.Metrika
フォーラム: "Bases";
現在のアーカイブ:2002.01.08;
ダウンロード:[xml.tar.bz2];

ダウン

最適化についての抽象的な質問。 似ている枝を探す


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

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

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

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

procedure TFSearch.BitBtn3Click(Sender: TObject);
VAR
s:文字列
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;
終わり

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;
終わり

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+"*""";
終わり
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;
終わり



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]

「order by otd.home」を追加した後、ParamByNameは常に有効にできます。 クエリへのパラメータの転送の使用を開始します(このため、「:myparam」の前に2つのドットが付いた名前のテキストにラベルを付けるだけで十分です)。 あなたはすぐにそれが非常に快適でスタイリッシュであることを見るでしょう。 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 全枝

フォーラム: "Bases";
現在のアーカイブ:2002.01.08;
ダウンロード:[xml.tar.bz2];

2階









メモリ:0.85 MB
時間:0.038 c
7-22437
パラドックス
2001-09-25 18:48
2002.01.08
wavファイル


6-22283
ユラズ
2001-10-08 11:05
2002.01.08
標準的な方法に加えて、どうやってネットワークプリンタを接続することもできますか?


1-22102
Andrey196
2001-12-19 18:43
2002.01.08
人々の画像がTIF画像を表示したくない理由


6-22315
マーサー
2001-08-01 16:04
2002.01.08
SMSメッセージ


3-21961
シャーク
2001-12-03 20:29
2002.01.08
SQLに空のクエリパラメータ値が存在できるかどうか





アフリカーンス語 アルバニア語 Arabic アルメニア語 アゼルバイジャン語 バスク ベラルーシ Bulgarian カタロニア語 中国語(簡体字) 中国語(繁体字) クロアチア チェコ語 デンマーク語 Dutch 英語 エストニア語 タガログ語 Finnish フランス語
ガリシア語 ジョージアン ドイツ語 ギリシャ語 ハイチ語 ヘブライ語 ヒンディー語 ハンガリー語 アイスランド語 Indonesian アイリッシュ イタリア語 日本語 Korean ラトビア語 リトアニア マケドニア語 Malay マルタ語 Norwegian
ペルシア語 ポリッシュ ポルトガル語 ルーマニア Russian セルビア Slovak スロベニア語 スペイン語 スワヒリ語 Swedish Thai トルコ語 ウクライナ語 ウルドゥー語 ベトナム語 ウェールズ語 イディッシュ語 ベンガル語 ボスニア語
セブアノ語 エスペラント グジャラート語 ハウサ語 モン族 イボ ジャワ語 カンナダ語 クメール語 ラオ語 ラテン マオリ語 マラーティー語 モンゴル語 ネパール語 パンジャブ語 ソマリ タミル語 テルグ語 ヨルバ語
ズールー語
Английский Французский Немецкий Итальянский ポルトガル語 Русский Испанский