MSAccess - OpenRecordset w / Query Name [дубликат]

  Монтажная сборка = Assembly.LoadFrom («MyAssembly.dll»);  Тип type = assembly.GetType («MyType»);  dynamic instanceOfMyType = Activator.CreateInstance (тип);   

Таким образом, вы можете использовать функции не с получением методаinfo, а затем вызывать его. Вы будете делать как этот экземплярOfMyType.MethodName (); Но вы не можете использовать Intellisense, потому что динамические типы вводятся во время выполнения, а не во время компиляции.

5
задан rryanp 20 June 2014 в 22:41
поделиться

4 ответа

Причина, по которой вы получаете ошибку при попытке открыть набор записей, заключается в том, что ваша форма не открыта, и когда вы пытаетесь получить доступ к [forms]![frmReportingMain], она равна нулю, тогда вы пытаетесь получить свойство на этой нулевой ссылке, и все в порядке , Функция OpenRecordset не может открывать диалоговое окно, чтобы запрашивать пользовательские входы, такие как пользовательский интерфейс, если он получает эту ошибку.

Вы можете изменить свой запрос, чтобы использовать параметры, которые не привязаны к form

yourTableAllocStart >= pAllocStart
and yourTableAllocEnd <= pAllocEnd

Затем вы можете использовать эту функцию для получения набора записей этого запроса.

Function GetQryAllocDebits(pAllocStart As String, pAllocEnd As String) As DAO.Recordset

    Dim db As DAO.Database
    Dim qdef As DAO.QueryDef
    Set db = CurrentDb
    Set qdef = db.QueryDefs("qryAlloc_Debits")
    qdef.Parameters.Refresh
    qdef.Parameters("pAllocStart").Value = pAllocStart
    qdef.Parameters("pAllocEnd").Value = pAllocEnd
    Set GetQryAllocDebits = qdef.OpenRecordset

End Function

Недостатком этого является то, что когда вы вызываете это сейчас в форме, которая связан с ним, он не динамически «заполняет пробелы» для вас.

В этом случае вы можете связывать формы qryAlloc_debts и иметь no where clause в сохраненной запроса, затем используйте формы Filter, чтобы сделать предложение where. В этом случае вы можете использовать свое предложение where точно, как вы его написали.

Затем, если вы хотите открыть набор записей, вы можете сделать это следующим образом:

Function GetQryAllocDebits(pAllocStart As String, pAllocEnd As String) As DAO.Recordset

    Dim qdef As DAO.QueryDef
    Set qdef = New DAO.QueryDef
    qdef.SQL = "Select * from qryAlloc_Debits where AllocStart >= pAllocStart and pAllocEnd <= pAllocEnd"
    qdef.Parameters.Refresh
    qdef.Parameters("pAllocStart").Value = pAllocStart
    qdef.Parameters("pAllocEnd").Value = pAllocEnd
    Set GetQryAllocDebits = qdef.OpenRecordset

End Function
5
ответ дан Brad 15 August 2018 в 21:40
поделиться
  • 1
    Мне нужно перечитать это, чтобы полностью переварить его, но я хотел бы отметить, что моя форма открыта, и вводится диапазон дат. Я фактически инициирую код с помощью кнопки в той же форме. Вот что меня пугает - я могу открыть запрос вручную, но не с кодом. Большое спасибо за ввод, но теперь я просмотрю его снова. – rryanp 20 June 2014 в 23:00
  • 2
    Поэтому моя основная проблема заключается в том, что эти параметры не являются частью требуемого запроса (qryAlloc_Debits) ... они являются частью исходного запроса данных, который фильтрует необработанные данные по дате. Необходимый мне запрос - это несколько запросов по цепочке, которая делает много группировки и консолидации. Поэтому, к сожалению, я не могу применить параметры непосредственно к этому запросу. – rryanp 21 June 2014 в 03:05
  • 3
    ну, опция запроса def все еще применяется. Параметры будут работать вверх по цепочке. Вы можете даже заполнить этот набор записей, как это, на загрузке формы и установить его в набор записей формы. – Brad 21 June 2014 в 03:31
  • 4
    Или, как только вы заработаете свой большой набор запросов, объедините его обратно в один запрос. – Brad 21 June 2014 в 03:32
  • 5
    Ах, я понял это сейчас - мне не хватало, что я могу использовать параметры qdef, даже если эти параметры не были конкретно в этом запросе. Благодаря! – rryanp 22 June 2014 в 14:05

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

Сохраненный запрос может быть разрешен:

Set db = CurrentDb
Set qdf = db.QueryDefs(sQueryName)
For Each prm In qdf.Parameters
    prm.Value = Eval(prm.Name)
Next prm
Set rst = qdf.OpenRecordset

Для SQL:

Set db = CurrentDb
Set qdf = db.CreateQueryDef("", "SELECT * FROM MyTable " & _
    "WHERE ID = " & Me.lstID & _
    " AND dWeekCommencing = " & CDbl(Me.frm_SomeForm.Controls("txtWkCommencing")) & _
    " AND DB_Status = 'Used'")
For Each prm In qdf.Parameters
    prm.Value = Eval(prm.Name)
Next prm
Set rst = qdf.OpenRecordset

Это предполагает, что доступны все значения параметров, т.е. формы открыты, а элементы управления имеют значения.

3
ответ дан Darren Bartrup-Cook 15 August 2018 в 21:40
поделиться

«У меня есть два параметра в моем наборе записей, и я получал« Слишком мало параметров. Ожидаемая ошибка 2 »при использовании OpenRecordset в MS Access vba, и так я обошел его, и ИТ-РАБОТАЕТ! см. ниже подпрограмму:

'Private Sub DisplayID_Click ()

' 1. Я создал переменные для двух полей параметров xEventID и xExID, как показано ниже:

Dim db As Database
Dim rst As Recordset
Dim xEventID As Integer 
Dim xExId As Integer  

'2. Устанавливает переменные в поля параметров, как показано ниже:

Set db = CurrentDb
xEventID = Forms!frmExhibitorEntry!txtEventID
xExId = Forms!frmExhibitorEntry!subExhibitors!ExID

'3. Установите сначала OpenRecordSet и назначьте переменные переменным в предложение WHERE. Обязательно включайте все цитаты, амперсанды и пробелы точно так, как они отображаются. В противном случае код будет разрываться! Точно так, как показано ниже:

Set rst = db.OpenRecordset("SELECT tblInfo_Exhibitor.EventID,tblInfo_Display.ExID, tblMstr_DisplayItems.Display " _
& "FROM tblInfo_Exhibitor INNER JOIN (tblMstr_DisplayItems INNER JOIN tblInfo_Display ON tblMstr_DisplayItems.DisplayID = tblInfo_Display.DisplayID) ON tblInfo_Exhibitor.ExID = tblInfo_Display.ExID " _
& "WHERE (((tblInfo_Exhibitor.EventID) =" & xEventID & " ) and ((tblInfo_Exhibitor.ExID) =" & xExId & " ));")

rst.Close
Set rst = Nothing
db.Close

'End Sub

0
ответ дан user6337445 15 August 2018 в 21:40
поделиться

Хотя ссылка [Forms]! ... по умолчанию ссылается на форму, когда QueryDef запускается из графического интерфейса, на самом деле это просто еще один параметр в запросе в VBA. В результате вы не должны перекодировать ваш запрос / создать новый. Кроме того, как отметил @Brad, независимо от того, находится ли параметр в конечном запросе цепочки запросов или нет, вы можете ссылаться на параметр так, как если бы он был в коллекции окончательного запроса. В этом случае вы должны использовать код, подобный этому:

Sub GetQryAllocDebits(dteAllocStart As Date, dteAllocEnd as Date)

    Dim db As DAO.Database
    Dim qdf As DAO.QueryDef
    Dim rst As DAO.Recordset

    Set db = CurrentDb()
    Set qdf = db.QueryDefs("qryAlloc_Debit")

    If CurrentProject.AllForms("frmReportingMain").IsLoaded Then
        qdf.Parameters("[forms]![frmReportingMain]![txtAllocStart]") = [forms]![frmReportingMain]![txtAllocStart]
        qdf.Parameters("[forms]![frmReportingMain]![txtAllocEnd]") = [forms]![frmReportingMain]![txtAllocEnd]
    Else
        qdf.Parameters("[forms]![frmReportingMain]![txtAllocStart]") = CStr(dteAllocStart)
        qdf.Parameters("[forms]![frmReportingMain]![txtAllocEnd]") = CStr(dteAllocEnd)
    End If

    Set rst = qdf.OpenRecordset

    Do Until rst.EOF
        '...do stuff here.
    Loop

    Set rst = Nothing
    Set qdf = Nothing
    Set db = Nothing

End Function

Если ссылочная форма открыта, код достаточно умен, чтобы использовать ссылочные элементы управления в форме. Если нет, он будет использовать даты, предоставленные подпрограмме в качестве параметров. Здесь вы найдете, что параметры не понравились, когда я задал их как типы даты (# xx / xx / xx #), даже если поле было датами. Казалось, что это нормально работает, если я задаю параметры как строки. Это, казалось, не проблема, если вытащить значения прямо из элементов управления на формах.

4
ответ дан VBlades 15 August 2018 в 21:40
поделиться
  • 1
    Спасибо @ VBlades - это очень помогло! Я дал правильный ответ Брэду, основанному только на сроках, но, увидев оба ответа, действительно помог прояснить это. Я ценю это. – rryanp 22 June 2014 в 14:06
  • 2
    Удивительно, рад, что это помогло. – VBlades 22 June 2014 в 20:46
Другие вопросы по тегам:

Похожие вопросы: