• ベストアンサー

Access 条件によってフィールドのデータを削除したい

いつもお世話になっています。 Accessで書籍管理のデータベースを作っています。 「利用者名」「連絡先」「貸出日」等のフィールドがあります。  書籍が返却されたときに「利用者名」のデータを削除しますが、削除されたとき「Null」の時、そのレコードの「連絡先」と「貸出日」のデータを消去したいと思います。 どのように設定すればよいか教えてください。 また、貸しだし登録の時に、「利用者名」が入力されたのに、「連絡先」や「貸出日」を入力されていな場合の警告の出し方も教えてください。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.3

テーブルの値要求を「はい」にしようとすると、「入力規則に違反している」と出ます ↑そりゃなりますよ。フィールドにデータが無いのですから。 一応MDBのバックアップを取ってください。 再度テーブルデザインで、 値要求 はい とします。前回漏れてしまいましたが、 空文字列の許可 いいえ にしてテーブルを保存してください。 警告メッセージには 「はい」で進めていってください。 その後フィールドにテキトーに埋めていってください 更新クエリでいいかな。 上記のようにやっても。 ↑上記とは、どの部分ですか? 「ということを踏まえつつ」の前後で全く別の回答をしている つもりなのですが・・ うまく動作しません ↑具体的かつ詳細に説明してください。 一般的には ユーザーテーブル ユーザーID 主キー(オートナンバー、社員No、住民基本台帳のNo、健康保険No・・) 氏名 氏名よみ 連絡先 ・・・ 書籍テーブル 書籍ID 主キー(オートナンバーでよいと思います) 書籍名 書籍名よみ(洋書の場合などは研究してみてね。無くても良いかな?) ・・・ 同じ本の場合でも個々に登録しておいた方が良いと思います。 貸し出し履歴テーブル 履歴ID 主キー(オートナンバーでよいと ユーザーID(ユーザーテーブルがオートナンバーなら長整数型) 書籍ID(こっちも。書籍テーブルのデータ型と合わせてね) 貸出日 規定値 Date() 返却日 備考 でクエリを作成 前述のテーブルを3個使います。 履歴ID 貸し出し履歴テーブル.ユーザーID 貸し出し履歴テーブル.書籍ID 貸出日 返却日 備考 氏名 氏名よみ 連絡先 書籍名 ・・・ などとします。 で クエリの結合線をLeft Join・・ 貸し出し履歴テーブル.ユーザーID → ユーザーテーブル.ユーザーID 貸し出し履歴テーブル.書籍ID → 書籍テーブル.書籍ID 「→」は結合プロパティで設定してください これでユーザーID・書籍IDを入力すれば氏名・書籍名が出てきます やっと上記クエリを基にしてフォームの作成ができる様になりました。 また、運用面では、ユーザーID・書籍IDを速やかに探したいと 思うと考えられますので、コンボボックスを使うなりして下さい。 書籍IDの方はAccessに登録する際に書籍の裏あたりに書籍IDを マジックで書いちゃう(安易過ぎて NG でしょうけど) この辺でどうでしょ なお、ここの掲示板の「回答の補足」では当方にはメールが届きません。 レスつけたものはなるべく見るようにはしていますが、2~3日が限度かな。 私の名前のところをクリックしてみてください。 「お礼」ですとこちらにメールが入りますので適宜使い分けてくださいまし。 (フォームの話は別にご質問ください) ここは参考となると思います。 ニキータさんの魔法使いの開発工房 http://www.mahoutsukaino.com/ ついでに・・ Accessについてくるサンプル(ノースウィンド)も参考になりますよ。 たしかオプション指定しないとインストールされなかったように思います。

その他の回答 (2)

noname#60992
noname#60992
回答No.2

No1の方もおっしゃっておられますが、access(リレーショナルデータベース)というのはテーブルを分散して作ることができるところが特徴です。 書籍というデータと、利用者というデータと、貸し出し履歴というのを別のテーブルで管理することができるということです。 そうすることによって、書籍の管理、利用者の管理、貸し出しの管理を簡単に行えるようになります。 (連絡先のデータは、利用者のテーブルで管理して、貸出日は貸し出し履歴で管理するほうが合理的です。) 前置きが長くなってしまいましたが、データの変更を行うための方法として、更新クエリがあります。 特定のデータが選択されるよう抽出条件(フォーム上の値に指定をして)選択クエリをつくり、クエリを「更新」に変更し「レコードの更新」にて値を変更します。 そしてフォーム上よりコマンドボタンなどでこのクエリを実行させることにより、値を変更します。 連結フォームよりデータを操作すると、間違って値を変えてしまう可能性があるため、アクセスの操作に慣れていないユーザーがいる場合はあまりお勧めしません。

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.1

「利用者名」「連絡先」「貸出日」等のフィールドがあります。  書籍が返却されたときに「利用者名」のデータを削除しますが 私だったら返却日フィールドを追加して、このフィールドのデータ有無で 返却されたかを判断するようにします。 この方が、後になって 書籍に破損が見つかったときに「容疑者」が分かりますし どの書籍が人気なのか?など等、わかるようになります。 そうすれば「連絡先」や「貸出日」のテーブルデザインで 値要求を「はい」にしておけば質問の後半も解決できます。 ということを踏まえつつ ご質問の回答としては フォームの利用者名の更新後処理に If Me!利用者名 = "" Then Me!連絡先 = "" Me!貸出日 = Null End If かな? 貸しだし登録の時に、「利用者名」が入力されたのに、 「連絡先」や「貸出日」を入力されていな場合の警告の出し方 フォームのタブオーダーを、「利用者名」→ 「連絡先」→「貸出日」と しておいて 「連絡先」と「貸出日」の フォーカス喪失時に If Me!連絡先 = "" Or Isnull(Me!貸出日) = true Then Msgbox "未記入項目があります" Cancel = True End If などと記述しておけば良いと思います。

hasmiya
質問者

補足

丁寧な回答ありがとうございます。 テーブルの値要求を「はい」にしようとすると、「入力規則に違反している」と出ます。そして、上記のようにやってもうまく動作しません。 どうすればよいのでしょうか?よろしくお願いします。

関連するQ&A

  • アクセス 空フィールドのみ 別データー挿入

    アクセスの同テーブル内に下記レコード(1)(2)が有ります。 (1)レコードのフィールドにはほぼデータが入っていますがNULLのフィールドもあります。 (2)レコードのフィールドはほとんどNULLです。 (1)のレコードのフィールド、データーを取得して (2)のレコードのフィールドがNULLの場合は(1)のフィールドのデーターを貼付ける 例えば下記の(3)様にしたいです。 |数値型 |テキスト型 |日付型  |通貨型  |メモ型 |Yes/No型 | |ID    |名前     |入力日  |金額   |     |チェック   | (1)|01   | さる    |07/28 |1,000 |     |-1     | (2)|02   |とら     |       |      |     |       | (3)|02   |とら     |07/28 |1,000 |     |-1     | 自分なりに考えた所 DLookUp で一つ一つ(1)フィールドを取得して(2)フィールドNULLの場合は挿入し(3)にする方法を 考えましたが、フィールド数が実際には100ほど有り方法が良くないと思いました。 Cloneメソッドを使用して同じフォームに(1)と(2)データーを表示させて上手く出来ないか 考えたりもして見ましたが上手く行きません 良い方法が思いつきません こんな方法があるとか このサイトを参考にしなさいとか どなたかご教授頂けませんでしょうか よろしくお願い致します。

  • Access2003でフィールドのデータがずれる

    WindowsXPを使用しています。 時々、100件以上あるレコードの内1件だけ、 データがおかしくなります。 具体的には、フィールド2に入力してあったデータが、 フィールド4と6に入っていたり、 フィールド3に入力していたデータが、 フィールド8,9,10に1文字ずつ分割して入っていたりします。 バックアップデータで確認したところ、 1ヶ月程前はそのレコードも正しく入力されていたため、 入力ミスではないと思います。 データが変になる原因がわかりません。 原因がお解かりになられる方、ご回答を宜しくお願いいたします。

  • アクセスのフィールドデータを一括削除したい

    アクセスのテーブルで、複数のフィールドにある、データのみを一括して削除したいのですが、方法はあるでしょうか。 たとえば顧客テーブルで、 「顧客番号」や「顧客名」「TEL」などのフィールドに格納されている基本データは温存します。 そして、過去の取引履歴として「最終請求日」や「最終入金日」など、複数のフィールドに格納されているデータのみを削除したいのです。 フィールド自体は削除しません。 複数のフィールド(列)を選択して右クリックすると、[ 選択したフィールドデータの削除 ]といったメニューが出ると良いのですが。 全ての顧客に対して、この作業を一括して行ないたいのですが可能でしょうか。      

  • アクセス2003でIDフィールドのデータをオート入力(規定値)したいのですが

    こんにちは。 教えてください。 オートナンバー型を利用せずに単票フォームからNOフィールドのデータを入力したいのです。  ↓こんな考え方で レコード新規作成時 : NO 規定値 総レコード件数+1 です。 オートナンバー型を利用するとたとえばNO10を後での削除をすると その10は欠番になり利用不可ですよね。 そこらへんは柔軟に必要があればいつでも欠番になっている10という値をNOフィールドに手入力で再利用したいのです。 いろいろ調べてみたのですがいい感じな方法が見つけられませんでした。 お願いします!!

  • アクセスのデータ取り込みについて

    UTF8のテキストデータを取り込みする際 データが10フィールドあるとします。 1レコード目の1フィールド目から9フィールド目までデータがあり、10フィールド目はNULL 2レコード目の1フィールド目から10フィールド目までデータがある場合 テキストデータ自体9フィールド目までしか取り込めない場合がございます。 こういったレコード終端がNULLの場合とNULLでない場合に取り込む際 注意することはありますでしょうか?? 因みにデータを取り込む際、文字コードを指定しフィールドの データ型を変更する際 存在するフィールドに比べアクセス上ではフィールド数が足らなくなるのですが・・・ どうぞよろしくお願いします。

  • アクセス:不要なデータのみを一括削除

    複数のフィールドに”不明”という文字が記録されています。この不明を全てのレコードで一括して削除する方法を探しております。 色々試しましたが、同じレコードのところまでしか消えなかったり(and条件)、逆に必要なデータが入った部分まで消えてしまったりします(Or条件)。 今までは更新クエリのフィールドひとつひとつで”不要”で条件設定し、更新にNullを入れ消していますが、一つ一つするには時間がかかるため、一括してする方法を探しております。

  • アクセスのフィールドデータ更新について

    アクセス初心者です。 商品売上TB(レコード数10万件)に [出荷日][出荷先][商品名A][個数]の4つのフィールドがあります。 商品名TBのフィールド(レコード数500件)に [商品名B][金額A]2つのフィールドがあります。 商品名Aと商品名Bはリレーションでつながっています。 フォームで月別、商品別、出荷先別に個数、金額が見られるようにしています。 年に1度商品の単価見直しがあり、毎年10/1に行われます。 見直し前のデータも取っておきたいのですが、そのような場合 新たなテーブルを作り追加クエリで[出荷日][出荷先][商品名A][個数][金額A] を毎年追加していくのか? ファイルサイズがかなり大きくなってしまうと思います。 商品名TBに[金額B][金額C]のようにフィールドを増やしていくのか? 毎年クエリで条件式が増えるとあまりスマートでないと思います。 使い勝手も悪そうです。 通常皆さんはどのようにされているのでしょう?

  • Access テーブルにデータを取り込む際 下記の条件でやるには どうしたらよいでしょうか?

    テーブル名「テーブル1」で 中身が フィールド名1,値1 フィールド名2,値2 フィールド名3,値3 というデータがあったとします。 このデータを 名前,フィールド名1,フィールド名2,フィールド名3 というフィールドをもったテーブルに1レコードとして書き込んで行きたいのです。 簡単な方法あるでしょうか? 結果として 名前,フィールド名1,フィールド名2,フィールド名3 テーブル1,値1,値2,値3 というレコードになります。 次に2レコード目は また別の「テーブル2」を書き込みます。 よろしくお願いします。

  • Access 連結フィールド値を自動で表示

    Accessでフォーム上にサブフォーム(データシート)を作成すると、 新規レコード欄にも自動的に連結フィールドの値が表示されます。 このサブフォームをメインフォーム上に作らずに、 コマンドボタンクリック時にあるフィールドが一致する(上記で言う連結フィールド)データを表示したサブフォーム(データシート)を開くかたちにしたいのですが、そうすると当然ながら新規レコード欄には連結フィールドの値は表示されません。 これをメインフォーム上にサブフォームを作った時と同じように、新規レコード欄に連結フィールド値を表示させるにはどうしたら良いでしょうか? サブフォームを開く段階で新規レコードに結合フィールドの値を(VBAで)入力する事も考えましたが、そうするともしそこにデータを入れるつもりじゃなくても1つのレコードとしてデータが残ってしまいます。 メインフォーム上に作ったサブフォームなら、新規レコードに結合フィールドの値は表示されているものの、その他のフィールドにデータを入力しなければ1つのレコードとしてデータが残ることはありません。 こういう事が可能かどうかわかりませんが、ご存知でしたら教えてくださいませ。 よろしくお願いします!

  • ACCESS2007でレコードの条件付き削除

    よろしくおねがいします。 テーブル [仕訳伝票]、[仕訳明細]に 仕訳IDで 前者が1、後者がN のリレーション設定しています。 [仕訳伝票]の仕訳日のフィールドが削除日以前のデータを削除するのに次のようにしました。 「仕訳明細クエリ」作成 ※添付画像を見てください DoCmd.RunSQL ("delete FROM 仕訳明細クエリ;")で 「 実行時エラー'3086' 指定したテーブルから削除できませんでした 」 因みに 「仕訳明細クエリ」を開いてDeleteキーで手動削除すると仕訳明細のレコードは削除できましたが仕訳伝票のレコードは残っています。

専門家に質問してみよう