【问题标题】:SQL as Control Source for Access Form fieldSQL 作为访问表单字段的控制源
【发布时间】:2010-11-21 15:57:01
【问题描述】:

有没有办法使用 SQL 填充访问表单的文本字段的值?

我已经读到不能简单地输入 SQL 作为控制源。这是真的吗?

感谢您的支持 :)

--编辑--

我需要执行这个查询;

SELECT tblCaseIssues.IssueDesc FROM tblCaseIssues INNER JOIN tblCaseNewHS_Issues ON tblCaseIssues.ID = tblCaseNewHS_Issues.IssueID WHERE(tblCaseNewHS_Issues.HS_ID = 81))

【问题讨论】:

  • 是否有某些原因不应将数据包含在表单的基础记录源中?

标签: sql vba ms-access


【解决方案1】:

很确定这是真正的 SQL,但您可以使用以下函数:
=DLookUp("field_name","table_name","any_fieldname = 'value'")

【讨论】:

  • 是否可以使用这样的函数在 tblCaseIssues.ID = tblCaseNewHS_Issues.IssueID WHERE (tblCaseNewHS_Issues.HS_ID = 81) 上执行 SELECT tblCaseIssues.IssueDesc FROM tblCaseIssues INNER JOIN tblCaseNewHS_Issues 这样复杂的事情?
  • 在所有表都连接的 Access 中创建一个查询。然后在您的 DBLookup 中,您可以将 table_name 替换为查询的名称(抱歉表示一个表并假设查询也可以工作)。注意:在 VBA 中有更好的方法。
【解决方案2】:

您可以将字段的控制源设置为函数名称。该函数可以轻松执行您的 SQL,和/或传入一个变量。这是我的简单样板,用于将 SQL 语句执行到记录集中并返回第一个值的函数。在我的世界里,我通常会包含一个非常具体的 where 子句,但您当然可以根据您的需要使任何这个函数更加健壮。

=fnName(sVariable, iVariable)

Public Function fnName( _
    sVariable as String, _
    iVariable as Integer _
    ) As String

On Error GoTo Err_fnName

    Dim con As ADODB.Connection
    Dim rst As ADODB.Recordset
    Dim sSQL As String

    sSQL = ""

    Set con = Access.CurrentProject.Connection
    Set rst = New ADODB.Recordset

    rst.Open sSQL, con, adOpenDynamic, adLockOptimistic

        If rst.BOF And rst.EOF Then

            'No records found
            'Do something!

        Else

            'Found a value, return it!
            fnName = rst(0)

        End If

    rst.Close
    Set rst = Nothing

    con.Close
    Set con = Nothing

Exit_fnName:

    Exit Function

Err_fnName:

    Select Case Err.Number
    Case Else
        Call ErrorLog(Err.Number, Err.Description, "fnName", "", Erl)
        GoTo Exit_fnName
    End Select

End Function

【讨论】:

    【解决方案3】:

    使用组合框并将 Row Source 设置为查询可能是最简单的方法,或者 DAO 是 Access 原生的。

    Private Sub Form_Current()
    ''Needs reference to Microsoft DAO 3.x Object Library
    Dim db As Database
    Dim rs As DAO.Recordset
    Dim strSQL As String
    Dim strResult  As String
    
    
    strSQL = "SELECT ci.IssueDesc FROM tblCaseIssues ci " _
           & "INNER JOIN tblCaseNewHS_Issues cni ON ci.ID = cni.IssueID " _
           & "WHERE cni.HS_ID = 81"
    
    Set db = CurrentDb
    Set rs = db.OpenRecordset(strSQL)
    
    If rs.RecordCount > 0 Then
        Do While Not rs.EOF
            strResult = strResult & ", " & rs!IssueDesc
            rs.MoveNext
        Loop
    
        strResult = Mid(strResult, 3)
    Else
        strResult = "Not found"
    End If
    
    Me.TextBoxName = strResult
    
    End Sub
    

    【讨论】:

      【解决方案4】:

      只需将您的 sql 查询保存为查询即可。

      然后在文本框中,只需放置:

      =(dlookup(“IssuesDesc”,“查询名称”))

      我对所有这些建议代码重击的海报感到相当大的损失,因为根本不需要。只需将您的 sql 保存为查询,然后使用 dlookup() 函数作为文本框的数据源,就完成了。

      【讨论】:

      • 因为第一个答案已经建议了您的解决方案,但 OP 仍在寻找一种可以利用 SQL 语句作为查询源的方法。
      【解决方案5】:
      Private Sub Form_Load()
          Me.Text0 = CurrentDb.OpenRecordset("SELECT COUNT(name) AS count_distinct_clients FROM (SELECT DISTINCT name FROM Table1 WHERE subject='Soc')  AS tmp;").Fields(0)
      End Sub
      

      【讨论】:

      • 最好包含一些解释/上下文,而不是仅提供代码答案。
      • 欢迎来到 Stack Overflow!虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。不鼓励仅使用代码回答。
      【解决方案6】:

      我创建了以下函数来解决这个问题。 我喜欢这个解决方案,因为您不必处理已保存的查询阻塞导航窗格或冗长的解决方法。

          Public Function DAOLookup(SQLstatement As String)
          'once you are finished with your SQL statement, it needs to be 
          'formatted for VBA and it also needs to be on one line.
          'example, you would set the control source of a text box to the following
          '=DAOLookup("Select ls_number FROM FROM ls INNER JOIN ls_sort ON ls.ls_id = ls_sort.ls_id WHERE ls_sort.number =" & forms!frmMenu!combo_sort &  ";")
          'Please note, this function only work for single column single row sql statements
          Dim db As DAO.Database
          Dim rs As DAO.Recordset
      
          Set db = CurrentDb
          Set rs = db.OpenRecordset(SQLstatement)
          If Not rs.BOF Then rs.MoveFirst
          If rs.BOF And rs.EOF Then Exit Function
          DAOLookup = rs(0)
          rs.Close
          Set rs = Nothing
          db.Close
          Set db = Nothing
          End Function
      

      这是我向老板解释的方式。 “您可以将 DLookUp() 函数作为文本框的控制源。为什么不编写一个执行查询的函数并将该函数用作控制源?” 试试看,它解决了我的问题。

      【讨论】:

        猜你喜欢
        • 2014-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-01
        • 2012-06-09
        相关资源
        最近更新 更多