Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Ошибка Invalid Descriptor Index в параметризированном запросе (число прочтений - 6151 )
TroYur
Junior Member
**
Отсутствует



Сообщений: 24
Зарегистрирован: 17. Октября 2006
Ошибка Invalid Descriptor Index в параметризированном запросе
02. Ноября 2010 :: 09:08
Печать  
Помогите понять в чем проблема, пожалуйста
Вот текст запроса:

[code]DECLARE @Номенклатура CHAR(9)
SET @Номенклатура = ?
SELECT sum(ОстаткиТМЦОстатки.КоличествоОстаток) ОстатокВсего
     , sum(case when ОстаткиТМЦОстатки.Склад = :Склад then ОстаткиТМЦОстатки.КоличествоОстаток else null end) ОстатокНаСкладе
FROM $РегистрОстатки.ОстаткиТМЦ(:ДатаОст~,
           INNER JOIN $Справочник.Номенклатура AS СпрНоменклатура ON Номенклатура = СпрНоменклатура.ID,
           (Номенклатура = @Номенклатура),(Склад,Номенклатура),) AS ОстаткиТМЦОстатки[/code]

Метод запроса ПостроитьПараметры() возвращает ошибку:
State 07009, native 0, message [Microsoft][ODBC SQL Server Driver]Invalid Descriptor Index

Метод Подготовить() отрабатывает успешно.
Что не так в запросе?

ЗЫ: 1С 7.70.025; 1С++ 2.0.3.3; SQL Server  2000 - 8.00.2162
  
Наверх
IP записан
 
U_zer
Экс-Участник


Re: Ошибка Invalid Descriptor Index в параметризированном запросе
Ответ #1 - 02. Ноября 2010 :: 10:26
Печать  
[quote author=TroYur link=1288688923/0#0 date=1288688923]Помогите понять в чем проблема, пожалуйста
Вот текст запроса:

[code]DECLARE @Номенклатура CHAR(9)
SET @Номенклатура = ?
SELECT sum(ОстаткиТМЦОстатки.КоличествоОстаток) ОстатокВсего
     , sum(case when ОстаткиТМЦОстатки.Склад = :Склад then ОстаткиТМЦОстатки.КоличествоОстаток else null end) ОстатокНаСкладе
FROM $РегистрОстатки.ОстаткиТМЦ(:ДатаОст~,
           INNER JOIN $Справочник.Номенклатура AS СпрНоменклатура ON Номенклатура = СпрНоменклатура.ID,
           (Номенклатура = @Номенклатура),(Склад,Номенклатура),) AS ОстаткиТМЦОстатки[/code]

Метод запроса ПостроитьПараметры() возвращает ошибку:
State 07009, native 0, message [Microsoft][ODBC SQL Server Driver]Invalid Descriptor Index

Метод Подготовить() отрабатывает успешно.
Что не так в запросе?

ЗЫ: 1С 7.70.025; 1С++ 2.0.3.3; SQL Server  2000 - 8.00.2162[/quote]

нужно через ДобПараметр() делать в данном случае.
  
Наверх
 
IP записан
 
TroYur
Junior Member
**
Отсутствует



Сообщений: 24
Зарегистрирован: 17. Октября 2006
Re: Ошибка Invalid Descriptor Index в параметризированном запросе
Ответ #2 - 02. Ноября 2010 :: 11:29
Печать  
ОК, делаю так:
Код
Выбрать все
	Если Запрос.Подготовить(ТекстЗапроса) = 0 Тогда
		Сообщить(Запрос.ПолучитьОписаниеОшибки());
	КонецЕсли;

	Запрос.ДобПараметр(1,14,9,0,"@Номенклатура");

	Запрос.УстПараметр(1,Номенклатура);

	СтрПарам = Запрос.ВыполнитьСкалярный();
 



ВыполнитьСкалярный() возвращает 0, т.е. как я понимаю, пустую выборку, хотя по идее должен выдать Структуру (Номенклатура есть на остатках)

ЗЫ: пример взят вобще-то из учебника который идет с документацией, так что скорее всего ошибка где-то на поверхности, просто я ее не вижу  Нерешительный
  
Наверх
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Ошибка Invalid Descriptor Index в параметризированном запросе
Ответ #3 - 02. Ноября 2010 :: 12:30
Печать  
ВыполнитьСкалярный() не возвращает Структуру.
Используйте ВыполнитьИнструкцию()
  
Наверх
IP записан
 
U_zer
Экс-Участник


Re: Ошибка Invalid Descriptor Index в параметризированном запросе
Ответ #4 - 02. Ноября 2010 :: 13:08
Печать  
leshik писал(а) 02. Ноября 2010 :: 12:30:
ВыполнитьСкалярный() не возвращает Структуру.
Используйте ВыполнитьИнструкцию()


Возвращает.
Нужно полный код смотреть - с установкой всех параметров.
Вообще-то непонятный какой-то запрос .....
Может просто задачу озвучить проще будет?
  
Наверх
 
IP записан
 
TroYur
Junior Member
**
Отсутствует



Сообщений: 24
Зарегистрирован: 17. Октября 2006
Re: Ошибка Invalid Descriptor Index в параметризированном запросе
Ответ #5 - 02. Ноября 2010 :: 13:18
Печать  
задача элементарная - вывод остатков в форме списка)

вот полный код:

Код
Выбрать все
	Запрос=СоздатьОбъект("ODBCRecordSet");

	Текст = "
	|DECLARE @Номенклатура CHAR(9)
	|SET @Номенклатура = ?
	|SELECT sum(ОстаткиТМЦОстатки.КоличествоОстаток) ОстатокВсего";

	Измерения = "Номенклатура";

	Если Склад.Выбран() = 1 Тогда
		Текст = Текст+"
		|	, sum(case when ОстаткиТМЦОстатки.Склад = :Склад then ОстаткиТМЦОстатки.КоличествоОстаток else null end) ОстатокНаСкладе";
		Измерения = "Склад,"+Измерения;
		Запрос.УстановитьТекстовыйПараметр("Склад",Склад);
	КонецЕсли;

	Текст = Текст+"
	|FROM $РегистрОстатки.ОстаткиТМЦ(";

	Если Конт.Выбран() = 1 Тогда
		ВидГраницыРасчетаОстатков = 2;
	ИначеЕсли ПустоеЗначение(ДатаОст) = 0 Тогда
		ВидГраницыРасчетаОстатков = 3;
	Иначе
		ВидГраницыРасчетаОстатков = 1;
	КонецЕсли;

	Если ВидГраницыРасчетаОстатков = 1 Тогда	 // ОстаткиТМЦ на ТА;
		ГраницаРасчетаОстатков = ПолучитьПозициюТА();
		Текст = Текст+",";
	Иначе
		Текст = Текст+":ДатаОст~,";
		Если ВидГраницыРасчетаОстатков = 2 Тогда // позиция документа
			ГраницаРасчетаОстатков = СформироватьПозициюДокумента(Конт,-1);// Позиция
		КонецЕсли;
		Если ВидГраницыРасчетаОстатков = 3 Тогда		// Дата
			ГраницаРасчетаОстатков = ДатаОст;
		КонецЕсли;
		Запрос.УстановитьТекстовыйПараметр("ДатаОст",ГраницаРасчетаОстатков);
	КонецЕсли;

	Текст = Текст+"
	|		INNER JOIN $Справочник.Номенклатура AS СпрНоменклатура ON Номенклатура = СпрНоменклатура.ID,
	|		(Номенклатура = @Номенклатура),("+Измерения+"),) AS ОстаткиТМЦОстатки
	|";

	Если Запрос.Подготовить(Текст) = 0 Тогда
		Сообщить(Запрос.ПолучитьОписаниеОшибки());
	КонецЕсли;

	//используется по отдельности:
	Запрос.ДобПараметр(1,14,9,0,"@Номенклатура");
	  //так ВыполнитьСкаларный() возвращает 0 (Ноль)
	//ИЛИ:
	Если Запрос.ПостроитьПараметры() = 0 Тогда
		Сообщить(Запрос.ПолучитьОписаниеОшибки());
	КонецЕсли;
	//так - сабж

	Запрос.УстПараметр(1,Номенклатура);

	СтрПарам = Запрос.ВыполнитьСкалярный();
 



Добавлю: если запрос непараметризированный - отрабатывает нормально.
« Последняя редакция: 08. Ноября 2010 :: 13:20 - TroYur »  
Наверх
IP записан
 
TroYur
Junior Member
**
Отсутствует



Сообщений: 24
Зарегистрирован: 17. Октября 2006
Re: Ошибка Invalid Descriptor Index в параметризированном запросе
Ответ #6 - 02. Ноября 2010 :: 13:28
Печать  
leshik писал(а) 02. Ноября 2010 :: 12:30:
ВыполнитьСкалярный() не возвращает Структуру.
Используйте ВыполнитьИнструкцию()


С ВыполнитьИнструкцию мне не очень подходит, дальнейшая работа со структурой удобнее
  
Наверх
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Ошибка Invalid Descriptor Index в параметризированном запросе
Ответ #7 - 02. Ноября 2010 :: 13:37
Печать  
если есть ДобПараметр, то ПостроитьПараметры делать не надо
  

1&&2&&3
Наверх
 
IP записан
 
TroYur
Junior Member
**
Отсутствует



Сообщений: 24
Зарегистрирован: 17. Октября 2006
Re: Ошибка Invalid Descriptor Index в параметризированном запросе
Ответ #8 - 02. Ноября 2010 :: 13:59
Печать  
trad писал(а) 02. Ноября 2010 :: 13:37:
если есть ДобПараметр, то ПостроитьПараметры делать не надо


да пробовал и так и сяк))
без ПостроитьПараметры возвращает 0 (ноль) хотя остатки точно есть

Суть в том что если параметр :Номенклатура указывать явно, ВыполнитьИнструкцию() отрабатывает правильно, т.е. выдает ТЗ с двумя колонками и остатками в строке.
Но в случае вывода списка справочника постоянная компиляция запроса не есть гуд, ИМХО...
  
Наверх
IP записан
 
TroYur
Junior Member
**
Отсутствует



Сообщений: 24
Зарегистрирован: 17. Октября 2006
Re: Ошибка Invalid Descriptor Index в параметризированном запросе
Ответ #9 - 03. Ноября 2010 :: 10:58
Печать  
апну темку на всякий случай) вдруг кто подскажет
  
Наверх
IP записан
 
Alex_Bob
Full Member
***
Отсутствует



Сообщений: 136
Местоположение: Липецк
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ошибка Invalid Descriptor Index в параметризированном запросе
Ответ #10 - 03. Ноября 2010 :: 12:22
Печать  
Может в тексте запроса SQL параметр надо писать так
Код
Выбрать все
(Номенклатура = ?) 

  

Необходимо время, чтобы восстановить хаос. (с) Дж. Буш (младший)
Наверх
 
IP записан
 
TroYur
Junior Member
**
Отсутствует



Сообщений: 24
Зарегистрирован: 17. Октября 2006
Re: Ошибка Invalid Descriptor Index в параметризированном запросе
Ответ #11 - 03. Ноября 2010 :: 14:38
Печать  
Alex_Bob писал(а) 03. Ноября 2010 :: 12:22:
Может в тексте запроса SQL параметр надо писать так
Код
Выбрать все
(Номенклатура = ?) 



не думаю, ведь declare  и set задают параметр и ожидание значения, а УстПараметр() это значение передает... при этом ДобПараметр() определяет его входящим.

