Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Ошибка в параметризованном запросе (число прочтений - 3978 )
newbas
Junior Member
**
Отсутствует



Сообщений: 32
Местоположение: Краснодар
Зарегистрирован: 29. Августа 2008
Пол: Мужской
Ошибка в параметризованном запросе
08. Ноября 2010 :: 01:08
Печать  
Есть запрос
[code]
     ЗапросЦены = СоздатьОбъект("ODBCRecordSet");
     ЗапросЦены.Отладка(0);
     ТекстЗапроса = "
           |SELECT $ПоследнееЗначение.Цены.Цена(СпрЦены.ID, ?) AS Цена
           |
           |FROM $Справочник.Номенклатура AS СпрНоменклатура
           |
           |INNER  JOIN
           |      $Справочник.Цены AS СпрЦены
           |      ON ((СпрЦены.ParentExt = СпрНоменклатура.ID) AND ($СпрЦены.ТипЦен =?))
           |WHERE ((СпрНоменклатура.ISMARK = 0)
           |      AND (СпрНоменклатура.ISFOLDER = 2)
           |      AND (СпрНоменклатура.ID =?)
           |)
           |";
     
     Если ЗапросЦены.Подготовить(ТекстЗапроса) = 0 Тогда
           Сообщить("Ошибка подготовки запроса из-за "+Запросцены.GetLastError());
     КонецЕсли;;
[/code]

[b]При попытке выполнить[/b]

[code]
     Если ЗапросЦены.ПостроитьПараметры() = 1 Тогда
           ЗапросЦены.УстПараметр(1, ВыбДата);
           ЗапросЦены.УстПараметр(1, ТипЦен.ТекущийЭлемент());
           ЗапросЦены.УстПараметр(2, Спр.ТекущийЭлемент());
           Сообщить(ЗапросЦены.ВыполнитьСкалярный());;
     Иначе
           Сообщить("Ошибка подготовки параметров из-за "+Запросцены.GetLastError());
     КонецЕсли;
[/code]
Падает на строке "[b]ЗапросЦены.ПостроитьПараметры()[/b]" с ошибкой
"Ошибка подготовки параметров из-за State 42000, native 4104, message [Microsoft][ODBC SQL Server Driver][SQL Server]Не удалось привязать составной идентификатор "СпрЦены.sp327"."
В чем ошибка?
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ошибка в параметризованном запросе
Ответ #1 - 08. Ноября 2010 :: 07:20
Печать  
Добавляй параметры сам методом ДобПараметр
  
Наверх
 
IP записан
 
newbas
Junior Member
**
Отсутствует



Сообщений: 32
Местоположение: Краснодар
Зарегистрирован: 29. Августа 2008
Пол: Мужской
Re: Ошибка в параметризованном запросе
Ответ #2 - 08. Ноября 2010 :: 07:32
Печать  
Пробовал, но почему-то возвращает 0 - скорей всего проблема с форматом даты.
Какой формат должен быть?
[code]ДобПараметр(1,8,8,0)[/code]
или
[code]ДобПараметр(1,9,17,0)[/code]
  
Наверх
 
IP записан
 
newbas
Junior Member
**
Отсутствует



Сообщений: 32
Местоположение: Краснодар
Зарегистрирован: 29. Августа 2008
Пол: Мужской
Re: Ошибка в параметризованном запросе
Ответ #3 - 08. Ноября 2010 :: 09:55
Печать  
Попробовал переделать вот так:
Код
Выбрать все
	ЗапросЦены.ДобПараметр(1,8,8,0,);
	ЗапросЦены.ДобПараметр(1,14,9,0,);
	ЗапросЦены.ДобПараметр(1,14,9,0,);

	ЗапросЦены.УстПараметр(1, ВыбДата);
	ЗапросЦены.УстПараметр(2, ТипЦен.ТекущийЭлемент());
	ЗапросЦены.УстПараметр(3, Спр.ТекущийЭлемент());
	Сообщить(ЗапросЦены.ВыполнитьСкалярный()); 



Падает на
Код
Выбрать все
Сообщить(ЗапросЦены.ВыполнитьСкалярный()) 



С ошибкой "State HYC00, native 0, message [Microsoft][ODBC SQL Server Driver]Дополнительная возможность не реализована"
« Последняя редакция: 08. Ноября 2010 :: 11:11 - newbas »  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ошибка в параметризованном запросе
Ответ #4 - 08. Ноября 2010 :: 11:11
Печать  
newbas писал(а) 08. Ноября 2010 :: 09:55:
Попробовал переделать вот так:
Код
Выбрать все
	ЗапросЦены.ДобПараметр(1,8,8,0,);
	ЗапросЦены.ДобПараметр(1,14,9,0,);
	ЗапросЦены.ДобПараметр(1,14,9,0,);

	ЗапросЦены.УстПараметр(1, ВыбДата);
	ЗапросЦены.УстПараметр(1, ТипЦен.ТекущийЭлемент());
	ЗапросЦены.УстПараметр(2, Спр.ТекущийЭлемент());
	Сообщить(ЗапросЦены.ВыполнитьСкалярный()); 



