Accessのフォームを作成し、データを入力する際にでbeforeupdateを用いて、どのフィールドにデータが入力されたのかを判断し、データが入力(更新)された際に日付(更新日付)の部分を自動更新したいのですが、ご存知の方ご教授ください。

A 回答 (2件)

(1)作成日時、最終更新日時の2つのフィールドを日付型で準備します。


(2)フォーム作成時に作成日時、フォームが更新されたとき(フィールドに更新された時)に最終更新日時のフィールドに更新された日時(そのときの時間)を入れる方法をとります。
(3)フォームレベルのイベントで処理します。

具体的には
作成日時のデータはフォームレベルのイベントの
フォームの挿入前のイベントで入れるか、
(もしくはフィールドの既定値で定義しても可能と思われる)

Private Sub Form_BerForeInsert(Cancel As Integer)
   Me![作成日時] = Now() ’←作成日の場合は Date
  ’Me![作成者] = CurrentUser() ’←作成者を入れる場合
End Sub

また、最終更新日についても、フォームレベルのイベントで
フォームの中のあるフィールドが更新されると言うのは、
フォーム全体も更新されたという事ですので”フォームのBeforeUpdate”
にコードを書きます。

この方法であると、どのフィールドにデータが入力されたのかを判断する必要はないと思われます。

Private Sub Form_BeforeUpdate(Cancel As Integer)
   Me![最終更新日時] = Now() ’←作成日の場合は Date
  ’Me![最終更新者] = CurrentUser()’←作成者を入れる場合
End Sub

フィールドのBeForeUpdateでなく、”フォームのBeForeUpdate”というのが鍵です。
以上どうでしょうか?

この回答への補足

回答ありがとうございます。詳しい説明で分かりやすいです。

実際はフォームの中にたくさん存在するレコードはクエリーを元にフォームを作っています。そしてそのクエリーもいくつかのテーブルをもとに作成しています。
こういう場合も上記の(3)のようにすればレコードにデータが更新された場合
日時が自動で挿入されるのでしょうか?

補足日時:2001/07/17 23:49
    • good
    • 0

>実際はフォームの中にたくさん存在するレコードは


>クエリーを元にフォームを作っています。
>そしてそのクエリーもいくつかのテーブルをもとに作成しています。
>こういう場合も上記の(3)のようにすればレコード
>にデータが更新された場合日時が自動で挿入されるのでしょうか?

複数のテーブルという事は、簡単な見積書作成DBの例で説明いたします。

このDBは以下の4つのテーブルで構成されるとします。
(1)見積書(見積書ID、顧客ID【(3)から引張ってくる】、作成日、作成者)
(2)見積書明細(商品ID【(4)から引張ってくる】、個数)
(3)顧客マスター(顧客ID、顧客名、顧客住所等・・)
(4)商品マスター(商品ID、品名、単価、商品情報等・・・)

見積書自身の最終更新を管理する場合には(1)のテーブルに作成日、更新日のフィールドを追加してこのフィールドに値が入るようにすれば良いと思います。
(わたくし個人的には”diojojo”さんはこの場合だと思うのですが・・・)

また顧客マスター、初品マスターの最終変更日を入れたい場合はこちらのテーブルに作成日、更新日のフィールドを追加すれば良いと思います。

どのテーブルに最終更新日を記載したいのかを明確にして、
最終更新日を記載したいテーブルにフィールドを追加するのが
ポイントと思われます。

以上判りましたでしょうか?

(言葉での説明は非常に難しいと痛感します、サンプルでは一目瞭然なのですが・・・・・・・)
    • good
    • 0

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

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

QAccess2003の更新クエリ、レコードの更新欄のフィールド名を自動的に入力するには?

AとBという2つのテーブルが、全く同じフィールドを30個持っています。
AとBでIDが同一のモノのみ、AにBのデータを丸々更新したいのですが
[B].[フィールド名1]というように、IDを除いた残り29個のレコードの更新の欄に
手入力する方法で現在行っています。

追加クエリなどだとフィールドが同じ場合は自動的にレコードの追加欄にフィールド名が現れるのですが
同様に更新クエリでもフィールド名を自動的に出す方法はありますか?
現在上記のような更新クエリを10件以上新規で作成しなければならないのですが
各件に29個も手入力で行うのが非常に面倒でなりません。
やはりSQL等で仕組んでいくようにするのでしょうか?

Aベストアンサー

作ったクエリの管理だけでも大変なものになりますね。
テーブルのフィールドが増減したら、また修正がたいへんですね。

参考までに(VBAでの処理になります:クエリは作りません)

使い方)
ボタンをクリックしたイベントなどで、以下を記述します。

  Call CopyFieldValue("A", "B", "ID")

テーブルAのフィールドを基準に、
テーブルAとテーブルBのIDが一致するものをテーブルAにコピーします。
(テーブルA/Bのフィールド名が同じだとして)

キーとなる部分に MsgBox 入れておきました。
UPDATE実行部分はコメントにしています。

ADO/ADOX での例です。
VBEのメニュー「ツール」->「参照設定」で、
 Microsoft ActiveX Data Objects 2.1 Library
 Microsoft ADO Ext. 2.8 for DDL and Security
が、参照可能となっていることを確認します。


---- 標準モジュールに以下を記述

Private Function FieldSet(TbTo As String, TbFrom As String, sFld As String) As String
  FieldSet = TbTo & "." & sFld & " = " & TbFrom & "." & sFld
End Function

Public Function CopyFieldValue(TbTo As String, TbFrom As String, TbKey As String)
  Dim catdb As New ADOX.Catalog
  Dim clm As Column
  Dim sSql As String
  Dim sTmp As String

  catdb.ActiveConnection = CurrentProject.Connection

  sTmp = ""
  For Each clm In catdb.Tables(TbTo).Columns
    If (clm.Name <> TbKey) Then
      sTmp = sTmp & ", " & FieldSet(TbTo, TbFrom, clm.Name)
    End If
  Next
  If (Len(sTmp) = 0) Then Exit Function
  sTmp = Mid(sTmp, 3)
  MsgBox "sTmp : " & sTmp

  sSql = "UPDATE " & TbTo & " INNER JOIN " & TbFrom & " ON " & _
        FieldSet(TbTo, TbFrom, TbKey) & " SET "
  sSql = sSql & sTmp & ";"
  MsgBox "sSql : " & sSql

'  CurrentProject.Connection.Execute sSql

End Function

---- ここまで

※ マクロから CopyFieldValue を呼び出したい(使いたい)場合には、
  マクロのアクション「プロシージャの実行」で指定します。

※ テーブル名/フィールド名を [ ] で囲みたい時には、
FieldSet = TbTo & "." & sFld & " = " & TbFrom & "." & sFld
 ↓
FieldSet = "[" & TbTo & "].[" & sFld & "] = [" & TbFrom & "].[" & sFld & "]"

※ テーブルBを基準とする時には、
For Each clm In catdb.Tables(TbTo).Columns
 ↓
For Each clm In catdb.Tables(TbFrom).Columns

テーブルAのフィールドを部分的に抜き出して作ったテーブルBの場合など
(テーブルBに無いテーブルAのフィールドは更新対象外に)


※ 関数名は適宜変更してください。

※ Function で作っていますが、戻り値は設定していません。

※ エラー処理は入れてません。


※※ UPDATE のSQL作成部分、以下でも動くようです。

  sSql = "UPDATE " & TbTo & " INNER JOIN " & TbFrom & " ON " & _
        FieldSet(TbTo, TbFrom, TbKey) & " SET "
  sSql = sSql & sTmp & ";"
 ↓
  sSql = "UPDATE " & TbTo & ", " & TbFrom & " SET "
  sSql = sSql & sTmp
  sSql = sSql & " WHERE (" & FieldSet(TbTo, TbFrom, TbKey) & ");"

作ったクエリの管理だけでも大変なものになりますね。
テーブルのフィールドが増減したら、また修正がたいへんですね。

参考までに(VBAでの処理になります:クエリは作りません)

使い方)
ボタンをクリックしたイベントなどで、以下を記述します。

  Call CopyFieldValue("A", "B", "ID")

テーブルAのフィールドを基準に、
テーブルAとテーブルBのIDが一致するものをテーブルAにコピーします。
(テーブルA/Bのフィールド名が同じだとして)

キーとなる部分に MsgBox 入れておきました。
...続きを読む

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で3つのフィールドに2006、4、25 と年、月、日
として扱うデータが入っています。
業務上どうしても別々のフィールドに置いておいたほうがよいので、そうしたのですが。
その3つのデータを、1つのフィールドに日付としてまとめるやり方を教えてください。

よろしくお願いします。

Aベストアンサー

クエリなどで
DateSerial([年],[月],[日])
で日付になります。

QACCESSで2つフィールドの日付を比較して新しい日付を表示するには。

お世話になっております。
ちょっとつまづいてしまったので、知恵をお貸しください。

AとBのフィールドにそれぞれ日付が入っていて、比較して新しい日付のものをCのフィールドに表示させたいと思っています。

例:
A:2006/05/31  B:2006/06/01 → C:2006/06/01
A:2006/06/02  B:2006/06/01 → C:2006/06/02
A:2006/06/01  B:2006/06/01 → C:2006/06/01

以上のようにするにはどうすればよいでしょうか。
よろしくお願いいたします。

Aベストアンサー

>Jetデータベースエンジンで、入力検査の式にあるフィールド’A'またはテーブル’テーブル名’の規定値が認識されません。

これはテーブルのエラーですね。
テーブルの既定値に式を入れているのでエラーになります。
テーブルのフィールド内では出来ません。クエリやフォーム上のプロシージャなどで新しい日付をCのフィールドに更新させるように処理しないと出来ません。(AccessはExcelなどの表計算ソフトではありませんので)
更新クエリでCのフィールドに
IIf([A]<[B],[B],[A])
として更新すれば出来ます。
フォーム上ではA・B・CがあればBのコントロールの更新後処理などに
Me![C]=IIf([A]<[B],[B],[A])
などの様にCに代入するようにすれば出来ます。

Qアクセスで複数フィールドを結合して1フィールドを作る際

こんにちは。
OSはWIN2KでAccess2000を使用しております。
「T_データ」テーブルには、
社員コード(数値型)、社員名(テキスト型)、
給料(数値型)、住所(テキスト型)フィールドがあります。
この4つのフィールドを以下の条件を満たしつつ
「T_結合」テーブルの「結合データ」フィールドという
一つのフィールド(テキスト型)に追加したいのです。
------------------------------------------------
1.社員コードは 5桁、社員名は半角30桁、
給料は10桁、住所は全角20桁。
2.社員コード、給料は右詰とし残りは0で、
社員名、住所は左詰とし、残りは空白("")で埋める。
-------------------------------------------------
最終的に「T_結合」テーブルを1レコード85バイトの
レコードとしてエクスポートするのが目標です。
アクセスはUnicodeで管理されているというので単純には
いかなそうなので、どなたかご教授願います。

こんにちは。
OSはWIN2KでAccess2000を使用しております。
「T_データ」テーブルには、
社員コード(数値型)、社員名(テキスト型)、
給料(数値型)、住所(テキスト型)フィールドがあります。
この4つのフィールドを以下の条件を満たしつつ
「T_結合」テーブルの「結合データ」フィールドという
一つのフィールド(テキスト型)に追加したいのです。
------------------------------------------------
1.社員コードは 5桁、社員名は半角30桁、
給料は10桁、住所は全角20桁。
2.社員コード、給料は右詰と...続きを読む

Aベストアンサー

Format([社員コード],"00000")
& Left([社員名] & Space(30),30)
& Format([給料],"0000000000")
& Left(StrConv([住所] & Space(20),4),20)

こんな感じでどうでしょうか?


人気Q&Aランキング

おすすめ情報