- ベストアンサー
入力フィールドの開き方を教えてください
- アクセス2003を使用してデータベースを組んでいる際に、商品をテキストボックスにカナ読みを入れてコンボボックスに商品名を表示させる方法について教えてください。
- 商品がリストになかった場合に、直接データフィールドに商品名を入力できるようにする方法を教えてください。
- 入力フィールドが表示される状態で、商品名を入力する方法について教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
久しぶりのコンボと所用で遅くなり ましたが、一応挙動を確認しました。 以下がコードです。flgは見つかった かどうかの判定用フラッグで、フォーム モジュールの一番上に置いてください。 メインフォームをfrmMain、サブを frmSubとしています。 商品テーブル名はtbl商品、フィールドは IDと商品名とヨミ。検索用のテキストボックスは tx検索。コンボボックスはcmb商品。 cmb商品の値集合ソースは、 SELECT tbl商品.ID, tbl商品.商品名, tbl商品.ヨミ FROM tbl商品; cmb商品の列数は3、列幅は0cm,2cm,2cm、 連結列は1。 Option Compare Database Option Explicit Dim flg As Boolean Private Sub Form_Open(Cancel As Integer) flg = False 'サブフォームの不可視化 Forms!frmMain!frmSub.Visible = False End Sub Private Sub tx検索_AfterUpdate() Dim db As Database Dim rs As Recordset Set db = CurrentDb Set rs = db.OpenRecordset("tbl商品", dbOpenDynaset) On Error Resume Next flg = False With rs Do Until rs.EOF If rs!ヨミ = Me.tx検索 Then Me.cmb商品.SetFocus Me.cmb商品.Text = rs!商品名 Me.cmb商品.Dropdown flg = True Exit Do Else flg = False End If rs.MoveNext Loop End With If flg = False Then MsgBox ("サブフォームに当該の商品名を書き込んでください") Me.cmb商品 = 0 'サブフォームの可視化 Forms!frmMain!frmSub.Visible = True Me.frmSub.SetFocus End If rs.Close Set rs = Nothing db.Close Set db = Nothing End Sub コードの概要を説明をします。コンボのソースを 検索しテキストボックスのヨミと一致するデータが あれば商品名をコンボボックスに表示し、同じ 商品名の値を表示して、コンボをドロップダウン する。なければメッセージを出し、コンボの表示を 消去してサブフォームにフォーカスを移動。 以上です。一応動かして何かあれば書き込んで ください。いろいろと大変でしょうが、少し づつ改良していけばいいのではと思います。
その他の回答 (2)
- piroin654
- ベストアンサー率75% (692/917)
実は重要なことがまだ機能として付け加えられて いません。それはサブフォームに入力し終わった 時点でどのタイミングでサブフォームを隠すか ということです。サブフォームのすべての項目を 満たしたとき、もし間違いがあった場合、訂正を するということも考えられます。エンターキーを 押した時点での項目チェックをすれば、その時点で フォームを隠すこともできますが、以上の点で どう判断するかで隠すタイミングがむつかしい のです。検索のテキストでマウスをクリックした タイミングでサブフォームを隠すには、 マウスボタンクリック時のイベントで、 Private Sub tx検索_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Forms!frmMain2!frmSub2.Visible = False End Sub のように、 Forms!frmMain2!frmSub2.Visible = False を加えるだけです。やってみてください。 上記のコードを付け加えれば、サブフォームは 隠れますが、それまではひらいたままです。 ということでどのタイミングで隠したらよいのかは 一つ考えてみてください。考えが確定したら 実装します。 また、レコードの書き換えからの保護という ことは一つの案として同じテーブルを 二つ用意し一方が変化したとき他方と 比較して変化する以前のものに変化が あったか確認し、なければそのレコードを 変化したテーブルに保持し、サブフォームが 閉じた時点でその新規のレコードを 他方に移し、再び同じことを繰り返す という方法もあります。もし以前の レコードに手が加えられたということが 確認できた時点でサブフォームを閉じ、 テーブルを元にもどします。 という方法もあります。 ただ、比較するテーブルの隠避やレコードが テーブルそのものを見ても判らない ように正規化しておくということも 必要になります。 ということで、閉じるタイミングを 考えてみてください。
お礼
重ね重ねありがとうございました。 前にいただいた回答と合わせて、いろいろとやってみます。
- piroin654
- ベストアンサー率75% (692/917)
レスがつかないようですが、 解決しましたか。 確認ですが。 >ヒットしなかった時は、入力フィールドが表示される この入力フィールドとはサブフォームですか、 あるいは他のコントロールですか。 >通常表示されるフィールドは編集ロックをかけています この編集ロックはどのような仕方をしている のですか。
補足
お返事遅くなり、申し訳ありません。 >この入力フィールドとはサブフォームですか、 あるいは他のコントロールですか。 入力フィールドはサブフォームです。 >この編集ロックはどのような仕方をしているのですか。 データの書き換えを防ぐため、使用可能を"いいえ"、編集ロックを"はい"の状態にしてあります。 ※データの書き換えを防ぐため、使用可能を"はい"、編集ロックを"いいえ"にし、商品を登録すれば済むではないかと思われますが、商品自体は、別のシステムに登録されており、変更があった場合、そのシステムからCSVで出力し、エクセルでマクロを使って加工し、再度読み込むという作業をしており、その都度、作業が止まるため、このような方法がないか質問をした次第です。 ※以前、どこかでこのような方法があるのを呼んだ記憶があったので質問を出してみました。 結果としては、データが書き換えられるのを覚悟で、使用可能を"はい"、編集ロックを"いいえ"の状態にしており、使用する人間に商品がヒットしないときは手で直接入力してくださいと説明してあります。
お礼
ありがとうございます。