2009-08-21 15 views
8

SQL kullanarak bir Access Form'un metin değeri değerini herhangi bir şekilde doldurmak mümkün mü?SQL, Erişim Formu için Kontrol Kaynağı olarak SQL alanı

SQL'i Kontrol Kaynağı olarak girmek mümkün olmadığını okudum. Bu doğru mu? Herhangi halp :) Ben bu sorguyu gerçekleştirmek için gereken

--edit--

için

sayesinde;

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

Veriler, formun temel kayıt kaynağına dahil edilmemesinin bir nedeni var mı? –

cevap

9

Oldukça emin olduğu doğrudur, SQL, ancak işlevini kullanabilirsiniz:
=DLookUp("field_name","table_name","any_fieldname = 'value'")

+0

o tblCaseIssues.ID = tblCaseNewHS_Issues.IssueID AÇIK tblCaseNewHS_Issues JOIN tblCaseIssues İÇ GELEN SEÇ tblCaseIssues.IssueDesc kadar karmaşık bir şey yapmak mümkün mü WHERE (tblCaseNewHS_Issues.HS_ID = 81) bu tür bir işlevle ? – Jambobond

+2

Tüm tabloların birleştirildiği Access'te bir sorgu oluşturun. Daha sonra DBLookup dosyanızda, table_name değerini sorgu ismiyle değiştirebilirsiniz (Bir tabloyu belirttiğim için üzgünüm ve bir sorgunun da işe yarayacağını varsayarak). Not: VBA'da daha iyi yollar vardır. – JeffO

2

Bir fonksiyon adının alanınızda denetim kaynağına ayarlayabilirsiniz. Bu işlev, SQL'inizi kolayca yürütebilir ve/veya bir değişkende geçirebilir. İşte bir SQL deyimini bir kayıt kümesine yürütmek ve ilk değeri döndürmek için bir işlev için basit kazan tabağım. Benim dünyamda genellikle çok özel bir cümlecik de dahil olmakla birlikte, bu işlevi herhangi bir şekilde ihtiyaçlarınız için daha sağlam hale getirebilirsiniz.

=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

Bir combobox kullanmak ve sorguya Satır kaynağı ayarlamanın en kolay olabilir, alternatif olarak, DAO Access özgüdür.

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

Sadece sql sorgunuzu alıp sorgu olarak kaydedin. Metin kutusuna Sonra

, sadece bir yer:

= (DLookUp (“IssuesDesc”,”sorgu adı”))

Ben whacks düşündüren tüm bu afişler için oldukça büyük bir kayıp hiçbir şekilde gerekli olmayan kod. Sadece sql'nizi bir sorgu olarak kaydedin ve ardından dlookup() işlevini metin kutusunun veri kaynağı olarak kullanın ve işiniz bitti.

+0

İlk cevap zaten çözümünüzü önerdiği için, OP hala bir SQL deyimini sorgularının kaynağı olarak kullanabileceği bir yöntem arıyordu. –

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

Sadece kod yanıtı almaktan ziyade bazı açıklama/içerik eklemek daha iyidir. – EJoshuaS

+1

Yığın Taşmasına Hoş Geldiniz! Bu kod soruyu cevaplayabilirken, neden ve/veya bu kodun soruyu nasıl cevapladığıyla ilgili ek bağlam sağlayarak uzun vadeli değerini arttırır. Sadece kod cevapları önerilmez. – Ajean

0

Bu sorunu çözmek için aşağıdaki işlevi oluşturdum. Bu özümden hoşlanıyorum çünkü gezinme bölmenizi tıkanmış veya uzun geçici çözümler içeren kaydedilmiş sorgularla uğraşmak zorunda kalmazsınız.

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 

Bu, patronuma açıkladığım yol buydu. "Bir metin kutusunun kontrol kaynağı olarak bir DLookUp() işlevine sahip olabilirsiniz. Neden bir sorguyu yapan ve işlevi denetim kaynağı olarak kullanan bir işlev yazmıyorsunuz?" Bir deneyin, durumu düzeltdim.