Ошибка ADODB.Recordset при выполнении SQL запроса #721694


#0 by bvb
Выполняю запрос по сторонней SQL базе Ошибка : {ОбщийМодуль.SQL.Модуль}: Ошибка при вызове метода контекста (RecordCount)      КолСтрок=eXrowset.Recordcount; по причине: Произошла исключительная ситуация (ADODB.Recordset): Операция не допускается, если объект закрыт. ----------------------------------------- Другие запросы выполняются нормально. А этот нет. В Managment Studio он исполняется нормально Я грешу на то что он использует UNION.
#1 by Ёпрст
Содержимое SqlQuery предлагается угадывать ?
#2 by Jaap Vduul
Результат запроса пустой. Кстати, поскольку тип курсора не указан, то по-умолчанию будет использован forward-only курсор. У которого Recordcount всегда равняется -1.
#3 by shuhard
+1 ни типа блокировки, ни курсора
#4 by Banned
зависит от драйвера. давай строку подключения и запрос
#5 by bvb
Provider=SQLOLEDB.1;Persist Security Info=False;Initial Catalog=MY_BASE;Data Source=10.10.0.2;User ID=sa;Password=sql;
#6 by bvb
DECLARE @TAB_09 TABLE(ALC_CODE VARCHAR,SUMMA INT) -- Приходы DECLARE @TAB_10 TABLE(ALC_CODE VARCHAR,SUMMA INT) -- Расходы DECLARE @TAB_11 TABLE(ALC_CODE VARCHAR,SUMMA INT) -- Возвраты от покупателя DECLARE @TAB_12 TABLE(ALC_CODE VARCHAR,SUMMA INT) -- Возвраты поставщику DECLARE @TAB_46 TABLE(ALC_CODE VARCHAR,SUMMA INT) -- Первичные остатки DECLARE @TAB_59 TABLE(ALC_CODE VARCHAR,SUMMA INT) -- Сведения о ввозе (ГТД) --36126 -- SET @DocStatus = '38041' -- Только зафиксированные --Ищем приходные накладные FROM WRH_WAYBILL AS T1 INNER JOIN WRH_WAYBILL_POS AS T2 ON T1.ID = T2.REF_WAYBILL_ID INNER JOIN DOCFLOW_OBJECT AS T3 ON T1.ID = T3.ID WHERE T1.INACTIVE_FLAG = '0' AND T2.INACTIVE_FLAG = '0' AND T3.REF_DATA_ID36 = @DocType AND T3.REF_DATA_ID38 = @DocStatus GROUP BY T2.REF_ALC_CODE_ID --Ищем расходные накладные SELECT T2.REF_ALC_CODE_ID,SUM(T2.[COUNT]) FROM WRH_WAYBILL AS T1 INNER JOIN WRH_WAYBILL_POS AS T2 ON T1.ID = T2.REF_WAYBILL_ID INNER JOIN DOCFLOW_OBJECT AS T3 ON T1.ID = T3.ID WHERE T1.INACTIVE_FLAG = '0' AND T2.INACTIVE_FLAG = '0' AND T3.REF_DATA_ID36 = @DocType AND T3.REF_DATA_ID38 = @DocStatus GROUP BY T2.REF_ALC_CODE_ID --Ищем возвратные приходные накладные SELECT T2.REF_ALC_CODE_ID,SUM(T2.[COUNT]) FROM WRH_WAYBILL AS T1 INNER JOIN WRH_WAYBILL_POS AS T2 ON T1.ID = T2.REF_WAYBILL_ID INNER JOIN DOCFLOW_OBJECT AS T3 ON T1.ID = T3.ID WHERE T1.INACTIVE_FLAG = '0' AND T2.INACTIVE_FLAG = '0' AND T3.REF_DATA_ID36 = @DocType AND T3.REF_DATA_ID38 = @DocStatus GROUP BY T2.REF_ALC_CODE_ID --Ищем возвратные расходные накладные SELECT T2.REF_ALC_CODE_ID,SUM(T2.[COUNT]) FROM WRH_WAYBILL AS T1 INNER JOIN WRH_WAYBILL_POS AS T2 ON T1.ID = T2.REF_WAYBILL_ID INNER JOIN DOCFLOW_OBJECT AS T3 ON T1.ID = T3.ID WHERE T1.INACTIVE_FLAG = '0' AND T2.INACTIVE_FLAG = '0' AND T3.REF_DATA_ID36 = @DocType AND T3.REF_DATA_ID38 = @DocStatus GROUP BY T2.REF_ALC_CODE_ID --Ищем первичные остатки SELECT T2.REF_ALC_CODE_ID,SUM(T2.[COUNT]) FROM WRH_WAYBILL AS T1 INNER JOIN WRH_WAYBILL_POS AS T2 ON T1.ID = T2.REF_WAYBILL_ID INNER JOIN DOCFLOW_OBJECT AS T3 ON T1.ID = T3.ID WHERE T1.INACTIVE_FLAG = '0' AND T2.INACTIVE_FLAG = '0' AND T3.REF_DATA_ID36 = @DocType AND T3.REF_DATA_ID38 = @DocStatus GROUP BY T2.REF_ALC_CODE_ID --Ищем сведения о ввозе SELECT T2.REF_ALC_CODE_ID,SUM(T2.QUANTITY) FROM TAB_IMPORT_INFO AS T2 INNER JOIN DOCFLOW_OBJECT AS T3 ON T2.ID = T3.ID WHERE T2.INACTIVE_FLAG = '0' AND T3.REF_DATA_ID38 = @DocStatus GROUP BY T2.REF_ALC_CODE_ID --36126 Сведения о постановке продукции на баланс --36128 Акт списания продукции на прочие расходы select T1.ALC_CODE,T5.CLIENT_CODE,T3.FULL_NAME,T3.PERCENT_ALC,T4.VOLUME,T5.FULL_NAME AS PRODUCER ,T1.CNT from (select alc_code,SUM(summa) AS 'CNT' from ((Select ALC_CODE,SUMMA from @TAB_09) union (Select ALC_CODE,-SUMMA from @TAB_10) union (Select ALC_CODE,SUMMA from @TAB_11) union (Select ALC_CODE,-SUMMA from @TAB_12) union (Select ALC_CODE,SUMMA from @TAB_46) union (Select ALC_CODE,SUMMA from @TAB_59)) as tab1 group by ALC_CODE) AS T1 INNER JOIN TAB_ALC_CODE AS T2 ON T1.ALC_CODE = T2.ID INNER JOIN TAB_ALC_NAME AS T3 ON T2.REF_ALC_NAME_ID = T3.ID INNER JOIN TAB_VOLUME AS T4 ON T2.REF_VOLUME_ID = T4.ID INNER JOIN TAB_CLIENT AS T5 ON T2.REF_CLIENT_ID = T5.ID
#7 by Banned
Мда... SET NOCOUNT ON в начало влепи...
#8 by МихаилМ
это oledb . он и так последний результат возвращает
#9 by Banned
А я всё равно бы поставил....
#10 by bvb
ура заборбатало !!! А что сия конструкция означает и почему без нее не работало ?
#11 by bvb
Если значение инструкции SET NOCOUNT равно ON, то количество строк не возвращается. Если значение инструкции SET NOCOUNT равно OFF, то количество строк возвращается. А почему другие запросы без нее работают ?
#12 by Banned
у тебя в начале стоит INSERT @TAB_09 (ALC_CODE,SUMMA) И возвращает количество строк вставленных. В других, видать, такого нет
#13 by Jaap Vduul
Наоборот, это MSDASQL возвращает только результат, а SQLOLEDB выдаёт на клиента rowcount по каждой инструкции.
#14 by bvb
А-а-а : То то я смотрю в закладке сообщения пишет (строк обработано: 71) (строк обработано: 1391) (строк обработано: 151) (строк обработано: 0) (строк обработано: 73) (строк обработано: 0) (строк обработано: 1405) в этом то и фича INSERT @TAB_09 (ALC_CODE,SUMMA)  - это не повод не отрабатывать   .Recordcount
#15 by bvb
я так понимаю : в запросе куча промежуточных таблиц и ADO Recordcount не понимает количество записей которой возвращать
#16 by Banned
Он может ин а set'ы реагировать... И возвращать в элементе коллекции закрытый рекордсет.
#17 by bvb
В любом случае большое спасибо - выручили
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С