過去の桐井戸端BBS (桐ver.8)
12349 既存データの自動検索入力(再利用)、いわゆる「オートコンプリート」みたいなことをしたい mie 2001/07/16-23:40
行き詰まったときには、いつも利用させて頂いております。

フォームに伝票形式でデータを入力していますが、[品名]という項目があり
この項にデータを入力する際に、過去に入力したデータを、入力した文字に
そって表示(入力)する方法があればお教え願います。

例)
[品名]項の既存データ
ABCDEF
ABCDFF
ABCDDD

[品名]
ABC <--と入力すると候補となる既存データが
     表示され、ABCDFFを選択入力したい。


・別のテーブルはしない事を前提としています。
12351 Re:オートコンプリート風 悲しげ 2001/07/17-00:52
記事番号12349へのコメント
どもっ、mieさん
いわゆる「おーとこんぷりーと」もどきですね。

>・別のテーブルはしない事を前提としています。

この部分が日本語としてもおかしくて意味が不明なので、
サラリと無視することにして(^^;)、いか様ならこういうのはきっと好きだろうな。
私はこうゆうのは苦手なんですが、少しだけ考えてみました。

使うのは「編集文字列変更」イベントだと思います。
ここで、このイベントが発生した毎に判断に走るのならば、1文字目からになりますし、
例示したように「3文字入力」後に判断するならそれなりの設定になろうかと思います。

大事な前提が欠けていまして、ここで使うフォームがカードなのか一覧表(伝票)なのかで、
操作方法は少し違って来ることになりそうです。
ま、それはさておき、ここで入れるデータは項目値で、引いて来たいデータが
同一表の入力済項目値であることはなかなか厄介ですから、
私ならフォームの下部なりに入力用のテキストボックスを設けると思います。
ソースは文字列型(ですよね?)変数とするでしょう。
そして、受けた変数の値からごにょごにょすると云う。
入力する行が最終行でなければ、現在の行を行マーク定義しておく。
入力した変数値でもって、先頭一致の部分一致検索をかける。
該当データがあればそれを同じ変数(または別な変数)に受けて、テキストボックス内に表示する。
(該当データが無ければ何もしない)
この際、例えば「3文字」で行くのなら同じ変数、「1文字毎」ならば
別変数で比較させることになろうかと思います。
ただし、今の私の頭の中に「1文字毎」の成案は無です。(^^;)
しかる後に、そのテキストボックス内で加除修正するなりした最終結果を牡丹(またはソース値更新とかキーダウンイベント)で確定したら、
入力対象行(行マークまたは最終行)にジャンプして行訂正して一丁上がり。・・・・かな?
この手は、この程度で私には「いっぱいいっぱい」(意味不明)です。
12353 Re:オートコンプリート風 いかすぱげてぃ 2001/07/17-15:24
記事番号12351へのコメント
>することにして(^^;)、いか様ならこういうのはきっと好きだろうな。

たははは、好きだと言われたので(^^;書いてみました。

まず、仕様的に、IEとか(私はネスケだけど)のアドレスバーみたいな感じです。

フォームの設定するテキストには、入力支援ボタンを付けます。
リストの種別はドロップダウンリスト。
ドロップダウンリストをクリックすれば、既に入力した履歴が一覧表示されます。
(入力後イベント参照)
テキストオブジェクトでは、途中まで入力すれば、その後、履歴を参照して(一応、過去100回まで)
自動的に表示されるようにしています。(単に履歴だけです)
下矢印を押せば、次の候補が検索されます。

----------------
イベントファイル
----------------

名札 メイン

 変数宣言 文字列{&dumy},整数{&c,&end,&hit=0}
 変数宣言 文字列{&選択文字列,&検索文字列,&前回検索文字列},\
整数{&検索続行位置,&選択文字位置,&選択文字数,&編集文字列長}
 変数宣言 文字列{ &focus }



*--------------------------------------------------------------------
手続き定義開始 品名::入力後(参照 文字列 &編集文字列,長整数 &モード,参照 長整数 &入力継続)
*--------------------------------------------------------------------
 if (&モード=1 .and.not&hit)
  繰り返し &c=100,2
  &dumy = #setq(&リスト[&c],&リスト[&c-1])
  繰り返し終了
  &リスト[1]=&編集文字列
   &hit = 0
 end
手続き定義終了

*--------------------------------------------------------------------
手続き定義開始 品名::編集文字列変更()
*--------------------------------------------------------------------
method ハンドル = &hwindow ,戻り値 = &end,@品名.編集文字列取得(&検索文字列)
method ハンドル = &hwindow ,戻り値 = &end,@品名.編集文字列長(&編集文字列長)
if(&検索文字列 .and&前回検索文字列<>&検索文字列)
繰り返し &c=1,100
if (&検索文字列 = #sstr(&リスト[&c],1,#文字数(&検索文字列)))
&選択文字列 = #sstr(&リスト[&c],#文字数(&検索文字列)+1)
method @品名.編集文字列設定(&検索文字列+&選択文字列)
method @品名.編集選択位置設定(#文字数(&検索文字列)+1, -1 )
&前回検索文字列 = &検索文字列
    &hit = 1
繰り返し中止
end
繰り返し終了
&検索続行位置 = #cond(&c>=100,1,1,&c+1)
end

手続き定義終了

*--------------------------------------------------------------------
手続き定義開始 フォーム::キーダウン(長整数 &仮想キーコード,長整数 &スキャンコード,長整数 &フラグ,参照 長整数 &処理中止)
*--------------------------------------------------------------------
method @フォーム.フォーカスオブジェクト取得( &focus )
method 戻り値=&end,@品名.編集選択位置取得(&選択文字位置 ,&選択文字数)
if(&focus=品名 .and&仮想キーコード=40 .and&前回検索文字列 .and&end)
繰り返し &c=&検索続行位置,100
if (&前回検索文字列 = #sstr(&リスト[&c],1,#文字数(&前回検索文字列)))
&選択文字列 = #sstr(&リスト[&c],#文字数(&前回検索文字列)+1)
method @品名.編集選択文字列置換(&選択文字列)
method @品名.編集選択位置設定(#文字数(&前回検索文字列)+1, -1 )
&hit = 1
繰り返し中止
end
繰り返し終了
&検索続行位置 = #cond(&c>=100,1,1,&c+1)
&処理中止 = 1
end
手続き定義終了
*--------------------------------------------------------------おわり


12354 Re:オートコンプリート風 いかすぱげてぃ 2001/07/17-15:25
記事番号12353へのコメント

追伸

>・別のテーブルはしない事を前提としています。

なぜ、別テーブルを「しない事」?が前提なのか分かりませんので、一概には言えませんが、
データベースソフトですから、やはり別テーブルを使う方が非常に簡単で応用性も高まります。
例えば、もし、入力値履歴をキチンと並び替えたりして表示させするのも別テーブルなら簡単ですが変数でやるとなると非常に面倒です。
(たはは、途中まで書き始めて止めちゃいました)
テーブルなら、次回起動時の為の保存も簡単だし、メンテも楽だし…いいとこだらけだと思います。

ということで、適当に書きなぐったものですから、不具合もあるかもしれませんが、
「現物」を悲しげさまへ勝手に送りつけておきましたので、後はよろしくお願いします。>悲しげ様

では、ごきげんよう

いかすぱげてぃ


12355 Re:オートコンプリート風 いかすぱげてぃ 2001/07/17-15:37
記事番号12353へのコメント
すみません、途中まで書きかけた方のやつをアップしてしまいました。

コード中、変数「&hit」に関連する場所はすべて削除して下さい。

いか

12359 Re:オートコンプリート風 悲しげ 2001/07/17-21:46
記事番号12354へのコメント
と云う訳で、私のところには届いています。
ただし、未だ解凍すらしていないと云う……(^^;)。
【多遊】さんにも「cc:」されていますから、週末には公開されると思います。
それまで待ちましょう。
開けてみて、コメントをつけたいことがあれば何か書きますけど。
12362 そう!オートコンプリート風 mie 2001/07/17-23:01
記事番号12349へのコメント
オートコンプリートの言葉が思い出せなくて...(^_^;)

>・別のテーブルはしない事を前提としています。
と、書きましたが他によい方法があれば、ご教授願います。

別のテーブルを作成して、オートコンプリート風が実現させる方法は表引きを利用するのでしょうか?
この場合、1文字毎に認識し該当するデータが表示(入力)できるのでしょうか?

>大事な前提が欠けていまして、ここで使うフォームがカードなのか一覧
>表(伝票)なのかで、操作方法は少し違って来ることになりそうです。

サブフォームを使用して、伝票形式でデータを入力しようとしています。

伝票形式で[品名]に入力したデータを別テーブルに自動的に書き込むには
どのような手法をとれば良いのでしょうか?

桐入門者なので、チンプンカンプンな質問かもしれませんが、
何卒、ご教授方お願いします。



12365 Re:そう!オートコンプリート風 悲しげ 2001/07/18-12:56
記事番号12362へのコメント
どもっ、mieさん

>表引きを利用するのでしょうか?

>桐入門者なので、チンプンカンプンな質問かもしれませんが、

ははぁ、なるほど、どの程度の「桐入門者」なのかは判りませんが、
それでは別な角度からコメントします。
結論から云うならば、「オートコンプリート」は諦めた方がいいと思います。
桐ver8ではこれを機能としては持っていませんから、
これを実現するには、別コメントにあるような結構難解な(?)イベントを組む必要があるからです。
余談ながら、実は私は「オートコンプリート」機能はうるさくて嫌いなもんで、
例えばMSワードなんかではなるべくこの機能を殺して使うようにしていたりします。
私が変わり者なのかも知れませんが、
結構同じ考えの方もいるようです。
そんな訳で、mieさんの場合は「表引き条件」を利用するのがいいと思います。
これは表定義から該当項目で[Alt]+[Enter]して「表引き」タブを指定して設定します。
ちなみにこれは「項目計算式」に設定する「#表引き(…,」関数とは違います。
また「別のテーブルはしない事を前提としています」の意味と意図は相変わらず不明ではありますが、
「表引き」を利用するに際しては表引き対象表としての「別表を用意することが前提」となります。
いか様も書かれたように、そうした方が絶対ベターです。

「表引き」の設定方法は、リファレンスを熟読して勉強して下さい。
桐ver8なら『表編集』なる冊子のp.93〜です。
12372 Re:そう!オートコンプリート風 mie 2001/07/18-21:47
記事番号12365へのコメント
悲しげさん、助言ありがとうございます。

>どもっ、mieさん
>
>>表引きを利用するのでしょうか?
>
>>桐入門者なので、チンプンカンプンな質問かもしれませんが、
>
>ははぁ、なるほど、どの程度の「桐入門者」なのかは判りませんが、
 桐暦45日です。(ただいま体験版使用中)

>それでは別な角度からコメントします。

>結論から云うならば、「オートコンプリート」は諦めた方がいいと
>思います。桐ver8ではこれを機能としては持っていませんから、こ
>れを実現するには、別コメントにあるような結構難解な(?)イベン
>トを組む必要があるからです。
>余談ながら、実は私は「オートコンプリート」機能はうるさくて嫌
>いなもんで、例えばMSワードなんかではなるべくこの機能を殺して
>使うようにしていたりします。私が変わり者なのかも知れませんが、
>結構同じ考えの方もいるようです。
>そんな訳で、mieさんの場合は「表引き条件」を利用するのがいい
>と思います。これは表定義から該当項目で[Alt]+[Enter]して「表
>引き」タブを指定して設定します。
>ちなみにこれは「項目計算式」に設定する「#表引き(…,」関数とは
>違います。
>また「別のテーブルはしない事を前提としています」の意味と意図
>は相変わらず不明ではありますが、

あっ、変な日本語でした。「別表を使用しないことを前提としています」と書きたかったのです。(^_^;)

>「表引き」を利用するに際して
>は表引き対象表としての「別表を用意することが前提」となります。
>いか様も書かれたように、そうした方が絶対ベターです。

了解しました。
ところで
別表Bを該当項目[品名]のデータベースとした場合、元表Aの項目[品名]へ入力したデータを
表Bに自動的に入れる方法は簡単なのでしょうか?
ヒントを頂ければ幸いです。
12374 Re:そう!オートコンプリート風 悲しげ 2001/07/18-23:02
記事番号12372へのコメント
どもっ、mieさん
そうですか、桐暦45日目の体験版ユーザーでしたか。
それは困った。(^^;)
では、例えば佐田さんのところで勉強して下さい。

http://www4.justnet.ne.jp/~morihiro.sada/

それはそうと、ヒントですか、う〜ん。

>ところで
>別表Bを該当項目[品名]のデータベースとした場合、元表Aの項目[品名]
>へ入力したデータを表Bに自動的に入れる方法は簡単なのでしょうか?

これはむしろ発想が逆で、まず元表Aの値があってそれを別表Bに(自動)転記するのではなく、
まずは表引き元表である別表Bに大抵のデータが入っていて
(品名,ヨミ,code,単価,原価等…いわゆるこの表が商品マスターでんな)、
入力表であるところの表Aに、表引きなどの機能を使って、
この別表Bからデータを持って来るような使い方となります。
これがおそらくはオーソドックスなやり方です。
12383 Re:そう!オートコンプリート風 toshi-chan 2001/07/19-19:55
記事番号12372へのコメント
mieさん、こんばんは。
私がある人からもらった一括処理システムでこんなのがありました。

@A表のデータをB表へ書き出す(データの追加を行う)。
AB表を開いて、[品名]で絞り込む(単一化)。
B補集合をとって、データの全削除を行う。
C絞り込みの解除を行う。

参考になりますか?会話処理でもできますので試してみてください。
ただ、いちいち手作業で行うのは面倒なので、履歴に登録したほうがいいです。
桐暦45日さんでは、言葉が難解だったかもしれませんね。

戻る