gooドクター有料プランが1ヶ月間無料!

初めてのAccessで分からない事があり質問させてください。

<会社テーブル>
会社ID
会社名
住所

<社員テーブル>
会社ID
社員名
ソート番号

*1社に対し複数の社員レコードが存在

以上のようなテーブルがあるとします

現在「会社テーブル」を表形式で一覧表示しています
会社ID,会社名、住所とフィールドが並んでいるのですが、その後ろに「社員テーブル」のソート番号が一番若い社員名を表示したいと考えています(現状は番号関係なく表示させる方法すら分かりません)

色々いじくりまわしたのですが、初めてAccessをさわる事もあってよくわかりません

リレーション等でひっぱってくる事ができるのでしょうか?

どなたか教えて頂けませんでしょうか

何卒よろしくお願い致します

PS.Access2013で作成中です

gooドクター

A 回答 (2件)

単純にテーブル[会社]のみでフォームを作成し、社員表示用テキストボックスを追加。

そして、そのプロパティを表示し

コントロールソース=DBLookup("SELECT 社員名 FROM 社員 WHERE 会社ID=" & [会社ID] & " ORDER BY ソート番号")

これは、以下の標準モジュールに登録したユーザ関数 DBLookup()を使っています。これで、クエリを用意しなくても目的を達成できます。

さて、かかるユーザ関数を標準ライブラリに登録したくない場合、

1、"社員ソートクエリ"を作成します。

SELECT 社員.会社ID, 社員.社員名
FROM 社員
ORDER BY 社員.ソート番号;

2、コントロールソースに次のように書きます。

=DLookUp("社員名","社員ソートクエリ","会社ID=" & [会社ID])

http://office.microsoft.com/ja-jp/access-help/HA …

DLookup()については、マイクロソフトの解説を参照されてください。

【DLookup()の限界を破るにはVBAで同じ関数を作るしかない】

マイクロソフトの解説を読めば判りますが、ORDER BY 節を指定する引数が用意されていません。ですから、どうしても、"社員ソートクエリ"を作成するという手間が必要となります。そこで、SQL文を引数とするDBLookup()をVBAで書けば、その手間を省けるという算段になります。この辺りは、好みと趣味の問題。どっちでも良いと思います。そういうお断りをした上で DBLookup()を紹介しておきます。なお、ADOは、つぎのように参照設定しないと利用できません。

http://www.happy2-island.com/access/gogo03/capte …

Public Function DBLookup(ByVal strQuerySQL As String, _
             Optional ByVal ReturnValue = Null) As Variant
On Error GoTo Err_DBLookup
  Dim DataValue
  Dim rst     As ADODB.Recordset

  Set rst = New ADODB.Recordset
  With rst
    .Open strQuerySQL, _
       CurrentProject.Connection, _
       adOpenStatic, _
       adLockReadOnly
    If Not .BOF Then
      .MoveFirst
      DataValue = .Fields(0)
    End If
  End With
Exit_DBLookup:
On Error Resume Next
  rst.Close
  Set rst = Nothing
  DBLookup = IIf(Len(DataValue & ""), DataValue, ReturnValue)
  Exit Function
Err_DBLookup:
  MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _
      "・Err.Description=" & Err.Description & Chr$(13) & _
      "・SQL Text=" & strQuerySQL, _
      vbExclamation, " 関数エラーメッセージ"
  Resume Exit_DBLookup
End Function
「Accessで別テーブルの値をフォームに」の回答画像2
    • good
    • 1
この回答へのお礼

お礼が遅くなって申し訳ありません

今回は「標準モジュールに登録したユーザ関数」を使わせて頂きました

他のデータベースやプログラムは経験があるのですが、Accessの表示に関する事がさっぱり分からなかったので非常に助かりました

本当にありがとうございました

お礼日時:2014/11/06 11:21

> ソート番号が一番若い社員名を表示したいと考えています


「1社につき1名以上の社員が居るが、最初の1名だけ出れば良い」
すなわち「表示されるレコード数は会社テーブルのレコード数」でOK?

1)テーブルのうち、会社ID別のソート番号の最小値を求めるクエリを作る
2)1)のクエリを呼ぶクエリを作り、社員テーブルを追加して
会社IDとソート番号を関連付け、会社IDと社員名を求めるクエリを作る
3)2)のクエリを呼ぶクエリを作り、会社テーブルを追加して
会社IDを関連付け、会社IDと会社名と住所と社員名を求めるクエリを作る
4)3)のクエリからフォームを作る

うまく作れば1)2)3)をひとつのクエリにできるけど、
順を追って作るほうが理解しやすいと思います。

1)2)は、昇順ソートとTop 1でひとまとめも可
    • good
    • 0
この回答へのお礼

お礼が遅くなって申し訳ありません

なるほど、クエリでフォームを作成してしまえばいいのですね

ただ、今回はその後の絞り込みの検索等色々しなくてはいけないので、その方法を模索する時間短縮の為に「標準モジュールに登録したユーザ関数」を使う方法を採用致しました

折角教えてくださったのに申し訳ありません

今後時間がある時に上記の方法を試してみようと思います

ありがとうございました

お礼日時:2014/11/06 11:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

gooドクター

関連するカテゴリからQ&Aを探す


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング