imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 12.10.2005, 22:03     # 1
Raven B.
Member
 
Аватар для Raven B.
 
Регистрация: 12.07.2004
Адрес: Очень странное место.
Сообщения: 328

Raven B. Известность не заставит себя ждатьRaven B. Известность не заставит себя ждать
Проблема с DoCmd.RunSQL ,SELECT и кнопкой "отменить" (VBA и Access)

Доброго времени суток.

Вопрос по использованию DoCmd.RunSQL.
DoCmd.RunSQL("INSERT...")
DoCmd.RunSQL("DELETE...")
работают без проблем.
А как справится с DoCmd.RunSQL("SELECT proff FROM proff_t;")
Выдает ошибку

Цитата:
Run-Time Error '2342'
Для маЗапускЗапросаSQL требуется аргумент,
состоящий из инструкции SQL.
Насколько я понял оно не знает что делать с результатом.
(DoCmd.RunSQL "SELECT * FROM [имя таблицы] INTO [имя любой другой таблицы];" работает нормально.)

Куда я в случае выполнения такого запроса получу результат ?
Как его изменить, что бы получить что типа RecordSet ?
И в каком виде ?

В хелпе написано что получу обьект типа DoCmd

Цитата:
The RunSQL method carries out the RunSQL action in Visual Basic.
expression.RunSQL(SQLStatement, UseTransaction)
expression Required. An expression that returns one of the objects in the A pplies To list.
В A pplies To list только DoCmd....

И второй вопрос:
Когда я выполняю любую DoCmd.RunSQL команду access переспрашивает вы точно хотите добавить-удалить-изменить столько то записей ?
Отвечаешь "да" - и все ок. Отвечаешь нет - программа тут же говорит о ошибке и предлагает дебагить. Текст ошибки:

Цитата:
Run-Time Error '2501'
Прервано выполнение макрокоманды RunSQL
Поможете ?
Raven B. вне форума  
Старый 13.10.2005, 08:59     # 2
Al-x
Junior Member
 
Регистрация: 30.03.2003
Адрес: СПб
Сообщения: 162

Al-x МолодецAl-x МолодецAl-x Молодец
1. Если хочешь получить ответ SELECT в объект, то смотри в справке RowSource Property. Там даже примерчик есть.
2. Чтобы отключить подтверждение исполнения SQL запросов надо в меню Сервис->Параметры вкладка Правка и поиск снять галочку Подтверждение запросов на изменение.
Если с RowSource не разберешься - я вечерком примерчик приведу.
__________________
640Kbytes should be enough for everything! (c) Bill Gates, 1981.
Все "спасибо" в репутацию
Al-x вне форума  
Старый 13.10.2005, 12:46     # 3
LightImage
Junior Member
 
Регистрация: 16.10.2002
Адрес: Россия-матушка
Пол: Male
Сообщения: 96

LightImage Нимб уже пробиваетсяLightImage Нимб уже пробивается
Raven B.
1. Чтобы получить результат выполнения запроса, пиши так:
Код:
Dim dbs As Database
Dim rst As Recordset
    Set dbs = CurrentDb
    Set rst = dbs.OpenRecordset("Select * From [ConnectInfo]")
2. Чтобы отключить предупреждения:
Код:
    DoCmd.SetWarnings False
    ' Действия...
    DoCmd.SetWarnings True
__________________
1 миллибайт = 1/1024 байта
LightImage вне форума  
Старый 13.10.2005, 21:37     # 4
Raven B.
Member
 
Аватар для Raven B.
 
Регистрация: 12.07.2004
Адрес: Очень странное место.
Сообщения: 328

Raven B. Известность не заставит себя ждатьRaven B. Известность не заставит себя ждать
2Al-x:
RowSource насколько я понял позволяет менять источник данных для ListBox,ComboBox и т.д. У меня немного другая задача.
Например: пользователь выбирает в листбоксе название професии. Я селектом в программе получаю id професии. Потом получаю из таблицы - связки все id опасных факторов для данной професии. потом вывожк их в соседний listBox. И т.п. То есть селект нужен для "сложных" с логической точки зрения операций (не помите неправильно - это самый простой пример) и тех операций, при которых надо перед передачей информации пользователю ее обработать.

2LightImage:
2. прекрасно решило проблему.
1. не работает =(
Пишет:
Цитата:
Compiler error:
User defined type not defined
1. Ругается уже на
Dim dbs As Database
Что это может значить? Это еж по идее обьект DAO ?

2. Из хелпа OpenRecordset - ф-я DAO... И требует открытия соответствующего соединения. или нет ? В примере вроде как открывают.
CurrentDb открывает соединение с текущей базой данных ?

Стоит Office 2003. ОC win2k
Raven B. вне форума  
Старый 14.10.2005, 10:10     # 5
Al-x
Junior Member
 
Регистрация: 30.03.2003
Адрес: СПб
Сообщения: 162

Al-x МолодецAl-x МолодецAl-x Молодец
CurrentDb - текущая открытая база. НИчего с ней дополнительно открывать не надо.

User defined type not defined ругается на то, что тип не определен. Проверь, стоит ли галочка Microsoft DAO 3.6 Object Library (ну или не 3.6) в меню Tools->References....

Про RecordSet пишут, что
Код:
For Connection [b]and Database[b] objects:
Так что можно применять к dbs.
__________________
640Kbytes should be enough for everything! (c) Bill Gates, 1981.
Все "спасибо" в репутацию
Al-x вне форума  
Старый 14.10.2005, 11:14     # 6
LightImage
Junior Member
 
Регистрация: 16.10.2002
Адрес: Россия-матушка
Пол: Male
Сообщения: 96

LightImage Нимб уже пробиваетсяLightImage Нимб уже пробивается
Raven B.
Про compiler error полностью ответил Al-x.
Цитата:
Raven B.:
У меня немного другая задача.
Например: пользователь выбирает в листбоксе название професии. Я селектом в программе получаю id професии. Потом получаю из таблицы - связки все id опасных факторов для данной професии. потом вывожк их в соседний listBox. И т.п. То есть селект нужен для "сложных" с логической точки зрения операций (не помите неправильно - это самый простой пример) и тех операций, при которых надо перед передачей информации пользователю ее обработать.
Можно и без всяких селектов.
1. Создаешь форму frm_Профессии, для нее источником данных ставишь "SELECT id_профессии FROM Т_Профессии". В ней создаешь listbox с именем lbx_СписокЭлементов, для него ставишь источник строк "SELECT id_профессии, НазваниеПрофессии FROM Т_Профессии". Свойство "Данные" (ControlSource) этого листбокса оставляешь пустым. Ширину столбцов листбокса ставишь "0;4" (чтобы в нем не отображалось поле id_профессии). Для него пишешь обработчик события "После обновления", который переводит текущую запись формы на выбранную профессию:
Код:
Private Sub lbx_СписокЭлементов_AfterUpdate()
    Me.RecordsetClone.FindFirst "id_профессии=" & lbx_СписокЭлементов.Value
    Me.Bookmark = Me.RecordsetClone.Bookmark
End Sub
Также на всякий случай для формы пишешь такой обработчик события "Текущая запись", который выделит в листбоксе текущую профессию:
Код:
Private Sub Form_Current()
    lbx_СписокЭлементов.Value = Me!id_профессии
End Sub
2. Создаешь форму sfrm_ОпасныеФакторы, пишешь в ней источник данных "Select id_профессии, ИмяОпасногоФактора FROM Т_ОпасныеФакторы". Ставишь на нее нужные элементы управления.
3. Добавляешь на форму frm_Профессии подчиненную форму, свойство "Объект-источник" для нее указываешь sfrm_ОпасныеФакторы, в свойствах "Подчиненные поля" и "Основные поля" пишешь "id_профессии".
4. Наслаждаешься полученными результатами =)
__________________
1 миллибайт = 1/1024 байта

Последний раз редактировалось LightImage; 14.10.2005 в 11:16. Причина: дополнение
LightImage вне форума  
Старый 14.10.2005, 12:52     # 7
Raven B.
Member
 
Аватар для Raven B.
 
Регистрация: 12.07.2004
Адрес: Очень странное место.
Сообщения: 328

Raven B. Известность не заставит себя ждатьRaven B. Известность не заставит себя ждать
Дико извиняюсь, но опять не работает.

Код:
Private Sub proff_n_list_Click()
Dim dbs As Database
Dim rstTemp As RecordSet
Dim sql_q As String
    Set dbs = CurrentDb
    sql_q = "Select ph_f_id From ph_f_n_t where ph_f_n='" + proff_n_list.Value + "';"
    Set rstTemp = dbs.OpenRecordset(sql_q, dbOpenForwardOnly, dbReadOnly)
    rstTemp.Close
End Sub
Получаю ошибку:
Цитата:
Run-Time Error '13'
Type mismatch
Ругается на присвоение Set rstTemp = dbs.Ope...
Пробовал различные type. Когда его "можно" использовать та же ошибка. Если нельзя - ругается на type...
Бред какой то... Я что то еще забыл подключить ?
Цитата:
Set recordset = object.OpenRecordset (source, type, options, lockedits)
Creates a new Recordset object and appends it to the Recordsets collection.
recordset An object variable that represents the Recordset object you want to open.
Пробовал пример из хелпа - тоже самое.
Помогите пожалуста разобратся.

Последний раз редактировалось Raven B.; 14.10.2005 в 12:56.
Raven B. вне форума  
Старый 14.10.2005, 17:30     # 8
Al-x
Junior Member
 
Регистрация: 30.03.2003
Адрес: СПб
Сообщения: 162

Al-x МолодецAl-x МолодецAl-x Молодец
Цитата:
Raven B.:
Я что то еще забыл подключить ?
Вот список того, что у меня подключено (порядок тоже играет роль):
Код:
Visual Basic For Applications
Microsoft Access 11.0 Object Library
OLE Automation
Microsoft DAO 3.6 Object Library
Microsoft ActiveX Data Objects 2.1 Library
Скорее всего у тебя Microsoft DAO 3.6 Object Library стоит после Microsoft ActiveX Data Objects 2.1 Library. Попробуй поменять местами.
__________________
640Kbytes should be enough for everything! (c) Bill Gates, 1981.
Все "спасибо" в репутацию
Al-x вне форума  
Старый 14.10.2005, 20:59     # 9
Raven B.
Member
 
Аватар для Raven B.
 
Регистрация: 12.07.2004
Адрес: Очень странное место.
Сообщения: 328

Raven B. Известность не заставит себя ждатьRaven B. Известность не заставит себя ждать
У меня
Цитата:
Visual Basic For Applications
Microsoft Access 11.0 Object Library
OLE Automation
Microsoft ActiveX Data Objects 2.1 Library
Microsoft DAO 3.6 Object Library
Microsoft ActiveX Data Objects (Multidimensional) 2.5 Library
Сейчас поправлю и напишу что вышло.

2Al-x:
ВЫ ГЕНИЙ.
Все работает !!!!
Порядок действительно имет значение =)

Единственное что плохо - это невозможность еще раз поднять вам репутацию. =)


Еще один вопрос по ходу.
я получаю записи таким образом:

For Each fldLoop In rst.Fields
MsgBox fldLoop.Name & " - " & fldLoop.Value
Next fldLoop

Вроде бы показывает все записи попавшие в выборку.
Это так или это только кажется
Raven B. вне форума  
Старый 15.10.2005, 01:26     # 10
Al-x
Junior Member
 
Регистрация: 30.03.2003
Адрес: СПб
Сообщения: 162

Al-x МолодецAl-x МолодецAl-x Молодец
Цитата:
Raven B.:
или это только кажется

Эта конструкция выводит список полей со значениями первой записи.

Я думаю, что имелось ввиду вот это (id и val имена полей в таблице):
Код:
     With rst
        Do
        MsgBox !id & " - " & !Val
        .MoveNext
        Loop Until .EOF = True
     End With
__________________
640Kbytes should be enough for everything! (c) Bill Gates, 1981.
Все "спасибо" в репутацию
Al-x вне форума  
Старый 09.08.2011, 00:01     # 11
Kyrli
Guest
 
Сообщения: n/a

столкнулся с той же проблемой. Прочитал все выше сказанное, попробывал сделать по анологии с Raven B.! в результате ничего не происходит, программа доходит весь код и просто закрывается, не выводя ни запрос, ни ошибки!
С чем это может быть связано? Подскажите кто чем может, на вас последняя надежда.
 
Старый 10.08.2011, 11:09     # 12
EvroStandart
Full Member
 
Аватар для EvroStandart
 
Регистрация: 20.01.2004
Адрес: Таллинн
Пол: Male
Сообщения: 623

EvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собой
пример в студию
EvroStandart вне форума  

Опции темы

Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 15:01.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.