2009-08-21 16 views
8

¿Hay algún modo de rellenar el valor de un campo de formulario de acceso mediante SQL?SQL como origen de control para el campo Formulario de acceso

He leído que no es posible simplemente ingresar SQL como fuente de control. ¿Es esto cierto?

gracias por cualquier halp :)

--edit--

que necesito para llevar a cabo esta consulta;

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

¿Hay alguna razón para que los datos no se incluyan en el origen de la fuente subyacente del formulario? –

Respuesta

9

bastante seguro de que es cierto SQL, pero se puede usar la función:
=DLookUp("field_name","table_name","any_fieldname = 'value'")

+0

¿Es posible hacer algo tan complejo como SELECT tblCaseIssues.IssueDesc DE tblCaseIssues INNER JOIN tblCaseNewHS_Issues EN tblCaseIssues.ID = tblCaseNewHS_Issues.IssueID DONDE (tblCaseNewHS_Issues.HS_ID = 81) con una función de este tipo? – Jambobond

+2

Cree una consulta en Access donde se unen todas las tablas. Luego, en su DBLookup, puede sustituir table_name con el nombre de la consulta (Lo sentimos, lo que indica una tabla y suponiendo que una consulta también funcionaría). Nota: hay mejores formas de hacerlo en VBA. – JeffO

2

puede establecer el origen del control de su campo para un nombre de función. Esa función puede ejecutar fácilmente su SQL y/o pasar una variable. Aquí está mi placa de caldera simple para una función para ejecutar una declaración de SQL en un conjunto de registros y devolver el primer valor. En mi mundo, por lo general, incluyo una cláusula Where muy específica, pero ciertamente podría hacer que alguna de estas funciones sea más robusta para sus necesidades.

=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

Puede ser que sea más fácil de utilizar un cuadro combinado y establecer el origen de fila de la consulta, alternativamente, DAO es nativa de acceso.

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

Simplemente tome su consulta sql y guárdela como consulta.

A continuación, en el cuadro de texto, solo lugar:

= (dlookup (“IssuesDesc”,”nombre de la consulta”))

I en una bastante grande pérdida en cuanto a todos estos carteles que indican golpes de código donde como ninguno se necesita en absoluto. Simplemente guarde su sql como una consulta y luego use la función dlookup() como fuente de datos del cuadro de texto y listo.

+0

Debido a que la primera respuesta ya sugería su solución, el OP todavía estaba buscando un método que pudiera utilizar una declaración de SQL como fuente de su consulta. –

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 mejor incluir alguna explicación/contexto en lugar de solo tener una respuesta de solo código. – EJoshuaS

+1

¡Bienvenido a Stack Overflow! Si bien este código puede responder a la pregunta, proporcionar un contexto adicional con respecto a por qué y/o cómo responde este código a la pregunta mejora su valor a largo plazo. Se desaconsejan las respuestas de solo código. – Ajean

0

He creado la siguiente función para resolver este problema. Me gusta esta solución porque no tiene que lidiar con consultas guardadas que obstruyen su panel de navegación o soluciones temporales largas.

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 

Así se lo expliqué a mi jefe. "Puede tener una función DLookUp() como fuente de control de un cuadro de texto. ¿Por qué no solo escribe una función que hace una consulta y usa la función como fuente de control?" Pruébalo, arregló mi situación.

Cuestiones relacionadas