1

作成しているアプリケーションで、VBAコードを使用してフォームのチェックボックスの値を変更すると、書き込みの競合が発生します。フォーム上のオブジェクトの値をVBAが変更するイベントに次のコードを挿入してみました。

If Me.Dirty Then
    Me.Dirty = False
End If

しかし、問題は解決しません。手動操作で何かを変更しようとする前に、レコードが保存されていないかのように。

この問題が発生しているフォームの完全なコードの例を次に示します。

空白の価格設定チェックボックスが変更された場合のコード:

Private Sub chkSupAllowBlankPrice_AfterUpdate()

    If Me.Dirty Then
        Me.Dirty = False
    End If

    If (chkSupAllowBlankPrice.Value = True) Then
        chkSupRequirePrice.Value = False
    End If
End Sub

[価格設定が必要]チェックボックスが変更された場合のコード:

Private Sub chkSupRequirePrice_AfterUpdate()
    If Me.Dirty Then
        Me.Dirty = False
    End If

    If (chkSupRequirePrice.Value = True) Then
        chkSupAllowBlankPrice.Value = False
        chkSupAllowBlankPrice.Visible = False
        chkSupAllowBlankPrice.Enabled = False
        chkSupAllowBlankPrice.Locked = True
        lblSupAllowBlankPrice.Visible = False
    Else
        chkSupAllowBlankPrice.Visible = True
        chkSupAllowBlankPrice.Enabled = True
        chkSupAllowBlankPrice.Locked = False
        lblSupAllowBlankPrice.Visible = True
    End If
End Sub

それが役立つかどうかはわかりませんが、テーブルはSQL Server Expressデータベースに格納されているため、タグです。

-2009年5月29日編集@1201時間-

すべてのオブジェクト値の変更をコメントアウトして、表示、ロック、および有効化された変更のみを残してみましたが、書き込みの競合が発生し続けています。イベントプロシージャの最後にMe.Dirty=Falseを入れてみましたが、削除しようとしました。これまでのところ、VBAコードによって他の値が変更されることなく、[RequirePricing]または[AllowBlank Pricing]を変更すると、書き込みの競合が発生します。

-2009年5月29日編集@1318時間-

これらのチェックボックスが操作するフィールドは、レコードが作成されると変更を受け入れず、操作しようとすると常に書き込みの競合が発生します。今、私は完全に混乱していて、すべてを内臓してやり直すことを考えています。

-2009年6月1日編集@1209時間-

調査の結果、関連するテーブルに対してサーバーで定義されているチェック制約がいくつかあるようですが、これらを削除することはできません。何かが原因で、アイテムが変更されていない場合でも、リンクされたテーブルが常にダーティを報告します-そして、AccessとSQLはデフォルト値でそれと戦っていると思います。とにかくテーブルを削除せずにチェック制約を削除できないように見えるので、すべてのテーブルをワイプし、すべての情報を削除して、デザインを最初からやり直します。皆さんの助けに感謝します。この質問を閉じることができますか?問題をこの新しい質問に参照してください(レコードの更新は許可されていません-競合の書き込み)?

-2009年6月3日編集@1307時間-

他の質問からのクロスポスト、興味のあるすべての解決策を以下に説明します。ここまで到達するために私と頭をぶつけてくれたすべての人々に感謝します、私は本当に助けを感謝します。[はい/いいえ]チェックボックスとSQLServerwithAccessを使用すると奇妙な問題が発生することがわかりました。どうやら、AccessはNULLをNoとして解釈します-値を変更しますが、SQL ServerはビットフィールドでNULLをNoとして解釈しないため(変換でYes / Noが変換される)、値がない場合はWriteConflictエラーをスローします必須であり、NULLです。解決策は、値が必要になるようにテーブルを再設計し、以前のすべての[はい/いいえ]チェックボックスにデフォルト値が割り当てられるようにすることでした。これにより、不思議なWrite Conflictメッセージが解決され、作成されたレコードを変更できるようになりました。

4

3 に答える 3

1

いくつかのコメント:

  • Dirty=false他のフィールドの値を変更する前にフォームのデータ(セット)を保存する特別な理由はありますか(フォームが再びダーティになります)?
    最初に他のフィールドのデータを変更してからフォームのデータ保存します。そうしないと、フォームは常にダーティになります。

  • コントロールの値をコードから変更してもイベントは呼び出されないため、chkSupRequirePriceの値をから変更しても。chkSupAllowBlankPrice_AfterUpdate()は呼び出されませんchkSupRequirePrice_AfterUpdate()

  • 各イベントに特定のコードを入れるのではなく、すべてを同じものに再グループ化することをお勧めします。たとえば、Update()各イベントハンドラーから呼び出されるサブです。
    常に呼び出されるのと同じコードであるため、コードとその副作用の管理が容易になります。

  • そうは言っても、あなたのコードは機能するはずなので、問題はあなたのコードのどこかから来ていると思います。
    同じレコードが他の場所で編集するためにすでに開かれている場合、書き込みの競合が発生します。
    ロックの種類を試して、何かが変わるかどうかを確認できます。

  • 問題が本当にSQLServerのセットアップに関連しているかどうかを確認するには、テーブルのリンクを解除し、代わりにローカルAccessデータベースにコピーして、ローカルAccessテーブルを処理しているときにこの問題が引き続き発生するかどうかを確認します。

于 2009-05-29T07:40:39.347 に答える
0

Accessが[はい/いいえ]チェックボックスの値を処理する方法とSQLServerには違いがあります。はい/いいえブール値をAccessからSQLServerに変換するときは、デフォルトの状態を定義し、回答が必要であるとマークすることを忘れないでください。そうしないと、毎回書き込みの競合が発生し、初期値が設定されると、変更とともにレコードが保存されなくなります。

于 2009-06-29T19:09:54.883 に答える
0

過去に、SQL Server のリンク テーブルに主キーがない場合、Access で奇妙な問題が発生したことがあります。テーブルに主キーがない場合、更新するレコードがわかりません。これについて同様のメッセージを一度受け取ったことは知っていますが、それは何年も前のことなので、これがあなたの問題かどうかはわかりません.

于 2009-05-28T19:43:47.420 に答える