2008-05-02

Access 主表單與子表單如何互相傳值?


問題:


我有一個「訂單」主表單和兩個子表單訂單明細」與存貨交易」,在自動傳值上遇到困難,請問下列狀況我該如何處理?

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 語法必須依你實際定義的存貨交易資料欄位名稱、型態、順序等加以調整,這裡只是一個程式範本,主要是讓你瞭解程式的控制點在哪些事件程序

沒有留言: