Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS Access > Браузер просмотра товаров базы данных


Автор: Raiser 23.12.2006, 11:10
Нужна ваша помощь!  smile 
Есть база данных в Access, браузер просмотра этой базы данных необходимо сделать в Excel'e. Базу я сделал, в экселе сделал браузер. 
Запускаю DAO, но после запуска браузера выдается ошибка:
Run-time error: несовпадение типов
Вот код формы:
Код

Private db As Database
Private Sub lstProiz_Click()
Dim rs As Recordset
Dim SQLquiry As String
Dim iCat As String
Dim i As Long
Dim iCatID As Long
If lstProiz.ListIndex = -1 Then Exit Sub
lblCategory.Caption = lstProiz.Text
iCatID = lstProiz.List(lstProiz.ListIndex, 1)
SQLquiry = "SELECT Наименование, ДатаВыпуска, ЕдиницаИзмерения, Стоимость " _
 & "FROM Товары WHERE НомерКатегории=" & CStr(iCatID) & " Order BY Наименование"
Application.Cursor = xlWait
Set rs = db.OpenRecordset(SQLquiry)
With lstCategory
 .Clear
  .AddItem rs.Fields("Наименование").Name
  .List(0, 1) = rs.Fields("ДатаВыпуска").Name
  .List(0, 2) = rs.Fields("ЕдиницаИзмерения").Name
  .List(0, 3) = rs.Fields("Стоимость").Name
End With
i = 1
Do Until rs.EOF
  With lstCategory
    .AddItem rs.Fields("Наименование").Value
    .List(i, 1) = rs.Fields("ДатаВыпуска").Value
    .List(i, 2) = rs.Fields("ЕдиницаИзмерения").Value
    .List(i, 3) = rs.Fields("Стоимость").Value
  End With
  i = i + 1
  rs.MoveNext
Loop
rs.Close
Application.Cursor = xlDefault
End Sub

Private Sub UserForm_Initialize()
Dim rs As Recordset
Dim SQLquiry As String
Dim i As Long
lblCategory.Caption = ""
With lstProiz
  .ColumnCount = 2
  .ColumnWidths = "90;0"
End With
With lstCategory
  .ColumnCount = 4
  .ColumnWidths = "100;30;100;30"
End With
Application.Cursor = xlWait
Set db = OpenDatabase(Name:=ThisWorkbook.Path & "\производители и товары.mdb")
SQLquiry = "SELECT НомерКатегории, НазваниеКатегории FROM Категории"
Set rs = db.OpenRecordset(SQLquiry)
i = 0
Do Until rs.EOF
  lstProiz.AddItem rs.Fields("НазваниеКатегории")
  lstProiz.List(i, 1) = rs.Fields("НомерКатегории")
  i = i + 1
  rs.MoveNext
Loop
rs.Close
Application.Cursor = xlDefault
End Sub


Автор: dionisiu 23.12.2006, 11:47
А на какой строке выдаёт ошибку?
Если на строке 
Код

Set rs = db.OpenRecordset(SQLquiry)


То попробуй вместо 
Код

Private db As Database



Сделать 
Код

Private db As DAO.Database


Автор: Raiser 23.12.2006, 11:52
Я в VB не очень разбираюсь, не найду - как настроить, чтобы показывало на какой строке ошибка. Потому что запускаю - выдает ошибку и все.
Что ты предложил не помогло, по-прежнему та же ошибка. Помогите, очень нужно в инсте 

Автор: Akina 24.12.2006, 22:55
Цитата(Raiser @  23.12.2006,  12:52 Найти цитируемый пост)
как настроить, чтобы показывало на какой строке ошибка

Если у тебя открыт GUI работы с VBA в Экселе. то при возникновении ошибки переключись на него - строка, в которой возникла ошибка, будет подсвечена желтым цветом.

Автор: dionisiu 25.12.2006, 11:09
Такой ещё вариант:
Код

Dim rs As Recordset


замени на 
Код

Dim rs As DAO.Recordset


Если при написании кода было использовано автозаполнение, то там два варианта Recordset, насколько я понимаю, один из них DAO, а другой ADO, но какой из них какой - не понятно. Обычно я работаю с DAO, и при автозаполнении использую первый сверху. Однако, ошибиться там легко.

В любом случае, стоит попробовать метод, предложенный Akina.
Как вариант - в сообщении об ошибке высвечивается кнопка Debug, нужно нажать её вместо End. Произойдёт останов программы с сохранением текущих значений переменных и строка будет подсвечена желтым. Обычно сообщение об ошибке является модальным окном и мешает обратиться к коду до его закрытия, при этом кнопка "Х" (закрытие) эквивалентна End и обрывает процесс отладки с потерей места ошибки.

Ещё замечание: возможно, при обращении к базе данных тип поля в ней не соответствует той переменной, в которую происходит присвоение значения, то есть стринговые данные присваиваются лонговой переменной (или наоборот).
Как вариант, можно убрать из кода модуля строку 
Код

Option Explicit 
(в самом верху кода), если она есть, и убрать объявления переменных (не рекордсета). Однако, этот шаг крайний, его использование ведёт к крайне нехорошим результатам при разрастании кода (Эта строка запрещает использование необъявленных переменных)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)