- ベストアンサー
クエリを基にしたフォームでテーブルにレコードを追加したい
よろしくご教授ください。 商品の在庫場所の検索システムを作成しています。 テーブルは「T商品(商品コード、商品名、在庫場所)」と「T在庫場所(在庫場所ID、在庫場所)」があり、それを基にクエリ「Q商品在庫場所(商品コード、商品名、在庫場所)」を作成しました。 エクセルデータからなんとか先の2つのテーブルを作成したのですが、将来新しい商品が入ってきたり、在庫場所変更に備えて、フォームにて追加・編集できる方法を考えています。何とか「Q商品在庫場所」を基に「F商品在庫場所」を作ってはみたのですが、入力しようとしても何も入力できません。編集ロックがかかっている様子もありません。リレーションが問題なのでしょうか? 「Q商品在庫」で入力したデータを、2つのテーブルのそれぞれのレコードとして蓄積することは可能なのでしょうか? クエリのデザインビューでは『「T在庫場所」1→∞「T商品」』となっています。 よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
No.2,3,4です。 すみません、こちらも見落としてました(汗) まずは体調が回復されたようで、何よりです。 > Dim rst As DAO.Recordset ・・・DAOですか。 私がDBに機能を組み込む場合、 1)マクロ=自作 2)VBA=自作/Copy&Paste 3)その他(DAO・ADO)=Copy&Paste (Webでよさそうなサンプルを探して) という感じで、DAOになると中身をいじれるレベルではないんです。 ・・・「回答の種類」に「お詫び」を加えてほしい感じです(汗) ただ、 > F-itemlocationを開きスクロールしようとすると、「数値型にテキスト型云々」 からすると、「列数」と「値集合ソース」、「連結列」の辺りに何か問題があるのかな、という気もします。 「値集合ソース」に指定されているテーブル・クエリ・SQL文には問題はないでしょうか? (例えば、クエリのデザインビューで、ドラッグ&ドロップではなく手入力で「T-location」と入力した場合、「[T]-[location]」というように書き換えられるという問題が発生しますので、その辺りが怪しいようにも思えます)
その他の回答 (4)
- DexMachina
- ベストアンサー率73% (1287/1744)
No.2,3です。 > 既に初心者の私にとって『未知なる世界』となってしまっています。(笑) 私も、独学なんで偏った情報しか持ってません(笑) ・・・さて。 > テーブルにはきちんと新たな在庫場所が追加されています。 「閉じる」マクロでの「レコードの保存」を実行後に、「値の代入」でエラーを起こしているので、追加されているということです。 ・・・ということぐらいはわかるのですが。 > ・値の代入 > アイテム [Forms]![F-itemlocation]![Location] > 式 [Forms]![F-addlocation]![Location] 式を見る限り、問題が見当たりません。 なので、念のため、以下の点を確認してみて下さい。 1)フォーム名・コントロール名・マクロ名は、本当に間違っていないか。(「l(エル)」と「1(いち)」など) (ただ、これだった場合のエラーは「~が見つかりません」になるはず・・・) ※「Location-NotInList」等の「-(ハイフン)」は「_(アンダーバー)」に直して下さい※ (これが可能性としては一番高い気がしますので) 2)各テーブルでのデータ型の確認 ・「T商品」の「在庫場所」(←「F-ItemLocation」の「Location」のレコードソース)がテキスト型の場合 →値の代入元となる「Location」のコントロールソースは「在庫場所」(テキスト型) ・「T商品」の「在庫場所」を数値型にしていた場合 →代入元の「Location」のコントロールソースは「ID」(数値型) (これも、もし違っていた場合のエラーは、「データ型が違います」になるはず・・・) 以上の確認をして、それでも問題なかった・問題が解決しなかった場合は、 以下の操作でマクロをVBAに変換して、それをここに貼り付けて下さい。 そうすれば、マクロについてはほぼ実物が見られることになりますので。 (解決できるかは別として) 1)データベースウィンドウでマクロの一覧を表示 2)「閉じる」マクロや「Location-NotInList」マクロをクリック 3)メニューで、「ツール(T)」→「マクロ(M)」→「マクロをVisualBasicに変換(B)」をクリック 4)ダイアログボックスが表示されたら「変換」ボタンをクリック 5)変換されたマクロが、モジュールの一覧に追加されるので、それを開いて、ここにCopy&Paste あと、今回のエラーの原因とは別の話ですが、「F-AddLocation」のコマンドボタンのマクロで、 「レコードの保存」をした後に「F-ItemLocation」の「Location」コンボボックスの再クエリ (又は「値集合ソース」の更新)が必要ですので、お忘れなく。 ・・・って、本当に別の話だよな・・・?(オイ)
補足
せっかくご教授いただいておりますのに返事もかかず申し訳ありません。 ちょっと風邪で寝込んでいた間に、自分が何をやっていたのか訳が分からない状態に陥っていました。 で、言われるがままに貼り付けてみました。 ================== Private Sub Location_NotInList(NewData As String, Response As Integer) Dim rst As DAO.Recordset Dim stDocName As String stDocName = NewData & " は、リストに無い値です。登録しますか?" '登録しない If MsgBox(stDocName, vbOKCancel) = vbCancel Then Response = acDataErrContinue Location.Undo Exit Sub End If 'T-locationに登録 Set rst = CurrentDb.OpenRecordset("T-location", , dbDenyWrite) With rst .AddNew !Loaction = NewData .Update .Close End With Response = acDataErrAdded Set rst = Nothing End Sub ================ 今現在はF-itemlocationを開きスクロールしようとすると、「数値型にテキスト型云々」の趣旨のアラートがでるまでになってしまいました。依然ぼーっとしたままの状態で(元からか・・・)考えて下りますので何がなんやら。 こんな状況ですが、何かおわかりになりますか?よろしくお願いいたします。
- DexMachina
- ベストアンサー率73% (1287/1744)
No.2です。 > なければ新規の在庫場所として認識・保存しようと考えていました。 でしたら、やはり「リスト外入力時(NotInList)」イベントで対応されるのがよいと思います。 (既存の在庫場所であればそのまま入力、新規の在庫場所だった場合はポップアップフォームを展開) 概略としては、 ○T在庫場所をレコードソースとした、入力専用のポップアップフォームを作成 ・プロパティシートの以下の設定値を「はい」に設定します 「データ」タブ : 「データ入力用」 「その他」タブ : 「ポップアップ」と「作業ウィンドウ固定」 ※「書式」タブの各種設定をいじると、より「それっぽい」見た目にできます※ (「スクロールバー」=「なし」、「境界線スタイル」=「ダイアログ」、など) ○F商品在庫場所の「在庫場所」コンボボックスに「リスト外入力時」イベントを設定 (同コンボボックスのプロパティシートの「イベント」タブにあります) ・上記の入力専用フォームを開きます (ウィンドウモードはダイアログ) ・そのフォームで新規在庫場所を入力・保存したら、「在庫場所」コンボボックスの再クエリを実行 (コンボボックスのリストに、新規登録した在庫場所が追加され、入力が可能になります) といった感じになります。 ・・・すみません、詳細な設定を説明しようと思ったのですが、説明が難しかったので・・・ プロパティシートの「リスト外入力時」にカーソルをおいた状態でF1キーを押すとヘルプが表示されるので、詳しくはそちらをご覧下さい(汗) 個別事項での不明な点などがありましたら、またご質問下さい。
補足
いつもありがとうございます。既に初心者の私にとって『未知なる世界』となってしまっています。(笑)で、とあるサイトにて同じような質問を参考に以下のように設定しました。 ===マクロにて=== <閉じる> ・コマンドの実行 レコード保存 ・値の代入 アイテム [Forms]![F-itemlocation]![Location] 式 [Forms]![F-addlocation]![Location] (最初に英語でテーブルなど作ってたモノですから・・・) ・閉じる オブジェクト F-addlocation (これは教えていただいた追加登録のフォームにボタンを設置し登録) <追加登録> ・フォームを開く オブジェクト F-addlocation ・レコードの移動 新しいレコード (これはフォーム[F-itemlocation]の在庫場所コンボボックスに設定) またこれで入力した際に「リストにありません」と表示されるのですが、それはOKとして、「F-addlocation」をボタンで閉じようとするとエラー表示されます。 「名前が適切ではありません。Location-NotInList」→「アクションの実行エラー」(条件:true アクション名:値の代入 引数:[Forms]![F-itemlocation]![Location][forms]![F-addlocation]![Location]) となっています。しかし、テーブルにはきちんと新たな在庫場所が追加されています。 たびたび、申し訳ありませんが、この原因をご教授願えませんか? 重ね重ねよろしくお願いします。
- DexMachina
- ベストアンサー率73% (1287/1744)
ご質問の「Q商品在庫」のような構造ですと、一対多の「一」側であるはずのテーブルに、同じ値が複数記録されることになってしまい、不適です。 以下、対応法をご提案します。 まず、T商品の「在庫場所」が、T在庫場所の「在庫場所」を記録するようになっているのでしたら、「在庫場所ID」を記録するように変更して下さい。 その上で、T商品の「在庫場所」を、コンボボックスで表示させるように設定します。 具体的には、 1)テーブルのデザインビューで「在庫場所」の行にカーソルを移す 2)画面左下で「ルックアップ」タブをクリックし、表示コントロールに「コンボボックス」を指定 3)値集合ソースに「T在庫場所」を指定 4)連結列に「1」(=既定値)を指定 (T在庫場所の第一列が「在庫場所ID」の場合) 5)列数に「2」を指定 6)列幅に「0cm;5cm」を指定 (1列目の「在庫場所ID」の幅を0とすることで、リストのドロップダウンをしなくても「在庫場所」が表示されるようになる。なお、この設定では在庫場所IDはリスト表示時にも見えなくなるため、それも確認できるようにしたい場合は、値集合ソースなどの変更が必要) これで、F商品在庫場所は、T商品から作成し直します。 (或いは既存のフォームのレコードソースをT商品に設定し、「在庫場所」テキストボックスをコンボボックスに変更して、T商品の「在庫場所」と同様の設定を行います) こうすることで、『新商品の追加』『在庫場所の変更』が問題なくできるようになります。 但し、「新規在庫場所の追加」はここではできませんので、別にフォームが必要です。 (それを作成した上であれば、「リスト外入力時(NotInList)」イベントを使用、といった方法も考えられます。長くなるのでここでは割愛しますが) わからないことがあれば、お尋ね下さい。 わかる範囲でしたら、お応えしますので。
補足
わざわざお時間頂きありがとうございます。 つまり、クエリで事前に在庫場所のデータが入力されていなければならない。という事でよろしいですか? 実は、在庫場所の表示が約200カ所とかなりの数に上ります。そこで、クエリで商品在庫場所を入力する際に、在庫場所も手入力しそのデータが既に「T在庫場所」に存在すればその在庫場所のデータとして追加し、なければ新規の在庫場所として認識・保存しようと考えていました。 その方法は、可能ではないのでしょうか? つまり、「Q商品在庫場所」内 「在庫場所」を手入力→既に登録してある→ 既存の「在庫場所」に登録 →新たなデータ→ 新しい「在庫場所」として登録 おわかりいただけますか?よろしくお願いします。
- Gin_F
- ベストアンサー率63% (286/453)
> 入力しようとしても何も入力できません。 [ACC2003] Microsoft Access データベースで関連テーブルのレコードを編集する方法 http://support.microsoft.com/default.aspx?scid=kb;ja;304473&Product=accJPN とりあえず、ここらへんをご確認ください。
お礼
ありがとうございました。 クエリによる更新、がヒントとなりました。ありがとうございました。 今後ともよろしくお願いします。
お礼
何度もご教授頂きありがとうございます。 今の私のレベルではテーブルをリレーションシップさせて、クエリからマクロを作成、というレベルではなさそうです。恥ずかしながら。 そこで、時間とのかねあいもあり、今回は単体のテーブルから作成することにしました。 教えていただいた件は、もう少し学習した後、活用していきたいと思います。 何度もご教授いただきお手間を取らせましたのに、失礼いたしました。 今後ともよろしくお願いいたします。 ありがとうございました。