powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Recordset - object variable or with block not set
19 сообщений из 19, страница 1 из 1
Recordset - object variable or with block not set
    #39353440
mozgen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток, Господа!
Может кто-нибудь подсказать в чем прикол (скорее всего моя проблема тривиальна, но все же):
Создаю и заполняю Recordset (в этом случае все ОК):

Код: vbnet
1.
2.
3.
4.
5.
6.
Dim db As Database
Dim rs As Recordset
Dim querPM As QueryDef
Set db = DBEngine.Workspaces(0).Databases(0)
Set querPM = db.QueryDefs("zapros1")
Set rs = querPM.OpenRecordset



rs нормально открывается, с ним можно свободно работать

Другой вариант(Не работает):

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Dim db As Database
Dim rs As Recordset
Set db = DBEngine.Workspaces(0).Databases(0)
Set rsPM = db.OpenRecordset("SELECT " _
& "PRB_RELS.R2, NLZ_RELS.N_PLAVKI, PRB_RELS.N_RUCHEY, PRB_RELS.N_ZAGOTOVKI, PROKAT321_SPR_NDT_SENSOR.NAME, PROKAT321_SPR_NDT_SENSOR.DESCRIPTION, PROKAT321_TBL_NDT_PM.DEFECT_POS, PROKAT321_TBL_NDT_PM.DEFECT_LENGTH, PROKAT321_TBL_NDT_PM.DEFECT_AMPLITUDE " _
& "FROM (PRB_RELS LEFT JOIN NLZ_RELS ON PRB_RELS.R1 = NLZ_RELS.R1) LEFT JOIN (PROKAT321_TBL_NDT_PM LEFT JOIN PROKAT321_SPR_NDT_SENSOR ON PROKAT321_TBL_NDT_PM.SENSOR_ID = PROKAT321_SPR_NDT_SENSOR.ID) ON PRB_RELS.R2 = PROKAT321_TBL_NDT_PM.R2 " _
& "WHERE (((PRB_RELS.R2)=755654) AND ((PROKAT321_SPR_NDT_SENSOR.NAME)='" & C1 & "'));")



При обращении к rs ошибка в сабже.
Пробую добавить параметры, н-р:

Код: vbnet
1.
2.
3.
Set rsPM = db.OpenRecordset("SELECT " _
....
& "WHERE (((PRB_RELS.R2)=755654) AND ((PROKAT321_SPR_NDT_SENSOR.NAME)='" & C1 & "'));", adOpenDynamic, adLockOptimistic)



Тогда ошибка: "ODBC - блокировка всех записей невозможна"

Собственно почему меня не устраивает 1й вариант? - не хочу захламлять хранить кучу запросов (а их будет 20шт), причем меняется в них только один параметр.

Подскажите как вопрос решить, ну или подтолкните на мудрую мысль ;)
...
Рейтинг: 0 / 0
Recordset - object variable or with block not set
    #39353451
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mozgen,
если вставите в модуль строку Option Explicit , то уыидите, что не все переменные объявлены
...
Рейтинг: 0 / 0
Recordset - object variable or with block not set
    #39353458
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
3.
4.
5.
Dim rs As DAO.Recordset
Dim strSQL As String
strSQL = "тут размещаем строку сборки кода запроса"
Debug.Print strSQL ' !!! и показать результат нам
Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset, dbSeeChanges)
...
Рейтинг: 0 / 0
Recordset - object variable or with block not set
    #39353459
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mozgen,

и предпочитаю такую форму записи
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
Option Compare Database
Option Explicit

Sub mm()
Dim db As Database
Dim rs As Recordset
Dim c1, s1
c1 = "aa"
Set db = DBEngine.Workspaces(0).Databases(0)
s1 = "SELECT "
s1 = s1 & " PRB_RELS.R2, NLZ_RELS.N_PLAVKI, PRB_RELS.N_RUCHEY, PRB_RELS.N_ZAGOTOVKI,"
s1 = s1 & " PROKAT321_SPR_NDT_SENSOR.NAME, PROKAT321_SPR_NDT_SENSOR.DESCRIPTION,"
s1 = s1 & " PROKAT321_TBL_NDT_PM.DEFECT_POS, PROKAT321_TBL_NDT_PM.DEFECT_LENGTH,"
s1 = s1 & " PROKAT321_TBL_NDT_PM.DEFECT_AMPLITUDE "
s1 = s1 & " FROM (PRB_RELS LEFT JOIN NLZ_RELS ON PRB_RELS.R1 = NLZ_RELS.R1)"
s1 = s1 & " LEFT JOIN (PROKAT321_TBL_NDT_PM"
s1 = s1 & " LEFT JOIN PROKAT321_SPR_NDT_SENSOR"
s1 = s1 & "  ON PROKAT321_TBL_NDT_PM.SENSOR_ID = PROKAT321_SPR_NDT_SENSOR.ID)"
s1 = s1 & "  ON PRB_RELS.R2 = PROKAT321_TBL_NDT_PM.R2 "
s1 = s1 & " WHERE (((PRB_RELS.R2)=755654) AND ((PROKAT321_SPR_NDT_SENSOR.NAME)='" & c1 & "'));"

