みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
お世話になります。
現在ファイルメーカープロ18を使用しており、
バーコードの読み取りとOnLayoutKeystrokeの組み合わせで困っております。
実装したい機能は、
画面上でわざわざバーコード読取り用の入力フィールドに移動しなくても
レイアウト上でバーコードを読み取ったら、そのバーコードに紐づいた情報が表示される仕組みです。
製品詳細画面というレイアウトがあり、特定のバーコードに紐づいた商品の詳細が表示されています。
このレイアウト上で商品の詳細について編集することもあれば、単に表示して確認するだけのこともあります。
このレイアウト上で、PCに接続したバーコードリーダーでバーコードを読み取ります。
バーコードには商品コード7ケタの先頭に$マークを付けています。
このときにOnLayoutKeystrokeで実行するスクリプトは
読み取った値が「$で始まる8ケタ」であれば右から7文字を変数に設定し、
この変数を使用して商品コードを検索し表示させるというものです。
入力モードが「全角かな」であれば、Get(トリガキー入力)で8ケタ取得できますが
半角の場合に、「$」しか取得できず「$で始まる8ケタ」の判定で蹴られてしまいます。
「$」だけのときに適当なフィールド(インプットメソッドはひらがな)を踏ませることで
かな入力にするとともに、もう一度読み込ませるようアナウンスしていますが
もう少しスマートに処理させることができればと思いますが解決法が見いだせません。
やろうとしていることが無理なことなのかも分かりませんので、どなたかお助け下さい。。。
1文字ずつ入ってくるので、8文字になるまでそのまま変数に貯めるなりして待てばいいのでは?
そのトリガーの使い方だと、単なる表示だけというレイアウト以外で不具合になりますよ。
Offline
himadaneeさん
半角入力のときは$が送られてきた時点でスクリプトトリガが起動して、
その後の数字が掴めないのですが、対処方がありますでしょうか。
Shinさん
確かにドロップダウンで入力するフィールドがアクティブのときは
勝手に選択肢が入ってしまいます。
やはり、やろうとすることに無理がありますかね。
普通は、バーコードを入力するフィールド(グローバルフィールドでもいいです)を配置し、そこに挿入する形でバーコードを読み取ります。そのフィールドにトリガーを仕掛けると良いですよ。8桁限定でしたら、バーコードリーダー側に8桁の設定をしておけばいいです。
Offline
バーコードリーダを持ってないのでテストできませんが、IMEオンならIMEが変換後の文字列をまとめて送ってきますが、IMEオフだから1文字ずつ送ってくるということですよね?
$でトリガが起動して、次の文字でまた起動されないんですか...キーバッファがないのかな。
他のフィールドがアクティブであっても、キートリガで処理してしまえばフィールドにはデータが行かないはずですが
スクリプトの最後で0を返してますか?
ヘルプにトリガの処理順の説明があったはずなんだけど、見つからない...レイアウトトリガの方がフィールドより先だった気がしますが...
$というのは、フィールドには絶対入力しない文字として選んだんですよね?
#5と行き違いになってしまいましたが
確かに専用のフィールドを使った方が動作が分かりやすいとは思いますが、
アクティブなフィールドがあるかどうかで分岐すれば、ない時だけバーコード検索にする、ある時にスキャンデータが入ってきたときは何かメッセージを出す、というのは可能だと思います。
いずれにしろ、IMEオフで最初の1文字しか取得できないのでは無理ですが...
Shinさん
ですよね…
複数あるフィールドからバーコード読取り用のフィールドを
ユーザーが選択する一手間を削ろうと考えましたが難しそうですね。
himadaneeさん
お見込みの通り、IMEオフで$の一文字が送られたときにトリガ発動で
他の入力キーはどこかに消えてしまいます。
単純に入力キーを順次グローバルフィールドに追加するスクリプトで
試してみましたが、キーボード入力は順次入るのにバーコードは
最初の一文字以外は入っていきませんでした。
$は使わない文字として運用予定で、入れたければドルと表記で運用回避可能な業務です。
スクリプトの最後で0を返しています。
今、操作できる環境にいないですが、ドロップダウンの動作はこれが原因?
最後の悪あがきで、この辺りとアクティブフィールドの判定を試みてみます。
フィールドを配置したり、そのフィールドを選択させたくないのでしたら、全く別の方法がありますよ。
バーコードリーダーをシリアル接続にしておきます。MBS などのプラグインが必要ですが、シリアルポートへの入力をトリガーにしてスクリプトを起動させ、データを読み込ませます。これですと、トリガーされたスクリプトでレイアウトを検知すれば、特定のレイアウトのみで読み込みが可能になります。
または思いつきだけすが、今のトリガーで$を検知すれば、入力用のフィールドを選択し、そこに数字を入力させるのはいかがでしょうか。
変数を設定 [ $char ; 値: Get ( トリガキー入力 ) ]
If [ IsEmpty ( Get ( アクティブフィールド名 ) ) and $char = "$" ]
フィールドへ移動 [ テーブル::tt ]
現在のスクリプト終了 [ テキスト結果: 0 ]
Else
現在のスクリプト終了 [ テキスト結果: 1 ]
End If
を試してみてください。ただし、1文字ごとに処理が入りますので、送信の文字間隔を長めに設定する必要があるかもしれません。また、ユーザーが間違って$を押してしまうと、誤作動になります。
Last edited by Shin (2023-12-08 13:54:23)
Offline
Shinさん
なるほど!できました!!ありがとうございます!!!
そして、「1文字ごとに処理が入る」ため、フィールドへ移動したあとに
同じスクリプト内で、そのまま商品検索にフィールド値を用いて検索しても処理できないけれど
OnObjectSaveによりフィールド値が確定してから検索処理すればできることが理解できました!
バーコード読取り値が1文字ずつトリガキー入力で飛んでくるのか?
1文字飛ばした後のキーは消えるのか?と勘違いしておりました。
私の勘違いでhimadaneeさんにも、ご迷惑をおかけしました。
お二方とも、大変ありがとうございました。
今後ともよろしくお願いいたします。
Pages: 1
[ Generated in 0.013 seconds, 10 queries executed - Memory usage: 542.63 KiB (Peak: 563.53 KiB) ]