2

MS Access のテーブルに tblMyTable.SomeID というフィールドがあり、tblUserPref.DefaultSomeID でユーザー設定としてデフォルト値を設定したいと考えています。tblMyTable のテーブル定義でクエリを使用するようにデフォルト値を設定できるようには見えません。レコードが tblMyTable に入力されるフォームがあります。フォームのフィールドのデフォルト値を設定しようとしましたが、クエリも受け付けないようです。というわけで、最後の手段としてVBAでやってみます。VBA で必要な値を照会できますが、コードをアタッチするイベントがわかりません。

ユーザーが入力を開始する前に、フォームで新しい空白のレコードが開かれるたびにコードを実行したいと考えています。既存のレコードを開いたり編集したりするときにコードを実行したくありません。ただし、コードが新しい空白のレコードと既存のレコードの両方に対して実行される場合は、おそらくそれを回避するコードを作成できます。これまでのところ、フィールドとフォーム自体で試したすべてのイベントは、希望どおりに実行されませんでした。誰がどのイベントをどのオブジェクトで使用するべきかを提案できますか?

4

5 に答える 5

5

問題を理解しているかどうかはわかりませんが、ランタイム情報 (ユーザー名など) に基づいて、別のテーブルから取得した値をフィールドに挿入するよう求めていると思います。その場合、ドメイン ルックアップ関数 DLookup() を使用して、返されるフィールドの名前、検索元のテーブルまたはクエリの名前、および検索条件を渡すことができます。結果を1行に制限します(これは、実行時に収集できる値に依存すると思います)。その DLookup() 式は、フォーム コントロールの既定値として永続的に設定でき、実際のレコードを作成する前にフォームが汚れることはありません。

もちろん、私はあなたがやろうとしていることを完全に誤解しているかもしれないので、これはうまくいかないかもしれませんが、あなたはレコードセットで何かを検索し、その結果を新しいレコードの値として使用したいと考えているようで、DLookup() はまったくコーディングせずにそれを行うことができます (また、レコードを時期尚早に汚さないという利点もあります)。

于 2008-10-03T19:33:08.333 に答える
3

現在のユーザーが誰であるかをどのように判断しているかはわかりませんが、プログラムで呼び出すことができるものだと思います。簡単にするために、この例では Access の組み込みの "CurrentUser" メソッドを使用します。(ユーザーレベルのセキュリティが必要です。それ以外の場合は、デフォルトで「管理者」になります。)

現在のユーザーのデフォルト値を返すパブリック関数を VBA モジュールに作成します。

Public Function InsertDefaultSomeID() As String

InsertDefaultSomeID = DLookup("DefaultSomeID", "tblUserPref", _
                              "UserID='" & CurrentUser & "'")

End Function

tblUserPref には、[UserID] フィールドと [DefaultSomeID] フィールドが必要です。現在のユーザーのデフォルトを定義します。

次に、tblMyTable にバインドされたフォームで、[SomeID] フィールドの [プロパティ] を開き、[既定値] プロパティを次のように設定します。

=InsertDefaultSomeID()

フォームを保存し、既知の既定値を持つユーザーとしてログオンして、新しいレコードを挿入してみてください。デフォルト値は自動的に設定されます。

于 2008-10-02T05:01:25.853 に答える
0

そのコードをFormit自体の「BeforeInsert」イベントに配置することをお勧めします(フォーム上のオブジェクトはありません)。

修正:ユーザーがデータの入力を開始するまで、実際にはトリガーされません。したがって、デフォルトにするフィールドが最初のデータ入力フィールドの後に来ることを確認する必要があります。

「OnCurrent」イベントで新しいレコードを確認することもできます。

Private Sub Form_Current()
    If Me.NewRecord Then
        Me.f2 = "humbug"
    End If
End Sub

これの欠点は、新しいレコードを入力するとすぐに作成/ダーティとマークされることです。したがって、レコードを無意識にステップスルーすると、最後のデータが実行され、デフォルトのデータだけを含むいくつかの追加のレコードが作成される可能性があります。そのため、そのような条件をトラップするために何かを行う必要があります(たとえば、必須フィールド、等。)

于 2008-10-01T14:22:16.043 に答える
0

あなたが正しい。コントロールの既定値プロパティを、コンパイル時に不明な値に設定することはできません。その値は実行時に決定されます。したがって、解決策は、フォームの現在のイベント中に、defaultvalue プロパティではなく、コントロールの value プロパティを設定することです。getUserID() は、ユーザーが誰であるかを判断するために使用される公開関数です。

Private Sub Form_Current()

    On Error GoTo Proc_Err

    Dim rs As DAO.Recordset
    Dim fOpenedRS As Boolean

    If Me.NewRecord = True Then
        Set rs = CurrentDb.OpenRecordset("SELECT DefaultSomeID " _
        & "FROM tblUserPref WHERE UserID = " & getUserID())
        fOpenedRS = True
        rs.MoveFirst
        Me!txtPref.Value = rs!DefaultSomeID
    End If

Proc_Exit:
    If fOpenedRS = True Then
        rs.Close
    End If

    Set rs = Nothing

    Exit Sub

Proc_Err:
    MsgBox Err.Number & vbCrLf & Err.Description
    Err.Clear
    Resume Proc_Exit
End Sub
于 2008-10-01T17:30:17.760 に答える
-1

彼は提案された代替アプローチです。ユーザーが明示的な値を指定していないときにデフォルトを明示的に INSERT するのではなく、その値を欠落したままにします (おそらく、これを専用のテーブルでモデル化し、行を INSERT するのではなく、欠落している値をモデル化しますが、私は知っています)多くの人は、テーブルに null 値を許容する列を多く持つことを嫌いません)。その後、クエリで欠落している値を置き換えることができます。欠落データを処理するための別のアプローチを言うだけなので、これはアプリケーションで有効である場合と有効でない場合があります:)

于 2008-10-02T10:24:00.180 に答える