короч, хз... еще раз проверил, без первых 2 строк и при указании параметра :Номенклатура - отрабатывает штатно... почему не хочет
в параметризированном запросе - не въезжаю((

еще раз обращаю внимание, что пример построен на основании примера из учебника (Глава 5):

Код
Выбрать все
ТекстЗапроса = "
|DECLARE @Товар CHAR(9)
|Set @Товар = ?
|SELECT
|  Рег.КоличествоОстаток as Количество
|FROM
|  $РегистрОстатки.ОстаткиТоваров(:ВыбДата~,,
|					 Склад = :ВыбСклад AND Товар = @Товар,
|					 (Товар), (Количество)) as Рег";
 

  
Наверх
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Ошибка Invalid Descriptor Index в параметризированном запросе
Ответ #12 - 04. Ноября 2010 :: 04:30
Печать  
весь код покажи
  

1&&2&&3
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Ошибка Invalid Descriptor Index в параметризированном запросе
Ответ #13 - 04. Ноября 2010 :: 06:56
Печать  
А может стоит в начало запроса добавить
Код
Выбрать все
SET NOCOUNT ON 


?
  
Наверх
IP записан
 
TroYur
Junior Member
**
Отсутствует



Сообщений: 24
Зарегистрирован: 17. Октября 2006
Re: Ошибка Invalid Descriptor Index в параметризированном запросе
Ответ #14 - 08. Ноября 2010 :: 07:52
Печать  
trad писал(а) 04. Ноября 2010 :: 04:30:
весь код покажи


а того что в 5-м посте недостаточно?

leshik писал(а) 04. Ноября 2010 :: 06:56:
А может стоит в начало запроса добавить
Код
Выбрать все
SET NOCOUNT ON 


?


Не помогает((
  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Ошибка Invalid Descriptor Index в параметризированном запросе
Ответ #15 - 08. Ноября 2010 :: 13:13
Печать  
(0)
на основе #5
либо пишем
Запрос.Подготовить
Запрос.ДобПараметр
Запрос.УстПараметр

либо пишем
Запрос.Подготовить
Запрос.ПостроитьПараметры
Запрос.УстПараметр

а у Вас смешаны оба этих способа
  
Наверх
 
IP записан
 
TroYur
Junior Member
**
Отсутствует



Сообщений: 24
Зарегистрирован: 17. Октября 2006
Re: Ошибка Invalid Descriptor Index в параметризированном запросе
Ответ #16 - 08. Ноября 2010 :: 13:17
Печать  
вобще-то такое замечание уже было  Подмигивание

отвечал на него в посте №8
просто в код воткнул оба варианта одновременно
сейчас поправлю
  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Ошибка Invalid Descriptor Index в параметризированном запросе
Ответ #17 - 08. Ноября 2010 :: 13:38
Печать  
Вот еще ошибка (исходя из #5)
либо используй непоименованные параметры ?
в этом случае
Запрос.ДобПараметр(1,14,9,0); // без пятого параметра

либо если используешь именнованные параметры то не объявляй переменую с тем же именем что и поименованный параметр.
в этом случае не нужны
     |DECLARE @Номенклатура CHAR(9)
     |SET @Номенклатура = ?

  
Наверх
 
IP записан
 
TroYur
Junior Member
**
Отсутствует



Сообщений: 24
Зарегистрирован: 17. Октября 2006
Re: Ошибка Invalid Descriptor Index в параметризированном запросе
Ответ #18 - 09. Ноября 2010 :: 07:38
Печать  
Z1 писал(а) 08. Ноября 2010 :: 13:38:
Запрос.ДобПараметр(1,14,9,0); // без пятого параметра

Вот так работает;

если же убрать
     |DECLARE @Номенклатура CHAR(9)
     |SET @Номенклатура = ?


то опять же результат запроса - 0...
видимо с виртуальными таблицами параметризованный запрос работает как-то по-особому)
  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Ошибка Invalid Descriptor Index в параметризированном запросе
Ответ #19 - 09. Ноября 2010 :: 08:19
Печать  
TroYur писал(а) 09. Ноября 2010 :: 07:38:
Z1 писал(а) 08. Ноября 2010 :: 13:38:
Запрос.ДобПараметр(1,14,9,0); // без пятого параметра

Вот так работает;

если же убрать
     |DECLARE @Номенклатура CHAR(9)
     |SET @Номенклатура = ?


то опять же результат запроса - 0...
видимо с виртуальными таблицами параметризованный запрос работает как-то по-особому)


Если хочешь то попробуй поименованый параметр английскими буквами. может в этом проблема.

  
Наверх
 
IP записан
 
TroYur
Junior Member
**
Отсутствует



Сообщений: 24
Зарегистрирован: 17. Октября 2006
Re: Ошибка Invalid Descriptor Index в параметризированном запросе
Ответ #20 - 09. Ноября 2010 :: 09:01
Печать  
Z1 писал(а) 09. Ноября 2010 :: 08:19:
Если хочешь то попробуй поименованый параметр английскими буквами. может в этом проблема.


вопрос в другом - почему ПостроитьПараметры() не работает?
ведь если параметров больше одного и заранее неизвестно сколько их будет, не очень удобно использовать ДобПараметр(), ИМХО
  
Наверх
IP записан
 
TroYur
Junior Member
**
Отсутствует



Сообщений: 24
Зарегистрирован: 17. Октября 2006
Re: Ошибка Invalid Descriptor Index в параметризированном запросе
Ответ #21 - 09. Ноября 2010 :: 09:24
Печать  
хех... а в форме списка-то и вовсе не пашет(((
1С падает с SQL State HY000

установка таймаута тоже не помогает
  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Ошибка Invalid Descriptor Index в параметризированном запросе
Ответ #22 - 09. Ноября 2010 :: 09:40
Печать  
TroYur писал(а) 09. Ноября 2010 :: 09:01:
Z1 писал(а) 09. Ноября 2010 :: 08:19:
Если хочешь то попробуй поименованый параметр английскими буквами. может в этом проблема.


вопрос в другом - почему ПостроитьПараметры() не работает?
ведь если параметров больше одного и заранее неизвестно сколько их будет, не очень удобно использовать ДобПараметр(), ИМХО

у меня работает. была здесь ветка по сводному остатку. там точно есть работающий пример с использованием ПостроитьПараметры.

  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Ошибка Invalid Descriptor Index в параметризированном запросе
Ответ #23 - 09. Ноября 2010 :: 09:42
Печать  
TroYur писал(а) 09. Ноября 2010 :: 09:24:
хех... а в форме списка-то и вовсе не пашет(((
1С падает с SQL State HY000

установка таймаута тоже не помогает

вообще ничего не понятно
1с все равно откуда выполнять запрос. Может только если шлешь
очень много запросов (из формы списка ) и некоректно их обрабатываешь.
  
Наверх
 
IP записан
 
TroYur
Junior Member
**
Отсутствует



Сообщений: 24
Зарегистрирован: 17. Октября 2006
Re: Ошибка Invalid Descriptor Index в параметризированном запросе
Ответ #24 - 16. Ноября 2010 :: 09:30
Печать  
Цитата:
вообще ничего не понятно
1с все равно откуда выполнять запрос. Может только если шлешь
очень много запросов (из формы списка ) и некоректно их обрабатываешь.


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

Z1 писал(а) 09. Ноября 2010 :: 09:40:
у меня работает. была здесь ветка по сводному остатку. там точно есть работающий пример с использованием ПостроитьПараметры.


а версия 1С++ какая?
  
Наверх
IP записан
 
U_zer
Экс-Участник


Re: Ошибка Invalid Descriptor Index в параметризированном запросе
Ответ #25 - 16. Ноября 2010 :: 09:57
Печать  
TroYur писал(а) 16. Ноября 2010 :: 09:30:
Цитата:
вообще ничего не понятно
1с все равно откуда выполнять запрос. Может только если шлешь
очень много запросов (из формы списка ) и некоректно их обрабатываешь.


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

Z1 писал(а) 09. Ноября 2010 :: 09:40:
у меня работает. была здесь ветка по сводному остатку. там точно есть работающий пример с использованием ПостроитьПараметры.


а версия 1С++ какая?


ПостроитьПараметры - лучше не использовать. Потому что иногда он работает неправильно.
А ошибка у тебя - скорее всего из-за неправильного использования парам. запроса в списке. Но это надо обработку смотреть .... А вообще, попробуй тупо top 1 написать, возможно поможет.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать