【问题标题】:How to set controlsource of a textbox from SQL如何从 SQL 设置文本框的控制源
【发布时间】:2014-02-02 07:08:48
【问题描述】:

我有一个绑定到 SQL 语句的子表单。在子窗体中,我有几个文本框绑定到该 SQL 的字段。但是,我有另一个文本框需要绑定到来自不同 SQL 语句的字段,其条件来自第一个。我的代码如下所示:

Dim subform As Object
Dim formFilter As String

formFilter = "SELECT * FROM my_table_1"
Set subform = Me!my_subform.Form    
subform.RecordSource = formFilter

subform.field1.ControlSource = "tb1f1"
subform.field2.ControlSource = "tb1f2"
...
subform.f3.ControlSource = "= SELECT TOP 1 tb2f3 FROM my_table_2 WHERE tb2f1 = '" & [tb1f1] & "' AND tb2f2 = '" & [tb1f2] "' ORDER BY tb2f4"

这里不能直接使用 DLOOKUP 函数,因为我需要对表格结果进行排序。

提前感谢您的帮助。

【问题讨论】:

  • 那个subform.f3只是一个显示字段吗?
  • @HelloW 是的,它仅用于显示。我不打算让用户直接编辑此表单。

标签: sql ms-access vba ms-access-2003


【解决方案1】:

您不能将同一表单上的控件绑定到 2 个不同的记录集。您唯一能做的就是从 2 个不同的记录集中提取数据,但这可能不是最好的方法。

为此,您必须创建第二个记录集并在其中获取该值。比如:

Dim db as Database
Dim rec as Recordset

Set db = CurrentDB
Set rec = db.OpenRecordset("SELECT TOP 1 tb2f3 FROM my_table_2 WHERE tb2f1 = '" & [tb1f1] & "' AND tb2f2 = '" & [tb1f2] "' ORDER BY tb2f4")

Me.MyControlName = rec(0)

【讨论】:

  • 感谢您的分享。但是我在这里遇到了运行时错误 2465。似乎 Access 无法在 OpenRecordset 语句中正确引用我的字段 [tb1f1] 和 [tb1f2]。这是我的代码Set db = CurrentDb Set rs = db.OpenRecordset("SELECT TOP 1 root_cause FROM Shipment_Remark " _ & "WHERE plant = '" & [plant] & "' AND shipment_no = '" & [shipment_no] & "' ORDER BY update_time DESC") subform.text_root_cause_field.ControlSource = rs(0) [plant] 和 [shipment_no] 是我的子表单记录源中的两个字段。
【解决方案2】:

我想我会简单地创建一个小函数来获得你想要的结果。最好在您自己的函数中简单地修改 DLookup 并添加排序,但我不会在这里这样做。
首先是表单代码。请注意,我没有设置记录源,只是设置了可能不是您想要的值。

subform.f3 = fGet_tb2f3([tb1f1], [tb1f2])

然后是函数代码(放入自己的错误处理)

Public Function fGet_tb2f3(tblf1 as String,tblf2 as String) as String  
    Dim rst as dao.recordset
    Dim db as database
    set db = currentdb
    set rst = db.openrecordset("SELECT TOP 1 tb2f3 FROM my_table_2 WHERE tb2f1 = '" & tb1f1 & "' AND tb2f2 = '" & tb1f2 "' ORDER BY tb2f4",dbopensnapshot
    if not rst is nothing then
        if not rst.eof then fGet_tb2f3 = rst!tb2f3
        rst.close
        set rst = nothing
    end if
    db.close
    set db = nothing
end Function

【讨论】:

  • @HellowW 感谢您的建议。我试过你的方法。但是访问再次提示我错误2465。在语句subform.f3 = fGet_tb2f3([tb1f1], [tb1f2]) 中找不到字段 [tb1f1] 和 [tb1f2]。 [tb1f1] 和 [tb1f2] 只是我的子表单记录源中的两个字段。我在这里错过了什么?
  • @got2nosth 您引用的字段在子表单中。我的代码没有反映这一点。这个子表单是级联表单还是一次单个记录?如果子表单一次只有一条记录,最好在 on current 事件的子表单中运行此代码。
  • 我的子表单是一个数据表。我试图在 oncurrent 事件中调用它。如果我这样做Me.field4 = getLatestRemark([tb1f1], [tb1f2]),我仍然会收到错误 2465。但如果我像Me.field4.ControlSource = "=getLatestRemark([tb1f1], [tb1f2])" 那样直接设置控制源,它似乎可以工作。但是,现在的问题是,每当我单击子表单中的任意位置时,field4 列都会刷新。无论如何要禁用此刷新操作?
  • 当我以 onLoad 事件的形式设置 controlsource 时,我设法让它工作。这是正确的方法吗?
  • 除非我更了解数据的上下文以及您要解决的问题,否则很难知道。可能最好在心里记下检查并确保这种行为是合意的。
猜你喜欢
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 2011-06-15
  • 1970-01-01
  • 2020-09-22
  • 1970-01-01
相关资源
最近更新 更多