Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема ВыполнитьСкалярный() возвращает -1 (число прочтений - 2772 )
Inner Join (c)
Junior Member
**
Отсутствует


I Love BaBB 2!

Сообщений: 23
Зарегистрирован: 15. Октября 2008
Пол: Мужской
ВыполнитьСкалярный() возвращает -1
19. Мая 2009 :: 07:54
Печать  
Доброе время суток!

Люди, кто знает что это значит? Вот код:

Код
Выбрать все
Функция ПодготовитьЗапросЕд()
	ЗапросЕд = СоздатьОбъект("ODBCRecordSet");

	ТекстЗапр = "
	|declare @pe char(9)
	|declare @K float
	|set @pe = ?
	|set @K = ?
	|select top 1
	|e.id [Ед $Справочник.Единицы]
	|from $Справочник.Единицы e (nolock)
	|where e.parentext = @pe and $e.спрКоэффициент = @K and e.ismark = 0
	|";

	Если ЗапросЕд.Подготовить(ТЗ)=0 Тогда
		Сообщить(ЗапросЕд.ПолучитьОписаниеОшибки(),"!");
		Возврат 0;
	Иначе
		ЗапросЕд.ДобПараметр(1,14,9,0);
		ЗапросЕд.ДобПараметр(1,6,10,2);
	КонецЕсли;

	Возврат 1;
КонецФункции	// ПодготовитьЗапросЕд

***************************************

ЗапросЕд.УстПараметр(1,Товар);
ЗапросЕд.УстПараметр(2,Коэф);
_Ед = ЗапросЕд.ВыполнитьСкалярный();

 



На первом элементе товара выдает 0, потому что такого там нет и при проверке на пустое значение обработку элемента пробрасывает. На втором "-1", хотя также нет нужного элемента. И это уже не пустое значение. Ессесн вылетает с ошибкой при обращении к элементу.... Не проверять же значение в дополнение на неотрицательность.   Язык

Где копать то?
  
Наверх
 
IP записан
 
Inner Join (c)
Junior Member
**
Отсутствует


I Love BaBB 2!

Сообщений: 23
Зарегистрирован: 15. Октября 2008
Пол: Мужской
Re: ВыполнитьСкалярный() возвращает -1
Ответ #1 - 19. Мая 2009 :: 07:57
Печать  
Огромное Сорри. при копи-пасте ТЗ не поменял на ТекстЗапр... Пока не выложил не заметил... Закон подлости.............
  
Наверх
 
IP записан
 
Inner Join (c)
Junior Member
**
Отсутствует


I Love BaBB 2!

Сообщений: 23
Зарегистрирован: 15. Октября 2008
Пол: Мужской
Re: ВыполнитьСкалярный() возвращает -1
Ответ #2 - 19. Мая 2009 :: 08:10
Печать  
Однако оригинальная подготовка запроса получилась (может канешн это одна из возможностей ODBCRecordSet, о которой я не знаю), вместо текста в процедуру передана здоровенная таблица значений. Подготовился без ошибок, добавились параметры, установились и еще что-то возвращалось....  Улыбка
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: ВыполнитьСкалярный() возвращает -1
Ответ #3 - 19. Мая 2009 :: 08:34
Печать  
А что реквизит так и называется [спрКоэффициент]? Там исключение генерируется скорее всего при ВыполнитьСкалярный(), поэтому возвращается -1
  
Наверх
 
IP записан
 
Inner Join (c)
Junior Member
**
Отсутствует


I Love BaBB 2!

Сообщений: 23
Зарегистрирован: 15. Октября 2008
Пол: Мужской
Re: ВыполнитьСкалярный() возвращает -1
Ответ #4 - 19. Мая 2009 :: 11:16
Печать  
alexdd писал(а) 19. Мая 2009 :: 08:34:
А что реквизит так и называется [спрКоэффициент]? Там исключение генерируется скорее всего при ВыполнитьСкалярный(), поэтому возвращается -1


Нет. Текст запроса ведь так и не дошел до запроса  Подмигивание Получается что он подготовился на таблице значений.  Улыбка
  
Наверх
 
IP записан
 
Inner Join (c)
Junior Member
**
Отсутствует


I Love BaBB 2!

Сообщений: 23
Зарегистрирован: 15. Октября 2008
Пол: Мужской
Re: ВыполнитьСкалярный() возвращает -1
Ответ #5 - 19. Мая 2009 :: 11:18
Печать  
и чем мог парсеру не угодить "спрКоэффициент"?
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: ВыполнитьСкалярный() возвращает -1
Ответ #6 - 19. Мая 2009 :: 11:42
Печать  
Inner Join (c) писал(а) 19. Мая 2009 :: 07:54:
Доброе время суток!

Люди, кто знает что это значит? Вот код:

Код
Выбрать все
Функция ПодготовитьЗапросЕд()
	ЗапросЕд = СоздатьОбъект("ODBCRecordSet");

	ТекстЗапр = "
	|declare @pe char(9)
	|declare @K float
	|set @pe = ?
	|set @K = ?
	|select top 1
	|e.id [Ед $Справочник.Единицы]
	|from $Справочник.Единицы e (nolock)
	|where e.parentext = @pe and $e.спрКоэффициент = @K and e.ismark = 0
	|";

	Если ЗапросЕд.Подготовить(ТЗ)=0 Тогда
		Сообщить(ЗапросЕд.ПолучитьОписаниеОшибки(),"!");
		Возврат 0;
	Иначе
		ЗапросЕд.ДобПараметр(1,14,9,0);
		ЗапросЕд.ДобПараметр(1,6,10,2);
	КонецЕсли;

	Возврат 1;
КонецФункции	// ПодготовитьЗапросЕд

***************************************

ЗапросЕд.УстПараметр(1,Товар);
ЗапросЕд.УстПараметр(2,Коэф);
_Ед = ЗапросЕд.ВыполнитьСкалярный();

 



На первом элементе товара выдает 0, потому что такого там нет и при проверке на пустое значение обработку элемента пробрасывает. На втором "-1", хотя также нет нужного элемента. И это уже не пустое значение. Ессесн вылетает с ошибкой при обращении к элементу.... Не проверять же значение в дополнение на неотрицательность.   Язык

Где копать то?

1.Зачем так сложно писать ?
вместо  УстПараметр используй УстановитьТекстовыйПараметр
2.1c sql не использует тип float.
3.Выполнить скалярный ( лучше вообще не использовать для таблиц) возвращает  числовое значение, а у тебя select возвращает справочник ( т.е. ) char(9)
надо вместо ВыполнитьСкалярный ВыполнитьИнструкцию

  
Наверх
 
IP записан
 
Inner Join (c)
Junior Member
**
Отсутствует


I Love BaBB 2!

Сообщений: 23
Зарегистрирован: 15. Октября 2008
Пол: Мужской
Re: ВыполнитьСкалярный() возвращает -1
Ответ #7 - 19. Мая 2009 :: 12:43
Печать  
Z1 писал(а) 19. Мая 2009 :: 11:42:
Inner Join (c) писал(а) 19. Мая 2009 :: 07:54:
Доброе время суток!

Люди, кто знает что это значит? Вот код:

Код
Выбрать все
Функция ПодготовитьЗапросЕд()
	ЗапросЕд = СоздатьОбъект("ODBCRecordSet");

	ТекстЗапр = "
	|declare @pe char(9)
	|declare @K float
	|set @pe = ?
	|set @K = ?
	|select top 1
	|e.id [Ед $Справочник.Единицы]
	|from $Справочник.Единицы e (nolock)
	|where e.parentext = @pe and $e.спрКоэффициент = @K and e.ismark = 0
	|";

	Если ЗапросЕд.Подготовить(ТЗ)=0 Тогда
		Сообщить(ЗапросЕд.ПолучитьОписаниеОшибки(),"!");
		Возврат 0;
	Иначе
		ЗапросЕд.ДобПараметр(1,14,9,0);
		ЗапросЕд.ДобПараметр(1,6,10,2);
	КонецЕсли;

	Возврат 1;
КонецФункции	// ПодготовитьЗапросЕд

***************************************

ЗапросЕд.УстПараметр(1,Товар);
ЗапросЕд.УстПараметр(2,Коэф);
_Ед = ЗапросЕд.ВыполнитьСкалярный();

 



На первом элементе товара выдает 0, потому что такого там нет и при проверке на пустое значение обработку элемента пробрасывает. На втором "-1", хотя также нет нужного элемента. И это уже не пустое значение. Ессесн вылетает с ошибкой при обращении к элементу.... Не проверять же значение в дополнение на неотрицательность.   Язык

Где копать то?

1.Зачем так сложно писать ?
вместо  УстПараметр используй УстановитьТекстовыйПараметр
2.1c sql не использует тип float.
3.Выполнить скалярный ( лучше вообще не использовать для таблиц) возвращает  числовое значение, а у тебя select возвращает справочник ( т.е. ) char(9)
надо вместо ВыполнитьСкалярный ВыполнитьИнструкцию




1. Затем что это вырезка из кода  Подмигивание И этот запрос выполняется порядка 35000 раз. УстановитьТекстовыйПараметр не для этих целей.
2. Мне нужны дробные числа.
3. Зачем же мне не нужна таблица после ВыполнитьИнструкцию, чтоб потом из нее получать справочник. ВыполнитьСкалярный возвращает тот самый, нужный мне один элемент справочника если он подходит по условию или пустое значение если нет.

Z1, не надо все усложнять. Я обратился за помощью с другой проблемой, которая уже решена. Вы же решили поискать недостатки в моем коде и при этом сами допустили ошибку. Это не похоже на желание помочь решить проблему, а похоже на желание поучить. Думаю в нашем случае это неуместно.

ЗЫ Z1, без обид Подмигивание Я всегда приветствую желание человека помочь.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать