2009-08-21 1 views
8

Есть ли какой-либо способ заполнить значение текстового значения формы формы доступа с помощью SQL?SQL как источник управления для поля формы доступа

Я читал, что невозможно просто ввести SQL в качестве источника управления. Это правда?

спасибо за любую halp :)

--edit--

Мне нужно выполнить этот запрос;

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

Есть ли причина, по которой данные не должны включаться в базовый источник записей формы? –

ответ

9

Довольно уверен, что это правда SQL, но вы можете использовать функцию:
=DLookUp("field_name","table_name","any_fieldname = 'value'")

+0

Можно ли сделать что-то так сложно, как ВЫБОР tblCaseIssues.IssueDesc ИЗ tblCaseIssues INNER JOIN tblCaseNewHS_Issues ON tblCaseIssues.ID = tblCaseNewHS_Issues.IssueID WHERE (tblCaseNewHS_Issues.HS_ID = 81) с такой функцией? – Jambobond

+2

Создайте запрос в Access, где все таблицы объединены. Затем в вашем DBLookup вы можете подставить имя_таблицы с именем запроса (Извините, указав таблицу и предположив, что запрос будет работать также). Примечание. В VBA есть лучшие способы. – JeffO

2

Вы можете установить источник управления вашего поля к имени функции. Эта функция может легко выполнить ваш SQL и/или передать переменную. Вот моя простая плита котла для функции выполнения инструкции SQL в наборе записей и возврата первого значения. В моем мире я обычно включаю очень специфическое предложение where, но вы, безусловно, могли бы сделать любую из этих функций более надежной для своих нужд.

=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

Это может быть проще использовать выпадающий и установить Row Source на запрос, в качестве альтернативы, DAO является родным для доступа.

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

Просто возьмите свой запрос sql и сохраните его как запрос.

Затем в текстовом поле, просто место:

= (DLookup («IssuesDesc»,»имя запроса»))

я на довольно большие потери, как все эти плакаты предлагая девелоперские из код, где никому не требуется вообще. Просто сохраните свой sql в качестве запроса, а затем используйте функцию dlookup() в качестве источника данных текстового поля, и все готово.

+0

Поскольку первый ответ уже предложил ваше решение, OP все еще искал метод, который мог бы использовать оператор SQL в качестве источника его запроса. –

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

Лучше включить какое-то объяснение/контекст, а не просто иметь только код-ответ. – EJoshuaS

+1

Добро пожаловать в переполнение стека! Хотя этот код может ответить на вопрос, предоставляя дополнительный контекст относительно того, почему и/или как этот код отвечает на вопрос, улучшает его долгосрочную ценность. Кодовые ответы не приветствуются. – Ajean

0

Я создал следующую функцию, чтобы решить эту проблему. Мне нравится это решение, потому что вам не нужно иметь дело с сохраненными запросами, засоряющими вашу навигационную панель или длинные обходные пути.

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 

Так я объяснил это своему боссу. «Вы можете использовать функцию DLookUp() в качестве источника управления текстовым полем. Почему бы просто написать функцию, которая выполняет запрос, и использовать эту функцию в качестве источника управления?» Дайте ему попробовать, он исправил мою ситуацию.

 Смежные вопросы

  • Нет связанных вопросов^_^