如何在 MS Access 中使用 DAO 将具有相同 ID 的多个记录插入 table
How to insert multiple records with the same ID into a table using DAO in MS Access
(1) 我有 3 个 table(A-Sched、B-Trans 和 C-ItemRecep)和一个名为 D-TransDetailRecep 的查找 table。下面是关系图。
(2) 我通过实现以下 DAO 的单击按钮将值从表单插入 table 字段:
Public 子 RecpSchedule1()
'仅供咨询
将数据库调暗为 DAO.Database
Dim rs As DAO.Recordset, rt As DAO.Recordset, rd As DAO.Recordset, ri As DAO.Recordset
Dim lngTransId 只要
Dim lngItemRecepId As Long
Set db = CurrentDb
Set rs = db.OpenRecordset("Sched")
Set rt = db.OpenRecordset("Trans")
Set ri = db.OpenRecordset("ItemRecep")
Set rd = db.OpenRecordset("TransDetailRecep")
lngItemRecepId = Nz(DMax("ID", "ItemRecep"), 0) + 1 '下一个 ItemRecep ID
lngTransId = Nz(DMax("ID", "Trans"), 0) + 1 '下一个传输 ID
With rs
.AddNew
!SDate = Me.txtSchedDate
!PatientName = Me.cmbPatientName
!RegNo = Me.txtRegNo
!DateOfBirth = Me.txtAge
!Gender = Me.txtGender
!PatientClass = Me.PatientClass
!RecepSchedule = True
.Update
End With
With rt
.AddNew
!ID = lngTransId
!SchedRegNo = Me.txtRegNo
![Total_RecepFee] = Nz((Me.txtConsFee + Me.txtIOPFee + ![Total_RecepFee]), 0)
.Update
End With
With ri
.AddNew
!ID = lngItemRecepId
!ItemName = "ConsFee"
!Price = Me.txtConsFee.Value
!Dept = "Reception"
.Update
End With
With rd
.AddNew
!TransID = lngTransId
!TransID = DMax("ID", "Trans")
!ItemRecepID = DMax("ID", "ItemRecep")
.Update
End With
rs.Close
rt.Close
ri.Close
rd.Close
Set rs = Nothing
Set rt = Nothing
Set rd = Nothing
Set ri = Nothing
Set db = Nothing
结束子
Public 子 RecpSchedule2()
Dim db As DAO.Database
Dim rs As DAO.Recordset, rt As DAO.Recordset, rd As DAO.Recordset, ri As DAO.Recordset
Dim lngTransId As Long
Dim lngItemRecepId As Long
Set db = CurrentDb
Set rt = db.OpenRecordset("Trans")
Set ri = db.OpenRecordset("ItemRecep")
Set rd = db.OpenRecordset("TransDetailRecep")
lngItemRecepId = Nz(DMax("ID", "ItemRecep"), 0) + 1 '下一个 ItemRecep ID
lngTransId = Nz(DMax("ID", "Trans"), 0) + 1 '下一个传输 ID
'With rt
' .AddNew
' !ID = lngTransId
'!SchedRegNo = Me.txtRegNo
'![Total_RecepFee] = Nz((Me.txtIOPFee + ![Total_RecepFee]), 0)
'.Update
' End With
With ri
.AddNew
!ID = lngItemRecepId
!ItemName = "IOPFee"
!Price = Me.txtIOPFee.Value
!Dept = "Reception"
.Update
End With
With rd
.AddNew
!TransID = lngTransId
!TransID = DMax("ID", "Trans")
!ItemRecepID = DMax("ID", "ItemRecep")
.Update
End With
rt.Close
ri.Close
rd.Close
Set rt = Nothing
Set rd = Nothing
Set ri = Nothing
Set db = Nothing
结束子
(3) 我的挑战:Total_RecepFee 的字段应该在价格为 500 的地方显示 500,在价格为 1200 的地方显示 1200。(我现在所拥有的是两者都显示值的总和)
问题出在这里:
rd!TransID = rt!ID
rd!ItemRecepID = ri!ID
rt.Update
和ri.Update
方法尚未运行 保存记录集。但即便如此,.AddNew
创建了一条新记录,因此 rt!ID
和 ri!ID
都是 Null。
您可以尝试先保存 rt
和 ri
记录集,然后通过 DMax
函数检索 Max(ID)(因为这将是最后添加的 ID) .但是,如果多个用户同时访问添加数据,这可能会有风险(实际上风险很大)。
我建议为什么不废弃自动编号 ID 并手动处理它?
Dim lngId as Long
lngId = DMax("ID", "Trans") + 1
'You can now feed it to both tables
尝试下面更新的代码。我自己还没来得及测试。
Public Sub RecpSchedule1()
Dim db As DAO.Database
Dim rs As DAO.Recordset, rt As DAO.Recordset, rd As DAO.Recordset, ri As DAO.Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("Sched")
Set rt = db.OpenRecordset("Trans")
Set ri = db.OpenRecordset("ItemRecep")
Set rd = db.OpenRecordset("TransDetailRecep")
With rs
.AddNew
!SDate = Me.txtSchedDate
!PatientName = Me.cmbPatientName
!RegNo = Me.txtRegNo
.Update
End With
With rt
.AddNew
!SchedRegNo = Me.txtRegNo
!TDate = Me.txtSchedDate
.Update
End With
With ri
.AddNew
!ItemName = "ConsFee"
!Price = Me.txtConsFee.Value
!Dept = "Reception"
.Update
End With
With rd
.AddNew
!TransID = DMax("ID", "Trans")
!ItemRecepID = DMax("ID", "ItemRecep")
.Update
End With
rs.Close
rt.Close
ri.Close
rd.Close
Set rs = Nothing
Set rt = Nothing
Set rd = Nothing
Set ri = Nothing
Set db = Nothing
End Sub
Public Sub RecpSchedule2()
Dim db As DAO.Database
Dim rs As DAO.Recordset, rt As DAO.Recordset, rd As DAO.Recordset, ri As DAO.Recordset
Set db = CurrentDb
Set rt = db.OpenRecordset("Trans")
Set ri = db.OpenRecordset("ItemRecep")
Set rd = db.OpenRecordset("TransDetailRecep")
With ri
.AddNew
!ItemName = "IOP"
!Price = Me.txtIOPFee.Value
!Dept = "Reception"
.Update
End With
With rd
.AddNew
!TransID = DMax("ID", "Trans")
!ItemRecepID = DMax("ID", "ItemRecep")
.Update
End With
rt.Close
ri.Close
rd.Close
Set rt = Nothing
Set rd = Nothing
Set ri = Nothing
Set db = Nothing
End Sub
更新:
为了手动处理 ID,您需要在输入数据时确定表 Trans 和 ItemRecep 的下一个 ID。
Dim lngTransId as Long
lngTransId = Nz(DMax("ID", "Trans"),0) + 1 'Next Trans ID
Dim lngItemRecepId as Long
lngItemRecepId = Nz(DMax("ID", "ItemRecep"),0) + 1 'Next ItemRecep ID
With rt
.AddNew
!ID = lngTransId
!SchedRegNo = Me.txtRegNo
!TDate = Me.txtSchedDate
.Update
End With
With ri
.AddNew
!ID = lngItemRecepId
!ItemName = "ConsFee"
!Price = Me.txtConsFee.Value
!Dept = "Reception"
.Update
End With
With rd
.AddNew
!TransID = lngTransId
!ItemRecepID = lngItemRecepId
.Update
End With
(1) 我有 3 个 table(A-Sched、B-Trans 和 C-ItemRecep)和一个名为 D-TransDetailRecep 的查找 table。下面是关系图。
(2) 我通过实现以下 DAO 的单击按钮将值从表单插入 table 字段:
Public 子 RecpSchedule1() '仅供咨询 将数据库调暗为 DAO.Database Dim rs As DAO.Recordset, rt As DAO.Recordset, rd As DAO.Recordset, ri As DAO.Recordset Dim lngTransId 只要 Dim lngItemRecepId As Long
Set db = CurrentDb
Set rs = db.OpenRecordset("Sched")
Set rt = db.OpenRecordset("Trans")
Set ri = db.OpenRecordset("ItemRecep")
Set rd = db.OpenRecordset("TransDetailRecep")
lngItemRecepId = Nz(DMax("ID", "ItemRecep"), 0) + 1 '下一个 ItemRecep ID lngTransId = Nz(DMax("ID", "Trans"), 0) + 1 '下一个传输 ID
With rs
.AddNew
!SDate = Me.txtSchedDate
!PatientName = Me.cmbPatientName
!RegNo = Me.txtRegNo
!DateOfBirth = Me.txtAge
!Gender = Me.txtGender
!PatientClass = Me.PatientClass
!RecepSchedule = True
.Update
End With
With rt
.AddNew
!ID = lngTransId
!SchedRegNo = Me.txtRegNo
![Total_RecepFee] = Nz((Me.txtConsFee + Me.txtIOPFee + ![Total_RecepFee]), 0)
.Update
End With
With ri
.AddNew
!ID = lngItemRecepId
!ItemName = "ConsFee"
!Price = Me.txtConsFee.Value
!Dept = "Reception"
.Update
End With
With rd
.AddNew
!TransID = lngTransId
!TransID = DMax("ID", "Trans")
!ItemRecepID = DMax("ID", "ItemRecep")
.Update
End With
rs.Close
rt.Close
ri.Close
rd.Close
Set rs = Nothing
Set rt = Nothing
Set rd = Nothing
Set ri = Nothing
Set db = Nothing
结束子
Public 子 RecpSchedule2()
Dim db As DAO.Database
Dim rs As DAO.Recordset, rt As DAO.Recordset, rd As DAO.Recordset, ri As DAO.Recordset
Dim lngTransId As Long
Dim lngItemRecepId As Long
Set db = CurrentDb
Set rt = db.OpenRecordset("Trans")
Set ri = db.OpenRecordset("ItemRecep")
Set rd = db.OpenRecordset("TransDetailRecep")
lngItemRecepId = Nz(DMax("ID", "ItemRecep"), 0) + 1 '下一个 ItemRecep ID lngTransId = Nz(DMax("ID", "Trans"), 0) + 1 '下一个传输 ID
'With rt
' .AddNew
' !ID = lngTransId
'!SchedRegNo = Me.txtRegNo
'![Total_RecepFee] = Nz((Me.txtIOPFee + ![Total_RecepFee]), 0)
'.Update
' End With
With ri
.AddNew
!ID = lngItemRecepId
!ItemName = "IOPFee"
!Price = Me.txtIOPFee.Value
!Dept = "Reception"
.Update
End With
With rd
.AddNew
!TransID = lngTransId
!TransID = DMax("ID", "Trans")
!ItemRecepID = DMax("ID", "ItemRecep")
.Update
End With
rt.Close
ri.Close
rd.Close
Set rt = Nothing
Set rd = Nothing
Set ri = Nothing
Set db = Nothing
结束子
问题出在这里:
rd!TransID = rt!ID
rd!ItemRecepID = ri!ID
rt.Update
和ri.Update
方法尚未运行 保存记录集。但即便如此,.AddNew
创建了一条新记录,因此 rt!ID
和 ri!ID
都是 Null。
您可以尝试先保存 rt
和 ri
记录集,然后通过 DMax
函数检索 Max(ID)(因为这将是最后添加的 ID) .但是,如果多个用户同时访问添加数据,这可能会有风险(实际上风险很大)。
我建议为什么不废弃自动编号 ID 并手动处理它?
Dim lngId as Long
lngId = DMax("ID", "Trans") + 1
'You can now feed it to both tables
尝试下面更新的代码。我自己还没来得及测试。
Public Sub RecpSchedule1()
Dim db As DAO.Database
Dim rs As DAO.Recordset, rt As DAO.Recordset, rd As DAO.Recordset, ri As DAO.Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("Sched")
Set rt = db.OpenRecordset("Trans")
Set ri = db.OpenRecordset("ItemRecep")
Set rd = db.OpenRecordset("TransDetailRecep")
With rs
.AddNew
!SDate = Me.txtSchedDate
!PatientName = Me.cmbPatientName
!RegNo = Me.txtRegNo
.Update
End With
With rt
.AddNew
!SchedRegNo = Me.txtRegNo
!TDate = Me.txtSchedDate
.Update
End With
With ri
.AddNew
!ItemName = "ConsFee"
!Price = Me.txtConsFee.Value
!Dept = "Reception"
.Update
End With
With rd
.AddNew
!TransID = DMax("ID", "Trans")
!ItemRecepID = DMax("ID", "ItemRecep")
.Update
End With
rs.Close
rt.Close
ri.Close
rd.Close
Set rs = Nothing
Set rt = Nothing
Set rd = Nothing
Set ri = Nothing
Set db = Nothing
End Sub
Public Sub RecpSchedule2()
Dim db As DAO.Database
Dim rs As DAO.Recordset, rt As DAO.Recordset, rd As DAO.Recordset, ri As DAO.Recordset
Set db = CurrentDb
Set rt = db.OpenRecordset("Trans")
Set ri = db.OpenRecordset("ItemRecep")
Set rd = db.OpenRecordset("TransDetailRecep")
With ri
.AddNew
!ItemName = "IOP"
!Price = Me.txtIOPFee.Value
!Dept = "Reception"
.Update
End With
With rd
.AddNew
!TransID = DMax("ID", "Trans")
!ItemRecepID = DMax("ID", "ItemRecep")
.Update
End With
rt.Close
ri.Close
rd.Close
Set rt = Nothing
Set rd = Nothing
Set ri = Nothing
Set db = Nothing
End Sub
更新:
为了手动处理 ID,您需要在输入数据时确定表 Trans 和 ItemRecep 的下一个 ID。
Dim lngTransId as Long
lngTransId = Nz(DMax("ID", "Trans"),0) + 1 'Next Trans ID
Dim lngItemRecepId as Long
lngItemRecepId = Nz(DMax("ID", "ItemRecep"),0) + 1 'Next ItemRecep ID
With rt
.AddNew
!ID = lngTransId
!SchedRegNo = Me.txtRegNo
!TDate = Me.txtSchedDate
.Update
End With
With ri
.AddNew
!ID = lngItemRecepId
!ItemName = "ConsFee"
!Price = Me.txtConsFee.Value
!Dept = "Reception"
.Update
End With
With rd
.AddNew
!TransID = lngTransId
!ItemRecepID = lngItemRecepId
.Update
End With