2009-08-21 4 views
8

C'è un modo per popolare il valore di un campo di testo di un modulo di accesso utilizzando SQL?SQL come sorgente di controllo per il modulo modulo di accesso

Ho letto che non è possibile inserire semplicemente SQL come origine di controllo. È vero?

grazie per qualsiasi halp :)

--edit--

ho bisogno per eseguire questa query;

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

C'è qualche motivo per cui i dati non devono essere inclusi nell'origine record sottostante del modulo? –

risposta

9

Abbastanza sicuro che è vero SQL, ma è possibile utilizzare la funzione di:
=DLookUp("field_name","table_name","any_fieldname = 'value'")

+0

E 'possibile fare qualcosa di così complesso come SELEZIONA tblCaseIssues.IssueDesc DA tblCaseIssues INNER JOIN tblCaseNewHS_Issues ON tblCaseIssues.ID = tblCaseNewHS_Issues.IssueID WHERE (tblCaseNewHS_Issues.HS_ID = 81) con tale funzione? – Jambobond

+2

Creare una query in Access in cui tutte le tabelle sono unite. Quindi nel tuo DBLookup, puoi sostituire table_name con il nome della query (scusa indicando una tabella e assumendo che una query possa funzionare allo stesso modo). Nota: ci sono modi migliori di fare in VBA. – JeffO

2

È possibile impostare la sorgente di controllo del vostro campo per un nome di funzione. Quella funzione può facilmente eseguire il tuo SQL e/o passare una variabile. Ecco la mia semplice piastra di riscaldamento per una funzione per eseguire un'istruzione SQL in un recordset e restituire il primo valore. Nel mio mondo di solito includo una clausola specifica, ma potresti sicuramente rendere questa funzione più solida per le tue esigenze.

=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

Potrebbe essere più facile da usare una casella combinata e impostare l'origine riga per la tua ricerca, in alternativa, DAO è nativo di 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

Basta prendere la query sql e salvarla come una query.

Poi nella casella di testo, solo luogo:

= (DLookup (“IssuesDesc”,”nome della query”))

io ad una piuttosto grande perdita per tutti questi manifesti suggeriscono whacks di codice dove nessuno è necessario affatto. Basta salvare il sql come una query e quindi utilizzare la funzione dlookup() come origine dati della casella di testo e il gioco è fatto.

+0

Poiché la prima risposta suggeriva già la soluzione, l'OP stava ancora cercando un metodo che potesse utilizzare un'istruzione SQL come fonte della sua query. –

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

È meglio includere alcune spiegazioni/contesto piuttosto che avere una risposta solo in codice. – EJoshuaS

+1

Benvenuti in Stack Overflow! Sebbene questo codice possa rispondere alla domanda, fornire un contesto aggiuntivo sul perché e/o su come questo codice risponde alla domanda migliora il suo valore a lungo termine. Le risposte al solo codice sono scoraggiate. – Ajean

0

Ho creato la seguente funzione per risolvere questo problema. Mi piace questa soluzione perché non devi occuparti di query salvate che ostruiscono il tuo pannello di navigazione o soluzioni alternative.

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 

Questo è stato il modo in cui l'ho spiegato al mio capo. "È possibile avere una funzione DLookUp() come origine di controllo di una casella di testo, perché non scrivere semplicemente una funzione che fa una query e utilizzare la funzione come origine di controllo?" Fai un tentativo, ha risolto la mia situazione.