あなたの映画力を試せる!POPLETA映画検定(無料) >>

お世話になります。
初心者です。Access2002を使っています。
AとBの2つのテーブルから1つのフォームをつくることはできますか?
フォームウィザードでAとBのテーブルのフィールドを指定してフォームを作成しようとすると、「A.Bテーブルのフィールドを選択しましたが、このうち1つまたは複数のテーブルが他と関連ありません...」というエラーメッセージが出ます。
解決策がありましたらよろしくお願いします。

A 回答 (5件)

こんにちは。



まずアドバイスですが、
このような内容の質問では、テーブルの内容を詳しく書いたほうがいいですよ。
場合によっては回答の仕方が変わってきますし、的外れな回答になってしまうこともあります。

さて、回答ですが、

まずは2つのテーブルの関連付け(リレーションシップ)を行わなければなりません。

たとえば
「商品」テーブルに商品IDと商品名、商品の価格
「請求書」テーブルに請求書IDと顧客名、注文商品Noがあるとします。

この場合、2つのテーブルの間に関連性のある項目は
「商品ID」と「注文商品No」ですね。
この2つを結びつけること(リレーションシップ)によって、
請求書に商品名や商品価格を表示させることができるようになるのです。

と概略だけご説明しましたが、
すべて説明するとなると一冊の本がかけてしまうほどの内容となりますので、
書店などで書籍を参考にされるなどして、勉強されてみてください。


それから蛇足ですが、
テーブルから直接フォームを作るのではなく、
クエリから作成したほうがあとあと作業が楽です。
    • good
    • 0
この回答へのお礼

お礼が遅くなってすみません。
アドバイスありがとうございました。
リレーションシップがなかなかうまくいきません。
参考書でもう少し勉強します。

お礼日時:2003/06/25 18:40

2つのテーブルで結合できるようなキー項目が必要です。



たとえば、テーブルAが顧客情報だったとします。テーブルBが顧客の住所情報だったとします。

2つのテーブルに顧客IDがあれば、この顧客IDをクエリの中で線で結合させてあげれば、1つのフォーム上に表示する事が出来るようになります。

なにか2つのテーブルを結合できる項目はありませんか?よろしくご検討ください。
    • good
    • 0
この回答へのお礼

お礼が遅くなってすみません。
アドバイスありがとうございました。
2つのテーブルで結合できるようなキー項目がありません。もう少ししらべてみます。

お礼日時:2003/06/25 18:39

手っ取り早いのは、2つのテーブルからクエリを作成して


そのクエリのフォームを作成してみてください。
メイン・サブフォームを使う方法もあります。
    • good
    • 0
この回答へのお礼

お礼が遅くなってすみません。
アドバイスありがとうございました。
クエリは作成できたのですが、レコードが反映されません?? もう少ししらべてみます。

お礼日時:2003/06/25 18:38

二つのテーブル間に参照整合性があれば簡単に出来ます。



参照整合性はこの場で説明するのは大変ですので、投げやりなようで申し訳ありませんが、図解本などをお調べ頂くとよいと思います。
    • good
    • 0
この回答へのお礼

お礼が遅くなってすみません。
アドバイスありがとうございました。
参照整合性を調べてみます。

お礼日時:2003/06/25 18:34

Accessは、完成度の高い便利なリレーショナル・データベースですから、複数のテーブルでリレーションシップでつないで、1つのクエリーを作り、フォームを作れば良いと思います。

    • good
    • 1
この回答へのお礼

お礼が遅くなってすみません。
アドバイスありがとうございました。
リレーションシップでつないで、フォーム自体は作成できたのですが、レコードが反映されません?? もう少ししらべてみます。

お礼日時:2003/06/25 18:33

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QAccess フォームで複数テーブルの同時入力

フィールド項目が多い為に複数のテーブルに分けて
同じフィールド名 [品番] で1対1でリレーションを組んでいます。
フォームの新規レコードで品番を入力の時に
各テーブルの品番に入力するのにはどうしたらいいでしょうか?
後々のことを考えると1つのテーブルにまとめたほうがいのでしょうか?
フィールドが300ぐらいあるのでテーブルに分けたほうがわかりやすいので
現在は10テーブルに分けています。

よろしくお願いします。

Aベストアンサー

> 1対1でリレーション
なんだから、一まとめにするクエリを作ってそのクエリを入力対象にするとか。
1対nだと、更新できないクエリになります。

QAccessで別テーブルの値をフォームに表示したい

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

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

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

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

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

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

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

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

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

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

PS.Access2013で作成中です

Aベストアンサー

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

