有网友问道:如何分阶段录入一条记录,要求是在新记录中录入一个机器号,如果这个机器号已有一条记录,并且要求必须录入的字段不完整的,则转到这条记录继续录入,同时已经录入的字段不能修改;若没有这个机器号或这个机器号的上条记录已经录入完整,则继续在新增的这条记录中录入相关信息。
点击下载此附件
这个分点击下载此附件两步处理:
1、如何判断这个机器号已有一条记录,并且要求录入的字段是否完整(通常也可以利用这个方法进行数据完整性和防止重复录入数据)。这个就在机器号文本框的更新后事件中进行判断处理,利用DLookup( )函数使用相关条件进行查找判断。若找到相关记录,则取消当前录入,并转到相应的记录,这个使用窗体数据集的FindFirst 方法。
2、转到相应记录时,保护以录入的数据。这个是在窗体的成为当前事件中进行处理。利用对窗体所有控件(控件集合)进行循环来判断处理。这里分别对控件的类型、控件的字段值、控件的标示(利用控件的标示属性Tag来标记区分有无数据都可以修改的字段,比如备注之类的)。对控件的锁定属性根据判定的结果进行设置就可以了,为了更好区别那些控件不允许修改,方便使用,最好对锁定的字段设置一下文本颜色。
程序见下面的代码及附件。
Private Sub MC__机器号_AfterUpdate()
Dim MachNum As String
'查找指定的机器号和指定字段内容有空的记录,若存在则转到找到的记录中
MachNum = Nz(DLookup("[MC#/机器号]", "[Laser P]", "[MC#/机器号]='" & [MC__机器号] & "' And ([Part#/料号] Is Null or [Lot#/批号] Is Null or [Style/类型] Is Null or [Side/正/反面] Is Null or [Start date/开始日期] Is Null or [Start time/开始时间] Is Null or [In shfit/开始班次] Is Null or [Start Op#/开始员工号] Is Null or [Panel qty/板数] Is Null or [End date/结束日期] Is Null or [End time/结束时间] Is Null or [End Op#/结束员工号] Is Null)"))
If MachNum <> "" Then
DoCmd.DoMenuItem acFormBar, acEditMenu, acUndo, , acMenuVer70 '取消当前录入
Me.Recordset.FindFirst "[MC#/机器号]='" & MachNum & "' And ([Part#/料号] Is Null or [Lot#/批号] Is Null or [Style/类型] Is Null or [Side/正/反面] Is Null or [Start date/开始日期] Is Null or [Start time/开始时间] Is Null or [In shfit/开始班次] Is Null or [Start Op#/开始员工号] Is Null or [Panel qty/板数] Is Null or [End date/结束日期] Is Null or [End time/结束时间] Is Null or [End Op#/结束员工号] Is Null)"
End If
End Sub
Private Sub Form_Current()
Dim ctl As Control
For Each ctl In Me.Controls
If ctl.ControlType = acComboBox or ctl.ControlType = acTextBox Then
'如果字段为空或字段标记(tag)为"*"则允许修改
If IsNull(ctl) or ctl.Tag = "*" Then
ctl.Locked = False
ctl.ForeColor = -2147483640
Else
ctl.Locked = True
ctl.ForeColor = 9868950
End If
End If
Next ctl
End Sub