2012-01-13 106 views
5

我有一个工作跟踪系统,并且有一个查询返回所有逾期工作的结果。 我有一个显示每个作业一个接一个的形式,并有两个按钮(作业已完成,作业未完成)。未完成只显示下一条记录。 如果按下“已完成”按钮,我无法找到访问当前记录以更新其内容的方式,我能得到的最接近的是表示记录位置的长数字。如何从表单编号直接更新数据库中的记录(Access 2007)

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

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

这是我第一次拍在VBA和搜索我找不到任何解决我的问题的一个小时之后。 我是否完全错误地回答这个问题?在Microsoft Access工作2007

更多信息所有的表都是标准化

车表:包含vehicle_id(PK),以及雷戈和模型等

工作表:包含作业ID(PK), vehicle_id(fk)和其他信息,关于需要发生什么以及下一个发生日期,每次发生作业(所有作业重复)和其他信息之间的天数

作业历史记录表:包含job_history_id(pk), job_id(fk),完成日期和评论

当按下任务完成按钮,它应该建立在作业历史表与当前日期的新条目,任何意见和作业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我相信这个记录,你正在谈论的是我所需要的,但我无法弄清楚如何使用它,任何提示?

@Matt我90%确定我正在使用绑定表单(就像我刚才所说的,Access的新功能,一直在查看人们建议和学习的所有内容)。当然有一个工作ID(只是没有显示,不需要可见),但我如何访问它来执行操作? SQL我可以做的,与Access/VBA整合我是新的

Form for ticking off jobs as they are completed, calls code shown

+1

“我对这个完全错误的方式做了什么?”我怀疑你可能是,做得很好,访问很简单。你的表格是连续表格吗?为什么你不能访问数据?您的记录集是否复杂,因此无法更新?你是否设计过表格以包含唯一的ID?您是否通过阅读关系数据库开始您的工作?你看过任何Access模板吗? – Fionnuala 2012-01-13 10:10:11

+1

顺便说一句,如果另一个人也upvotes您的问题,您将有足够的声誉发布您的表单的图像,这可能是有益的,然后再次它可能不会:) – Fionnuala 2012-01-13 10:16:07

+0

我会upvote为可能的图像上传,也似乎你正在使用绑定表单,因此应该能够包含一个带有作业唯一编号的字段(我当然希望它有一个),然后你可以在Update SQL中引用这个文本字段。 – 2012-01-13 11:24:42

回答

2

据我了解你的情况,你的表格是数据绑定绑定(你可以记录索引),所以 - 你的表格已经位于在这张唱片上。如果您需要更新基础数据集的一些领域,你可以写类似

Me!SomeField = ... 
DoCmd.RunCommand acCmdSaveRecord 

如果你的形式也必然要“SomeField”控制,表单将自动更新。

如果这不会帮助,你可以看看一对夫妇的另一个方向:

1)使用SQL代码更新记录。例如,你有记录的ID应在表单数据集进行更新,所以你可以写这样的:

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

2)你可以看一下书签属性 - 无论是记录和形式都有这个属性,它描述了记录的位置。所以,你可以写这样的事情(不是最好的例子,但可以帮助你得到一个想法):

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 
+0

不确定如何堆栈溢出警报工作,但我已经张贴了更多信息 – StandOff 2012-01-16 05:41:59

+0

@StandOff我beleive记录源表单包含字段JOB_ID,所以要使用它,你可以只写我!JOB_ID(无需添加CurrentRs)。所以strSQL1(但没有评论)我将重写为“INSERT INTO completed_jobs(JOB_ID,DATE_COMPLETED)VALUES(”&Rs!job.ID&“,Date())” – sarh 2012-01-16 12:38:08

+0

刚刚注意到,我在第一个代码中做了一个印刷错误snippet - 它应该是我!SomeField而不是Rs!SomeField,对不起,修正。 – sarh 2012-01-16 12:41:07

1

考虑一个更简单的方法。我怀疑你需要关心窗体的CurrentRecord属性。我不明白为什么你需要一个命令按钮来表示“已完成”,另一个表示“尚未完成”。

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

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

+0

不确定Stack Overflow警报是如何工作的,但我已经发布了更多信息 – StandOff 2012-01-16 05:42:36

相关问题