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

ダウン

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


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

質問は...

以下のコードは何らかの形で最適化することができます.... ???

そして、彼は書いて、私は夢中になりました。 私は他に何も考えられない....:-(((

procedure TFSearch.BitBtn3Click(送信者:TObject);
VAR
s:文字列
katId、strId:整数;
filt:文字列;
始まる
edit2.text <> ""の場合
始まる
dm1.q1.close;
dm1.q1.sql.clear;
dm1.q1.sql.add( "select * from streets name 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:= "選択" +
「otd.predpr」+
「otd.otdid」+
「pre.idPredpr」、+
「otdnameをotdnameとして」、+
「otd.phone」+
「pre.katalog」、+
「otd.kindid」+
「orgnameとしてのpre.name」、+
「otd.home」+
「otd.office」+
「通りとしてのstr.name」、+
「(katからIdkat = pre.katalogの名前を選択)katalとして」、+
「kat.name as kateg」+
「from」+
「otdel otd」+
「predpr pre」+
「ストリートストリート、カテゴルキャット」+
「where otd.predpr = pre.IdPredprおよびotd.kindId = kat.idkatおよび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 <> "")および(edit2.text <> "")then
filt:= filt + "and kateg =" "" + edit3.text + "" "";
if(edit3.text <> "")および(edit2.text = "")then
filt:= filt + "kateg =" "" + edit3.text + "" "";
dm1.qSearch.open;
filt <> ""の場合
始まる
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( "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]

次のようにコードを最適化することもできます。

Edit2.Text <> ""の場合 始める dm1.q1で 始める 閉じる Sql.Clear; Sql.Add( "select * from streets from name =:name"); 準備する ParamByName( "name")。Asstring:= edit2.text; 開く strId:= dm1.q1.FieldByName( "idstreet")。AsInteger; 終わり; 終わり;



Котелок   (2001-12-04 08:15) [5]

>カイフ
Gyk ...最初はそうしましたが、それから拒否しなければなりませんでした。
動的に作成されたフォームからパラメーターを取得します。 たとえば、ユーザーが検索ボタンをクリックしました。 フォームが表示され、検索語を入力しました。 このリクエストを作成し、フォームを破棄しました。 そして、同じユーザーが検索結果を別のフィールドでソートすることにしたとしましょう。 この場合、どうすればよいですか? それで、私はそのような庭を通って登りました。 要求はメインフォームの変数に保存されます。
PS:parambynameの使用方法を知っています.... ;-) ...そして正直なところ、私はこの方法を好みます。

>イリーシャ
いくつかの記事で、データベースを操作するときにwithコンストラクトを使用しないようにという警告を見たことがあります。 正しくないかもしれませんが...



kaif   (2001-12-04 16:10) [6]

ORDER BYに関してクエリテキストを置き換えた後、いくつかの変数にパラメーターを保存し、必要なだけ何度でも再配置します。 原則として、あなたのバージョンには何も悪いことはありませんが、私にはわかりません。 コードの最適性を追求する必要はありません。 しかし、それは明快さと可視性の略です。 1か月後にこのプログラムに戻る必要がある場合はどうなりますか? 将来の作業時間を節約することが重要な場合があります。 最適なオプションは、同様のことを行うユニバーサルプロシージャを記述することです。



ページ: 1 全枝

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

2階





メモリ:0.58 MB
時間:0.025 c
1-22243
ガンバート - ガンバート
2001-12-16 22:22
2002.01.08
Delphiでn番目の学位のルートを取得する方法は?


14-22392
〜マグ〜
2001-11-10 13:27
2002.01.08
Windowsでレジストリのロックを解除する方法???


1-22001
Socol
2001-12-15 15:55
2002.01.08
アナトリーポドゴレツキー


14-22393
フェリックス
2001-11-08 21:54
2002.01.08
何をしますか?


14-22412
フィッシュカ
2001-11-12 14:50
2002.01.08
オペレータの便宜のためのコンポーネントとその場所(Delphi 3)





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