問題:
我有一個「訂單」主表單和兩個子表單「訂單明細」與「存貨交易」,在自動傳值上遇到困難,請問下列狀況我該如何處理?
1. 主表單「訂單.orderID」要在輸入後傳至子表單「存貨交易.PurchaseOrderID」
2. 子表單「訂單明細.ProductID」要在輸入後傳至子表單「存貨交易.ProductID」
3. 子表單「訂單明細.Quantity」要在輸入後傳至子表單「存貨交易.UnitsOrdered」
可以提供 VBA 的寫法嗎?
回答:
首先你要確立表單之間的關聯性:
1. 「訂單」的主鍵為 OrderID,「訂單明細」也需要一個 OrderID 的欄位與 「訂單」 作關聯,並且以 OrderID 和 ProductID 作為主鍵。
2. 「存貨交易」以 PurchaseOrderID 和 ProductID 作為主鍵,並以這兩個欄位與「訂單明細」的 OrderID 和 ProductID 作關聯。
資料的關聯性確立之後就容易了,其實這個關聯性可以透過 Access 的資料庫關聯圖來建立,並且能夠減少 VBA 的控制,不過這裡我先完全以 VBA 來控制。
首先建立一個以「訂單」為資料來源的主表單,然後在這個表單內建立兩個子表單,分別以「訂單明細」及「存貨交易」為資料來源。
接 下來就是作表單間的關聯,在「訂單明細」子表單的屬性表資料頁籤裡設定連結主欄位與子欄位為 OrderID,在「存貨交易」子表單的屬性表資料頁籤裡設定連結主欄位為「訂單明細.OrderID」 和「訂單明細.ProductID」,設定連結子欄位為「存貨交易.PurchaseOrderID」和「存貨交易.ProductID」。
做好上面的資料關聯後,當你在子表單輸入資料時就會自動把連結主欄位的資料帶入。不過你的 「存貨交易」資料似乎要自動新增,而修改「訂單明細.Quantity」時也要更新到「存貨交易.UnitsOrdered」,這個地方還是要靠 VBA 來控制。
如果上面的資料關聯性沒有問題的話,請你先確定「訂單明細」子表單是一個獨立的表單,在 「訂單」主表單裡頭是用一個子表單控制項去連結它。
接下來就是用 VBA 來控制自動新增及修改「存貨交易」資料,請開啟「訂單明細」子表單並將 Visual Basic 的程式編輯視窗打開,確定一下程式碼視窗標題是你要編輯程式的表單名稱,也就「訂單明細」。
以上操作程序都沒有問題的話,請將下列程式碼複製到剛剛的程式編輯視窗:
' 自動新增存貨交易資料
Private Sub Form_AfterInsert()
Dim sSQL As String
sSQL = "insert into 存貨交易 values(" & 訂單明細.OrderID & ", " & 訂單明細.ProductID & ", " & 訂單明細.Quantity & ")"
DoCmd.RunSQL sSQL
End Sub
' 自動修改存貨交易資料
Private Sub Form_AfterUpdate()
Dim sSQL As String
sSQL = "update 存貨交易 set UnitsOrdered = " & 訂單明細.Quantity & _
" where PurchaseOrderID = " & 訂單明細.OrderID & " and ProductID = " & 訂單明細.ProductID
DoCmd.RunSQL sSQL
End Sub
上述的 SQL 語法必須依你實際定義的「存貨交易」資料欄位名稱、型態、順序等加以調整,這裡只是一個程式範本,主要是讓你瞭解程式的控制點在哪些事件程序裡。
沒有留言:
張貼留言