Çok kullanıcılı bir güncelleme ortamında çalışacağınız için, diğer kullanıcılarla çakışma olmadığından emin olmanız gerekir. En güvenli yaklaşım bir İŞLEM kullanmaktır.
Daha sonra, iki tablo güncellemek için nasıl ve ne zaman karar vermeniz gerekir. Kullanıcı bittiğinde tıkladığı düğmeyi kullanacak olan 'Seçenek 1' ile devam edelim. Düğmeyi tıkladıklarında aşağıdaki alt programı çağırmanız gerekir. Kullanıcı alt formda herhangi bir değişiklik yaptıysa da takip etmeli, ancak 'Kaydet' düğmesini tıklamayı unutmuş olmalısınız.
Sonra şiddetle Yaptığınız değişiklikleri izleme düşündürmektedir. Örneğin, kullanıcı 5'e girer, değişiklikleri kaydeder. Yarın, verilere bakıp, 5'i görüyor ve 6'ya değiştirmek istiyor ... ... gerçek envanteri bozacak. Önlenecek bir yöntem, PO satır öğeleri için işlendiğini ve güncellemeleri tekrar önlediğini belirten bir "bayrak" a sahip olmaktır.
Aşağıdaki kod yalnızca bir örnek ... Giriş ve çıkış kayıt kümeleri olması gerektiğini düşündüğümde kod yazdım, ancak işlenecek doğru girdi satırlarının seçilmesini sağlamanız ve sonra çıkış satırını seçmeniz gerekir.) tablolar için. içlerinde ## ile yorumlar için
Bak .... SİZİN kontrol adlarını kullanmak için kod düzeltin.
bir açıklama fazlasına ihtiyaç olursa haber verin.
Option Compare Database
Option Explicit
' BeginTrans, CommitTrans, Rollback Methods Example
' After the BeginTrans method starts a transaction that isolates all the changes made,
' the CommitTrans method saves the changes.
' Notice that you can use the Rollback method to undo changes that you saved using
' the Update method. Furthermore, the main transaction is nested within another transaction
' that automatically rolls back any changes made by the user during this example.
' One or more table pages remain locked while the user decides whether or not to accept the changes.
' For this reason, make sure you only execute the transaction on some event - don't allow a user
' to be interactive, else he may go to lunch and may lock pages someone else needs!
' Add to: Receiving_Amount: ID(again autonumber), Item#, Amount, PONum
' Subtract from: Materials_Used: ID(just an Autonumber field), Project, Item#, Amount
Sub BeginTransX_Update_Inventory()
On Error GoTo Error_trap
Dim wrkDefault As DAO.Workspace
Dim dbs As DAO.Database
Dim tblInput As DAO.recordSet
Dim tblItems As DAO.recordSet
'Dim tblMaterials As DAO.recordSet
' Get default Workspace.
Set wrkDefault = DBEngine.Workspaces(0)
Set dbs = CurrentDb
' ## Change the following line to use the name of the form control that has your PONum
Set tblInput = dbs.OpenRecordset("select * from MaterialsRec where PONum = " & Me.txtPONum & ";") '<<< This will be the source of your changes. Can use a query to filter exact rows.
' Start transaction.
wrkDefault.BeginTrans
Do While Not tblInput.EOF
Set tblItems = dbs.OpenRecordset("select * from [Items] where [Item#] = " & tblInput![item] & ";") ' <<< This will be where the updates are applied.
' Increase Qty on Hand
tblItems.Edit
tblItems![Qty on Hand] = tblItems![Qty on Hand] + tblInput!Amount
tblItems.Update
'## Add a text field named 'ProcStatus' to table MaterialsRec, or delete the following update ... your choice...
tblInput.Edit
tblInput!ProcStatus = "updated"
tblInput.Update
tblInput.MoveNext
Loop
' You can remove the following code if desired...
' Ask if the user wants to commit to all the changes made above.
If MsgBox("Save changes?", vbYesNo) = vbYes Then
wrkDefault.CommitTrans
Else
wrkDefault.Rollback
End If
tblInput.Close
tblItems.Close
'tblMaterials.Close
Set tblItems = Nothing
'Set tblMaterials = Nothing
Set dbs = Nothing
Set wrkDefault = Nothing
Exit Sub
Error_trap:
wrkDefault.Rollback
MsgBox "An error was encountered, but all changes were rolled back." & vbCrLf & _
"Err: " & Err.Number & vbCrLf & _
"Desc: " & Err.Description
End Sub
Yukarıdaki tablo ve alan tanımlarınız yanlış ya da parametre değerinizde bir yazım hatası var. 'Purchase_Orders' tablosunu ve bazı alanları gösterin, ancak daha sonra bir Albümü (Receiving_Amount'dan sonra :) var. Purchase_Orders'da 'ID' adlı bir alan var mı? Güncellemeye gelince, bazı Vba kodlarını, kullanılan QTY ve Materyalleri güncellemek için çalıştırmaya zorlamak için bir düğme tıklaması gibi bir şey öneririm. –
Yukarıdaki Purchase_Orders tablosu yanlıştı, sadece yansıtacak şekilde düzenledim. Purchase_Orders için bir alan, sadece 'PONum' ve' Received Date' adlı bir alan yok. Ve güncellemek için bunu düşünüyordum ama bunun için kodun nasıl yazıldığından emin değilim, bu değeri Items tablosunun – Needtoknow
altındaki doğru satıra geçirmeyi gerektireceğini biliyorum 'Sorun 1' yanlış alan adından kaynaklanıyor Ana ve alt form arasındaki bağlantıda veya sorguda ... 'ID' alanı yok ... Tam sözdizimini görmeden belki PONum'u kullanmak mı istiyorsunuz? 'Sorun 2' ile ilgili olarak, alt formunuz ne için kullanılıyor? Kullanıcı, PO'daki her bir öğe için alınan miktarda yazıyor mu? Eğer öyleyse, ilişkili tabloları güncellemek için bazı vba kodu sağlayabilirim. –