Microsoft Access可编辑数据获取:DLookup替代方案咨询
解决Access中DLookup控件无法编辑的方案
核心问题:DLookup作为控件数据源时是计算型控件,仅支持读取显示,无法直接编辑。要实现"拉取默认数据+允许手动修改"的需求,需要用未绑定文本框结合事件代码,同时区分标准数据(ModelT)和实际数据(需单独存储)。
步骤1:调整数据表(关键)
不要直接修改ModelT里的标准KDQty,应该新建一个记录表存储实际计件数据,比如PieceWorkT,包含以下字段:
PieceWorkID:自动编号(主键)ModelID:数字型(外键,关联ModelT的ModelID)ActualKDQty:数字型(存储修改后的实际板材数量)SubContractorID:数字型(分包商ID,可选)WorkDate:日期/时间(记录日期,可选)FinishType:文本/数字(饰面类型,可选)
步骤2:设计窗体控件
- 保留
ModelCombo:可绑定到PieceWorkT.ModelID(新建/编辑记录时选择户型),或设置为未绑定(需后续把选中值写入表) - 添加未绑定文本框:命名为
txtActualKDQty,用于显示默认值和手动编辑
步骤3:编写VBA事件代码
1. 选择户型后自动填充标准数量(ModelCombo的AfterUpdate事件)
打开窗体设计视图,选中ModelCombo → 右键「属性」→ 「事件」→ 「更新后」→ 点击[...]进入VBA编辑器,输入:
Private Sub ModelCombo_AfterUpdate() ' 当选中户型时,从ModelT拉取标准KDQty填充到文本框 If Me.ModelCombo.Value <> 0 Then Me.txtActualKDQty.Value = DLookup("KDQty", "ModelT", "ModelID=" & Me.ModelCombo.Value) Else Me.txtActualKDQty.Value = 0 End If ' 如果是新建记录,同步ModelID到记录表 If Me.NewRecord Then Me.ModelID.Value = Me.ModelCombo.Value End If End Sub
2. 加载现有记录时填充数据(Form的Current事件)
如果窗体用于编辑已有计件记录,在窗体的「当前」事件中写入:
Private Sub Form_Current() ' 加载记录时,优先显示已保存的ActualKDQty,若无则显示标准KDQty If Not IsNull(Me.ModelID) Then Me.txtActualKDQty.Value = Nz(Me.ActualKDQty, DLookup("KDQty", "ModelT", "ModelID=" & Me.ModelID)) Else Me.txtActualKDQty.Value = 0 End If End Sub
3. 保存修改后的数值(txtActualKDQty的AfterUpdate事件)
选中txtActualKDQty → 「属性」→ 「事件」→ 「更新后」,输入:
Private Sub txtActualKDQty_AfterUpdate() ' 将手动修改的值同步到绑定的ActualKDQty字段,保存到PieceWorkT Me.ActualKDQty.Value = Me.txtActualKDQty.Value End Sub
额外提示
- 如果只是临时调整数值(不需要永久保存),可以跳过步骤1,直接用未绑定文本框,修改后直接用
txtActualKDQty.Value参与工资计算即可 - 确保
ModelID在两个表中的数据类型一致(比如都是长整型),否则DLookup会出错 - 测试时可以先新建一条记录,选择户型后看是否自动填充数值,再手动修改,保存后查看PieceWorkT是否有对应数据
内容的提问来源于stack exchange,提问作者Gayle Alley
相关产品推荐
相关产品推荐

