MS Access连续表单:按记录ID过滤查询并在文本框显示结果
问题修复方案
核心问题原因
连续表单的Form_Load事件仅在表单初始化时执行一次,此时Me.txtProjectID读取的是第一条记录的ID值,后续所有行的HotNotes_Textbox都会沿用这个初始值,不会自动匹配每行对应的ProjectID。
修复步骤
1. 重新设置文本框的控件来源
无需在Form_Load中手动赋值,直接修改HotNotes_Textbox的控件来源为以下表达式:
=CONCAT_SQL("SELECT [ProjectName], tblHotNotes.HotNote, tblHotNotes.HotNoteDate FROM tblProjects INNER JOIN tblHotNotes ON tblProjects.ProjectID = tblHotNotes.ProjectID WHERE tblHotNotes.ProjectID = " & [ProjectID])
这样连续表单的每一行都会自动调用函数,并传入当前行的ProjectID,返回对应项目的备注内容。
2. 优化CONCAT_SQL函数(可选但推荐)
原函数存在未初始化变量、未释放资源等问题,优化后版本如下:
Public Function CONCAT_SQL(strSQL As String) As String Dim r As ADODB.Recordset Dim a1 As Variant Dim s As String Dim outer As Long s = "" ' 初始化结果字符串 Set r = New ADODB.Recordset r.Open strSQL, CurrentProject.Connection, adOpenStatic, adLockReadOnly ' 仅在记录集非空时处理 If Not r.EOF Then a1 = r.GetRows() For outer = LBound(a1, 2) To UBound(a1, 2) s = s & "<b>" & a1(2, outer) & "</b>: " & a1(1, outer) & "<br>" Next End If ' 释放资源 r.Close Set r = Nothing CONCAT_SQL = s End Function
3. 移除冗余代码
删除Form_Load事件中的赋值语句:
' 删掉这一行 Me.HotNotes_Textbox = CONCAT_SQL(...)
额外注意事项
- 确保
HotNotes_Textbox的是否为超文本属性设置为是,这样<b>(加粗)和<br>(换行)标签才能正确渲染格式 - 如果
ProjectID是文本类型,需要在SQL语句中给ID添加单引号:WHERE tblHotNotes.ProjectID = '" & [ProjectID] & "'"
内容的提问来源于stack exchange,提问作者Bruno Giusti Coronato
相关产品推荐
相关产品推荐

