SQL запрос в Access200

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Mao
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 95
Зарегистрирован: 10.10.2004 (Вс) 13:09

SQL запрос в Access200

Сообщение Mao » 10.10.2004 (Вс) 13:18

Возможно ли выполнение SQL запроса из VBA программы и чтоб результат выполнения запроса присваивался какому-нибуть массиву?

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 11.10.2004 (Пн) 9:51

Так.... Давай уточним...
1) VBA - пишешь что-то в самом Access?
2) что используешь - DAO, ADO? Если не знаешь, то скорее всего DAO (он там по умолчанию). Можешь посмотреть в Tools->Referencies. Хотя, для ответа на твой вопрос это не так важно, но на будущее это знать надо.
3) Ты уже познакомился с такими объектами, как Recordset и Connection? В DAO есть объект CurrentDB, у него свойсво Connection.
У Connection есть метод OpenRecordset, который результат выборки возвращает в рекордсет. В ADO есть аналогичные вещи.

Ты это искал?
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

Mao
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 95
Зарегистрирован: 10.10.2004 (Вс) 13:09

Сообщение Mao » 11.10.2004 (Пн) 10:31

Rainbow писал(а):Так.... Давай уточним...
1) VBA - пишешь что-то в самом Access?
2) что используешь - DAO, ADO? Если не знаешь, то скорее всего DAO (он там по умолчанию). Можешь посмотреть в Tools->Referencies. Хотя, для ответа на твой вопрос это не так важно, но на будущее это знать надо.
3) Ты уже познакомился с такими объектами, как Recordset и Connection? В DAO есть объект CurrentDB, у него свойсво Connection.
У Connection есть метод OpenRecordset, который результат выборки возвращает в рекордсет. В ADO есть аналогичные вещи.

Ты это искал?

Я использовал метод GetRows объект CurentDB для записи данных таблицы в массив. Потом с помощью метода CreateQueryDef записывал в какой нибуть запрос SQL запрос находящийся в строковой переменной. Методом OpenQuery объекта DoCmd открывал сформированный запрос, но это все не то. Мне надо чтоб все выполнялось так сказать в фоновом режиме, не видном для пользователя. Как это можно сделать? Заранее благодарю.

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 11.10.2004 (Пн) 10:46

Хм... тут уже 2 вопроса у тебя...
1) как получить выборку
2) как запрос выполнить асинхронно

Асинхронность, насколько я знаю, в DAO не поддерживается. Она есть в ADO. Там можно описать глобальный (для модуля) объект и ловить от него события.
Примерчик запроса не подкинешь? Это все-таки запрос, который возвращает выборку какую-нибудь или нет? Тебе именно в массив надо?

В массив, боюсь, никакими силами не получится. В ракордсет - наздоровье.

Зачем QueryDef создаешь? Чтобы потом DoCmd сделать? Запрос с параметрами?

Перейти на ADO довольно просто.
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

Mao
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 95
Зарегистрирован: 10.10.2004 (Вс) 13:09

Сообщение Mao » 11.10.2004 (Пн) 11:07

Да это все я делал в другой базе, там надо было сделать форму универсального поиска. Т.е. выносятся все поля всех таблиц на форму. Потом анализировалось состояние объектов формы и формировался запрос, и далее, с учетом выбранного представления, запускался сам запрос, либо гистограмма, либо график и т.д.
А в данном случае мне надо при выборе клиента в комбобоксе, в соседнем поле выводилось сальдо по данному клиенту. Вот и все. =))

Mao
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 95
Зарегистрирован: 10.10.2004 (Вс) 13:09

Сообщение Mao » 11.10.2004 (Пн) 14:33

Rainbow писал(а):Хм... тут уже 2 вопроса у тебя...
1) как получить выборку
2) как запрос выполнить асинхронно

Асинхронность, насколько я знаю, в DAO не поддерживается. Она есть в ADO. Там можно описать глобальный (для модуля) объект и ловить от него события.
Примерчик запроса не подкинешь? Это все-таки запрос, который возвращает выборку какую-нибудь или нет? Тебе именно в массив надо?

В массив, боюсь, никакими силами не получится. В ракордсет - наздоровье.

Зачем QueryDef создаешь? Чтобы потом DoCmd сделать? Запрос с параметрами?

Перейти на ADO довольно просто.


Запрос будет иметь примерно такой вид:
Код: Выделить всё
SELECT Sum(CCur(Заказано.Цена*Заказано.Количество/100)*100) AS Сумма
FROM Клиенты INNER JOIN (Заказы INNER JOIN Заказано ON Заказы.КодЗаказа = Заказано.КодЗаказа) ON Клиенты.КодКлиента = Заказы.КодКлиента
WHERE (((Клиенты.КодКлиента)="ANATR"))

Этот запрос возвращает только 1 поле. Вот как его запустить и получить это число в какую нибуть переменную??

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 11.10.2004 (Пн) 14:59

Проще всего так:

Код: Выделить всё
Dim Summ as Long

Dim rst as New Recordset
Set rst = CurrentDB.Connection.OpenRecordset(strSQL, dbOpenDynaset)
if rst.RecordCount > 0 then
    Summ = rst(0)
end if


Попробуй - не проверяла
Может, параметры какие-нибудь еще надо указать в openRecordset
Я DAO плохо знаю
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

Mao
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 95
Зарегистрирован: 10.10.2004 (Вс) 13:09

Сообщение Mao » 11.10.2004 (Пн) 15:36

Rainbow писал(а):Проще всего так:

Код: Выделить всё
Dim Summ as Long

Dim rst as New Recordset
Set rst = CurrentDB.Connection.OpenRecordset(strSQL, dbOpenDynaset)
if rst.RecordCount > 0 then
    Summ = rst(0)
end if


Попробуй - не проверяла
Может, параметры какие-нибудь еще надо указать в openRecordset
Я DAO плохо знаю

Вот спасибо, хорошо. =))
Но только код будет такой:
Код: Выделить всё
Dim Summ As Variant
Dim strSQL As String
Dim dbs As Database, rst As Recordset
ch = """"
strSQL = "SELECT Sum(CCur(Заказано.Цена*Заказано.Количество/100)*100) AS Сумма" & Chr(13) & "FROM Клиенты INNER JOIN (Заказы INNER JOIN Заказано ON Заказы.КодЗаказа = Заказано.КодЗаказа) ON Клиенты.КодКлиента = Заказы.КодКлиента" & Chr(13) & "WHERE (((Клиенты.КодКлиента)=" & ch & "ANATR" & ch & "));"
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset(strSQL)
If rst.RecordCount > 0 Then
    Summ = rst.Fields("Сумма")
End If

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 12.10.2004 (Вт) 10:49

Угу...
Только кавычки проверь - в SQL же для строковых выражений одинарные используются... :roll:
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 1

    TopList