• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Accessフォームの規定値の設定について)

Accessフォームの規定値の設定について

このQ&Aのポイント
  • 履歴を管理するフォームを作成し、新規入力時にコードの最新更新日の名称などが規定値として表示される方法についてお教えください。
  • Accessフォームで単票形式の新規入力時、コードの最新更新日の内容を規定値として表示し、変更された箇所のみ入力できる方法を知りたいです。
  • Accessフォームの規定値として、新規入力時にコードの最新更新日の内容を表示し、変更がある場合の入力を促す方法を教えてください。

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

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.1

>VBAを使わなくてもできる方法があると助かります。 マクロを知らないので、回答できません。 VBAで試しにやってみた結果です。後学のためにやってみただけなので、「VBAは嫌だ」という場合は気にせずスルーしてください。 'T履歴事項:ID, コード, 名称, 住所, 更新日 '同上テーブルから自動で作成した単票フォームにおいて Private Sub コード_BeforeUpdate(Cancel As Integer) Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim mySQL As String Dim latestUpdate As Date Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset rs.CursorLocation = adUseClient mySQL = "SELECT T履歴事項.コード, Max(T履歴事項.更新日) AS 最新更新日 FROM T履歴事項 GROUP BY T履歴事項.コード HAVING (((T履歴事項.コード)='" & [コード] & "'));" rs.Open mySQL, cn, adOpenForwardOnly, adLockReadOnly If rs.RecordCount = 1 Then latestUpdate = rs.Fields("最新更新日") Else Exit Sub End If rs.Close mySQL = "SELECT * FROM T履歴事項 WHERE (((T履歴事項.コード)='" & コード & "') AND ((T履歴事項.更新日)=#" & Format(latestUpdate, "m/d/yyyy") & "#));" rs.Open mySQL, cn, adOpenForwardOnly, adLockReadOnly '同じコード、日付のデータがあれば、IDが最新のものを採用-不要かも If rs.RecordCount > 1 Then rs.Sort = "ID DESC" End If Me.名称 = rs.Fields("名称") Me.住所 = rs.Fields("住所") Me.更新日 = Date rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub 結構面倒ですが、もっと簡単な方法がきっとあるでしょう。 ご参考まで。

s-e
質問者

補足

ご回答ありがとうございます。 ほかに方法が見つからなかったら試してみたいと思います。 ありがとうございました。

その他の回答 (1)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

>の規定値の設定について と言う表現は間違いに近い。 http://office.microsoft.com/ja-jp/access/HA100964511041.aspx など見れば、この言葉の他の使い方があり、本件はコードを入れて選択したデータで、規定値ではなかろう。 ーーー コード入力を元に参考確認事項たる、名称や付属属性を入力画面に出すのは良く有ること。 アクセスの解説書の読み方が足りない。読んでないのかも。 ーー 名称や住所や内容は、コードを条件にして、履歴事項テーブルをクエリで検索し、検索内容結果を所定のテキストに出す。 ーー 「履歴事項」と言う名称も、別のことを暗示して違和感が有る。履歴と言うのは固有の別の意味が有るので良くない。 Googleで「Access 履歴」で照会してみること。 普通に言うと、会社マスターテーブル的なもののようだ。 ーー コードを入力するテキストボックスを、フォームに貼り付けると、テキスト0になったとして ーー 氏名表示用のテキストボックスをもう1つ設ける(テキスト2)。 ここでのやり方は、そのコントロールソースに =DLookUp("[氏名]","社員3","[ID] = " & Val([テキスト0])) と入れる。エクセルのVLOOKUPの類推で考えやすいと思う。 私の場合は、社員3と言うテーブルがあり、その中のフィールドに、IDと氏名がある。だから 社員3テーブルで、IDフィールドが、テキスト0のTEXTと等しいものを探し、あればその氏名を返し、それを テキスト2に入れろ、となる。ただテキストボックスの値は文字列で、参照するIDなどのデータ型は整数型など有るかも知れないから その場合は変換して、合わせる様に注意。

s-e
質問者

補足

ご回答ありがとうございました。 質問の意図がきちんと伝わっていなかったようで申し訳ありません。 テーブルの履歴事項には、取引先の情報の変更履歴がすべて収まるようになっています。 質問の例でいうと、コード001の「あいうえお有限会社」が「あいうえお株式会社」に社名を変更した、という情報が載っている、ということです。 IDは、ユニーク性を保つための単なるオートナンバーであり、取引先の情報とリンクするものではありません。 履歴事項テーブルのほかに、現在事項クエリがあり、コードごとにグループ化し、更新日の最大を集計して、現在有効な情報のみ表示するクエリも作ってあります。 今後、取引先の情報に変更があった場合、履歴事項テーブルに新しいIDのレコードを追加していくのですが、変更のない事項(社名変更の場合、住所フィールドとか)を、いちいち入力していくのが面倒で…。 フォームを作って、規定値として現在の事項が出て、変更事項だけ変更するようにしたいのです。 コントロールソースに関数を入力してしまうと、新しいIDで追加したものが変更できないし、追加したものも空欄になってしまうので、「規定値」として表示したいと考えています。 履歴事項テーブルには、変更のあったところのみ入力して、そうでないところはNullにして、現在事項クエリでNullでない最新情報を拾ってくる方法も考えたのですが、それだと「Nullに変更」ができないため、中止しました。 ご指摘いただいたDLookUP関数も試してみたのですが、コントロールソースではうまくいくのに、規定値だとうまくいかず…。 オブジェクトを起動するときにエラーが発生しました。 *オブジェクトのプロパティまたはメソッドで、引数が正しく指定されていません。オートメーションでサポートされているプロパティまたはメソッドについては、OLEサーバーのドキュメントを参照してください。 *メモリ不足のため、プロシージャを実行できません。不要なアプリケーションを終了し、再度実行してください。 メモリを開放する方法については、MicrosoftWindowsのオンラインヘルプ「メモリ.トラブルシューティング」を参照してください。 と、出てしまいます。 コントロールソースではうまくいくので、引数間違いではないと思います。 最近買った新しいPCで、Accessしか立ち上げてないので、メモリ不足でもないと思います。 どうしたものでしょう…。

関連するQ&A