Laboratory of Mobile Agricultural Chemicals Searcher
携帯農薬検索実験室

研究会

  ツリー表示 ┃スレッド表示 ┃一覧表示 ┃トピック表示 ┃番号順表示 ┃検索  
49 / 114 ツリー <前へ | 次へ>

〔581〕ACFinder 070318版 kabe (07/03/18 22:36)
〔582〕Re:ACFinder 070318版 kabe (07/03/19 9:22)
〔584〕Re:ACFinder 070318版 Hidemi Oya (07/03/19 13:41)
〔585〕Re:ACFinder 070318版 kabe (07/03/19 15:06)
〔588〕ACFinder 070319版 kabe (07/03/20 0:03)
〔590〕Re:ACFinder 070319版 kabe (07/03/20 0:08)
〔592〕Re:ACFinder 070319版 Hidemi Oya (07/03/20 0:49)
〔611〕ACFinder 070319版の薬剤タブで Hidemi Oya (07/03/24 19:05)
〔606〕行選択モードの横スクロール Hidemi Oya (07/03/23 17:22)
〔608〕Re:行選択モードの横スクロール kabe (07/03/23 22:34)
〔586〕検索の高速化 Hidemi Oya (07/03/19 22:30)
〔587〕Re:検索の高速化 Hidemi Oya (07/03/19 22:36)
〔589〕開発者モードが欲しい Hidemi Oya (07/03/20 0:05)
〔594〕Re:開発者モードが欲しい kabe (07/03/20 0:52)
〔595〕Re:開発者モードが欲しい kabe (07/03/20 0:56)
〔597〕Re:開発者モードが欲しい Hidemi Oya (07/03/20 9:51)
〔598〕Re:開発者モードが欲しい kabe (07/03/20 13:31)
〔599〕Re:開発者モードが欲しい Hidemi Oya (07/03/20 23:24)
〔591〕Re:検索の高速化 kabe (07/03/20 0:17)
〔593〕Re:検索の高速化 Hidemi Oya (07/03/20 0:52)
〔600〕テンポラリーテーブルを使うなら Hidemi Oya (07/03/20 23:43)
〔601〕Re:テンポラリーテーブルを使うなら kabe (07/03/22 20:54)
〔602〕Re:テンポラリーテーブルを使うなら Hidemi Oya (07/03/22 21:35)
〔603〕Re:テンポラリーテーブルを使うなら kabe (07/03/22 22:39)
〔607〕Re:テンポラリーテーブルを使うなら Hidemi Oya (07/03/23 21:35)
〔596〕Re:検索の高速化 Hidemi Oya (07/03/20 1:07)
〔604〕070323test版 kabe (07/03/23 9:15)
〔605〕Re:070323test版 Hidemi Oya (07/03/23 16:58)
〔609〕Re:070323test版 Hidemi Oya (07/03/24 0:27)
〔613〕Re:070323test版 kabe (07/03/25 9:48)
〔614〕Re:070323test版 kabe (07/03/25 17:36)
〔615〕Re:070323test版 Hidemi Oya (07/03/25 21:43)
〔616〕Re:070323test版 Hidemi Oya (07/03/25 22:21)
〔617〕Re:070323test版 Hidemi Oya (07/03/25 22:38)
〔619〕Re:070323test版 Hidemi Oya (07/03/26 0:51)
〔621〕Re:070323test版 Hidemi Oya (07/03/26 23:16)
〔625〕Re:070323test版 kabe (07/03/27 9:40)
〔627〕Re:070323test版 kabe (07/03/27 21:13)
〔628〕Re:070323test版 kabe (07/03/27 21:15)
〔618〕Re:070323test版 Hidemi Oya (07/03/25 23:21)
〔620〕Re:070323test版 Hidemi Oya (07/03/26 22:11)
〔622〕Re:070323test版 Hidemi Oya (07/03/26 23:28)
〔626〕Re:070323test版 kabe (07/03/27 14:00)
〔610〕070323test版用テンプレート Hidemi Oya (07/03/24 18:46)
〔612〕クエリ埋め込み開発者モード Hidemi Oya (07/03/24 21:58)

〔581〕ACFinder 070318版
 kabe  (07/03/18 22:36)

引用なし
   kabe です。

070318版をアップしました。
http://acfinder.kabe.info/

/fオプションで起動した場合、オフライン作業の設定値を保存しないよう変更しました。
なお/fオプションで起動した場合でもメニューからオフライン作業の切り替え操作を行った場合には保存されます。

薬剤タブの操作方法を一部変更しました。
従来の名称タブを通称タブに変更し、薬剤名、作物名での絞り込み結果を、通称タブ、登録番号タブで切り替えて参照できます。
作物名の絞り込みは、作物タブと同様に複数作物の指定を行えるよう修正しました。
作物選択ダイアログから上位分類を含めた作物名を指定できます。
ただし作物タブと同様に regexp演算子を使用しているため、作物名を指定すると以前より検索に時間がかかります。

070312付け特定作物系テンプレート改訂版を添付しました。

〔582〕Re:ACFinder 070318版
 kabe  (07/03/19 9:22)

引用なし
   kabe です。

>070318版をアップしました。
すいません、FTPしたと思ったのですがされてませんでした。
昨晩 Not Found に遭遇した方には失礼しました。
今朝、再アップしましたので、ダウンロード可能になっています。

〔584〕Re:ACFinder 070318版
 Hidemi Oya WEB  (07/03/19 13:41)

