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

研究会

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

〔185〕ACFinder LocalDB版 kabe (06/05/31 22:51)

〔298〕ACFinder 060618版 kabe (06/06/18 21:11)
〔299〕Re:ACFinder 060618版 kabe (06/06/18 21:25)
〔301〕日本語フィールド名 Hidemi Oya (06/06/19 9:45)
〔313〕Re:日本語フィールド名 Hidemi Oya (06/06/19 23:03)
〔319〕Re:日本語フィールド名 Hidemi Oya (06/06/20 1:34)
〔321〕Re:日本語フィールド名 kabe (06/06/20 6:35)
〔322〕Re:日本語フィールド名 Hidemi Oya (06/06/20 9:16)
〔323〕Re:日本語フィールド名 Hidemi Oya (06/06/20 12:09)
〔302〕作物・病害虫タブ Hidemi Oya (06/06/19 10:10)
〔309〕Re:作物・病害虫タブ kabe (06/06/19 22:09)
〔315〕Re:作物・病害虫タブ Hidemi Oya (06/06/20 0:45)
〔318〕Re:作物・病害虫タブ Hidemi Oya (06/06/20 1:19)
〔303〕薬剤タブ Hidemi Oya (06/06/19 10:41)
〔310〕Re:薬剤タブ kabe (06/06/19 22:17)
〔304〕定型処理タブ Hidemi Oya (06/06/19 11:12)
〔305〕SQLタブ Hidemi Oya (06/06/19 11:28)
〔311〕Re:SQLタブ kabe (06/06/19 22:25)
〔316〕Re:SQLタブ Hidemi Oya (06/06/20 0:53)

〔298〕ACFinder 060618版
 kabe WEB  (06/06/18 21:11)

引用なし
   kabe です。

時間切れで、060618版暫定アップします。
http://acfinder.kabe.info/

今回のバージョンから、データベース更新時に作物名、農薬名を全角に変換します。
検索も全角を前提にしていますので、以前のデータベースファイルでは検索できません。めんどうですが、一度、手動で XLS->データベース更新の部分のみ実行してください。

#294の機能を取り入れてみました。
HidemiOya さんのコードをほとんど、そのまま使っています。
なお、テンプレートの内容に応じたボタンの表示、非表示は、まだ対応していません。全てのボタンが表示されるので、わかりにくいです。
使い方は
http://macs.o-ya.net/sample/
を参考にしてください。
as で指定したフォールド名は、文字列によっては表示されないか、文字化けします。

SQLエディタに簡易な入力支援機能を付けました。
SQLタブ内の左側にテーブルとフィールド名を選択する覧があります。
フォールド名のリストボックスでポップアップメニューが出ますので、適当に試してみてください。

薬剤検索部分を変更しました。
検索と閲覧的な用途にも使えます。
使い方わかりにくいかもしれませんので、インターフェース等、改善案あれば提案お願いします。

〔299〕Re:ACFinder 060618版
 kabe WEB  (06/06/18 21:25)

引用なし
   >HidemiOyaさん

kabe です。

>as で指定したフォールド名は、文字列によっては表示されないか、文字化けします。
これなんですが、ASの後のフォールド名を F1 F2 F3... と指定するような方法にできませんでしょうか。

max(case when sakumotsu = "なす" then jiki||"、 "||kaisu else "" end) as jp_なす,
max(case when sakumotsu = "なす(露地栽培)" then jiki||"、 "||kaisu else "" end) as jp_なす(露地栽培),

max(case when sakumotsu = "なす" then jiki||"、 "||kaisu else "" end) as F1,
max(case when sakumotsu = "なす(露地栽培)" then jiki||"、 "||kaisu else "" end) as F2,

として検索します。
なす->F1
なす(露地栽培)->F2
のような対応表を持っておいて、グリッドに表示するときに置換したらよいのかなと思います。

〔301〕日本語フィールド名
 Hidemi Oya WEB  (06/06/19 9:45)

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

