Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выборка данных из Access, Необходим совет 
:(
    Опции темы
Rodman
Дата 9.5.2007, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 1
Всего: 122



Дароф.

Мне нужно подсчитать корреляцию данных, но для начала необходимо достать данные. делаю так
Код

Private Sub Кнопка21_Click()
Dim db As Database
Dim arr(100000), i As Integer
Dim rst As Recordset
Dim strSQL As String
strSQL = "SELECT Avg(Year(Now())-[Table1].[DateBirth]), Sum([Bloode].CountBloode) FROM [Table1] INNER JOIN [Bloode] ON [Table1].CodeT = [Bloode].CodeTb;"
Set rst = db.OpenRecordset(strSQL)
i = 0
While Not rst.EOF
  arr(i) = rst.Fields("F1").Value ' так ли я заполняю массив???
  arr(i + 1) = rst.Fields("F2").Value
  i = i + 2
Wend
MsgBox "OK"
End Sub


Почему событие не срабатывает, хотя я в свойствах вешаю событие на "Нажатие кнопка", но даже MsgBox не появляется?! Просто я ничего не могу проверить!!!

Сенкс..
PM MAIL WWW Skype GTalk YIM MSN   Вверх
bopoha
Дата 9.5.2007, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1283
Регистрация: 10.5.2006
Где: Беларусь, Минск

Репутация: 21
Всего: 21



В свойствах элемента управления "Кнопка21" в событии "Нажатие клавиши" должно быть написано "Процедура обработки события". Проверь.

Если такого нет, то можно просто нажать на кнопку "..." напротив пункта или выбрать из списка.
PM MAIL WWW ICQ Skype GTalk   Вверх
Rodman
Дата 9.5.2007, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 1
Всего: 122



Цитата(bopoha @  9.5.2007,  17:20 Найти цитируемый пост)
должно быть написано "Процедура обработки события"

есть...

Добавлено через 13 минут и 36 секунд
а вот создал в отдельной проекте
Код

Dim db As Database
Dim arr(100000), i As Integer
Dim rst As Recordset
Dim strSQL As String
strSQL = "SELECT Таблица1.q1, Таблица1.q2 FROM Таблица1"
Set rst = db.OpenRecordset(strSQL) ' ругается (RunTime error '91' Object variable or with block variable not set)
i = 0
While Not rst.EOF
  arr(i) = rst.Fields("F1").Value ' так ли я заполняю массив???
  arr(i + 1) = rst.Fields("F2").Value
  i = i + 2
Wend
MsgBox "OK"


почему в основном не открывается???

а тут открывается но ошибка - почему?

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  BD.zip 14,17 Kb
PM MAIL WWW Skype GTalk YIM MSN   Вверх
bopoha
Дата 11.5.2007, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1283
Регистрация: 10.5.2006
Где: Беларусь, Минск

Репутация: 21
Всего: 21



Потому что db не задана.

перед открытием таблицы нужно:
Код

Set db = CurrentDb


или вообще используй CurrentDb вместо db.
PM MAIL WWW ICQ Skype GTalk   Вверх
Rodman
Дата 11.5.2007, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 1
Всего: 122



т.е. вот так?!
Код

Dim arr(100000), i As Integer
Dim rst As Recordset
Dim strSQL As String
strSQL = "SELECT Таблица1.q1, Таблица1.q2 FROM Таблица1"
Set rst = CurrentDb.OpenRecordset(strSQL) ' ругается (RunTime error '91' Object variable or with block variable not set)
i = 0
While Not rst.EOF
  arr(i) = rst.Fields("F1").Value ' так ли я заполняю массив???
  arr(i + 1) = rst.Fields("F2").Value
  i = i + 2
Wend
MsgBox "OK"

PM MAIL WWW Skype GTalk YIM MSN   Вверх
Akina
Дата 11.5.2007, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Код
Dim rst As Recordset
'...
Set rst = CurrentDb.OpenRecordset(strSQL)
неправильно. Надо
Код
Dim db As Database
Dim rst As Recordset
'...
Set db = CurrentDB
Set rst = db.OpenRecordset(strSQL)


Добавлено через 2 минуты и 57 секунд
Перед 
Код
While Not rst.EOF
надо вставить
Код
rst.MoveFirst
Вместо
Код
arr(i) = rst.Fields("F1").Value 
используйте
Код
arr(i) = rst!F1





--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
bopoha
Дата 12.5.2007, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1283
Регистрация: 10.5.2006
Где: Беларусь, Минск

Репутация: 21
Всего: 21



Akina,
rst.MoveFirst вставлять сразу после открытия набора нет необходимости. Набор открывается всегда с указателем на первой записи.

Обращаться к столбцу можно следующими способами, и все они будут работать одинаково:
Код

rst.Fields("F1").Value 
rst.Fields("F1")
rst("F1")
rst!F1


Так как для объекта Recordset атрибут Fields является атрибутом по умолчанию. Также для объекта Fields атрибут Value также - по умолчанию.

Rodman, 
Я бы порекомендовал использовать в таблицах более осмысленые имена. Из таблицы ты выбираешь поля q1 и q2, а обращаешься к F1 и F2.
CurrentDB написано правильно.


Это сообщение отредактировал(а) bopoha - 12.5.2007, 08:18
PM MAIL WWW ICQ Skype GTalk   Вверх
Akina
Дата 13.5.2007, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Цитата(bopoha @  12.5.2007,  09:17 Найти цитируемый пост)
rst.MoveFirst вставлять сразу после открытия набора нет необходимости. Набор открывается всегда с указателем на первой записи.

Да? спросите-ка его в этот момент, чему равен rst.EOF... сразу после открытия рекордсет еще немножко "недоделанный".




--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
bopoha
Дата 23.5.2007, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1283
Регистрация: 10.5.2006
Где: Беларусь, Минск

Репутация: 21
Всего: 21



Сразу после открытия rst.EOF равен false, если в таблице есть данные. Я ниразу не переходил на первую запись после открытия таблицы. 
PM MAIL WWW ICQ Skype GTalk   Вверх
Rodman
Дата 23.5.2007, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 1
Всего: 122



Сделал так
Код

 Dim v_xlApp As Object
  Dim v_Rst As ADODB.Recordset
  Set v_Rst = New ADODB.Recordset
     v_Rst.Open "SELECT * FROM TAble;", CurrentProject.Connection
     v_X = v_Rst.GetRows
     v_Rst.Close
  Set v_Rst = Nothing
  N = UBound(v_X, 2) + 1
  For i = 0 To N - 1
    v_MX = v_MX + v_X(0, i)
  Next i


Это сообщение отредактировал(а) Rodman - 23.5.2007, 08:46
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Rodman
Дата 1.6.2007, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 1
Всего: 122



а можно ли сделать так, что бы при пустом результате (когда запрос ничего не возвращает) - не вылетала ошибка?
PM MAIL WWW Skype GTalk YIM MSN   Вверх
bopoha
Дата 1.6.2007, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1283
Регистрация: 10.5.2006
Где: Беларусь, Минск

Репутация: 21
Всего: 21



Код

If v_Rst.EOF = True Then
    '-- нет данных
    Exit Sub/Function
End if

PM MAIL WWW ICQ Skype GTalk   Вверх
Akina
Дата 1.6.2007, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



или вместо
Код
v_Rst.EOF = True
может быть
Код
v_Rst.RecordCount = 0



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS Access"
Akina
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] и [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS Access | Следующая тема »


 




[ Время генерации скрипта: 0.2170 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.