Передать параметр в запрос

badhabit
Дата: 30.11.2009 09:37:13
Добрый день. У меня вопрос. Есть файл .mdb в нем есть таблицы, которые я заполняю/изменяю через vbs-скрипт. Так же мне нужен запрос на выборку, он большой (много строк). Вопрос: Я могу хранить этот запрос в самом .mdb-файле и как мне его вызвать из vbs-скрипта и можно ли ему передавать какой-нибудь параметр, например мне надо указывать разные условия where (т.е. передавать запросу строку)?
П-Л
Дата: 30.11.2009 09:55:09
То есть ваши скрипты находятся "снаружи" от мдб ?
Анатолий ( Киев )
Дата: 30.11.2009 13:30:34
badhabit
Так же мне нужен запрос на выборку
Вам нужно получить Recordset на основе єтого запроса? Тогда вам нужно обратиться к семейству DAO.QueryDefs объекта DAO.Database, получить QueryDef по имени запроса, задать значение параметров (семейство QueryDef.Parameters) и открыть Recordset.
badhabit
Дата: 30.11.2009 14:11:18
П-Л
То есть ваши скрипты находятся "снаружи" от мдб ?

Ага, в отдельном .vbs-файле. (работаю с БД через ADO)
Анатолий ( Киев )
Вам нужно получить Recordset на основе єтого запроса? Тогда вам нужно обратиться к семейству DAO.QueryDefs объекта DAO.Database, получить QueryDef по имени запроса, задать значение параметров (семейство QueryDef.Parameters) и открыть Recordset.

Да, надо получить recordset. А можно не через DAO, а через ADO?
badhabit
Дата: 01.12.2009 12:39:45
что для ado такого способа нет?
klen_
Дата: 01.12.2009 12:49:40
это текст для vbs
Dim adCmdStoredProc:		adCmdStoredProc = 4
Dim adParamInput:		adParamInput = 1
Dim adStateOpen:		adStateOpen = 1
Dim adBSTR:			adBSTR = 8

Dim path_:     path_ = "C:\VBA Access\_Пример\PARAMETERS"
Dim basa_:     basa_ = "basa.mdb"

Dim cnn:        Set cnn = WScript.CreateObject("ADODB.Connection")
Dim rst:        Set rst = WScript.CreateObject("ADODB.Recordset")
Dim cmd:        Set cmd = WScript.CreateObject("ADODB.Command")
With cnn
    .Provider = "Microsoft.jet.oledb.4.0"
    .Properties("Data Source") = path_ & "\" & basa_
    .Properties("User ID").Value = "Admin"
    .Properties("Password").Value = ""
    .Open
    If .State = adStateOpen Then
        With cmd
            .ActiveConnection = cnn
            .CommandType = adCmdStoredProc
            .CommandText = "[имя запроса]"  'имя запроса хранимого в файле mdb, с одним параметром
            .Parameters.Append .CreateParameter("param1", adBSTR, adParamInput, 50, "01")
  
            Set rst = cmd.Execute
            Dim i:  i = 0
            Do Until rst.EOF
                MsgBox rst.Fields(0)
                rst.MoveNext
                i = i + 1               'для отладки
                If i > 3 Then Exit Do
            Loop
            
        End With
    End If
End With

rst.Close
cnn.Close

Set cmd = Nothing
Set rst = Nothing
Set cnn = Nothing
badhabit
Дата: 02.12.2009 10:41:29
klen_
это текст для vbs...

Спасибо! Только ещё два попутных вопроса:
1. Я вот спросил про параметр в запросе, а сам не знаю как его указать. Т.е. как в аксессе указать в запросе типа
select * from my_tbl where name = [парамерт]
что поле [парамерт] мой параметр, который я укажу потом через .Parameters.Append .CreateParameter?
2. При выполнении моего запроса
select nz(min(op_code), 0) from ....
вылетает исключение:
автор
Неопределённая функция nz в выражении

если оставить просто min(op_code), то все работает, если в аксессе нажать выполнить запрос, тоже все работает и с nz. Так почему не работает через ado? Может драйвер не тот или что?
qwrqwr
Дата: 02.12.2009 10:50:59
badhabit
select nz(min(op_code), 0) from ....
вылетает исключение:
Неопределённая функция nz в выражении

Nz - собственная функция акцесса, "извне" она неработает.
На выбор:
select iif(Min(op_code) Is Null, 0, Min(op_code)) from...
select iif(Min(op_code)=Min(op_code), Min(op_code), 0) from...
badhabit
Дата: 02.12.2009 11:15:42
qwrqwr, спасибо!