初めて自分の家と他人の家が違う、と意識した時

こんばんは。いつもこちらにはお世話になってます。

会社の業務でアクセスでデータを管理してます。
前任者が作ったフォームに、新規データを入力・・といういつもの業務をこなそうとしたら・・

フォームに新しいレコードが追加できなくなりました(今日突然です)
特に原因が分からないのでヘルプで見て
フォームの「レコードセット」のところを
”ダイナセット”→ダイナセット(矛盾を許す)に変えて、何とか新規レコードは追加できるようになったのです。

しかし、いざ新規のレコードを追加する段になって、
今度は 本来、社員NOを入れれば自動的に部署や、性別などが表示されていたのに、一切されなくなりました(今回は仕方ないのですべて入力しましたが)

ちなみに簡単に元になっているDBの説明をしますと

(1)社員基本情報テーブル(主なものだけ抜粋します)
フィールド 従業員NO
      部署
      性別
   
(2)社員出張情報テーブル
フィールド 従業員NO
      出張日
      出張先
      
この(1)と(2)のテーブルがクエリで結ばれて仮想テーブルができてます。
クエリのデザインを開くと、(1)(2)の従業員NO同士が
一本の線で結合されており(一対多とかではなく)
クエリの出力フィールドでは
(2)の従業員NO,(1)の部署、性別、(2)の出張日、出張先
が指定されてました。

フォームはこのクエリを元に作成されてるのですが、
従業員NOを入力すると自動的に部署と性別は表示され、出張日と出張先を入力するという業務でした。

特に何かをしたわけではない(はず)なので原因が分からないまま、とりあえず部署と性別を手入力でしのぎました。

何か解決策があれば教えてください。
(ちなみに質問の書き方で分かるかと思われますが、初級者レベルです)

A 回答 (2件)

クエリが追加更新不可になる原因はいろいろあります


詳しくはヘルプのクエリのトラブルシューティングで
「クエリからデータを更新できない」を見てください

>”ダイナセット”→ダイナセット(矛盾を許す)に変えて
これはこのようなときに使うものではありません
折角Accessがテーブルがおかしいよと教えてくれているのですから
そっちの方を正さないと駄目ですね

テーブルに主キーは設けられていますか?
無いようなら設定してください(多分できない)

原因の予想としては社員基本情報テーブルに矛盾したデータが入力された
というものですね。(多分レコードが重複)
    • good
    • 0
この回答へのお礼

ありがとうございました。おっしゃるとおりでした!
社員基本情報テーブルの主キーが設定されておらず、設定しようとしたらエラー(社員Noが重複していたため)で、データを修正して、主キーを設定したら→直りました!!!

お礼日時:2006/10/11 21:03

クエリは、テーブル<社員出張情報>のみで作成し、<社員基本情報>の各列は参照による列とする。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
こういう改造をすれば、100%動作が約束されます。
一方が他方を参照する関係ですから、<社員出張情報>と<社員基本情報>とでの矛盾も発生する余地がなくなります。
この改善は、初心者の方でも2、30分で可能と思います。

<社員基本情報:主キー=従業員No>
従業員No 氏名    性別  部署
1    鈴木 一郎  M   A
2    中村 太郎  M   B

<社員出張情報:主キー=従業員No+出張日>
従業員No 出張日   出張先
1 2006/10/10  あ
1    2006/10/11  い
1    2006/10/13  う

<社員出張情報 クエリ>
従業員No 出張日   出張先  社員_氏名  社員_性別 社員_部署
1    2006/10/10  あ   鈴木 一郎  M     A
1    2006/10/11  い   鈴木 一郎  M     A
1    2006/10/13  う   鈴木 一郎  M     A

<社員出張情報 クエリ:SQL ビュー>
SELECT 社員出張情報.従業員No, 社員出張情報.出張日, 社員出張情報.出張先, DBLookup("SELECT 氏名 FROM 社員基本情報 WHERE 従業員NO=" & [従業員No]) AS 社員_氏名, DBLookup("SELECT 性別 FROM 社員基本情報 WHERE 従業員NO=" & [従業員No]) AS 社員_性別, DBLookup("SELECT 部署 FROM 社員基本情報 WHERE 従業員NO=" & [従業員No]) AS 社員_部署
FROM 社員出張情報;

<社員出張情報 クエリ>では、社員_氏名、社員_性別、社員_部署の全てを参照によって生成しています。
クエリ自身が参照しているテーブルは、<社員出張情報>のみです。
SQLビューを真似して編集すれば、多分、成功するでしょう。
当然に、DBLOOKUP関数を標準モジュールに登録してから作業します。

フォームでは、社員_氏名、社員_性別、社員_部署を配置することになります。

社員_氏名.使用可能=いいえ
社員_氏名.編集ロック=はい

にします。
これで、社員_氏名、社員_性別、社員_部署は自動参照し、入力もスキップされます。

※AccessではDLookup関数をサポートしていますが実行速度に問題があります。そこで、DBLookup関数を使っています。
※DLookup関数でも事足りるのは当然のことです。

? DBLOOKUP("SELECT 氏名 FROM 社員基本情報 WHERE 従業員No=1")
鈴木 一郎
? DBLOOKUP("SELECT * FROM 社員基本情報 WHERE 従業員No=1")
1;鈴木 一郎;M;A

Microsoft DAO X.XX Object Library を参照設定に加える必要があります。

Public Function DBLookup(ByVal strQuerySQL As String) As String
On Error GoTo Err_DBLookup
  Dim I   As Integer
  Dim N   As Integer
  Dim Datas As String
  Dim dbs  As DAO.Database
  Dim rst  As DAO.Recordset
  
  Set dbs = CurrentDb
  Set rst = dbs.OpenRecordset(strQuerySQL)
  With rst
    Do Until .EOF
      N = .Fields.Count - 1
      For I = 0 To N
        Datas = Datas & .Fields(I) & IIf(I = N, "", ";")
      Next I
      .MoveNext
    Loop
  End With
Exit_DBLookup:
On Error Resume Next
  rst.Close
  dbs.Close
  DBLookup = Datas
  Exit Function
Err_DBLookup:
  MsgBox Err.Description
  Resume Exit_DBLookup
End Function
    • good
    • 0
この回答へのお礼

ありがとうございました。
途中までは文章が理解できたのですが、
DAO?のあたりから、理解ができなくなってしまいました・・
とりあえず、書いていただいたソースをコピーして、分からないところをヘルプで見ながら理解していきます。

お礼日時:2006/10/11 21:20

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

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

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


おすすめ情報

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