2009-08-21 29 views
8

Có cách nào điền giá trị văn bản của mẫu truy cập bằng cách sử dụng SQL không?SQL làm Nguồn điều khiển cho trường Mẫu truy cập

Tôi đã đọc rằng không thể chỉ cần nhập SQL làm Nguồn điều khiển. Điều này có đúng không?

nhờ cho bất kỳ halp :)

--edit--

tôi cần phải thực hiện truy vấn này;

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

Có một số lý do dữ liệu không được đưa vào nguồn bản ghi cơ sở của biểu mẫu không? –

Trả lời

9

Đẹp, chắc chắn đó là SQL đúng, nhưng bạn có thể sử dụng chức năng:
=DLookUp("field_name","table_name","any_fieldname = 'value'")

+0

Có thể làm điều gì đó phức tạp như CHỌN tblCaseIssues.IssueDesc TỪ tblCaseIssues INNER JOIN tblCaseNewHS_Issues ON tblCaseIssues.ID = tblCaseNewHS_Issues.IssueID WHERE (tblCaseNewHS_Issues.HS_ID = 81) với một chức năng như vậy? – Jambobond

+2

Tạo truy vấn trong Access nơi tất cả các bảng được nối. Sau đó, trong DBLookup của bạn, bạn có thể thay thế table_name với tên của truy vấn (Xin lỗi chỉ ra một bảng và giả sử một truy vấn sẽ làm việc là tốt). Lưu ý: có những cách tốt hơn để làm trong VBA. – JeffO

2

Bạn có thể thiết lập các nguồn kiểm soát lĩnh vực của bạn để một tên hàm. Hàm đó có thể dễ dàng thực thi câu lệnh SQL của bạn và/hoặc truyền vào một biến. Đây là đĩa nồi hơi đơn giản của tôi cho một hàm để thực hiện một câu lệnh SQL thành một recordset và trả về giá trị đầu tiên. Trong thế giới của tôi, tôi thường bao gồm một điều khoản rất cụ thể, nhưng bạn chắc chắn có thể làm cho bất kỳ chức năng này mạnh mẽ hơn cho nhu cầu của bạn.

=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 
1

Có thể dễ nhất để sử dụng combobox và đặt Nguồn hàng cho truy vấn của bạn, cách khác, DAO có nguồn gốc 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 
2

Chỉ cần truy vấn sql của bạn và lưu truy vấn đó làm truy vấn.

Sau đó, trong hộp văn bản, chỉ ra:

= (dlookup (“IssuesDesc”,”tên của truy vấn”))

tôi thua lỗ khá lớn như cho tất cả những áp phích cho thấy whacks của mã mà không cần gì cả. Chỉ cần lưu sql của bạn làm truy vấn và sau đó sử dụng hàm dlookup() làm nguồn dữ liệu của hộp văn bản và bạn đã hoàn tất.

+0

Vì câu trả lời đầu tiên đã đề xuất giải pháp của bạn, nhưng OP vẫn đang tìm kiếm một phương pháp mà ông có thể sử dụng câu lệnh SQL làm nguồn truy vấn của mình. –

0
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 
+1

Tốt hơn nên bao gồm một số giải thích/ngữ cảnh thay vì chỉ có câu trả lời chỉ có mã. – EJoshuaS

+1

Chào mừng bạn đến với Stack Overflow! Mặc dù mã này có thể trả lời câu hỏi, cung cấp ngữ cảnh bổ sung về lý do và/hoặc cách mã này trả lời câu hỏi cải thiện giá trị lâu dài của nó. Các câu trả lời chỉ có mã không được khuyến khích. – Ajean

0

Tôi đã tạo chức năng sau để giải quyết vấn đề này. Tôi thích giải pháp này bởi vì bạn không phải đối phó với các truy vấn đã lưu làm tắc nghẽn bảng điều hướng của bạn hoặc cách giải quyết lâu dài.

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 

Đây là cách tôi giải thích cho sếp của mình. "Bạn có thể có một hàm DLookUp() như một nguồn điều khiển của một hộp văn bản. Tại sao không chỉ viết một hàm thực hiện truy vấn và sử dụng hàm làm nguồn điều khiển?" Hãy thử, nó đã khắc phục tình trạng của tôi.

Các vấn đề liên quan