IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   Проблема с DoCmd.RunSQL ,SELECT и кнопкой "отменить" (VBA и Access) (http://www.imho.ws/showthread.php?t=94107)

Raven B. 12.10.2005 22:03

Проблема с 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 :confused:

Цитата:

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
Поможете ? :confused:

Al-x 13.10.2005 08:59

1. Если хочешь получить ответ SELECT в объект, то смотри в справке RowSource Property. Там даже примерчик есть.
2. Чтобы отключить подтверждение исполнения SQL запросов надо в меню Сервис->Параметры вкладка Правка и поиск снять галочку Подтверждение запросов на изменение.
Если с RowSource не разберешься - я вечерком примерчик приведу.

LightImage 13.10.2005 12:46

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


Raven B. 13.10.2005 21:37

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

Al-x 14.10.2005 10:10

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.

LightImage 14.10.2005 11:14

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. Наслаждаешься полученными результатами =)

Raven B. 14.10.2005 12:52

Дико извиняюсь, но опять не работает. :idontnow:

Код:

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.
Пробовал пример из хелпа - тоже самое.
Помогите пожалуста разобратся. :help:

Al-x 14.10.2005 17:30

Цитата:

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. Попробуй поменять местами.

Raven B. 14.10.2005 20:59

У меня
Цитата:

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:
ВЫ ГЕНИЙ.
Все работает !!!!
Порядок действительно имет значение =)
:yees:
Единственное что плохо - это невозможность еще раз поднять вам репутацию. =)
:beer:

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

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

Вроде бы показывает все записи попавшие в выборку.
Это так или это только кажется :p

Al-x 15.10.2005 01:26

Цитата:

Raven B.:
или это только кажется
:)
Эта конструкция выводит список полей со значениями первой записи.

Я думаю, что имелось ввиду вот это (id и val имена полей в таблице):
Код:

    With rst
        Do
        MsgBox !id & " - " & !Val
        .MoveNext
        Loop Until .EOF = True
    End With


Kyrli 09.08.2011 00:01

столкнулся с той же проблемой. Прочитал все выше сказанное, попробывал сделать по анологии с Raven B.! в результате ничего не происходит, программа доходит весь код и просто закрывается, не выводя ни запрос, ни ошибки!
С чем это может быть связано? Подскажите кто чем может, на вас последняя надежда.

EvroStandart 10.08.2011 11:09

пример в студию :)


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

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