Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Recordset - object variable or with block not set / 19 сообщений из 19, страница 1 из 1
24.11.2016, 10:57
    #39353440
mozgen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordset - object variable or with block not set
Доброго времени суток, Господа!
Может кто-нибудь подсказать в чем прикол (скорее всего моя проблема тривиальна, но все же):
Создаю и заполняю 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
24.11.2016, 11:04
    #39353451
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordset - object variable or with block not set
mozgen,
если вставите в модуль строку Option Explicit , то уыидите, что не все переменные объявлены
...
Рейтинг: 0 / 0
24.11.2016, 11:09
    #39353458
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordset - object variable or with block not set
Код: 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
24.11.2016, 11:09
    #39353459
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordset - object variable or with block not set
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
24.11.2016, 11:11
    #39353462
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordset - object variable or with block not set
Ну и всё же желательны
Код: vbnet
1.
Dim var As New ObjectType
...
Рейтинг: 0 / 0
24.11.2016, 11:26
    #39353476
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordset - object variable or with block not set
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
24.11.2016, 11:34
    #39353488
\\\\
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordset - object variable or with block not set
AkinaНу и всё же желательны
Код: vbnet
1.
Dim var As New ObjectType

Эт куда прикладывать? К дао рекордсету?
...
Рейтинг: 0 / 0
24.11.2016, 11:47
    #39353499
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordset - object variable or with block not set
\\\\Эт куда прикладывать? К дао рекордсету?
ну как бы родной справке я верю. А она однозначно говорит, что
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
24.11.2016, 11:50
    #39353504
Lieutenant Pigeon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordset - object variable or with block not set
mozgen,

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

* здесь приведен вырванный кусок
no comments ...
.
...
Рейтинг: 0 / 0
24.11.2016, 12:38
    #39353544
Recordset - object variable or with block not set
Вам правильно посоветовали про 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
24.11.2016, 12:46
    #39353558
Lieutenant Pigeon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordset - object variable or with block not set
\\\\Lieutenant Pigeon...Для As New нужны весьма и весьма убедительные предпосылки. В моей практике таковых не было... Более того - избавлялся беспощадно.
.Дело тут не в инициализации переменной в секции декларирования (хотя это действительно не есть гуд, но вполне допустимо), а в создании разных объектов.

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

Да, VB с M$ и БГ допускают многие вольности и даже в своих сраных хэлпах и мсднах провоцируют новичков на них... Но это не есть гуд практик.
.
...
Рейтинг: 0 / 0
24.11.2016, 13:18
    #39353591
Lieutenant Pigeon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordset - object variable or with block not set
Анатолий ( Киев )... создать сохраненный запрос ("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
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Recordset - object variable or with block not set / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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