2014-02-06 29 views
0

我在Access中有一個表單,其中有2個未綁定的多選列表框,並帶有一些代碼以在它們之間移動項目。在Access VBA中編輯底層記錄時出現「數據已更改」錯誤

列表框中顯示的每個字段都是布爾值 - 如果該值爲true,那麼該字段的名稱將顯示在lstSelected中,並且如果在lstUnselected中顯示爲false。

列表框具有值列表的RowSourceType,並且通過查看底層記錄並構建字段名稱爲lstSelected的布爾值爲true的字符串和lstUnselected的False來編程生成值列表。

在表單上我有兩個按鈕cmdMoveToSelectedcmdMoveToUnselected。當我點擊cmdMoveToSelected時,它通過執行一個SQL字符串將lstUnselected列表框中的任何選定項目的基礎字段的布爾值從false更改爲true,然後重新構建兩個列表框的值列表。

我有這一切工作得很好。如果我做了me.lstUnwanted.requeryme.lstwanted.requery然後一切移動和顯示正確,和底層都正常編輯,但是當我點擊窗體上別的我得到的錯誤:

The data has been changed.

Another user edited this record and saved the changes before you attempted to save your changes.

Re-edit the record.

現在我已經找到解決的辦法(jobDetailsID被處理的記錄的主鍵):

Dim intCurID as Integer 

    intCurID = Me.JobDetailsID 

    Me.Form.Requery 

    Me.Recordset.FindFirst "JobDetailsID = " & curID 

這再次查詢表格,然後移回到當前記錄,這擺脫了錯誤,但是它會導致在第一條記錄打開時會出現延遲和閃爍的形式,然後變回公司正確的記錄並重新填充列表框。

有沒有辦法解決這個錯誤,或讓它以編程方式觸發,所以我可以通過vba關閉警告來捕獲它?

在此先感謝。

回答

0

也許它有助於不將表單綁定到由cmdMoveToSelected改變的表格,而是不包含所有布爾字段的查詢。如果cmdMoveToSelected更改一個或多個布爾字段,則記錄會更改,但查詢結果不會。不知道它是否是健全的。

它聽起來有點像設計問題,而不是表單問題,將選項存儲在布爾字段中而不是存儲到相關表中。

+0

有趣的建議,但我真的不認爲這會有所幫助。如果表單正在運行直接更改當前記錄的VBA代碼(即不通過表單的記錄源),那麼無論表單是直接綁定到表還是在表級別上,都可能在表級別存在鎖定衝突綁定到基於該表的可更新查詢。 –

+0

該結構確實有意義。我想讓他們在一個單獨的桌子或其他東西,但讓我解釋一下。我們正在細木工車間存儲有關工作的信息。我們製造了許多標準產品,每種標準產品都有選擇。每個布爾型字段表示某項工作是否包含在工作中 - 所以可能是「包含屋頂玻璃」和另一個「需要特殊玻璃珠」。總的來說,我有大約70個領域(沒有一個是重複集合),但他們確實需要在每個工作中都有相同的信息。儘管如此,我願意接受更好結構的建議。 – WhatEvil

+0

如果將選項存儲在作業表中,則所有選項都具有默認值(true或false)。如果這些選項是關於在Persons表中使用SpokenLanguage的說法,那麼不需要擁有該默認值,因爲您在創建Persons時假設他們確實或不會說那種語言。在你的情況下,它可能更適用,但只有當你存儲相同的作業類型。當存儲不同的作業類型時,應用不同的選項,並且某個作業類型的所有選項都必須獲取表格中的字段。 – Bwurk

0

可能最好的解決方案是而不是當表格很髒時,直接更新表格中的當前記錄。相反,當項目從一個列表框移動到另一個列表框時,更新表單本身內的字段值(Me!FieldName),並讓表單像往常一樣將這些值寫回表格。

+0

列表框是未綁定的,它只是綁定到底層表的表單上顯示的ID字段,所以用'me!fieldname'來更改值會給我「你不能爲這個對象賦值」。 – WhatEvil

0

我似乎已經修復了它,雖然修復對我沒有太大的意義。

我在Me.Refresh中添加了一個按鈕點擊代碼,在我重新查詢了兩個列表框之後,它似乎已經停止了消息的出現。但是這隻適用於我在表單上顯示JobDetailsID文本框時(儘管我認爲這是任意的,並且任何字段鏈接的文本框都可以工作)。

有人可以向我解釋爲什麼這有效嗎?我想完全理解什麼時候使用查詢,刷新等

0

我已經有這種事情發生時,我已經離開窗體RowSource查詢將控件轉換爲未綁定的文本框等等之後掛起。一般形式行源查詢(引入我可能最終使用的所有字段)爲我提供了與表字段名相同的查詢列表,使得根據需要爲控制名選擇它們變得簡單。工作正常,但在所有名稱匹配後,您必須刪除表單行源查詢。 (之後DLookup和BeforeUpdate用於獲取和存儲值和更改。)

相關問題