Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Очень популярная тема (более 25 ответов) Ошибка Invalid Descriptor Index в параметризированном запросе (число прочтений - 6118 )
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 записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать