2017-01-06 33 views
0

所以我已經開始學習訪問權限了,因爲負責它的人通過了路,而且有人不得不繼續這樣做。 我注意到他創建的所有數據庫中有一個非常糟糕的(至少是IMO)行爲:每個表單都直接綁定到表或保存的查詢。這樣,如果用戶打開表單,他必須完成他應該完成的所有步驟,因爲如果他關閉了表單中間過程(或計算機凍結或其他任何類型),則實際數據會被泄露因爲它會完成一半。這往往會破壞流程鏈中的所有內容,導致無法執行連續的步驟,並迫使我直接在表中手動更正數據。在ms-access中使用表單編輯數據的最佳實踐

,因爲我已經開始升級他的東西和發展我自己的,我一直在努力學習的方式來使數據只在表格進行編輯,從而有可能取消該過程隨時或全部保存更改一次到最後。

如果版本很簡單,我發現我可以創建一個記錄集,將相關數據複製到表單中的未綁定字段,最後如果用戶選擇將表單字段中的數據複製回記錄。

其他時候需要更復雜的解決方案,因爲我需要以連續的形式同時編輯多個數據片段,「保存」它們,運行更多的代碼,可能會添加字段以保存源自該處理的信息等等上。然後我學會了使用臨時表,但不喜歡它,因爲它傾向於使數據庫膨脹。我甚至在代碼執行期間繼續創建臨時數據庫,這些臨時數據庫將承載臨時表並最終銷燬,但這增加了太多不必要的複雜性。

現在我使用斷開的ADO記錄集來保存臨時數據和字段。它工作但有其侷限性。

所以我想知道,什麼是最好的方式 - 比我更有經驗 - 人們用來處理這種情況?在內存中使用ADO記錄集真的是最好的方法嗎?

+0

Access的威力是綁定的形式。要僅保存經過驗證的(完整)數據,請創建一個驗證函數,並且在BeforeUpdate中,如果驗證失敗,請將Cancel設置爲True。隨意選擇未綁定的表單,但使用Access之外的其他工具,例如Visual Studio和WinForms。 – Gustav

+0

我開發了一個數據庫來管理我們的用戶羣和他們對我們其他數據庫的使用權限。在那裏有一個表單來管理選定用戶的權限。其中,加載所有相關權限,管理員可以根據需要刪除,創建或編輯現有的權限。所有這些都發生在臨時表中,所以如果用戶在不保存的情況下關閉表單,則不會有任何更改。你能告訴我如何用一個綁定到「真實」表的表單來處理這個問題嗎? – fmonacos

+0

您可以將更新包裝在事務中。然後,如果沒有提交就關閉表單,則回滾更改。 – Gustav

回答

0

我認爲你在混合兩個表單所做的事情,它們有完全不同的要求。編輯現有記錄(以及綁定表單非常適合)和創建新記錄(使用直接綁定表單可能會導致創建不完整的記錄)。接近它的方式取決於很多事情,但主要是需要多少數據才能使新記錄被視爲「完整」。

我通常做下面的事情之一:

  • 創建添加新記錄,其中只有必要的字段都存在一個未綁定的模式彈出形式。完成後,它會將新記錄加載到主窗體以供進一步編輯。

  • 使用除了形式的上述方法不是一個彈出一個,但一組中的主要形式的標題或註腳未結合的字段。

  • 讓用戶創建新記錄,但綁定表單的OnClose(和/或其他適合您的情況)事件,如果它沒有驗證,則刪除半滿記錄的事件。

  • 讓用戶創建的束縛形式的新記錄,但有一個「清理」程序調用無論是在計劃或根據用戶的操作。

最後,如果你的業務流程需要手動添加/編輯每當一個新的記錄添加或編輯時間大部分字段,則最好使用未綁定的形式。

0

這樣一來,如果用戶打開一個表格,他必須完成所有他應該做的步驟 ,因爲如果他關閉了形式中間過程(或 計算機凍結,或諸如此類的事),實際的數據將是 妥協,因爲它會半完成

不,如果計算機凍結,則沒有數據保存到表中。如果您使用斷開的reocrdset和未綁定的表單,這也是一樣的。

如果你有一些驗證碼,並做了簡單的取消= true,那麼表單中的數據不會被保存,也不是更新的表的形式使用前更新事件。同樣,如果你使用了DIS連接的記錄集和用戶關閉表,你必須以測試數據 - 而你又可以選擇寫出來的數據或不 - 這種效果是使用結合的形式,以零差價一個表格或一個斷開的表格。

如果版本很簡單,我發現我可以創建一個 記錄,表單相關數據複製到綁定字段,並在 最後,如果用戶選擇,從表單中的數據複製將 字段返回到記錄集。

不,你不需要做以上。上述內容完全沒有實現,只會縮短額外的開發時間並增加應用程序的成本。在幾乎所有情況下,入境的表格都會增加開發成本,而不是綁定到表格的簡單表格。所以最初的開發者有正確的想法。您可以在幾乎所有情況下控制基礎表的更新,以實現所需的驗證。如果開發人員允許,表單僅保存並寫入數據。

所以訪問形式的束縛時沒有更多或更少的寫不完整的數據出來一個表,如果您將驗證碼在更新事件之前進行的形式。半填充的結合形式,或與DIS-連接reocrdset半填充的未結合的形式,如果計算機凍結BOTH不會寫入其數據。

這兩種類型的形式不會寫出來的數據表,直到您的驗證碼已完成爲止。

訪問不適用於未綁定的形式,工具,如vb.net,甚至VB6有涼爽的嚮導對未綁定的形式一大堆和支持。在訪問中,我們沒有這些嚮導。而當你使用UN綁定表單的時候,你會丟失大量的表單事件。你實際上得到了兩個世界最糟的,因爲你失去了使用形式事件,並有未綁定任何嚮導或支持。即使只是幾個刪除記錄事件,我們都相當驚人。

您失去使用me.dirty的,上嵌件,me.newReocrd,之後更新活動形式 - 你折騰了,失去的功能列表是巨大的。如果你想有一個按鈕,寫入數據表(如窗體上的保存按鈕),然後只要進入:

If me.Dirty = True then 
    me.Dirty = False  ' this forces your verification code to run 
End if 

有一些用例,其中以結合形式將有利於你,但就開發時間而言,他們會花費你很多。

+0

感謝您提供所有這些信息。我會研究一切。正如我所說的,我正在學習工作,並且通過觀察其他人做了什麼。我終於認爲綁定形式是「不好的」,因爲現在我開始意識到,他根本沒有實現任何驗證方法......想象一個有許多綁定到一個表的字段的表單。用戶開始填寫字段,當他從一個移動到另一個時,前面的內容得到更新,並且沒有任何驗證,「保存」到表格中。如果他在中途關閉表格,信息將會丟失,可能會打破流程鏈的其餘部分。 – fmonacos

+0

所以我一直在努力理解你說的話......我開始明白表單.Dirty作品,並且我已經取得了一些進展,如果條件滿足,在表單.BeforeUpdate事件上設置cancel = true。它可以放棄單個記錄的所有字段的任何更改,但是當我用連續的表單嘗試它時,它只適用於當前焦點記錄,我無法「撤消」對先前記錄所做的更改。我仍然不知道如何「打包」自表單打開以來對所有記錄所做的更改,並在用「取消」按鈕關閉表單時「撤消」它們。 – fmonacos

+0

表單一次只能編輯一條記錄。因此,不要混淆任何常規形式(一次編輯一條記錄)或連續形式,AGAIN一次只編輯一條記錄,但會顯示多條記錄。您顯示多個記錄或允許在僅顯示一條記錄的表單中導航「許多」記錄的事實在驗證該記錄方面沒有任何變化。這種設置的例外情況是當這樣一組「數據」屬於某種父母形式或父母記錄時。這是一個不同的問題,有幾種解決這些問題的方法。 –