>これなんですが、ASの後のフォールド名を F1 F2 F3... と指定するような方法にできませんでしょうか。
 [#280] の方法に従って作成して、SQL タブでも使用する可能性があるのでエンコードは SQLite に渡す直前に実行する必要があるので、今回のサンプルでは実際のエンコード/デコートルーチンを割愛しました。
 フィールド名を F1, F2 のようにしてしまうと、対応表を作成して結果表示ルーチンに渡さなければならず、複数のフィールドでこのような使い方があると、ちょっと面倒です。やはり [#280] のような方法が楽だと思います。

 で、SQLite の方にもしかするとユーザ関数を組み込めるかもしれないので、将来的にこの方法の採用も検討するとすると、
(1) SQL 文側では「hex("日本語文字列")」と書いておくと、この部分を「hex十六進文字列」にエンコードする
(2) エラー表示/フィールド名表示の際には「hex十六進文字列」を「日本語文字列」にデコードする
という方式を採用したいと思います。これなら、将来的に (1) の部分は SQLite に組み込んだとしても、既存の SQL を書き換える必要がありません。
 また、16 進文字列にエンコードすることにより、SQLite が大文字/小文字変換をしてもデコードに問題が発生することもありませんし、デコードする際に hex([0-9a-f]+) でエンコードされた文字列を切り出せるので便利です。
 一応、この方式でエンコード/デコードルーチンを作成しますので、ACFinder への組み込みをお願いします。

〔302〕作物・病害虫タブ
 Hidemi Oya WEB  (06/06/19 10:10)

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

毎度素早いバージョンアップご苦労様です。

>今回のバージョンから、データベース更新時に作物名、農薬名を全角に変換します。
 やっぱり、全角統一が良いですね。

 ところで、作物名選択について以前から書こうと思ってて書き忘れてたんですが、現在のようなツリー形式のダイアログボックスで複数選択可能にならないでしょうか?

 たとえば、「なす」に登録のある農薬を検索する場合に、「なす%」ではなく、「なす」と「なす(露地栽培)」だけで検索したいとか、あるいはマイナークロップや花などでは、上位分類も含めて一括検索したいということはよくあります。
 このため、ダイアログボックスで複数選択可能にするとともに、テキストボックス内に「"なす", "なす(露地栽培)"」のように書かれていれば、「(sakumotu like "なす" or sakumotsu like "なす(露地野菜)")」と展開するような機能を追加していただけると、非常に使いやすくなります。

 あと、ツールバーの通称モードボタンですが、薬剤タブでも使用するのかと思っていたら、今回の形だと使いそうにないので、作物・病害虫タブ内に移した方が良いかもしれませんね。

 なお、「にがうり」の件は修正されていることを確認しました。

〔303〕薬剤タブ
 Hidemi Oya WEB  (06/06/19 10:41)

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

>薬剤検索部分を変更しました。
>検索と閲覧的な用途にも使えます。
 いや〜、これはなかなか良いです。以前のバージョンだといまいち使い道が不明でしたが、これは使い出があります。
 左上隅のコンボボックスは何のために用意されてるのでしょう?

>使い方わかりにくいかもしれませんので、インターフェース等、改善案あれば提案お願いします。
 薬剤候補なんですが、今の形なら、種類を左側において先に種類を選択してからキーワード入力の方が、エンターキー一発で検索できるので楽です。
 が、できれば、種類は選択せずにキーワード入力だけで、自動的に
shurui LIKE '%キーワード%' OR shurui LIKE '%きーわーど%' OR meisho LIKE '%キーワード%' OR meisho LIKE '%きーわーど%'
と展開してくれた方が便利ですね。
 条件として有効成分が必要かどうかは微妙です。「2,4−PA」なんかは後ろに「ジメチルアミン」とか「エチル」とかいろいろ付きますが、それまで必要なことがどの程度あるか…。細かな成分名まで付けて検索しなくても、種類「2,4−PA」で検索後に確認すれば良さそうですし。

〔304〕定型処理タブ
 Hidemi Oya WEB  (06/06/19 11:12)

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

>#294の機能を取り入れてみました。
 素早い対応ありがとうございます。こんなに早く組み込まれるとは思ってもみませんでした。

 作物名ボタンですが、現在のままだと選択した作物だけにテキストボックスが書き換えられてしまうので、複数作物登録農薬一覧表のような用途では非常に不便です。このままの方式で行くなら、ダイアログボックス内に「追加」ボタンを追加して、テキストボックスにどんどん作物を追加できるようにする必要があります。
 できれば、2タブにして [#302] で書いたような選択方法と両方使えるとさらに良いですね。特にいろいろな作物を一括して選択する場合は、全一覧から選択できた方が便利です。ひとつ作れば、作物・病害虫タブでも同じものが使えますし…。

 病害虫ボタンは使いやすいです。作物検索語を作物名テキストボックスから自動的に持ってきてくれたり、作物検索語を書き換えてエンターキーを入力すると再検索できたりするともっと良いですが…。現在は、入力ミスで再検索したい場合はダイアログボックスをいったん閉じなければならないので、できれば再検索機能は欲しいですね。

 あと、私のサンプルが横着してたのが悪いんですが(^_^;)、テンプレート選択した後は、アクティブページを処理内容タブにしてくれると使いやすいです。
 それと、サンプルでは設定値にダブルクォートが付いていてもいなくても問題ないよというところを見てもらいたくてダブルクォート付きも添付しましたが、正式リリースの際はダブルクォート無しに統一した方が良いですね。

〔305〕SQLタブ
 Hidemi Oya WEB  (06/06/19 11:28)

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

>SQLエディタに簡易な入力支援機能を付けました。
 これはなかなか凄いですね。予約語の色分けまで付いているとは…。テンプレートで多用している IN 演算子が予約語として認識されていないので、追加をお願いします。

>SQLタブ内の左側にテーブルとフィールド名を選択する覧があります。
>フォールド名のリストボックスでポップアップメニューが出ますので、適当に試してみてください。
 今のところ、骨格としてはこれくらいあれば十分ですね。これで、作物名/病害虫名などを GUI で設定できるようになれば、もう何もいらないかも…。

 SQL 文と結果は、現行2ペイン制と定型処理のような2タブ制とどちらが良いか微妙ですね。短い SQL 文だと2ペインの方が良いし、長い SQL 文だと2タブの方が良さそうです。

〔309〕Re:作物・病害虫タブ
 kabe WEB  (06/06/19 22:09)

引用なし
   >Hidemi Oyaさん

kabe です。

> このため、ダイアログボックスで複数選択可能にするとともに、テキストボックス内に「"なす", "なす(露地栽培)"」のように書かれていれば、「(sakumotu like "なす" or sakumotsu like "なす(露地野菜)")」と展開するような機能を追加していただけると、非常に使いやすくなります。
定型処理タブの作物選択も含めて同じ選択ダイアログを使うようにしたいと思います。
今回作成していただいた定型処理ルーチンを、作物・病害虫タブにも応用して、複数作物検索を実現できないかなと思ってますが、まだ機能がよく理解できていません。(^^;
これについてはなんとか最優先で取り組みたいと思います。

〔310〕Re:薬剤タブ
 kabe WEB  (06/06/19 22:17)

引用なし
   >Hidemi Oyaさん

kabe です。

> 左上隅のコンボボックスは何のために用意されてるのでしょう?
用途を選択すると該当する用途の通称薬剤が全て表示されるだけです。
検索というよりは、農薬便覧の閲覧みたいな用途を想定していました。

> が、できれば、種類は選択せずにキーワード入力だけで、自動的に
>shurui LIKE '%キーワード%' OR shurui LIKE '%きーわーど%' OR meisho LIKE '%キーワード%' OR meisho LIKE '%きーわーど%'と展開してくれた方が便利ですね。
この方法に変更したいと思います。

〔311〕Re:SQLタブ
 kabe WEB  (06/06/19 22:25)

引用なし
   >Hidemi Oyaさん

kabe です。

>>SQLエディタに簡易な入力支援機能を付けました。
> これはなかなか凄いですね。予約語の色分けまで付いているとは…。
簡単にキーワードが指定できるようだったので AFEdit コンポーネントを使っています。
ところで拡張メモコンポーネントなんですが D6 + WindowsXP では使えるのでしょうか。

〔313〕Re:日本語フィールド名
 Hidemi Oya WEB  (06/06/19 23:03)

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

>(1) SQL 文側では「hex("日本語文字列")」と書いておくと、この部分を「hex十六進文字列」にエンコードする
>(2) エラー表示/フィールド名表示の際には「hex十六進文字列」を「日本語文字列」にデコードする
 これに基づいたエンコード/デコード関数を作成しましたので、組み込みをお願いします。SQLite の本家サイトを探したんですが、フィールド名の最大長が分かりませんでした。長くなりすぎないように ShiftJIS の文字列をエンコードしていますが、もしかしたら文字数制限に引っかかるかも…。

 エンコード/デコードルーチンで、AnsiToUtf8/Utf8ToAnsi も行ってしまいます。また、エンコード時に「hex("日本語文字列")」、デコード時に「hex十六進文字列」を含まない文字列はほとんどオーバーヘッドなくオリジナル文字列をそのまま返します。ってことで、SQLite に SQL 文を渡す際には現在の AnsiToUtf8 関数の代わりに EncodeHex を、エラー表示やフィールド名表示の際は Utf8ToAnsi 関数の代わりに DecodeHex を常に使ってもらって問題ありません。
 なお、テンプレートの「jp_[field]」の部分は、「hex("[field]")」に変更する必要があります。

function EncodeHex(src: string): string;
var
 t, h: string;
 p: PChar;
begin
 RegExprModifierI := true;
 RegExprModifierS := true;
 Result := ReplaceRegExpr('hex\(\s+("[^"]*")\s+\)', AnsiToUtf8(src), 'hex($1)', true);
 while ExecRegExpr('hex\("[^"]+"\)', Result) do begin
  t := ReplaceRegExpr('.*?hex\("([^"]+)"\).*', Result, '$1', true);
  p := PChar(Utf8ToAnsi(t));
  h := '';
  while p^ <> #0 do begin
   h := h + IntToHex(Ord(p^), 2);
   Inc(p);
  end;
  Result := ReplaceRegExpr('hex\("' + t + '"\)', Result, 'hex' + h, false);
 end;
end;

function DecodeHex(src: string): string;
type
 THex2 = array[0..1] of char;
 PHex2 = ^THex2;
var
 t, s: string;
 p: PChar;
begin
 RegExprModifierI := true;
 RegExprModifierS := true;
// Result := src;
 Result := Utf8ToAnsi(src);
 while ExecRegExpr('hex[0-9a-f]+', Result) do begin
  t := ReplaceRegExpr('.*?hex([0-9a-f]+).*', Result, '$1', true);
  p := PChar(t);
  s := '';
  while p^ <> #0 do begin
   s := s + Chr(StrToInt('$' + PHex2(p)^));
   Inc(p, 2);
  end;
//  Result := ReplaceRegExpr('hex' + t + '([^0-9a-f])', Result, AnsiToUtf8(s) + '$1', true);
  Result := ReplaceRegExpr('hex' + t + '([^0-9a-f])', Result, s + '$1', true);
 end;
// Result := Utf8ToAnsi(Result);
end;

〔315〕Re:作物・病害虫タブ
 Hidemi Oya WEB  (06/06/20 0:45)

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

>今回作成していただいた定型処理ルーチンを、作物・病害虫タブにも応用して、複数作物検索を実現できないかなと思ってますが、まだ機能がよく理解できていません。(^^;
 エレメント型メタフィールドを展開する時は、テキストボックスの値を TStringList に CommaText プロパティで放り込んで、TStringList の1行(各要素)ごとに展開しています。
 TfrmMain.TemplateToQuery 関数の下記の部分です。メタフィールドを書き換えるわけじゃないので、for ループの中は単純に
s := s + 'sakumotsu like ("' + list.Strings[j] + '") or ';
でつないでいって、最後に
Delete(s, Length(s) - 3, 4);
s := '(' + s + ')';
としてやれば OK だと思いますが…。

list.CommaText := edtTplSakumotsu.Text;
for j := 0 to list.Count - 1 do dest.Add(ReplaceRegExpr('\[' + CField[f] + '\]', line, list.Strings[j], false));

〔316〕Re:SQLタブ
 Hidemi Oya WEB  (06/06/20 0:53)

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

>簡単にキーワードが指定できるようだったので AFEdit コンポーネントを使っています。
 特定文字列で始まる行全体を色分けできるような機能があれば、定型処理の説明文の章タイトルを色分けしてくれるとうれしいです。

>ところで拡張メモコンポーネントなんですが D6 + WindowsXP では使えるのでしょうか。
 ユーザの中には、その組み合わせで使っている人もいるようです。ただし、禁則処理などの Asian Language Version Only な機能は一切使えません。既に作者が開発を止めている(^_^;)コンポーネントなので、あえて使う必要はないかと…。

〔318〕Re:作物・病害虫タブ
 Hidemi Oya WEB  (06/06/20 1:19)

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

 次のような方法の方が簡単かな…。
(1) テキストボックス直接入力は、今まで通り like 演算子とワイルドカードを使った検索
(2) 作物名選択ダイアログボックスを使った時は、ダイアログボックス内に複数選択作物表示テキストボックスを作っておいて、その値をそのまま in 演算子に渡して検索

 (2) はリスト型メタフィールドの展開と同じです。ダイアログボックス内の作物リストを sakumotsu_list とすると、単純に
s := 'sakumotsu in (' + QuotedCSV(sakumotsu_list) + ')';
でお終いです。
 定型処理タブでは、sakumotsu_list を edtTplSakumotsu.Text に代入してもらえばすみますし。

〔319〕Re:日本語フィールド名
 Hidemi Oya WEB  (06/06/20 1:34)

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

 EncodeHex 関数を書いている時に確認したんですが、UTF-8 では 0x00〜0x7F は使われないような感じです。したがって、[#280]
> UTF-8 文字列を URL エンコードすると、%xx の中に英小文字が散見されるので、恐らく sqlite3.dll はフィールド名を大文字に変換しちゃってるんでしょうね。
は間違いですね(^_^;)。英子文字が散見されたのは ShiftJIS ですね。

 では何故フィールドアリアスに UTF-8 が使えないのかというと、SQLite 側で大文字/小文字変換する際のバグですかねえ?

〔321〕Re:日本語フィールド名
 kabe WEB  (06/06/20 6:35)

引用なし
   >Hidemi Oyaさん

kabe です。

早速ありがとうございます。
ちょっと今やってみたのですが、DecodeHex の方がうまくいきません。
DecodeHex を使わない場合
hex("なす") を SQLite に渡すと
HEX82C882B7
とフィールド名が表示されます。
(SQLite が大文字に変換しているようです)
DecodeHex を使うと、無限ループになっているのか、応答なし状態になってしまいます。
MessageDlg(DecodeHex('HEX82C882B7'),mtInformation,[mbOk],0);
でも同様の症状なので、DecodeHex 関数の問題でしょうか。?
ソースはそのままコピペしただけなんですが、どこかチェックポイントありますか。

〔322〕Re:日本語フィールド名
 Hidemi Oya WEB  (06/06/20 9:16)

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

>ちょっと今やってみたのですが、DecodeHex の方がうまくいきません。
 あれ〜? D7 では全く問題なく動作してたんですが…。複数作物登録一覧表とその設定例でできた SQL 文を全部エンコード/デコードできたので、「なす」も動作確認済みです。

>DecodeHex を使わない場合
>hex("なす") を SQLite に渡すと
>HEX82C882B7
>とフィールド名が表示されます。
 EncodeHex で渡した SQL 文は、SQLite で問題なく動作するわけですね?

>(SQLite が大文字に変換しているようです)
 予測は当たってましたね。UTF-8 なら影響しないはずなんですけどね。
 ちなみに、hex が HEX になっても問題なく Decode できることを確認しています。

>MessageDlg(DecodeHex('HEX82C882B7'),mtInformation,[mbOk],0);
>でも同様の症状なので、DecodeHex 関数の問題でしょうか。?
 ですね。

>ソースはそのままコピペしただけなんですが、どこかチェックポイントありますか。
 D6 と D7 の仕様の違いだとすれば、怪しいのは
  p := PChar(t);
の部分(D3 でも大丈夫だったような気はするけど…)ですかねえ? とりあえず、
  p := @t[1];
だとどうでしょう?
 それと、現状では最初に SHiftJIS に戻してからデコードしてますが、UTF-8 のままデコードして最後に ShiftJIS に戻す方法を残してあります。// でコメントアウトした行を生かして、その下の行をコメントアウトしてください。
 とりあえず、今思いつく範囲ではこんなところです。

〔323〕Re:日本語フィールド名
 Hidemi Oya WEB  (06/06/20 12:09)

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

> D6 と D7 の仕様の違いだとすれば、怪しいのは
>  p := PChar(t);
>の部分(D3 でも大丈夫だったような気はするけど…)ですかねえ?
 EncodeHex で
  P := PChar(Utf8ToAnsi(t));
が OK ですから、こいつは問題ないですね。
 で、ソースを見直してみたら、フィールド名の書き戻しができないことが判明しました(^_^;)。エラーメッセージのデコードは問題ないはずです。DecodeHex の end; から上に5行目の
//  Result := ReplaceRegExpr('hex' + t + '([^0-9a-f])', Result, AnsiToUtf8(s) + '$1', true);
  Result := ReplaceRegExpr('hex' + t + '([^0-9a-f])', Result, s + '$1', true);

//  Result := ReplaceRegExpr('hex' + t + '([^0-9a-f]|$)', Result, AnsiToUtf8(s) + '$1', true);
  Result := ReplaceRegExpr('hex' + t + '([^0-9a-f]|$)', Result, s + '$1', true);
に書き換えてください。

 SQLite3 の基本エンコードは Unicode のようなので、データベースの内容も SQL のやりとりも全て UTF-16 にしてやれば、問題なく日本語が通るのかもしれません。SQLite 3.3.6 の DLL が日本語データベース名を通してくれないのも、Unicode でなく ShiftJIS だからかも…。
 UTF-8 のフィールド名が正常に使えないのは、UTF-8 を無理矢理 UTF-16 に変換しているせいだと考えれば、理解できるような気がします。

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