【问题标题】:How to directly update a record in a database from a form number (Access 2007)如何从表单编号直接更新数据库中的记录 (Access 2007)
【发布时间】:2012-01-13 06:00:31
【问题描述】:

我有一个作业跟踪系统,并且有一个查询会返回所有过期作业的结果。 我有一个表格,可以逐个显示这些作业,并且有两个按钮(作业已完成,作业未完成)。未完成只显示下一条记录。 如果按下“已完成”按钮,我无法找到访问当前记录以更新其内容的方法,我能得到的最接近的是代表表单中记录位置的长数字。

获取表格中记录索引的VBA如下。

Sub Jobcompleted(frm As Form)
    Dim curr_rec_num As Long
    curr_rec_num = frm.CurrentRecord
End Sub

这是我第一次接触 VBA,经过一个小时的搜索,我找不到任何可以解决问题的方法。 我会以完全错误的方式解决这个问题吗?在 Microsoft Access 2007 中工作

更多信息所有表格均已标准化

Vehicle Table:包含vehicle_id(pk),以及rego和model等

作业表:包含 job_id(pk)、vehicle_id(fk) 和其他关于需要发生的事情的信息,以及下一次发生日期、每次作业发生之间的天数(所有作业重复)和其他信息

作业历史表:包含job_history_id(pk)、job_id(fk)、完成日期和cmets

当作业完成按钮被按下时,它应该在作业历史表中创建一个带有当前日期、任何 cmets 和作业 ID 的新条目

这是我正在尝试使用的脚本

Private Sub Command29_Click()
    Dim strSQL1 As String
    Dim strSQL2 As String
    Set Rs = CurrentRs
    Set db = CurrentDb

    strSQL1 = "INSERT INTO completed_jobs(JOB_ID, DATE_COMPLETED, COMMENTS) VALUES " & Rs!job.ID & ", " & Date
    db.Execute strSQL1, dbFailOnError
    strSQL2 = "UPDATE job SET JOB_NEXT_OCCURANCE = JOB_NEXT_OCCURANCE+JOB_RECURRANCE_RATE WHERE job.ID = Rs!job.ID"
    db.Execute strSQL2, dbFailOnError
End Sub

注意:Set Rs = CurrentRs 行完全不正确,我相信这是我需要弄清楚的吗?这在按钮按下时调用

我发布了一张显示表单的图片(非连续)。

@HansUp,我明白你在说什么,但我认为它不太适用(我认为我第一次没有提供足够的信息让你理解)

@sarh 我相信你所说的这个 Recordset 是我需要的,但是我不知道如何使用它,有什么提示吗?

@Matt 我 90% 确定我使用的是绑定表单(就像我说的,Access 的新手,一直在查看人们提出的所有建议并在学习过程中学习)。该作业当然有一个 ID(只是未显示,不需要可见),但我将如何访问它以对其执行操作?我可以做的 SQL,与 Access/VBA 集成我是新手

【问题讨论】:

  • “我是不是走错了路?”我怀疑你可能做得很好,访问很容易。你的表格是连续表格吗?为什么您无法访问数据?您的记录集是否复杂,因此无法更新?您是否设计了包含唯一 ID 的表格?您的工作是从阅读关系数据库开始的吗?您是否查看过任何 Access 模板?
  • 顺便说一句,如果另一个人也支持您的问题,您将有足够的声誉来发布您的表单图像,这可能会有所帮助,那么它可能不会:)
  • 我会支持可能的图像上传,而且您似乎正在使用绑定表单,因此应该能够包含一个带有作业唯一编号的字段(我当然希望它有一个)然后您可以在更新 SQL 中引用此文本字段。
  • 不确定 Stack Overflow 警报是如何工作的,但我已经发布了更多信息
  • 如果您在某人姓名的开头附加一个 at 符号,则会通知该人,但是,您只能在每条评论中通知一个额外的人。将自动通知帖子的所有者。

标签: ms-access vba


【解决方案1】:

据我了解,您的表单是数据绑定的(您可以获得记录索引),所以 - 您的表单已经位于此记录中。如果您需要更新底层数据集的某些字段,您可以编写类似

Me!SomeField = ...
DoCmd.RunCommand acCmdSaveRecord

如果您的表单有控件绑定到“SomeField”,那么表单将自动更新。

如果这没有帮助,您可以查看其他几个方向:

1) 使用 SQL 代码更新记录。例如,您有应该在表单数据集中更新的记录 ID,因此您可以编写如下内容:

Call CurrentDB.Execute( _
"UPDATE SomeTable SET SomeField = SomeValue WHERE SomeTableID = " & Me!SomeTableID, dbSeeChanges)

2) 你可以看看Bookmark 属性——Recordset 和Form 都有这个属性,它描述了记录的位置。所以你可以写这样的东西(不是最好的例子,但可以帮助你得到一个想法):

Dim Rs as Recordset
Set Rs = Me.RecordsetClone 'make a reference copy of the form recordset
Rs.Bookmark = Me.Bookmark 'locate this recordset to the form current record

【讨论】:

  • 不确定 Stack Overflow 警报是如何工作的,但我在上面发布了更多信息
  • @StandOff 我相信您的表单的记录源包含字段 JOB_ID,所以要使用它,您可以只写 Me!JOB_ID(无需添加 CurrentRs)。所以 strSQL1(但没有评论)我会重写为“INSERT INTO completed_jobs(JOB_ID, DATE_COMPLETED) VALUES (" & Rs!job.ID & ", Date())"
  • 刚刚注意到,我在第一个代码 sn-p 中打错了 - 它应该是 Me!SomeField 而不是 Rs!SomeField,抱歉,已修复。
【解决方案2】:

考虑一种更简单的方法。我怀疑您是否需要关注表单的 CurrentRecord 属性。而且我不明白为什么您需要一个命令按钮来表示“已完成”,而另一个命令按钮用于“尚未完成”。

将“是/否”数据类型字段添加到表单的记录源使用的表中。将其默认值属性设置为 0,表示 False 或 No。称其为“completion_status”。使用该记录源创建一个新表单。然后您的表单可以有一个用于完成状态的复选框控件。

新添加的记录将具有 False/No 作为 completion_status --- 复选框将显示为未选中。表单中其他记录的完成状态可以使用复选框控件在是(选中)和否(未选中)之间切换。

【讨论】:

  • 不确定 Stack Overflow 警报是如何工作的,但我已经发布了更多信息
猜你喜欢
  • 1970-01-01
  • 2011-05-06
  • 2010-10-27
  • 2014-03-12
  • 1970-01-01
  • 2012-11-07
  • 1970-01-01
  • 2018-12-10
  • 2015-04-22
相关资源
最近更新 更多