如何在 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.Updateri.Update 方法尚未运行 保存记录集。但即便如此,.AddNew 创建了一条新记录,因此 rt!IDri!ID 都是 Null。

您可以尝试先保存 rtri 记录集,然后通过 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,您需要在输入数据时确定表 TransItemRecep 的下一个 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