А почему два раза устанавливается первый параметр и не устанавливается третий?
  
Наверх
 
IP записан
 
newbas
Junior Member
**
Отсутствует



Сообщений: 32
Местоположение: Краснодар
Зарегистрирован: 29. Августа 2008
Пол: Мужской
Re: Ошибка в параметризованном запросе
Ответ #5 - 08. Ноября 2010 :: 11:14
Печать  
JohnyDeath писал(а) 08. Ноября 2010 :: 11:11:
А почему два раза устанавливается первый параметр и не устанавливается третий?

Да это опечатка при вставке на форум.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ошибка в параметризованном запросе
Ответ #6 - 08. Ноября 2010 :: 11:18
Печать  
А, кстати, виртуальные таблицы вроде как в параметризованных запросах не поддерживаются.
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Ошибка в параметризованном запросе
Ответ #7 - 08. Ноября 2010 :: 11:22
Печать  
Попробуй сначала определить на какой '?' ругается, пойди методом исключений, установи конкретные значение для всех полей, потом заменяй их ? и строй параметры и подготавливай запрос.
Для того '?' где будет ругаться построй самый простой запрос и разберись в чем причина.
У меня есть параметризованные с датами и все нормально работает.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ошибка в параметризованном запросе
Ответ #8 - 08. Ноября 2010 :: 11:26
Печать  
Параметр даты вот так попробуй добавить:
Код
Выбрать все
ДобПараметр(1,10,17,0) 

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



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

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



Сообщений: 32
Местоположение: Краснодар
Зарегистрирован: 29. Августа 2008
Пол: Мужской
Re: Ошибка в параметризованном запросе
Ответ #10 - 23. Ноября 2010 :: 12:25
Печать  
Вопрос решил таким образом

Код
Выбрать все
ЗапросЦены	= СоздатьОбъект("ODBCRecordset");
Если ТипГраницыЦен = "Дата" Тогда    // из контекста подбора передали дату
	ВыбДата		= Строка(Формат(ГраницаРасчетаЦен, "ДГГГГММДД"));
Иначе
	врДата		= Сред(ГраницаРасчетаОстатков, 2, 8);    //Дата документа
	СтрДатыТА	= Строка(Формат(врДата,"ДГГГГММДД"));	// Получаем позицию расчета цен
КонецЕсли;

ТекстЗапроса = "
    |SELECT
    |    $ПоследнееЗначение.Цены.Цена(СпрЦены.ID,:ВыбДата)
    |FROM
    |    $Справочник.Номенклатура as СпрН
    |INNER JOIN
    |    $Справочник.Цены AS СпрЦены ON СпрЦены.ParentExt = СпрН.ID
    |WHERE
    |    $СпрЦены.ТипЦен =:ВыбТипЦен
    |    and СпрН.ID = ?
    |";

ЗапросЦены.УстановитьТекстовыйПараметр("ВыбДата", ТекущаяДата());
Если ТипЦен.Рассчитывается = 1 Тогда
	врТипЦен	= ТипЦен.БазовыйТипЦен.ТекущийЭлемент();
Иначе
	врТипЦен	= ТипЦен.ТекущийЭлемент();
КонецЕсли;
ЗапросЦены.УстановитьТекстовыйПараметр("ВыбТипЦен", врТипЦен.ТекущийЭлемент());
ЗапросЦены.Подготовить(ТекстЗапроса);
ЗапросЦены.ДобПараметр(1,14,9,0);
 

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Ошибка в параметризованном запросе
Ответ #11 - 23. Ноября 2010 :: 12:39
Печать  
(10) ИХМО плохо использовать и параметры ?
и УстановитьТекстовыйПараметр
выберите что либо одно
а при таком подходе только теряете в производительности.
  
Наверх
 
IP записан
 
newbas
Junior Member
**
Отсутствует



Сообщений: 32
Местоположение: Краснодар
Зарегистрирован: 29. Августа 2008
Пол: Мужской
Re: Ошибка в параметризованном запросе
Ответ #12 - 23. Ноября 2010 :: 12:42
Печать  
Почему теряю - этот код - код подготовки запроса. результаты вызываются так:
Код
Выбрать все
	Если ТекущийЭлемент().ЭтоГруппа() = 1 Тогда
		Возврат "";
	ИначеЕсли ЗапросЦены.КолвоПараметров() <> 0 Тогда
		ЗапросЦены.УстПараметр(1, МетаВорк.ЗначениеВСтрокуБД(ТекущийЭлемент()));
		врЦена = ЗапросЦены.ВыполнитьСкалярный();
		Если ТипЦен.Рассчитывается = 1 Тогда
			// Пересчитаем цену в соответствии с наценкой
			врЦена	= глОкруглить(врЦена-0.01*врЦена*ТипЦен.Процент, ТипЦен.ПорядокОкругления);
		КонецЕсли;
		Возврат Формат(врЦена,"Ч014.2.,");
	КонецЕсли; 



Вызов осуществляется из формулы колонки формы списка
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать