search

ACCESS 2010初心者向け!フォーム作成と複数テーブル参照によるエラー解決ガイド

ACCESS 2010初心者向け!フォーム作成と複数テーブル参照によるエラー解決ガイド

ACCESS 2010 初心者です。フォームを作成しようとしてますが、新規の時はコンボ・ボックスからマスターデータを参照、登録済のデータを表示する場合はコードからマスターデータを参照・・【その3】 【その1】 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13108126208 【その2】 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1010836245 先日はお世話になりました。度々失礼します。 受注明細フォームの件で 上の続きなのですが、得意先テーブルの下のレベルには支店テーブル と言うのがあります。フォーム上で得意先を選び、次に必ず支店テーブル を選ぶようになります(得意先と支店は1対多の関係にあります)。 支店テーブルは、主キーが得意先コードと(支店)コードに設定してあります。 得意先と同じように、支店を選ぶためにコンボボックスを作成し コンボの「値集合ソース」に下記を設定。 SELECT 支店.名称, 支店.[コード], 支店.郵便番号, 支店.住所, 支店.電話番号 FROM 支店 WHERE (((支店.得意先コード)=[Forms]![受注メンテナンス]![Form_得意先コード])) ORDER BY 支店.[コード]; そして支店コンボのイベント「更新後処理」に Private Sub 支店_AfterUpdate() Me!支店_郵便番号.Value = Me!支店.Column(2) Me!支店_住所.Value = Me!支店.Column(3) Me!支店_電話番号.Value = Me!支店.Column(4) Me!Form_支店コード.Value = Me!支店.Column(1) End Sub これで得意先に対応した支店の情報が表示されます。 ※例えば「支店_郵便番号」は、フォーム上の得意先の「郵便番号」と 区別するためです。 問題はここからなのですが、 得意先と支店のコンボから其々名前を選び、受注テーブルを更新後、 再びそのデータを表示すると下記のエラーとなります。 実行時エラー”13″:型が一致しません。 エラーの部分は、メンテナンスフォームのレコード移動時イベントで下記の 部分です。得意先のを参考にして記述したのですが・・・ Private Sub Form_Current() If IsNull(Me!Form_支店コード.Value) = False Then Me!支店.Value = DLookup(“[名称]”, “支店”, “[コード]='” & Me!Form_支店コード.Value & “‘” And “[得意先コード]'” & Me!Form_得意先コード.Value & “‘”) 結論としては、2つのキーを持った支店テーブルをDLookupで参照する場合 この設定で良いでしょうか?(駄目だからエラーになるのだと思いますが) ただ文法エラーにもならず、デバックしても其々の値には入力したないようが テキスト形式の場合の「AND条件」とかがよく分かっていないような気がします。 何か気づいた点がありましたら教えて頂けると幸いです。 よろしくお願いします。

ACCESS 2010で複数テーブルを参照するフォーム作成におけるエラー解決

ACCESS 2010を用いてフォームを作成する際、複数のテーブルを参照する処理で「実行時エラー’13’:型が一致しません」というエラーが発生するケースがあります。これは、主にデータ型の違いや、DLookup関数における条件式の記述ミスが原因です。本記事では、このエラーの原因と解決策を、具体的なコード例を交えながら解説します。特に、主キーが複数カラムから構成されるテーブル(今回の例では、得意先コードと支店コードが主キーの支店テーブル)を参照する際の注意点に焦点を当てます。

エラーの原因と解決策

質問者様のコードでは、`DLookup`関数内で`AND`条件を使用していますが、その記述に問題があります。`AND`演算子の前後には、それぞれ正しい比較演算子と値が必要です。 `'” & Me!Form_支店コード.Value & “‘” And “[得意先コード]'” & Me!Form_得意先コード.Value & “‘”` の部分は、論理演算子の使い方に誤りがあります。文字列連結と論理演算子を正しく組み合わせる必要があります。

修正後のコード:

vba
Private Sub Form_Current()
If IsNull(Me!Form_支店コード.Value) = False Then
Me!支店.Value = DLookup(“[名称]”, “支店”, “[コード] = ‘” & Me!Form_支店コード.Value & “‘ AND [得意先コード] = ‘” & Me!Form_得意先コード.Value & “‘”)
End If
End Sub

ポイント: `AND`の両側に`=`演算子を追加し、各条件を正しく比較するように修正しました。また、文字列連結において、シングルクォーテーション(‘)を適切に配置することで、文字列と数値を正しく連結しています。

データ型の一致確認

エラーの原因としてもう一つ考えられるのは、データ型の一致です。`DLookup`関数が返す値と、`Me!支店.Value`のデータ型が一致していない場合、このエラーが発生します。 `Me!支店`コンボボックスのデータ型と、`支店`テーブルの`名称`フィールドのデータ型を確認し、一致していることを確認してください。不一致の場合は、データ型を合わせる必要があります。

コンボボックスの値集合ソースの最適化

コンボボックスの「値集合ソース」にSQLクエリを使用していますが、WHERE句に`[Forms]![受注メンテナンス]![Form_得意先コード]`を使用することで、フォームの値が変化するたびにクエリが実行されます。これはパフォーマンスの低下につながる可能性があります。

より効率的な方法として、得意先コードが変更された際にのみクエリを実行する、イベントプロシージャを使用することを検討しましょう。例えば、得意先コンボボックスの`AfterUpdate`イベントに、支店コンボボックスのRowSourceを更新するコードを追加します。

vba
Private Sub 得意先_AfterUpdate()
Me!支店.RowSource = “SELECT 支店.名称, 支店.[コード], 支店.郵便番号, 支店.住所, 支店.電話番号 FROM 支店 WHERE 支店.得意先コード = ‘” & Me!得意先.Value & “‘ ORDER BY 支店.[コード];”
Me!支店.Requery
End Sub

この方法により、不要なクエリの再実行を減らし、パフォーマンスを向上させることができます。

エラー発生時のデバッグ方法

エラーが発生した際に、原因を特定するために、デバッグ機能を活用しましょう。 ブレークポイントを設定し、変数の値を確認することで、エラーの原因を特定することができます。特に、`Me!Form_支店コード.Value`と`Me!Form_得意先コード.Value`の値が期待通りであるかを確認することが重要です。

専門家の視点:効率的なデータベース設計

データベース設計の段階で、適切なリレーションシップを定義することで、このようなエラーを未然に防ぐことができます。 今回のケースでは、得意先テーブルと支店テーブルの間に1対多の関係がありますが、主キーの構成を改めて検討する余地があります。例えば、支店テーブルに「支店ID」という主キーを追加し、得意先テーブルとの関連付けを「得意先コード」で行うことで、よりシンプルで効率的な設計が可能になります。

成功事例: ある企業では、受注管理システムのデータベース設計を見直し、主キーの構成を最適化することで、データ参照時のエラーを大幅に削減し、システムの処理速度を向上させました。

実践的なアドバイス:段階的な開発とテスト

複雑なフォームを作成する際には、段階的に開発を進め、各ステップでテストを行うことが重要です。 まず、得意先テーブルのみを参照するシンプルなフォームを作成し、動作を確認します。次に、支店テーブルを追加し、データの整合性を確認します。 この段階的なアプローチにより、エラーの原因を特定しやすくなり、開発効率が向上します。

まとめ

ACCESS 2010で複数テーブルを参照するフォームを作成する際には、データ型の一致、`DLookup`関数における条件式の記述、そしてデータベース設計の最適化に注意が必要です。本記事で紹介した修正コードとアドバイスを実践することで、エラーを回避し、効率的なフォームを作成することができます。 エラーが発生した場合は、デバッグ機能を有効活用し、段階的に問題を解決していくことが重要です。 さらに、専門家のアドバイスを参考に、データベース設計を見直すことで、より堅牢で効率的なシステムを構築できます。 継続的な学習と実践を通して、ACCESS 2010のスキルを向上させていきましょう。

コメント一覧(0)

コメントする

お役立ちコンテンツ