Debug.Print s1

Set rs = db.OpenRecordset(s1)

End Sub
...
Рейтинг: 0 / 0
Recordset - object variable or with block not set
    #39353462
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и всё же желательны
Код: vbnet
1.
Dim var As New ObjectType
...
Рейтинг: 0 / 0
Recordset - object variable or with block not set
    #39353476
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mozgen,

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Public Sub Sub1 (L as Long, S as String)
On Error GoTo er1
Dim db As Database
Dim rs As Recordset
Dim querPM As QueryDef
Set db = CurrentDb()
Set querPM = db.QueryDefs("zapros1")
querPM![L1] = L
querPM![S1] = S
Set rs = querPM.OpenRecordset
'
' действия....
'
rs.Close
Exit Sub
er1:
MsgBox "Ошибка!"
End Sub


Текст сохраненного zapros1
Код: sql
1.
2.
3.
PARAMETERS L1 Long, S1 Text ( 255 );
SELECT ..........
WHERE (((PRB_RELS.R2)=[L1]) AND ((PROKAT321_SPR_NDT_SENSOR.NAME)=[S1]));


Вызов
Код: vbnet
1.
Call Sub1 (755654, "C1")



Может где ошибся, но смысл думаю понятен...
...
Рейтинг: 0 / 0
Recordset - object variable or with block not set
    #39353488
\\\\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaНу и всё же желательны
Код: vbnet
1.
Dim var As New ObjectType

Эт куда прикладывать? К дао рекордсету?
...
Рейтинг: 0 / 0
Recordset - object variable or with block not set
    #39353499
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
\\\\Эт куда прикладывать? К дао рекордсету?
ну как бы родной справке я верю. А она однозначно говорит, что
MS Access HelpIf the New keyword is not used when declaring an object variable, the variable that refers to the object must be assigned an existing object using the Set statement before it can be used. Until it is assigned an object, the declared object variable has the special value Nothing, which indicates that it doesn't refer to any particular instance of an object.
DAO-рекордсет - это объект. И никаких оговорок, что к DAO-рекордсету эта часть справки не относится, я не вижу.
...
Рейтинг: 0 / 0
Recordset - object variable or with block not set
    #39353504
Фотография Lieutenant Pigeon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mozgen,

хспдя... пока наковыривал ответ уже пять человек отписалось...

ну, неужели это так тяжело - самому проверить правильность собственных действий?..

Если qdf работает, а rst, на похожей, казалось бы, sql-строке нет - то дело в последней... Получается, что интерфейсный акс умнее тя... Так и бери с него пример... сравни sql-строки для начала... Создай программно qdf на своей sql-строке... и разберись, млин...

Тем более ,что (а их будет 20шт) ... отличный метод проыерки правильности и универсальности решения...

Мой совет - формируй строку наиболее наглядным для себя (и других!) способом. Подсовывай в инструкцию уже готовую строку, а не сбивчивое бормотание... Вообще вынеси в отдельную процедуру... обратно, принимая во нимание (а их будет 20шт) ...

Как-то так...

А то на ходу всплывает какая-то & C1 & ...
.
...
Рейтинг: 0 / 0
Recordset - object variable or with block not set
    #39353507
\\\\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina...DAO-рекордсет - это объект. И никаких оговорок, что к DAO-рекордсету эта часть справки не относится, я не вижу.А я не вижу смысла в том, что сначала создать один объект и получить на него ссылку, а затем тут же получить ссылку на другой объект и присвоить её этой же переменной...
...
Рейтинг: 0 / 0
Recordset - object variable or with block not set
    #39353524
Фотография Lieutenant Pigeon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
\\\\, +1

Акина с этим As New просто гарцует на хэлпе. Так он скоро договорится и до:
' Option Explicit

Для As New нужны весьма и весьма убедительные предпосылки. В моей практике таковых не было... Более того - избавлялся беспощадно.
.
...
Рейтинг: 0 / 0
Recordset - object variable or with block not set
    #39353527
mozgen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа, всем спасибо, все получилось!)
Спасибо за дельные комментарии, как только убрался в коде ошибка сразу стала ясна.
Бить меня надо сначала по рукам, затем по голове, хотя последовательно принципиального значения не имеет))

Рабочие код:
Код: vbnet
1.
2.
Dim rs As Recordset
Set rs = querPM.OpenRecordset



И не рабочий код:
Код: vbnet
1.
2.
Dim rs As Recordset
Set rsPM = db.OpenRecordset(...)



rsPM - другой Recordset, объявленный много ранее и уже не используемый) Косяк не в мозгах а в руках и невнимательности.
...
Рейтинг: 0 / 0
Recordset - object variable or with block not set
    #39353531
mozgen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lieutenant Pigeon, мне лень писать подобный запрос ручками, поэтому он был скопирован из конструктора, синтаксис верный)
По поводу процедуру и пр. так и сделано, здесь приведен вырванный кусок который не работал.
...
Рейтинг: 0 / 0
Recordset - object variable or with block not set
    #39353532
