2009-08-21 5 views
8

Gibt es eine Möglichkeit, füllen Sie den Text eines Forms Feild Access Form mit SQL?SQL als Steuerelement Quelle für Access Form Feld

Ich habe gelesen, dass es nicht möglich ist, einfach SQL als die Steuerquelle einzugeben. Ist das wahr?

Dank für jede halp :)

--edit--

ich diese Abfrage durchführen müssen;

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

Gibt es einen Grund, warum die Daten nicht in der zugrunde liegenden Datenquelle des Formulars enthalten sein sollten? –

Antwort

9

Ziemlich sicher, das ist wahr SQL, aber Sie die Funktion nutzen könnten:
=DLookUp("field_name","table_name","any_fieldname = 'value'")

+0

Ist es möglich, etwas so komplex wie SELECT tblCaseIssues.IssueDesc VON tblCaseIssues INNER JOIN tblCaseNewHS_Issues ON tblCaseIssues.ID = tblCaseNewHS_Issues.IssueID WHERE (tblCaseNewHS_Issues.HS_ID = 81) mit einer solchen Funktion zu tun? – Jambobond

+2

Erstellen Sie eine Abfrage in Access, wo alle Tabellen verknüpft sind. Dann können Sie in Ihrem DBLookup Tabellenname durch den Namen der Abfrage ersetzen (Sorry zeigt eine Tabelle an und unterstellt, dass eine Abfrage auch funktionieren würde). Hinweis: In VBA gibt es bessere Möglichkeiten. – JeffO

2

Sie können die Steuerquelle des Feldes auf einen Funktionsnamen. Diese Funktion kann Ihr SQL einfach ausführen und/oder eine Variable übergeben. Hier ist meine einfache Boiler-Platte für eine Funktion, um eine SQL-Anweisung in ein Recordset auszuführen und den ersten Wert zurückzugeben. In meiner Welt schließe ich normalerweise eine sehr spezifische Where-Klausel ein, aber Sie könnten sicherlich jede dieser Funktionen robuster für Ihre Bedürfnisse machen.

=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

Es könnte sein, am einfachsten, eine Combobox zu verwenden und die Zeile Quelle auf Ihre Anfrage gesetzt, alternativ ist DAO für den Zugriff auf nativen.

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

nehmen Sie Ihre SQL-Abfrage und als Abfrage speichern.

dann in dem Textfeld ein, nur Ort:

= (dlookup („IssuesDesc“,“Name der Abfrage“))

ich in einem ziemlich großen Verlust zu all diesen Plakaten darauf hindeutet, whacks von Code, wo überhaupt keiner benötigt wird. Speichern Sie einfach Ihre SQL als Abfrage und verwenden Sie dann die Funktion dlookup() als Datenquelle des Textfelds und Sie sind fertig.

+0

Da die erste Antwort Ihre Lösung bereits vorgeschlagen hat, suchte das OP noch immer nach einer Methode, mit der er eine SQL-Anweisung als Quelle für seine Abfrage verwenden konnte. –

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

Es ist besser, einige Erklärungen/Zusammenhänge einzubeziehen, als nur eine reine Codeantwort zu haben. – EJoshuaS

+1

Willkommen bei Stack Overflow! Während dieser Code die Frage beantworten kann, verbessert ein zusätzlicher Kontext, warum und/oder wie dieser Code die Frage beantwortet, seinen langfristigen Wert. Code-only-Antworten werden nicht empfohlen. – Ajean

0

Ich habe die folgende Funktion erstellt, um dieses Problem zu lösen. Ich mag diese Lösung, weil Sie sich nicht mit gespeicherten Abfragen befassen müssen, die Ihr Navigationsfenster oder lange Umgehungslösungen blockieren.

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 

So habe ich es meinem Chef erklärt. "Sie können eine DLookUp() - Funktion als Steuerquelle eines Textfelds haben. Warum nicht einfach eine Funktion schreiben, die eine Abfrage ausführt und die Funktion als Steuerquelle verwendet?" Probieren Sie es aus, es hat meine Situation behoben.

Verwandte Themen