コントロールソース=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/HA001228825.aspx

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

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

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

http://www.happy2-island.com/access/gogo03/capter00307.shtml

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

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

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

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

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

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

SELECT 社員.会社ID, 社員.社員名
FR...続きを読む

QACCESSでフォームを使って、テーブルを参照、データ入力、データ更新をしたいのです

フォームを使って、テーブルを参照、データ入力、データ更新をしたいのです。

売上テーブル

 ID   商品コード  日付    金額 
 1    G1     20080101  532153
 2    G1     20080101  564281
 3    G1     20080301  538123
 4    J4     20080301  124531
 5    J4     20080302  125483

ID:オートナンバー 商品コード:数値型 日付:数値型 金額:数値型

これを使い、
フォームではまず

レコードナンバーを入力画面
       ↓
レコード番号を入れると、そのレコードのデーターが画面に表示され、
その画面で修正可能
       ↓
 保存 ボタンで保存

という流れです。

レコードナンバーはIDを使おうと思っています。

データの量が莫大な為、コンポボックスなどは使えません。

できるだけ、VBAなどは使わずに作りたいです。

よろしくお願い致します。

フォームを使って、テーブルを参照、データ入力、データ更新をしたいのです。

売上テーブル

 ID   商品コード  日付    金額 
 1    G1     20080101  532153
 2    G1     20080101  564281
 3    G1     20080301  538123
 4    J4     20080301  124531
 5    J4     20080302  125483

ID:オートナンバー 商品コード:数値型 日付:数値型 金額:数値型

これを使い、
フォームではまず

レコードナンバーを入...続きを読む

Aベストアンサー

まずそのテーブルを基にしてフォームを作成します。
そのフォームのヘッダー部分にテキストボックスを配置後、一旦
上書き保存。
フォームのレコードソースを
SELECT *
FROM テーブル名 WHERE ID=[Forms]![フォーム名]![テキストボックス名]
とします。
次にテキストボックスの更新後処理に
Me.Requery
とすれば完成です。
フォームを開いてテキストボックスにID入力後エンターしてください。

保存に関しては、コマンドボタン作成後クリック時イベントに
DoCmd.RunCommand acCmdSaveRecord
とすれば良いでしょう。

この手のモノは検索すれば相当数ヒットするので、そちらを参考にされるのもよろしいかと。

QACCESSのフォームからデータの追加ができない

現在Accessの基本を勉強中です。
テーブルを元にフォームを作成し、フォームから新しく名前や会社名などを直接入力し、追加できるようにしたいです。
ところがフォームから入力を行うと、内容が追加されず一番最初に登録した人の名前が書き換わるだけになります。
どのように新しくデータを追加できるようになるのでしょうか?
まったくの初心者なので、どの機能を使えばよいか戸惑ってます。
どうかよいご意見をお願い致しますm(__)m

Aベストアンサー

データを追加する場合は、新規レコードに移動(=新規レコードを選択)する必要があります。

最も簡単なのは・・・
そのフォームの最下方に、レコードセレクタ(『レコード: [|<][<][   1][>][>|][*]/1』といった
感じの部分)が表示されていたら、そこで『[*]』のボタンを押すと、新規レコードに移動できます。
(もしレコードセレクタが表示されていないようなら、フォームのプロパティシートを開いて、
 『書式』タブの『レコードセレクタ』の設定値を「はい」にして下さい)

他には、
 ・フォーム自体を入力専用にする
 (フォームのプロパティシートの『データ』タブで『データ入力用』を「はい」に設定:
  既存のレコードは表示されなくなります)
 ・レコード移動用のコマンドボタンを設置する
 (フォームをデザインビューで開き、ツールボックス(矢印や、新規のテキストボックス等を
  設置する際に使用するツールバー)の左から二番目にあるウィザードボタンが押された
  状態にして、新規コマンドボタンを設置すると、簡単に作れると思います)
といった方法があります。

データを追加する場合は、新規レコードに移動(=新規レコードを選択)する必要があります。

最も簡単なのは・・・
そのフォームの最下方に、レコードセレクタ(『レコード: [|<][<][   1][>][>|][*]/1』といった
感じの部分)が表示されていたら、そこで『[*]』のボタンを押すと、新規レコードに移動できます。
(もしレコードセレクタが表示されていないようなら、フォームのプロパティシートを開いて、
 『書式』タブの『レコードセレクタ』の設定値を「はい」にして下さい)

他には、
 ・フォー...続きを読む

QAccess 同じデータをたくさんのレコード(同一列)に一度に入力するには

いつもお世話になっています。
Accessの基本的な入力に関して教えてください。
同じデータをたくさんのレコード(同一フィールド)に一度に入力するには、どうすればよいか教えてください。

Excelの列方向へのコピーと同じような感覚でできないのでしょうか?

よろしくお願いします。

Aベストアンサー

質問の回答にならないかも知れませんが・・・

1.EXCELでコピーするための元データを作成します
  ※仮にレコードが1000件ある場合はEXCELで1000行作ります。

2.Excelのデータをコピーします。

3.Accessのテーブルを開きます。

4.先頭レコードの貼り付けをしたい項目にカーソルを合わせます。(カーソルは白の十字)

5.下方向へドラッグし、項目を選択します。

6.貼り付けをします。

※貼り付けに失敗した場合、元に戻せませんので必ず元ファイルのコピーを取ってから行ってください

よろしければ、お試し下さい

QアクセスVBAのMe!と[ ]

基本的なことですみません。

アクセスのイベントプロシージャで、Me!ってありますけど、これはどういう意味なんでしょうか?

また、Me!の後に、Me!.~~と書く場合と、Me!.[~~]と書く場合がありますが、どこが違うのでしょうか?

Aベストアンサー

>プロシージャ内で[]を使う場合は、そのフォーム外のオブジェクトを使う場合と考えてよろしいでしょうか?
別のオブジェクトを使う場合だけではありません。
Hensu = Me![Text1]のようにHensuという変数に自身のTest1の値を代入する場合のように。
[]で括られているのがオブジェクト名やコントロール名だよという事。
クエリの抽出条件に存在しない[?]とすれば?というコントロール等が参照できないので?というダイアログが表示されるように?というオブジェクトやコントロールは何?と聞いてくるように。
>フォーム内のオブジェクトの場合はあくまでMe!で良いのでしょうか
Forms.[フォーム名]![コントロール名]やForms![フォーム名]![コントロール名]が構文。
アクティブなフォームが自分自身ならForms![フォーム名]の変わりにMeでもOKですという事。

と言う解釈の方が良いと思います。

QACCESS IIF関数 複数条件の設定について

 選択クエリにおいて、あるフィールド「 X」 のレコード数値が
 
  0<[X]<=50   であれば A 
  50<[X]<=100  であれば B 
  100<[X]<=150  であれば C

 と表記させるフィールド「Y」を追加したいと考えています。
 この場合、Yのフィールド設定で指定する数式についてご教授願います。

 一応、
  IIf(0<[X]<=50,"A","") Or IIf(50<[X]<=100,"B","") Or IIf(100<[X]<=150,"C","")

  としましたが、実行すると、Yの列がすべて「-1」と表記されてしまいます。

 何卒よろしくお願いいたします。

Aベストアンサー

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A", [X]<=100, "B", [X]<=150, "C", True, "")


なお、数学あるいは一般生活では確かに「0<[X]<=50」という表記をしますが、
Accessの関数などではこれだと正しい結果が得られません。
正しく認識させるためには、等号・不等号を挟んだ式は、「左辺」と「右辺」の
2つの要素からなる形にする必要があります。
(「0<[X]<=50」は「[X]>0 And [X]>=50」と分割してやる、と)

但し、今回のご質問のような『連続した範囲』であれば、前(左)で既出となる
式の要素で「[X]<=0」が「真(=-1)」とならなかった時点で、「[X]>0」が保証
されますので、上記のように、「[X]>0」を省略して「[X]<=50」だけを条件として
指定すればOk、ということになります。
(「0<[X]<=50」の次が「80<[X]<120」などのように、「50~80」が欠けた
 場合は、省略ができない、と)


【参考】
「0<[X]<=50」は、このままだと「0 < ([X]<=50)」という式と解釈されます。
この場合、「[X]<=50」は、「真(=-1)」か「偽(=0)」か「Null」のいずれかに
なります。
何にせよ、「0<[X]<=50」全体として「正(=-1)」となることがないため、
ご質問の式では、IIF関数は常に第3引数に指定された値「""」を返す
ことになります。

この結果、式全体としては「"" Or "" Or ""」という形となり、「0かNull」
以外なので、「真(=-1)」という値が返された、ということです。

なお、Nullについては、以前、他の方の質問につけた回答も、併せて参考までに:
http://oshiete.goo.ne.jp/qa/4850675.html

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A"...続きを読む

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

QAccessでテーブルの値をテキストボックスに代入するには?

[ID][文字列]の2つのフィールドからなる単純なテーブルがあり、削除クエリを併用して常に最新のデータしか格納されていない状態に工夫できました。(データは常に1つ)
そこでフォーム上にあるテキストボックスにこのテーブルの[文字列]フィールドのデータを表示させたいのですが、
どうしたらよいでしょうか?

また、このテーブルの[文字列]フィールドのデータを直接変数として使いたい場合はVBAでどのように記述すればよいのでしょうか?

Aベストアンサー

テーブルに"データは常に1つ"ならコントロールソースに
「=DLOOKUP("文字列のフィールド名","テーブル名")」
IDごとに"データは常に1つ"ならコントロールソースに
「=DLOOKUP("文字列のフィールド名","テーブル名","[ID]='" & Me.ID & "'")」

Dlookup関数のヘルプ
http://office.microsoft.com/ja-jp/assistance/HP010496551041.aspx

QACCESS 入力フォームでテーブルへデータを複数追加する

自力で問題解決できないのでお願いします。

1画面の入力フォームでテーブルへデータを複数追加をしたいと考えています。

例)
☆ 入力フォーム
________________________________________________________
顧客番号 [0001]
顧客氏名 [山田太郎]
受付日付 [2008/6/18]

  購入商品
     えんぴつ
     消しゴム
     ボールペン
                      [ 登録 ]
_______________________________________________________________
                ↓

☆ テーブルデータ
_______________________________________________________________
0001  山田太郎  2008/6/18  えんぴつ
0001  山田太郎  2008/6/18  消しゴム
0001  山田太郎  2008/6/18  ボールペン
_______________________________________________________________


以上のように入力フォーム1画面に対してテーブルのデータが入力分発生するようにしたいです。

VBAは触れないので、できればAccessの対話式で解決できればと思っています。URL等があれば教えてください。
よろしくお願いします。(⌒ ⌒)(_ _)ぺこ

自力で問題解決できないのでお願いします。

1画面の入力フォームでテーブルへデータを複数追加をしたいと考えています。

例)
☆ 入力フォーム
________________________________________________________
顧客番号 [0001]
顧客氏名 [山田太郎]
受付日付 [2008/6/18]

  購入商品
     えんぴつ
     消しゴム
     ボールペン
                      [ 登録 ]
_______________________________________________________________
      ...続きを読む

Aベストアンサー

購入履歴:

[ID]_[顧客番号]_[顧客氏名]_[受付日付]
__1__________1___山田太郎___2008/06/18

購入明細:

[購入履歴_ID]_[行番号]_[購入商品]
___________1________1___えんぴつ
___________1________2___消しゴム
___________1________3___ボールペン

こういうテーブル構造が一般的だと思いますね。
ですと、自動で次のようなメイン・サブフォームが生成されます。
[行番号]の生成がチトややこしいですが・・・。
でも[行番号]がないと[購入商品]の表示順が制御できないです。

*************************************************

ID___________[_____1]
顧客番号_____[___1]
顧客氏名_____[山田太郎___________]
受付日付_____[2008/06/18]

============================================
[購入履歴_ID][行番号][購入商品]
--------------------------------------------
[__________1][_____1][えんぴつ_________]
[__________1][_____2][消しゴム_________]
[__________1][_____3][ボールペン_______]

*************************************************

これで、自動的にテーブルにはデータが登録されます。
([行番号]の生成問題は残りますが・・・。)

クエリ1:

顧客番号_顧客氏名_受付日付___行番号_購入商品
_______1_山田太郎_2008/06/18______1_えんぴつ
_______1_山田太郎_2008/06/18______2_消しゴム
_______1_山田太郎_2008/06/18______3_ボールペン

SELECT 購入履歴.顧客番号, 購入履歴.顧客氏名, 購入履歴.受付日付, 購入明細.行番号, 購入明細.購入商品
FROM 購入明細 INNER JOIN 購入履歴 ON 購入明細.購入履歴_ID=購入履歴.ID
ORDER BY 購入明細.行番号;

で、所望のデータ形式は、このようにクエリで解決します。

購入履歴:

[ID]_[顧客番号]_[顧客氏名]_[受付日付]
__1__________1___山田太郎___2008/06/18

購入明細:

[購入履歴_ID]_[行番号]_[購入商品]
___________1________1___えんぴつ
___________1________2___消しゴム
___________1________3___ボールペン

こういうテーブル構造が一般的だと思いますね。
ですと、自動で次のようなメイン・サブフォームが生成されます。
[行番号]の生成がチトややこしいですが・・・。
でも[行番号]がないと[購入商品]の表示順が制御できないです。

*************...続きを読む


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

人気Q&Aランキング