\\\\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lieutenant Pigeon...Для As New нужны весьма и весьма убедительные предпосылки. В моей практике таковых не было... Более того - избавлялся беспощадно.
.Дело тут не в инициализации переменной в секции декларирования (хотя это действительно не есть гуд, но вполне допустимо), а в создании разных объектов.
...
Рейтинг: 0 / 0
Recordset - object variable or with block not set
    #39353539
\\\\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mozgen...Рабочие код:
Код: vbnet
1.
2.
Dim rs As Recordset
Set rs = querPM.OpenRecordset


.Точнее типизируй объекты
Код: vbnet
1.
Dim rs As DAO.Recordset

- букав немного, а проблем в будущем будет меньше.
...
Рейтинг: 0 / 0
Recordset - object variable or with block not set
    #39353543
Фотография Lieutenant Pigeon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mozgenLieutenant Pigeon, мне лень писать подобный запрос ручками, поэтому он был скопирован из конструктора, синтаксис верный)
По поводу процедуру и пр. так и сделано, здесь приведен вырванный кусок который не работал.

* мне лень писать подобный запрос ручками
Ты не один такой :)
Тут все именно этим профессионально и занимаются - написать один раз и на всю оставшуюся...

* мне лень писать подобный запрос ручками
Кто тебя заставляет?! Я же, наоборот, сказал: бери пример с акса. Сделай по образу и подобию, подставь свои переменные и бкдет тебе щазтье...

* синтаксис верный
Был бы верный - топика бы не было...

* здесь приведен вырванный кусок
no comments ...
.
...
Рейтинг: 0 / 0
Recordset - object variable or with block not set
    #39353544
Вам правильно посоветовали про Option Explicit.
mozgenDim rs As Recordset
...
Set rsPM = db.OpenRecordset("SELECT...") Т.е. объявлен rs, а используется rsPM. Кстати, лучше (надежнее) Dim rs As DAO. Recordset.
mozgenSet rsPM = db.OpenRecordset("SELECT...", adOpenDynamic, adLockOptimistic )
Тогда ошибка: "ODBC - блокировка всех записей невозможна") Константы из библиотеки ADO, а у вас DAO. Х.з., что вы пытаетесь открыть с их значениями.
mozgenSet db = DBEngine.Workspaces(0).Databases(0) Если ваш код в Аксе, то лучше использовать Set db = CurrentDb.
mozgenСобственно почему меня не устраивает 1й вариант? - не хочу захламлять хранить кучу запросов (а их будет 20шт), причем меняется в них только один параметр. Прислушайтесь к совету vmag - можно создать запрос с параметром и указывать его значение перед отркрытием Recordset-а.
Или другой вариант - создать сохраненный запрос ("zapros1") без WHERE (или с WHERE PRB_RELS.R2=755654), а затем:
Set rsPM = db.OpenRecordset("SELECT * FROM zapros1 WHERE <ваше условие>")
...
Рейтинг: 0 / 0
Recordset - object variable or with block not set
    #39353558
Фотография Lieutenant Pigeon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
\\\\Lieutenant Pigeon...Для As New нужны весьма и весьма убедительные предпосылки. В моей практике таковых не было... Более того - избавлялся беспощадно.
.Дело тут не в инициализации переменной в секции декларирования (хотя это действительно не есть гуд, но вполне допустимо), а в создании разных объектов.

Гуд... Не гуд... Я же не случайно съязвил в сторону ' Option Explicit ...

Да, VB с M$ и БГ допускают многие вольности и даже в своих сраных хэлпах и мсднах провоцируют новичков на них... Но это не есть гуд практик.
.
...
Рейтинг: 0 / 0
Recordset - object variable or with block not set
    #39353591
Фотография Lieutenant Pigeon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ( Киев )... создать сохраненный запрос ("zapros1") без WHERE (или с WHERE PRB_RELS.R2=755654), а затем ...
В принципе-то плюсую, но...

... давно ужЕ отказался от подобной практики.

Практикую типичный, максимально упрощенный рекордсет. И лишь по месту, по исключительной нужде, через евонные .Sort и .Filter затачиваю:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
                sSQL = "SELECT [Bp], [Lp], [Ap] FROM " & sTbl & " ORDER BY [RID];"
                Set rst = cdb.OpenRecordset(sSQL, dbOpenDynaset)
                lRecCnt(1) = fn_RecCntRst(rst)
                If lRecCnt(1) = 0 Then Stop
                
                sFlt = "([Bp] > 0 And Len([BP] = " & tDQ & ")) AND " & _
                       "([Ap] > 0 And Len([AP] = " & tDQ & ")) AND " & _
                       "([Lp] = 0)"
                With rst
                    .Filter = sFlt
                    Set rst2 = .OpenRecordset
                    lRecCnt(2) = fn_RecCntRst(rst2)
                    Call sb_Close(rst2)
                End With
                Call sb_Close(rst)



Несколько затратно по ресурсам и коду, но, нынче... и для себя любмого...
.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Recordset - object variable or with block not set
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]