【问题标题】:How to insert multiple records with the same ID into a table using DAO in MS Access如何在 MS Access 中使用 DAO 将具有相同 ID 的多条记录插入表中
【发布时间】:2017-12-10 22:22:17
【问题描述】:

(1) 我有 3 个表(A-Sched、B-Trans 和 C-ItemRecep)和一个名为 D-TransDetailRecep 的查找表。下面是关系图。

(2) 我通过实现以下 DAO 的单击按钮将值从表单插入到表字段中:

公共订阅 RecpSchedule1() '仅供咨询 暗淡 db 作为 DAO.Database Dim rs 作为 DAO.Recordset,rt 作为 DAO.Recordset,rd 作为 DAO.Recordset,ri 作为 DAO.Recordset 将 lngTransId 变暗 将 lngItemRecepId 变暗

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 '下一个Trans 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 Sub 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 '下一个Trans 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。(我现在所拥有的是两者都显示值的总和)

【问题讨论】:

  • 那不是 Vb.NET 代码。它是 VB6 或一些 legacy/vba 变体
  • 我认为 VB.NET 会容忍爆炸!表示法,但 IDE 吃掉了旧的 Set 关键字 @YowE3K
  • @Plutonix DOH!!当然。 (你可以看出我使用 .Net 已经有一段时间了!)
  • Kostas K,你能帮我看看上面的代码吗?它基于您的修改。我仍然很感激你。

标签: vba ms-access dao


【解决方案1】:

问题出在这里:

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

【讨论】:

  • Kostas K. 你太棒了!抱歉耽搁了。我试过你的修改。我突出显示了 .rs 更新,并且还收到了以下错误消息。 “运行时错误'3022'您请求对表的更改不成功,因为它们会在索引、主键或关系中创建重复值。更改包含重复数据的字段或字段中的数据,删除索引,或重新定义索引以允许重复条目,然后重试。"
  • 我将表 sched 的索引状态更改为“否”,这使您的代码有效。谢谢!
  • 实际上这个应用程序将是基于多用户的,我如何在代码中的“lngId = DMax("ID", "Trans") + 1 "上面实现你的代码?
  • 我实现了您的更新 Kostas,但我收到了以下错误消息:“运行时错误 '94' 无效使用 Null”还有“lngTransId = DMax("ID", "Trans") + 1我尝试调试时突出显示“下一个 Trans ID”。
  • @Liberty Crown Infotech 立即尝试,我将 DMaxNz 包装在一起以获得 Null 值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-08
  • 1970-01-01
  • 1970-01-01
  • 2014-07-15
  • 2012-11-22
相关资源
最近更新 更多