次の方法で共有

型の不一致の回避方法

Anonymous
2013-08-25T02:47:36+00:00

テーブルAには会社名が格納されています。レコードの構成は ID、 会社名 です。(フィールドが ID と 会社名)

テーブルBには会社名と部署名が格納されています。 レコードの構成は ID、 会社名、 部署名 です。(フィールドが ID と 会社名 と 部署名)

しかし、このテーブルBの会社名のフィールドはテーブルAの会社名を参照してインプットしていますから

データ型は数値型、集合値ソースは

SELECT [テーブルA].[ID], [テーブルA].[会社名] FROM テーブルA ORDER BY [ID]; 

となっています。

テーブルBをデータシートビューで見ると、会社名のフィールドには 数値(テーブルAのID)ではなく 文字列で会社名が

表示されています。

ここで、テーブルBに 会社名が あいうえお であるレコードがいくつあるかカウントさせたく

    Dim cnt As Integer

    cnt = DCount("会社名", "テーブルB", "会社名='あいうえお'")

を実行すると 抽出条件でデータ型が一致しません と言われます。

この解決策として、名前でなくIDを使って抽出せよ という記事がWebにありましたが、これはやりたくありません、

IDはデータベースのプライマリキーとして使っているだけでデータを管理するものにとって何の意味もありません。

テーブルBの会社名フィールドにテーブルAから名前をひっぱってきているのは、未登録の会社の部署登録を

避けるためで、テーブルBにレコードを追加するときに、会社名をテーブルAに登録済の会社から選んで入力させ

ているものです。テーブルBの会社名フィールドをIDでなく実際の名前で抽出する方法はないのでしょうか?

よろしくご教示お願いします。

yamaoyapi

Microsoft 365 と Office | アクセス | 家庭向け | Windows

ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。

0 件のコメント コメントはありません

質問作成者が受け入れた回答

Anonymous
2013-08-27T14:17:59+00:00

MukkuMukuです。

Reference/MSDN

Application.DCount メソッド (Access)

定義域関数によるフィールドの値の計算

抽出条件式での複数フィールド

このあたりが参考になろうかと思います。

Expr

"会社名"+"部署名"としてしまうと、フィールド[会社名部署名]が見つからないというエラーになりそうです。

"[会社名] & [部署名]" でも可能ですが ”*” (アスタリスク)や "[ID]" などにするとよいかと思います

Criteria

暗黙の変換ができたとしても評価できない式になっているのでしょう。

cnt = DCount("*", "テーブルB", "[会社名] & [部署名]=Application.Forms!dept_name_reg.controls!会社名 & Application.Forms!dept_name_reg.controls!部署名")

でエラーにならないかなと思います。

※ここ訂正。コンボボックスの連結列が文字列フィールドだとこれでできるけど、連結列が数値フィールドとなっている場合は、

"[会社名] = Application.Forms!dept_name_reg.controls!会社名 AND [部署名]=Application.Forms!dept_name_reg.controls!部署名"

とか

"[会社名] = " & Me!会社名 & " AND [部署名] = " & Me!部署名

ですね。

また、文字列を+演算子で結合する場合、結果がNullになることがありますので気を付けてください。

テーブルでルックアップフィールドを確認するとこんな感じになっています。

ここで設定された内容が、テーブルやフォームで使用されるデフォルトのコントロールになります。

この状態でフォームを作成した時、該当フィールドに連結されるコントロールはコンボボックスコントロールになります。テーブルの設定でなくても、フォームであればコントロールを変更してコントロールソースなどプロパティを適切に設定してください。

なぜ変化したかについては、現在の情報から判断できるものはありません。

この回答は役に立ちましたか?

0 件のコメント コメントはありません

3 件の追加の回答

並べ替え方法: 最も役に立つ
  1. Anonymous
    2013-09-01T09:15:43+00:00

    MukkuMUku さん、

    ご教示ありがとうございます。

    教えていただいた方法で対処できそうです。

    ありがとうございました。

    yamaoyapi

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません
  2. Anonymous
    2013-08-27T00:44:17+00:00

    MukkuMukku 様、

    ご教示ありがとうございます。ACCESS はほとんど使ったことがなく、これから勉強を始めようという超初心者ですのでよろしくお願いします。

    > どのようなフローで会社名で件数をだすのかにもよるかなと

    部署の登録ボタンを押したときに実行させるVBA(でしょうか?)として以下をボタンに登録しております。

    このボタンを押したときのエラーです。(ただし下のコードはエラーになりません、コードの下の説明を参照ください)

    Private Sub Dept_name_reg_go_Click()

    On Error GoTo Err_club_name_reg_go_Click

        Dim cnt As Integer

        cnt = DCount("会社名", "テーブルB", "会社名=Application.Forms!dept_name_reg.controls!会社名")

        If cnt = 0 Then

          rsp = MsgBox(Me!会社名 & Me!部署名 & "を登録しますか?", vbOKCancel, "確認")

            If rsp = vbOK Then

              レコードの登録処理

            End If

        Else

          rsp = MsgBox(Me!会社名 & Me!部署名 & "は登録済です。", vbOKOnly, "確認")

        End If

    Exit Sub

    以下略

    で、このプログラムはエラーにならずうまく動きました。最初に質問させていただいたときには、書き方の見当がつかなかったので簡単なことから複雑化させようと4行目をフォーム入力との一致チェックでなく固定値で

     "会社名='あいうえお'"

     としていたものです。これが型の不一致のエラーになっていました。やりたいことは、このような固定名称でなく フォームから入力した会社名だったのです。上の4行目のコードのようにしたらエラーは出ずに、動くようになりました。なお、フォームの会社名入力は文字を直接タイプ入力するのでなくテーブルAからコンボボックスで選択入力させるようにしています。

    質問(1) しかし、実際に行いたいのは 会社名だけでなく部署名の一致もチェックしたいのです。

    ですから、4行目は本来は 「会社名一致 And 部署名一致」 のAnd条件で、

     cnt = DCount("会社名"+"部署名", "テーブルB", "会社名=Application.Forms!dept_name_reg.controls!会社名" And "部署名**=Application.Forms!dept_name_reg.controls!部署名")**

    でなくてはいけないと思いますが、こうすると 型が一致しません というエラーになります。

    ところが

    cnt = DCount("会社名, "テーブルB", "会社名=Application.Forms!dept_name_reg.controls!会社名")

    および

     cnt = DCount("部署名", "テーブルB", "部署名**=**Application.Forms!dept_name_reg.controls!部署名")

    はいずれもエラーにならずに正常に動きます。

    Andで条件をつないだときに 型が一致しませんというエラーになる理由がわかりません。

    質問(2) テーブルBをデータシートビューでみると、以前は 会社名 に 文字列で 名前が表示されていましたが、今日現在は 1,2,3といった数値が表示されています。この数値は テーブルAの会社名のIDのようです。IDで表示されてもなんだかわかりませんので、従前のように 名前で表示されるようにできませんか?

    テーブルAの表示に関してはなにも操作した覚えがありませんが、どこかを操作して表示がIDになったり文字列になったりしますか?

    質問(3)Meの使い方が疑問ですが、これについては新しく質問を立てますので、そちらでご教示お願いします。

    初歩的質問でお時間をとっていただき恐縮ですが、よろしくご教示お願いします。

    yamaoyapi

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません
  3. Anonymous
    2013-08-25T04:44:58+00:00

    MukkuMukuです。こんにちは。

    テーブルBの会社名フィールドには、テーブルAのPrimarykeyであるIDの値しか持っていないので

    Dcountでレコード件数を出そうとするならばクエリを用意する必要があります。

    SELECT

         テーブルB.ID

        , テーブルA.会社名

    FROM

        テーブルB INNER JOIN テーブルA ON テーブルB.会社名 = テーブルA.ID

    DCount 関数: レコード セット内の一意の値のカウント / Office.com

    とはいえ、どのようなフローで会社名で件数をだすのかにもよるかなと。

    たとえば、リストボックスコントロールで選択した会社の件数を出力するというときであれば、

    クエリを別途用意する必要もないでしょう。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません