Access子窗体记录循环更新表异常:仅更新首行问题求助
Access子窗体循环更新仅生效第一行的问题解决
问题原因
第二个子窗体的UPDATE语句错误地直接引用了子窗体控件的当前显示值(Forms.frmASI.sfrmASISpec.form.SPEC_ID、Forms.frmASI.sfrmASISpec.form.NEW_SPEC_DESC),而非循环遍历的RecordsetClone记录集中的对应字段值。循环执行时,控件始终显示子窗体的第一行数据,导致每次UPDATE都只针对第一行的SPEC_ID进行操作。
修正后的代码
将UPDATE语句中的控件引用替换为Recordset的字段引用(如!SPEC_ID、!NEW_SPEC_DESC),同时优化字符串与日期的处理逻辑,避免语法错误:
Private Sub SaveExitBtn_Click() Dim strSQL As String Dim strSQL2 As String Dim rs As DAO.Recordset ' 第一个子窗体的INSERT逻辑(保留原有正常逻辑) Set rs = Me.sfrmASI.Form.RecordsetClone With rs Do Until rs.EOF ' 转义文本字段中的单引号,统一日期格式 strSQL = "INSERT INTO DA_CC_QAQC_DRAWINGS_DETAIL (DRAW_ID, REV_DATE, REV_DESC, REV_TYPE)" & _ "VALUES ('" & !DRAW_ID & "', #" & Format(Me.sfrmASI.Form.DIFCDate, "yyyy-mm-dd") & "#, '" & Replace(!ITEM_DESC, "'", "''") & "', 'ASI');" DoCmd.SetWarnings False DoCmd.RunSQL strSQL DoCmd.SetWarnings True rs.MoveNext Loop End With ' 修正后的第二个子窗体UPDATE逻辑 Set rs = Me.sfrmASISpec.Form.RecordsetClone With rs Do Until rs.EOF ' 改用Recordset中的字段值,处理单引号转义 strSQL2 = "UPDATE DA_CC_QAQC_SPEC_MASTER_1 SET [REV_DATE] = #" & Format(Me.DIFC_DATE, "yyyy-mm-dd") & "#, " & _ "[REV_DESC] = '" & Replace(!NEW_SPEC_DESC, "'", "''") & "', [REV_TYPE] = 'ASI' " & _ "WHERE [ID] = '" & !SPEC_ID & "' AND [JOBNUMBER] = GET_QAQC_JOB();" DoCmd.SetWarnings False DoCmd.RunSQL strSQL2 DoCmd.SetWarnings True rs.MoveNext Loop End With DoCmd.OpenForm "frmASIPicklist" DoCmd.Close acForm, "frmASI" Else: Me.SetFocus End If End If End Sub
额外优化建议
- 避免SQL语法错误:对包含单引号的文本字段(如
REV_DESC)用Replace(字段值, "'", "''")转义,防止字符串拼接导致SQL语句中断。 - 统一日期格式:用
Format函数将日期转为yyyy-mm-dd格式,避免因系统区域设置差异引发的日期解析错误。 - 参数查询更安全:相比字符串拼接,参数查询能彻底规避SQL注入风险,同时简化数据类型处理,示例代码如下:
' 参数化UPDATE示例 Dim qdf As DAO.QueryDef Set qdf = CurrentDb.CreateQueryDef("", _ "UPDATE DA_CC_QAQC_SPEC_MASTER_1 SET [REV_DATE] = @RevDate, [REV_DESC] = @RevDesc, [REV_TYPE] = 'ASI' " & _ "WHERE [ID] = @SpecID AND [JOBNUMBER] = GET_QAQC_JOB();") With rs Do Until rs.EOF qdf.Parameters("@RevDate") = Me.DIFC_DATE qdf.Parameters("@RevDesc") = !NEW_SPEC_DESC qdf.Parameters("@SpecID") = !SPEC_ID qdf.Execute dbFailOnError rs.MoveNext Loop End With Set qdf = Nothing
内容的提问来源于stack exchange,提问作者house
相关产品推荐
相关产品推荐