引用なし
   kabe さん、こん**は。Hidemi Oya です。

 ACFinder のアップデート、ありがとうございました。私の方は [#583] に書いたような理由で、InetUtil の更新が遅れています(^_^;)。

>従来の名称タブを通称タブに変更し、薬剤名、作物名での絞り込み結果を、通称タブ、登録番号タブで切り替えて参照できます。
 JAなんかで最新適用についてチェックしたい場合などは、登録番号で入力した方が簡単です。しかし、現在の仕様では一度検索してしまうと、別の農薬を登録番号で確認したいと思っても登録番号で検索できません。
 登録番号タブに、検索結果をクリアして全農薬を再表示するか、入力番号で再検索する機能があると良さそうです(この場合、通称タブと登録番号タブの内容が一致しなくなりますが)。一番良いのは、薬剤候補に登録番号も入力可能にする方法ですが、名称・通称等は部分一致検索、登録番号は完全一致検索になるので、プログラムの修正が必要になりますね。StrToIntDef 関数で、デフォルトを -1 とかにしておけば、正数が取得できた場合は登録番号による完全一致検索、負数の場合は 名称・通称等による部分一致検索と切り分けることは可能です。

 話は変わりますが、薬剤候補に「アファーム」と入力して検索すると、登録番号タブに「21853 アファームエクセラ顆粒水和剤」が2つ表示されます。登録番号タブ表示用の検索に DISTINCT がないのが原因かな…。

>作物名の絞り込みは、作物タブと同様に複数作物の指定を行えるよう修正しました。
>作物選択ダイアログから上位分類を含めた作物名を指定できます。
 これは要望しようと思っていた機能なので、非常にありがたいです。作物別防除資料のチェックをするときに、特にマイナークロップなどでは上位分類の農薬も記載されていることが多いので、作物名をその都度変更しなければならず不便だったのが解消されます。

〔585〕Re:ACFinder 070318版
 kabe  (07/03/19 15:06)

引用なし
   >Hidemi Oyaさん

kabe です。

> 話は変わりますが、薬剤候補に「アファーム」と入力して検索すると、登録番号タブに「21853 アファームエクセラ顆粒水和剤」が2つ表示されます。登録番号タブ表示用の検索に DISTINCT がないのが原因かな…。
すいません。2成分以上含む薬剤は全て成分の数だけ同じ登録番号の薬剤が表示されてしまうようです。
検索対象とするテーブルを間違えました。
多分 m_kihon を使っているつもりで DISTINCT しなかったんでしょう。

これについては今晩修正します。

〔586〕検索の高速化
 Hidemi Oya WEB  (07/03/19 22:30)

引用なし
   kabe さん、こん**は。Hidemi Oya です。

>ただし作物タブと同様に regexp演算子を使用しているため、作物名を指定すると以前より検索に時間がかかります。
 テンポラリーテーブルを作ると、高速になります。たとえば、薬剤候補を検索する時点で、
DROP TABLE IF EXISTS tempyakuzai;
CREATE TEMP TABLE tempyakuzai AS SELECT * FROM tekiyo WHERE meisho||shurui MATCH '%薬剤名%';
を実行して、以後の SQL は tempyakuzai に対して
SELECT DISTINCT tsusho FROM tempyakuzai WHERE sakumotsu REGEXP ...
SELECT DISTINCT bango, meisho FROM tempyakuzai WHERE sakumotsu REGEXP ...
SELECT sakumotsu, byochu, mokuteki, ... FROM tempyakuzai WHERE bango = ...
などを発行すれば OK です。
 なお、SQLite3 の標準状態ではメモリ上にテンポラリーテーブルを作成するので、ACFinder の終了時に DROP TABLE する必要はないはずです。

 作物タブでも同様にテンポラリーテーブルを使えば、薬剤タブよりも効果が大きいはずです。まず、作物名で検索する段階で
DROP TABLE IF EXISTS tempsakumotsu;
CREATE TEMP TABLE tempsakumotsu AS SELECT * FROM vTsushoTekiyo WHERE sakumotsu REGEXP ...;
SELECT * FROM tempsakumotsu;
を実行しておき、コンボボックスにセットする値は
SELECT DISTINCT byochu FROM tempsakumotsu
SELECT DISTINCT mokuteki FROM tempsakumotsu
などの SQL で取得すれば、現状の約 1/3 で検索が終了します。

 3/22 に埼玉県の農薬飛散防止技術緊急実証事業の担当者会議があり、そこで ACFinder のデモを行うので、もし可能ならそれに間に合わせてもらえると大変ありがたいです。

〔587〕Re:検索の高速化
 Hidemi Oya WEB  (07/03/19 22:36)

引用なし
   補足です。

 ExecSQL メソッドは、SQL 文をセミコロンで区切ることにより、複文を一括実行できると思ってたんですが、1文ごとに ExecSQL を実行しないとダメかも…。

〔588〕ACFinder 070319版
 kabe  (07/03/20 0:03)

引用なし
   070819版をアップしました。
http://acfinder.kabe.info/

>Hidemi Oyaさん

> 一番良いのは、薬剤候補に登録番号も入力可能にする方法ですが、名称・通称等は部分一致検索、登録番号は完全一致検索になるので、プログラムの修正が必要になりますね。StrToIntDef 関数で、デフォルトを -1 とかにしておけば、正数が取得できた場合は登録番号による完全一致検索、負数の場合は 名称・通称等による部分一致検索と切り分けることは可能です。
これを採用させていただきました。

登録番号タブのバグも修正しました。

〔589〕開発者モードが欲しい
 Hidemi Oya WEB  (07/03/20 0:05)

引用なし
   kabe さん、こん**は。Hidemi Oya です。

 検索高速化を確認するのに、ACFinder の SQL タブでは CREATE コマンド等に制限がかかっているので、自前のソフトで行いました。
 できれば、起動オプションに /d なんて付ければ、開発者モードになって SQL が制限無く使えるとありがたいです。暇なときで結構ですので、御一考ください。

〔590〕Re:ACFinder 070319版
 kabe  (07/03/20 0:08)

引用なし
   kabeです。

追加です。
薬剤候補に >20000 と入れると
登録番号 20000 以降の薬剤を表示します。
範囲指定もしたいところですが、それは今後の課題ということで…

〔591〕Re:検索の高速化
 kabe  (07/03/20 0:17)

引用なし
   >Hidemi Oyaさん

kabe です。

作業用テーブル案、取り組んでみます。

> 3/22 に埼玉県の農薬飛散防止技術緊急実証事業の担当者会議があり、そこで ACFinder のデモを行うので、もし可能ならそれに間に合わせてもらえると大変ありがたいです。
21日に私用で出かけなくてはならず、可能性は低いです。(^^;

〔592〕Re:ACFinder 070319版
 Hidemi Oya WEB  (07/03/20 0:49)

引用なし
   kabe さん、こん**は。Hidemi Oya です。

 早速のアップデート、お疲れ様でした。

>薬剤候補に >20000 と入れると
>登録番号 20000 以降の薬剤を表示します。
 指定作物に登録がある比較的新しい農薬を調べたいときなんかには、結構便利かも。'<10000' だと登録番号が 10000 以下の農薬が検索できることも確認しました。あえて、古い農薬のみを調べたいことはあまりないかもしれませんが…。
 それと、'>20000' のように全角でも OK なんですね。すばらしい! 薬剤候補は IME が自動オンになるので、こういう細かな配慮が使い勝手を大きく左右します。

〔594〕Re:開発者モードが欲しい
 kabe  (07/03/20 0:52)

引用なし
   >Hidemi Oyaさん

kabe です。

> できれば、起動オプションに /d なんて付ければ、開発者モードになって SQL が制限無く使えるとありがたいです。
ダウンロードページに開発者バージョンをアップしました。
EXEファイルのみです。

〔593〕Re:検索の高速化
 Hidemi Oya WEB  (07/03/20 0:52)

引用なし
   kabe さん、こん**は。Hidemi Oya です。

>作業用テーブル案、取り組んでみます。
 検索高速化にはかなり効果がありそうですし、SQL を発行する部分だけ若干修正すればすみますから、ぜひよろしくお願いします。

>21日に私用で出かけなくてはならず、可能性は低いです。(^^;
 了解しました。

〔595〕Re:開発者モードが欲しい
 kabe  (07/03/20 0:56)

引用なし
   >Hidemi Oyaさん

kabe です。

とりあえず今のところ create drop delete update を含む場合に ExecSQLを実行するようにしてます。他のコマンドで必要なものがあれば追加します。

〔596〕Re:検索の高速化
 Hidemi Oya WEB  (07/03/20 1:07)

引用なし
   もうひとつ補足です。

> なお、SQLite3 の標準状態ではメモリ上にテンポラリーテーブルを作成するので、ACFinder の終了時に DROP TABLE する必要はないはずです。
 確認していませんが、ACFinder の終了時に TSQLiteDb オブジェクトを Free (=開いているデータベースのクローズ)し忘れると、メモリリークが発生するかも…。

〔597〕Re:開発者モードが欲しい
 Hidemi Oya WEB  (07/03/20 9:51)

引用なし
   kabe さん、こん**は。Hidemi Oya です。

早速ご対応いただき、大変ありがとうございました。

>とりあえず今のところ create drop delete update を含む場合に ExecSQLを実行するようにしてます。他のコマンドで必要なものがあれば追加します。
 当面は create, drop が使えれば十分だと思いますが、あと insert, replace が使えると(すでに使えるのかな?)さらに good ですね。
 それよりも、SQL の実行時間をどこかに表示してくれる機能があると、検索時間の評価がしやすいですね。

 ところで、/d モードでも制限を付けるよりは、/d モードはノーチェックで SQL を通した方が搭載が簡単じゃないですか?

〔598〕Re:開発者モードが欲しい
 kabe  (07/03/20 13:31)

引用なし
   >Hidemi Oyaさん

kabe です。

> それよりも、SQL の実行時間をどこかに表示してくれる機能があると、検索時間の評価がしやすいですね。
ログに表示するようにします。

> ところで、/d モードでも制限を付けるよりは、/d モードはノーチェックで SQL を通した方が搭載が簡単じゃないですか?
ExecSQL と GetTable のどちらを実行するかで、ExecSQL を実行する文を判別するために文字列チェックしてましたが、文頭に select がある場合だけ GetTable を実行して、それ以外は ExecSQL を実行した方が簡単ですね。
select 以外では PRAGMA table_info とか PRAGMA index_list あたりはGetTableする必要がありますね。

〔599〕Re:開発者モードが欲しい
 Hidemi Oya WEB  (07/03/20 23:24)

引用なし
   kabe さん、こん**は。Hidemi Oya です。

>ログに表示するようにします。
 ぜひお願いします。

>ExecSQL と GetTable のどちらを実行するかで、ExecSQL を実行する文を判別するために文字列チェックしてましたが、文頭に select がある場合だけ GetTable を実行して、それ以外は ExecSQL を実行した方が簡単ですね。
 あらためて SQLite.pas を確認したら、GetTable でテーブルを返さないクエリーを実行しても、ヌルテーブルが返ってくるだけで、特に問題はなさそうです。今のところ、ExecSQL も単文しか実行できないので、GetTable と ExecSQL の違いは返り値をあとで利用するかしないかの差しかないということになります。
 したがって、SQL タブでは、SELECT 文以外も GetTable で処理しちゃうのが面倒がなくて良いと思います。

>select 以外では PRAGMA table_info とか PRAGMA index_list あたりはGetTableする必要がありますね。
 もし前述のように GetTable で全て代用するのではなく、ExecSQL と使い分けるのなら、PRAGMA コマンドは値設定がない場合は全てテーブルを返すので、PRAGMA 文の中に '=' を含む場合は ExecSQL、含まない場合は GetTable で良いと思います。

 なお、sqlite3_exec を使えば複文を一括実行できそうなので、そのうち ExecSQL を仕様変更しようと考えています。

〔600〕テンポラリーテーブルを使うなら
 Hidemi Oya WEB  (07/03/20 23:43)

引用なし
   kabe さん、こん**は。Hidemi Oya です。

 現在の作物タブは、用途と剤型は作物名と同様の検索条件として扱われるので、病害虫で絞り込んであっても、それがリセットされて再検索されてしまいます。病害虫や使用目的が絞り込みで、その下にある用途や剤型が再検索ってのは、ちょっと分かりづらいです。
 現状のように検索条件として使用するなら、用途/剤型と病害虫/使用目的の位置を入れ替えた方が分かりやすくなると思います。

 が、テンポラリーテーブルを使うなら、用途一覧や剤型一覧を取得するクエリを発行してもほとんど時間はかからないので、もう一歩進んで、病害虫や使用目的と同様に絞り込み条件として使えた方が便利で分かりやすいと思います。

〔601〕Re:テンポラリーテーブルを使うなら
 kabe  (07/03/22 20:54)

引用なし
   >Hidemi Oyaさん

kabe です。

> が、テンポラリーテーブルを使うなら、用途一覧や剤型一覧を取得するクエリを発行してもほとんど時間はかからないので、もう一歩進んで、病害虫や使用目的と同様に絞り込み条件として使えた方が便利で分かりやすいと思います。
現状では最終的に病害虫名で絞り込むことを想定しているので、用途を指定した場合は、指定した用途が存在する病害虫、使用目的を再検索するという仕様ですが、病害虫、使用目的の再検索は必要なし、最初に作物名を選択した状態でテンポラリーテーブルを作り、それを基に病害虫、使用目的、用途、剤型は同じレベルで AND 条件で絞り込めるようにするという解釈でよろしいですか。

〔602〕Re:テンポラリーテーブルを使うなら
 Hidemi Oya WEB  (07/03/22 21:35)

引用なし
   kabe さん、こん**は。Hidemi Oya です。

>病害虫、使用目的の再検索は必要なし、最初に作物名を選択した状態でテンポラリーテーブルを作り、それを基に病害虫、使用目的、用途、剤型は同じレベルで AND 条件で絞り込めるようにするという解釈でよろしいですか。
 そういうことです。病害虫/使用目的/用途/剤型は IN 演算子で検索できますし、元のテンポラリーテーブルが作物検索でレコード数が減少しているので、どれかを選択するたびに、他の3つを再検索しても時間はいくらもかかりません。
 ただ、用途に関しては対象病害虫を限定するための検索条件、剤型に関しては対象とする病害虫に目的の剤型があるとは限らないので絞り込み条件とした方が使いやすいかもしれないですね。この場合、下図のような並び順の方が分かりやすいと思います。

     検索条件              絞り込み
    ┌──────┐          ┌──────┐
作物名 │      │     病害虫雑草│     ▼│
    ├──────┤          ├──────┤
近接作物│      │□非表示 使用目的 │     ▼│
    ├──────┤          ├──────┤
用途  │      │     剤型   │     ▼│
    └──────┘          └──────┘

〔603〕Re:テンポラリーテーブルを使うなら
 kabe  (07/03/22 22:39)

引用なし
   >Hidemi Oyaさん

kabe です。

> ただ、用途に関しては対象病害虫を限定するための検索条件、剤型に関しては対象とする病害虫に目的の剤型があるとは限らないので絞り込み条件とした方が使いやすいかもしれないですね。
このあたりが良さそうです。

〔604〕070323test版
 kabe  (07/03/23 9:15)

引用なし
   kabeです。

作業テーブルを作成する実験をしています。
お試しにご協力ください。
http://acfinder.kabe.info/acfinder070323test.zip

薬剤タブの検索のみ作業テーブルを使っています。
薬剤タブで作物名をした場合の検索速度がいくらか向上しています。

あと、Hidemi Oya さん作成の新版SQLiteクラスを適用し、定型処理タブと 開発者モードで起動した場合のSQLタブで複文が実行できるようにしてあります。

〔605〕Re:070323test版
 Hidemi Oya WEB  (07/03/23 16:58)

引用なし
   kabe さん、こん**は。
異動が決まったというのに、子供が次々とインフルエンザに罹って毎日母ちゃんと午前/午後交代で休んでいる Hidemi Oya です。

>薬剤タブの検索のみ作業テーブルを使っています。
>薬剤タブで作物名をした場合の検索速度がいくらか向上しています。
 070319 版と比べると、作物を指定した状態で農薬を選択して適用を表示するときの速度は十分改善され、軽快といえるレベルになったと思います。が、最初に作物を指定したとき(tempsaku を作るとき?)は、砂時計が短くなったとはいえ、若干ストレスを感じます。
 テンポラリテーブルをどのように作成しているのかがログに表示されないので、詳細は分かりませんが、tempsaku はおそらく大きなテーブルから regexp を使った作物検索をして作ってるんですよね? これを、[#586] で書いたように、薬剤候補で検索したテンポラリテーブルを作成して、そこから作物検索をして通称タブや薬剤タブの一覧を取得するように変更すれば、速度はもっと改善できるのではないかと思います。問題は、tyakuzai との整合性がとれるかどうかですが…。

 ついでに、作物タブですが、[#586] で書いたように一気にテンポラリテーブルを作るよりは、次のように2段階に分けて作った方がわずかに速いようです。
 また、テンポラリテーブルを使用する場合、vTekiyo と vTsushoTekiyo の参照元テーブルをテンポラリーテーブルにしてやれば、通称モードと商品名モードを切り替えるたびに再検索する必要がなくなります。テンポラリーテーブルを参照元にできるかどうかは確認していませんが(^_^;)。

DROP TABLE IF EXISTS tsaku1;
DROP TABLE IF EXISTS tsaku2;
CREATE TEMP TABLE tsaku1 AS SELECT * FROM tekiyo WHERE sakumotsu REGEXP '(^|、|\()(作物リスト)';
CREATE TEMP TABLE tsaku2 AS SELECT * FROM tsaku1 WHERE sakumotsu NOT REGEXP '\((.*、)?(作物リスト)(、.*)?を除く';

 本題とは関係ありませんが、070323test 版では、作物候補に作物名を直接入力した場合、ログにクエリーが表示されません。

〔606〕行選択モードの横スクロール
 Hidemi Oya WEB  (07/03/23 17:22)

引用なし
   kabe さん、こん**は。Hidemi Oya です。

 行選択モードで、途中の列を表示している状態で特定行をクリック(ドラッグ)した場合、勝手に横スクロールしてしまい、見たいところが見えなくなってしまいます。これは非常に使いづらいので、なんとか自動横スクロールを抑制できないでしょうか?
 あるいは、セル選択モードのみにして、複数行にまたがるセルを選択している場合は複数行削除を可能にしてもらうのでも良いと思います。

〔607〕Re:テンポラリーテーブルを使うなら
 Hidemi Oya WEB  (07/03/23 21:35)

引用なし
   kabe さん、こん**は。Hidemi Oya です。

>> ただ、用途に関しては対象病害虫を限定するための検索条件、剤型に関しては対象とする病害虫に目的の剤型があるとは限らないので絞り込み条件とした方が使いやすいかもしれないですね。
>このあたりが良さそうです。

 用途に関しては、作物と同列の検索条件にするのではなく、作物と病害虫/使用目的/剤型の中間にするのが良さそうですね。

(1) テンポラリテーブル([#605] の例では tsaku2)は作物で検索した結果によって作成する。
(2) 用途は、tsaku2 から次のようなクエリーで選択リストを作成して絞り込めるようにする。病害虫/使用目的/剤型が選択されても影響は受けない。
SELECT DISTINCT yoto FROM tsaku2;
(3) 病害虫/使用目的/剤型は、用途と他の項目(病害虫なら使用目的/剤型)が選択されるたび、tsaku2 を再検索して選択リストを作成し直す。たとえば、用途が選択されると
SELECT DISTINCT byochu FROM tsaku2 WHERE yoto IN (選択用途リスト);
SELECT DISTINCT mokuteki FROM tsaku2 WHERE yoto IN (選択用途リスト);
SELECT DISTINCT zaikei FROM tsaku2 WHERE yoto IN (選択用途リスト);
で、病害虫/使用目的/剤型の選択リストを再作成。さらに、剤型が選択されると、
SELECT DISTINCT byochu FROM tsaku2 WHERE yoto IN (選択用途リスト) AND zaikei IN (選択剤型リスト);
SELECT DISTINCT mokuteki FROM tsaku2 WHERE yoto IN (選択用途リスト) AND zaikei IN (選択剤型リスト);
で病害虫/使用目的の選択リストを再作成。

〔608〕Re:行選択モードの横スクロール
 kabe  (07/03/23 22:34)

引用なし
   >Hidemi Oyaさん

kabe です。

> なんとか自動横スクロールを抑制できないでしょうか?
LeftColプロパティを制御できればよさそうなんですが、ちょっと試行錯誤してみます。

> あるいは、セル選択モードのみにして、複数行にまたがるセルを選択している場合は複数行削除を可能にしてもらうのでも良いと思います。
最初から、この方法が良かったかもしれません。
LeftColが制御できそうもなければこの方法にします。

〔609〕Re:070323test版
 Hidemi Oya WEB  (07/03/24 0:27)

引用なし
   自己レスです。
SQL タブで検索時間が表示されるようになったので、ちょっと確認してみました。

> ついでに、作物タブですが、[#586] で書いたように一気にテンポラリテーブルを作るよりは、次のように2段階に分けて作った方がわずかに速いようです。
 同じ2段階検索でも、下記のようにテンポラリテーブルを作らずに検索すると、[#586] の2倍くらいの時間がかかります。FROM 節に SELECT 文を書くような検索を行う場合は、必ずテンポラリテーブルを作るようにした方が良さそうです。
 どうも、FROM 節の SELECT 文で1行取得するたびに WHERE 節の条件判定を行っているようですね。いや、それにしても AND による条件判定の2倍もかかるというのは予想外でした。

DROP TABLE IF EXISTS tsaku;
CREATE TEMP TABLE tsaku AS SELECT * FROM
(SELECT * FROM tekiyo WHERE sakumotsu REGEXP '...') AS a
WHERE a.sakumotsu NOT REGEXP '...';

〔610〕070323test版用テンプレート
 Hidemi Oya WEB  (07/03/24 18:46)

引用なし
   >あと、Hidemi Oya さん作成の新版SQLiteクラスを適用し、定型処理タブと 開発者モードで起動した場合のSQLタブで複文が実行できるようにしてあります。
 この機能使ったテンプレートを作成しました。テンポラリテーブルを作成することで、複数作物農薬一覧系テンプレートに作物数フィールドが復活しています。
 それと、各テンプレートで検索速度がもっとも速くなるように WHERE 節の条件の並びを最適化しました。これにより、「その他」項目も常に AND 検索としたため、これまでのように先頭に AND を書くとエラーになります。

 なお、上記のような事情で .arg ファイルも一部修正したため、一式全てを同梱しています。

template070324.zip


〔611〕ACFinder 070319版の薬剤タブで
 Hidemi Oya WEB  (07/03/24 19:05)

引用なし
   kabe さん、こん**は。Hidemi Oya です。

 薬剤候補に農薬名や成分名を入力したときは検索後通称タブに、登録番号を入力したときは登録番号タブに自動的にアクティブコントロールが切り替わってくれると、さらに使いやすくなるのではないかと思いますが、いかがでしょう?

〔612〕クエリ埋め込み開発者モード
 Hidemi Oya WEB  (07/03/24 21:58)

引用なし
   kabe さん、こん**は。Hidemi Oya です。

 070324 版テンプレートでは、複数作物農薬一覧系テンプレートでテンポラリテーブルを使用しているので、非開発者モードでは SQL 編集でクエリをモディファイして実行することができなくなりました。
 そこでお願いですが、SQL タブでクエリの先頭行が「--/d」の場合、非開発者モードであってもそのクエリを一時的に開発者モード(クエリ制限無し、複文実行可)で実行できるようにしていただけないでしょうか。これが可能になれば、複数作物農薬一覧系テンプレートの先頭行に「--/d」を埋め込んでおくだけで、上記の問題が解決できます。
 なお、SQLite は「--」以降行末までをコメントと見なすので、「--/d」を含むクエリをそのまま渡しても問題ありません。

 これは急ぎではありませんので、暇なときにでも対応いただければと思います。

〔613〕Re:070323test版
 kabe  (07/03/25 9:48)

引用なし
   >Hidemi Oyaさん

kabe です。

>tempsaku はおそらく大きなテーブルから regexp を使った作物検索をして作ってるんですよね?
そうです。SELECT DISTINCT して登録番号だけ抜き出してます。
リストボックスに表示する際はこの登録番号を含む薬剤を m_kihon から作成ています。

> 薬剤候補で検索したテンポラリテーブルを作成して、そこから作物検索をして通称タブや薬剤タブの一覧を取得するように変更すれば、速度はもっと改善できるのではないかと思います。
薬剤候補と作物候補の両方を指定した場合は、かなり速度改善の目処がたちました。
tekiyo テーブルで match を使うと、この部分がけっこう時間がかかるので、1回 m_kihon から検索対象薬剤を抜き出してからやるとけっこう早いです。
DROP TABLE IF EXISTS t_tmp0;
CREATE TEMP TABLE t_tmp0 AS SELECT bango FROM m_kihon WHERE meisho||shurui MATCH '%すみちおん%';
DROP TABLE IF EXISTS t_yaku;
CREATE TEMP TABLE t_yaku AS SELECT * FROM tekiyo WHERE bango IN t_tmp0;
DROP TABLE IF EXISTS t_bango;
CREATE TEMP TABLE t_bango AS SELECT DISTINCT bango FROM t_yaku WHERE sakumotsu REGEXP '(^|、|\()(なす.*?)(\)|、|$)' AND sakumotsu NOT REGEXP '\((.*、)?(なす.*?)(、.*)?を除く' ORDER BY bango

> また、テンポラリテーブルを使用する場合、vTekiyo と vTsushoTekiyo の参照元テーブルをテンポラリーテーブルにしてやれば、通称モードと商品名モードを切り替えるたびに再検索する必要がなくなります。
なるほど。
現在はデータベース更新の際にビューを作成していますが、検索するたびにテンポラリテーブルからテンポラリビューを作成すればよさそうですね。
こちらはまだ試してませんが、試行錯誤してみます。

〔614〕Re:070323test版
 kabe  (07/03/25 17:36)

引用なし
   kabe です。

>現在はデータベース更新の際にビューを作成していますが、検索するたびにテンポラリテーブルからテンポラリビューを作成すればよさそうですね。
>こちらはまだ試してませんが、試行錯誤してみます。
どうも、テンポラリテーブルはビューの参照元にできないみたいです。
まあ、一時的な実テーブルを作ってもよいので、作物検索結果を元にした標準、通称表示切り替えができるようにしたいと思います。

〔615〕Re:070323test版
 Hidemi Oya WEB  (07/03/25 21:43)

引用なし
   kabe さん、こん**は。Hidemi Oya です。

>どうも、テンポラリテーブルはビューの参照元にできないみたいです。
 確かに、テンポラリテーブルを参照元とするパーマネントビューは作れませんでした(^_^;)。が、テンポラリテーブルを参照元とするテンポラリビューは作れました。
 なお、一度作ったテンポラリビューは、参照元のテンポラリテーブルの内容が変更されても作り替える必要はありません。ただし、参照元のテンポラリテーブルが存在していない段階で、先にテンポラリビューを作成することはできません。

>まあ、一時的な実テーブルを作ってもよいので、作物検索結果を元にした標準、通称表示切り替えができるようにしたいと思います。
 ってことで、下記のような対応は可能です。クエリに毎回 CREATE TEMP VIEW が入ってしまうのが難点ですが、一時的な実テーブルを後で削除する必要はなくなります。

DROP TABLE IF EXISTS tTbl;
CREATE TEMP TABLE tTbl AS SELECT * FROM tekiyo WHERE sakumotsu REGEXP ...;
CREATE TEMP VIEW IF NOT EXISTS vTekiyo AS SELECT ... FROM tTbl;
CREATE TEMP VIEW IF NOT EXISTS vTsushoTekiyo AS SELECT ... FROM tTbl;
SELECT * FROM vTshushoTekiyo;

〔616〕Re:070323test版
 Hidemi Oya WEB  (07/03/25 22:21)

引用なし
   kabe さん、こん**は。Hidemi Oya です。

>クエリに毎回 CREATE TEMP VIEW が入ってしまうのが難点ですが、一時的な実テーブルを後で削除する必要はなくなります。
 ACFinder の終了時に作物タブ/病害虫タブで最後に実行した一時的な実テーブルを作成するための検索パラメータを保存しておき、次回起動時にそれを復元するとともに、前回最後に使った実テーブルを表示するってのであれば、実テーブルを使うのも結構良さそうです。
 検索パラメータもデータベースに保存しておけば、現在はデータ更新時にデータベースそのものを破棄しているので、自動的にパラメータや一時テーブルも破棄され、データ更新時に不都合も生じません。ただ、パーマネントテーブルが存在しない段階でパーマネントビューを作成することはできないので、いつビューを作成するかが問題です。結局、この方法でも毎回クエリに CREATE VIEW を入れなきゃですね。

 さらに、これをさらに推し進め、作物タブについては、作物とその時の検索結果を複数データベースに保存するようにしておけば、二度目以降は再検索の必要がないので、軽快に使えることになりますね。
 普及指導員が使用する場合、使う人によってよく使う作物はある程度決まってくるでしょうから、かなり有効な高速化手法ではないかと思います。といっても、これは将来的に対応可能であればということですが…。

〔617〕Re:070323test版
 Hidemi Oya WEB  (07/03/25 22:38)

引用なし
   kabe さん、こん**は。Hidemi Oya です。

>DROP TABLE IF EXISTS tTbl;
>CREATE TEMP TABLE tTbl AS SELECT * FROM tekiyo WHERE sakumotsu REGEXP ...;
>CREATE TEMP VIEW IF NOT EXISTS vTekiyo AS SELECT ... FROM tTbl;
>CREATE TEMP VIEW IF NOT EXISTS vTsushoTekiyo AS SELECT ... FROM tTbl;
>SELECT * FROM vTshushoTekiyo;
 テンポラリビューの使い方としてはこれで良いと思いますが、このテンポラリテーブルの作り方だと、近接作物を指定したときに再検索が必要になりますね。指定した主作物を対象作物とする農薬の全ての適用をテンポラリテーブルにして、病害虫一覧等を作成する際は毎回作物で検索するようにした方が良いかもしれません。

〔618〕Re:070323test版
 Hidemi Oya WEB  (07/03/25 23:21)

引用なし
   kabe さん、こん**は。Hidemi Oya です。

>クエリに毎回 CREATE TEMP VIEW が入ってしまうのが難点ですが
 ACFinder 起動時に、クエリ1のように定義だけで空のテンポラリテーブルを元に元にテンポラリビューを作成しておけば、操作時はクエリ2ですみますね。
 [#616]
>パーマネントテーブルが存在しない段階でパーマネントビューを作成することはできないので、いつビューを作成するかが問題です。
についても、これと同様に定義だけの一時テーブルを作成してパーマネントビューを作成しておけば OK ですね。

クエリ1
CREATE TEMP TABLE tTbl (...);
CREATE TEMP VIEW IF NOT EXISTS vTekiyo AS SELECT ... FROM tTbl;
CREATE TEMP VIEW IF NOT EXISTS vTsushoTekiyo AS SELECT ... FROM tTbl;

クエリ2
DROP TABLE IF EXISTS tTbl;
CREATE TEMP TABLE tTbl AS SELECT * FROM tekiyo WHERE sakumotsu REGEXP ...;
SELECT * FROM vTshushoTekiyo;

〔619〕Re:070323test版
 Hidemi Oya WEB  (07/03/26 0:51)

引用なし
   kabe さん、こん**は。Hidemi Oya です。

> 指定した主作物を対象作物とする農薬の全ての適用をテンポラリテーブルにして、病害虫一覧等を作成する際は毎回作物で検索するようにした方が良いかもしれません。
 クエリ1(テンポラリビューは [#618] の方法で作成済み)で試してみました。が、この方法で病害虫一覧等も作成するとなるとさすがに時間がかかり、大きな速度改善効果は期待できません。
 近接作物を指定したときは多少遅くなりますが、クエリ2の方が良さそうです。なお、この場合絞り込み条件の病害虫一覧等は tSaku から生成します。また、絞り込み条件が指定されている場合は、tTmp を作成する際に WHERE 節を付加します。

クエリ1
CREATE TEMP TABLE tBango AS
SELECT DISTINCT bango FROM m_tekiyo WHERE sakumotsu REGEXP ...;
DROP TABLE IF EXISTS tTbl;
CREATE TEMP TABLE tTbl AS
SELECT * FROM tekiyo WHERE bango in (SELECT bango FROM tBango);
DROP TABLE tBango;
SELECT * FROM tvTsushoTekiyo WHERE sakumotsu REGEXP ...;

クエリ2
DROP TABLE IF EXISTS tSaku;
CREATE TEMP TABLE tSaku AS SELECT * FROM tekiyo WHERE 主作物検索条件;
DROP TABLE IF EXISTS tTbl;
(1) 近接作物が指定されていない場合
CREATE TEMP TABLE tTbl AS SELECT * FROM tSaku;
(2) 近接作物が指定されている場合
CREATE TEMP TABLE tTmp AS SELECT DISTINCT bango FROM tSaku;
CREATE TEMP TABLE tTbl AS SELECT * FROM tekiyo
WHERE bango IN (SELECT bango FROM tTmp)
AND ((主作物検索条件) OR (近接作物検索条件));
DROP TABLE tTmp;
(3) (1), (2) 共通
SELECT * FROM tvTsushoTekiyo;

〔620〕Re:070323test版
 Hidemi Oya WEB  (07/03/26 22:11)

引用なし
   kabe さん、こん**は。Hidemi Oya です。

>薬剤候補と作物候補の両方を指定した場合は、かなり速度改善の目処がたちました。
 薬剤候補のみ指定した場合は現状で十分高速なので、問題は「作物候補のみを指定した場合」ということでしょうか?
 作物からの検索は作物タブがあるので(こいつの高速化はかなり難しいですが、[#619] の方法でかなり改善はできます)、薬剤タブの基本はまず薬剤候補を指定することだと思います。なので、作物候補のみを指定した場合の検索速度は、あまり気にする必要はないかと…。

 ところで、ACFinder って、ストリンググリッドの表示に結構時間がかかりますね。自前テストソフトだと1秒で表示できるテーブルが、ACFinder だと 2.1 秒かかります。これって、セル幅のオートアジャストに時間がかかっているのでしょうか?
 オートアジャストに時間がかかっているのならやむを得ませんが、もしストリンググリッドの ColCount, RowCount プロパティを結果をセットする前に設定していないなら、下記のように設定することで行数の多い表なら表示速度を改善できる可能性があります(薬剤タブのように行数が少ない表はほとんど変わりません)。

tb := DB.GetTable(SQL);
StringGrid1.ColCount := tb.ColCount;
StringGrid2.RowCount := tb.RowCount + 1; // +1 はヘッダ表示用

〔621〕Re:070323test版
 Hidemi Oya WEB  (07/03/26 23:16)

引用なし
   kabe さん、こん**は。Hidemi Oya です。

 [#619] のクエリ2ですが、ACFinder 起動時に次のようなテンポラリテーブルを作成すると、さらに高速化が可能です。作物に「ブロッコリー,あぶらな科野菜,野菜類」を指定した場合、自宅マシンで [#619] のクエリ2が初回 2.3 秒ですが、下記のクエリなら初回 1.8 秒です。
 なお、テンポラリテーブルの作成は自宅マシンで 1.3 秒、パーマネントテーブルとして作成しても同じ時間でした。この程度なら ACFinder 起動時にテンポラリテーブルとして毎回作成しても苦にはならないですが、薬剤タブでも使うなら、データ更新時にパーマネントテーブルとして作成した方が良いかもしれません。

--ACFinder 起動時
CREATE TEMP TABLE tsTekiyo (...);
CREATE TEMP VIEW IF NOT EXISTS tvTekiyo AS
SELECT ... FROM tsTekiyo;
CREATE TEMP VIEW IF NOT EXISTS tvTsushoTekiyo AS
SELECT ... FROM tsTekiyo;
--追加テンポラリテーブル作成
CREATE TEMP TABLE tBangoSaku AS
SELECT DISTINCT bango, sakumotsu FROM tekiyo;

--作物タブ用クエリ
CREATE TEMP TABLE tTmp AS SELECT bango FROM tBangoSaku WHERE 作物検索条件;
DROP TABLE IF EXISTS tSaku;
CREATE TEMP TABLE tSaku AS SELECT * FROM tekiyo
WHERE bango IN tTmp AND 作物検索条件;
DROP TABLE tTmp;
DROP TABLE IF EXISTS tsTekiyo;
--(1) 近接作物指定無し
CREATE TEMP TABLE tsTekiyo AS SELECT * FROM tSaku;
/*
--(2) 近接作物指定有り
CREATE TEMP TABLE tTmp AS SELECT DISTINCT bango FROM tSaku;
CREATE TEMP TABLE tsTekiyo AS SELECT * FROM tekiyo
WHERE (bango IN tTmp) AND ((作物検索条件) OR (近接作物検索条件));
DROP TABLE tTmp;
*/
--(3) 適用表示
SELECT * FROM tvTsushoTekiyo;

〔622〕Re:070323test版
 Hidemi Oya WEB  (07/03/26 23:28)

引用なし
   kabe さん、こん**は。Hidemi Oya です。

> ところで、ACFinder って、ストリンググリッドの表示に結構時間がかかりますね。自前テストソフトだと1秒で表示できるテーブルが、ACFinder だと 2.1 秒かかります。これって、セル幅のオートアジャストに時間がかかっているのでしょうか?
 ACFinder は結果表示用のストリンググリッドを毎回ダイナミックに生成していますが、各タブにスタティックにストリンググリッドを貼り付けておいて、それを使い回して方が表示が高速になるかも…。

〔625〕Re:070323test版
 kabe  (07/03/27 9:40)

引用なし
   >Hidemi Oyaさん

kabe です。

作物名そのものを REGEXP で検索する時間をどれくらい短縮できるかですね。
この考え方をさらに進めると、次の方法が効果的と思われます。

作物名を単一化して作物コードと作物名のみのテーブルを作成する。
m_tekiyo テーブルに作物コードを付加して、作物名テーブルから作物コードを更新する。
作物検索は最初に作物名テーブルで検索して、作物コードを抽出してから適用を検索する。
これだと REGEXP での作物名検索は現状で 1100レコード程度に対して行えば済むのでかなり高速化が期待できそうです。

作物コードをデータ更新時に同時に作成することになるので、データ更新時間がどれくらい増えるかですね。

〔626〕Re:070323test版
 kabe  (07/03/27 14:00)

引用なし
   >Hidemi Oyaさん

kabe です。

> ところで、ACFinder って、ストリンググリッドの表示に結構時間がかかりますね。
そうですね。SQL検索は終わってから表示が完了するまでは、データ量が多いと、時間がかかる部分です。

>StringGrid1.ColCount := tb.ColCount;
>StringGrid2.RowCount := tb.RowCount + 1; // +1 はヘッダ表示用
これは設定しています。

表示幅の自動設定は全てのセルを調べてから、各列幅を設定し、その後に表示幅ゼロ(データが存在しないフィールド)の列を削除しています。
現在は StringGrid にデータをセットした後で調べてますが、GetTable の時点で先に必要なセル幅とデータが存在しないフィールドを調べておいた方が早いのかもしれません。
検索機能の見直しが一段落したら、この部分改善してみます。

グリッドコンポーネントはもっといいものがないかと探しているのですが、シェアウェアだと高機能なものがありますが、フリーではなかなか理想とする機能が全て入っているものがみつかりません。

〔627〕Re:070323test版
 kabe  (07/03/27 21:13)

引用なし
   kabe です。

>作物コードをデータ更新時に同時に作成することになるので、データ更新時間がどれくらい増えるかですね。
実験中です。
m_kihon の9万行のレコードの UPDATE 処理を加えた場合のデータ更新時間は、私の環境で今まで 50秒程度が70秒以上かかります。
UPDATE m_tekiyo SET idsaku = (
SELECT idsaku FROM m_sakumotsu
WHERE m_sakumotsu.sakumotsu m_tekiyo.sakumotsu)
m_sakumotsu の sakumotsu と m_tekiyoのsakumotsu にインデックス設定を行った上です。

〔628〕Re:070323test版
 kabe  (07/03/27 21:15)

引用なし
   kabe です。

>m_kihon の9万行のレコードの
訂正↑m_tekiyo です。

  ツリー表示 ┃スレッド表示 ┃一覧表示 ┃トピック表示 ┃番号順表示 ┃検索  
49 / 114 ツリー <前へ | 次へ>
ページ:  ┃  記事番号:   
(SS)C-BOARD vv3.8 is Free.