代码之家  ›  专栏  ›  技术社区  ›  hummingBird

在ms access中将记录插入表中

  •  1
  • hummingBird  · 技术社区  · 14 年前

    我创建了表格:病人,治疗和实验室结果。

    病人表中的主键是ID,它在治疗和labresults表中充当外键,在那里它被命名为patientID。

    我的问题: I added a button to the 2nd tab, and I want to attach an 'action' that will set an INSERT query with values taken from fields (controls) in tab 2, together with ID field taken from tab1 (that corresponds with patient ID from patients table), and then execute a query.

    谢谢

    桌子:

    患者

    ID - primary key, autogenerated
    patientID - internal number of the patient record. I could've used this, but it would complicate my life later on :)
    gender
    age
    dateOfDiagnose
    

    实验室测试

    ID - primary key
    patientID - foreign key, from patients table
    ... bunch of numerical data :)
    

    还有两个表,但它们基本上反映了一些额外的信息,并不那么重要。

    1 回复  |  直到 9 年前
        1
  •  5
  •   Fionnuala    14 年前

    在VBA下运行SQL是很有可能的,但我怀疑简单地设置表单可能会更容易。例如,如果将ID设置为lab results子窗体(我希望您正在使用)的Link Child&Master字段,则它将自动填充。此外,还可以将控件的默认值设置为以前用很少的代码输入的值。因此,我建议你就你希望实现的目标加上一些说明。

    从您的评论来看,您至少有三个相关表:

    患者

    PatientID PK, Counter

    TreatmentID PK, Counter
    PatientID FK
    TreatmentTypeID FK
    

    实验室结果

    LabResultID PK, Counter
    TreatmentID FK 
    PatientID FK <-- Optional, can be got through TreatmentID
    LabResultTypeID FK
    

    此外,您还需要一个“治疗类型”表,其中列出了两种当前治疗,并允许进一步的治疗类型:

    治疗类型

    TreatmentTypeID PK, Counter 
    TreatmentDescription 
    

    标签结果类型

    LabResultTypeID PK, Counter <-- This can be referenced in the LabResults table
    TreatmentTypeID FK
    

    PKs有一些不同于建议的参数,因为您有自然键,但是我认为在使用autonumbers访问时更容易,但是,您将需要自然键的索引。

    Meet the Access 2010 macro designer .

    您的表单将包含每个患者的记录和两个子表单,治疗和LabResults。Treatments子窗体绑定到Treatments表,其中PatientID用于LinkChild和Master字段,而combobox用于TreatmentTypeID:

    Rowsource: SELECT TreatmentTypeID, TreatmentDescription FROM TreatmentTypes
    ColumnCount: 2
    BoundColumn: 1

    将处理类型添加到“处理”子窗体后,可以运行查询或在VBA下运行SQL。您可以对treatments子窗体包含的窗体使用After Insert事件,也可以使用按钮,After Insert事件具有优势,但它仅在用户保存记录或从记录中移动时触发,这是相同的事情。在treatments子表单和After Insert事件中,SQL将位于以下行:

    ''Reference Microsoft DAO x.x Object Library
    Set db = CurrentDB
    sSQL = "INSERT INTO LabResults (TreatmentID, PatientID, LabResultTypeID) " _
         & "SELECT " _
         & Me.TreatmentID & ", " _
         & Me.PatientID & ", " _
         & "LabResultTypeID FROM LabResultTypes " _
         & "WHERE TreatmentTypeID " = & Me.TreatmentTypeID
    db.Execute sSQL
    
    MsgBox "Records inserted: " & db.RecordsAffected
    
    Me.Parent.LabResults_Subform.Form.Requery
    

    如果您的版本低于2010,并且您还没有设置触发器,则查询还应包括日期和用户名(如上所述)。

    我想,您可能会想对子表单使用数据表。我建议你抵制诱惑,使用任何一种单一形式的连续形式,它们都更强大。对于一个有趣的方法,您可能希望查看Northwind示例数据库客户订单表单。