3

アクセスフォームActivityTrackerを開いて新しいレコードを開くときに、フィールド* start_time *に現在の時刻now()を自動入力するようにします。

Private Sub Form_Open(Cancel As Integer)
    If IsNull(Form_ActivityEntry.Start_time) And IsNull(Form_ActivityEntry.id) Then
        Form_ActivityEntry.Start_time = Now()
    End If
End Sub

これにより、「このオブジェクトに値を割り当てることはできません」というエラーがスローされ、実行が停止します。

新しいレコードに明示的に移動することでエラーを修正できます

Private Sub Form_Open(Cancel As Integer)
    If IsNull(Form_ActivityEntry.Start_time) And IsNull(Form_ActivityEntry.id) Then
        DoCmd.RunCommand acCmdRecordsGoToNew
        Form_ActivityEntry.Start_time = Now()
    End If
End Sub

またはによって

Private Sub Form_Open(Cancel As Integer)
    If IsNull(Form_ActivityEntry.Start_time) And IsNull(Form_ActivityEntry.id) Then
        Me.Recordset.AddNew
        Form_ActivityEntry.Start_time = Now()
    End If
End Sub

ただし、これらのいずれかにより、「指定されたレコードに移動できません」というポップアップ警告が表示されます。

これで警告を抑えようとしました

    DoCmd.SetWarnings False
    DoCmd.RunCommand acCmdRecordsGoToNew
    DoCmd.SetWarnings True

またはエラー処理を設定することにより、

    On Error GoTo Err_SomeName

しかし、それでも警告が表示されます。

AllowAdditionsはTrueに設定されています。レコードセットのタイプはDynasetです。

それ以外の場合は、このフォームですべてが正常に機能します。

私は何が間違っているのですか?「オープンフォーム」ではなく「オープニングニューレコード」というイベントはありますか?

ご協力いただきありがとうございます!

4

3 に答える 3

5

ここでの問題は、投稿されたコードが機能しない理由についてはまだ誰も正しく答えていません。

理由は、オープンイベントを使用しているためです。

.netとは異なり、ほとんどのシステムアクセスは、オープンフォームイベント(キャンセル可能)とオンロードイベントのときに2つのイベントが発生するという優れた設計になっています。

この優れたAccessの設計は、条件をテストし、フォームの読み込みを防ぐためのコードをon-openイベントに配置できることを意味します。CLOSEを見ると、on-openにもキャンセルがあることがわかります。cancel = trueに設定すると、フォームは読み込まれず、表示されません。

したがって、データがないか、ユーザー権限などをテストでき、小屋はフォームの読み込みをキャンセルします。フォームの読み込みをキャンセルできる場合は、バインドされたコントロールの値を変更できるようにすることはほとんど意味がありません。そのため、バインドされたコントロールはすべて読み取り専用です。

on-openイベントでBOUNDコントロールの値を変更することは許可されていません。これは早すぎます。これは、製品の設計と意図によるものです。

したがって、フォームのロードを防ぐための条件のテストは、オープンで行われます。

したがって、これは、変数のセットアップ、コントロールのセットアップ、コントロールの値の設定、および基本的なフォームの起動コードがON-LOADイベントに属していることを示しています。オンオープンは早すぎます。

また、コードがフォームの読み込みをキャンセルする場合は、すべてのフォームの起動コードとセットアップコードを実行する必要がなく、実行する必要がないことは論理的です。

要約すれば

オンオープンイベント:

キャンセル=trueを設定できますフォームが読み込まれてユーザーに表示されないようにするかどうかをテストするために、コードがここに表示されます。

On-LOADイベント:

すべてのスタートアップコード、変数の設定、コントロールの設定などが推奨され、可能になりました。

また、Accessのこのシンプルなデザインは、開発者として、フォームの読み込みを防止およびキャンセルするコードを探す場所を知っていることを意味します。もちろん、この違いの基本的な理解と、Accessに2つのイベントが存在する理由がなければ、投稿者と与えられた回答の混乱が明らかになります。

于 2013-02-16T23:28:25.563 に答える
3

コントロールのデフォルト値をNow()またはDate()に設定することをお勧めします。デフォルト値は新しいレコードにのみ適用され、他のフィールドに入力すると、値が割り当てられます。

この特定のケースでは、テーブルのフィールドのデフォルト値を設定するための引数さえあります。

警告の設定は使用しないでください:DoCmd.SetWarningsとCurrentDB.Executeの違いは何ですか

于 2013-02-15T21:46:55.323 に答える
-1

私はフォームの新しいレコードに移動するのが好きではありません。発生する可能性のあるデータホールが多すぎて、自分のような問題が発生します。

追加するフィールドごとに、テキストボックス、カレンダーコントロール、番号を上げるなど、空白のバインドされていないフォームをお勧めします。このようにして、各フィールドをタイプチェックするか、必要なものに対して他のチェックを行うことができます。次に、ユーザーが満足したら、挿入クエリを使用してレコードを追加します。

しかし、あなたが尋ねた質問については。バインドされたフィールドに値を割り当てようとしているようです。フィールドがバインドされているオブジェクトに値を割り当ててみてください。

于 2013-02-15T23:16:07.720 に答える