Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Ошибка Query.Prepare (число прочтений - 3686 )
Spider_kz
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 7
Местоположение: Актобе
Зарегистрирован: 04. Декабря 2009
Пол: Мужской
Ошибка Query.Prepare
04. Декабря 2009 :: 08:25
Печать  
Создал хранимую процедуру на сервере, пытаюсь обратиться к ней с помощью функции:

Функция ПолучитьОстатки(Номенклатура,Склад,Цена,ИндДок) Экспорт
  _ЗапускаемаяХранимаяПроцедура="_1sp_R_405__Ostatki_Na";
  RBS = СоздатьОбъект("MetaDataWork");
  ТекстSELECT="
  | @ID_Товар='"+RBS.ValueToDBString(Номенклатура)+"',
  | @ID_Склад='"+RBS.ValueToDBString(Склад)+"',
  | @Цена='"+Цена+"',
  | @ПозицияДокумента='"+ИндДок+"'";
 
  ТекстSELECT=_ЗапускаемаяХранимаяПроцедура+ТекстSELECT;
  КолВ=0;
  Query = СоздатьОбъект("Query");
  If Query.Prepare(ТекстSELECT)=1 Then // исполняем
    If Query.Open()=1 Then // открываем результаты
     Query.GotoNext(); // переходим на первую (или следующую) запись
     While Query.IsOK()=1 Do // пока запись получена
       КолВ=КолВ+Число(Query.GetString(1));
       Query.GotoNext();
     EndDo;
     Query.Close();
    Else
     Предупреждение("Ошибка Query.Open");
     возврат 0;
    EndIf;
    Query.Reset();
  Else
    Предупреждение("Ошибка Query.Prepare");
    возврат 0;
  EndIf;
 
  Возврат КолВ;
 
КонецФункции

При запуске выбивает:
If Query.Prepare(ЗапросSELECT)=1 Then // исполняем
{Глобальный модуль(7169)}: поле агрегатного объекта не обнаружено (Prepare)

я так полагаю что-то не прогружается, но вот что?
  
Наверх
GTalkICQ  
IP записан
 
U_zer
Экс-Участник


Re: Ошибка Query.Prepare
Ответ #1 - 04. Декабря 2009 :: 08:40
Печать  
А что это за объект такой, Query? Если стандартный 1С , тогда правильно и пишет, нет такого метода у него.
  
Наверх
 
IP записан
 
Spider_kz
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 7
Местоположение: Актобе
Зарегистрирован: 04. Декабря 2009
Пол: Мужской
Re: Ошибка Query.Prepare
Ответ #2 - 04. Декабря 2009 :: 08:52
Печать  
Упс, объект конечно же "Запрос", с автозаменой перестарался. вернее это вчера работало в таком варианте

Query = СоздатьОбъект("Запрос");
  If Query.Prepare(ТекстSELECT,1,1)=1 Then

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Ошибка Query.Prepare
Ответ #3 - 04. Декабря 2009 :: 08:54
Печать  
(0) а где exec или call и пробел между название процедуры и первым параметром
легче привести работающий пример
Код
Выбрать все
Процедура Тест_хран_проц(ЧислоДней)
		rc = СоздатьОбъект("ODBCRecordSet");
		ТекстЗапроса = "exec dbo.get_all " + СокрЛП(ЧислоДней);
		ТЗ =  rc.ВыполнитьИнструкцию(ТекстЗапроса);
		rc.Закрыть();
		ТЗ.ВыбратьСтроку();
КонецПроцедуры
 

  
Наверх
 
IP записан
 
Spider_kz
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 7
Местоположение: Актобе
Зарегистрирован: 04. Декабря 2009
Пол: Мужской
Re: Ошибка Query.Prepare
Ответ #4 - 11. Декабря 2009 :: 11:09
Печать  
переделал в

Query = СоздатьОбъект("ODBCRecordSet");
  //cast( 'ИндДок' as datetime );
  ТекстSELECT="
  | @ID_Товар='"+Номенклатура+"',
  | @ID_Склад='"+Склад+"',
  | @Цена='"+Цена+"',
  | @ПозицияДокумента='"+ИндДок+"'";
  Query.Отладка();
  Query.ОбратныйРасчетОтТА(1);
  ТекстSELECT="exec _1sp_R_6287__Ostatki_Na "+ТекстSELECT;
  КолВ=0;
  If Query.ВыполнитьИнструкцию(ТекстSELECT)=1 Then

затыкается на последней строчке

message [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting datetime from character string

понимаю несоответствие типов, а как исправить?
  
Наверх
GTalkICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Ошибка Query.Prepare
Ответ #5 - 11. Декабря 2009 :: 11:38
Печать  
Наверное так

вместо ИндДок
надо
cast( left(ИндДок,8) as datetime )
  
Наверх
 
IP записан
 
Spider_kz
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 7
Местоположение: Актобе
Зарегистрирован: 04. Декабря 2009
Пол: Мужской
Re: Ошибка Query.Prepare
Ответ #6 - 11. Декабря 2009 :: 11:40
Печать  
Функция не обнаружена (cast)
  
Наверх
GTalkICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Ошибка Query.Prepare
Ответ #7 - 11. Декабря 2009 :: 11:44
Печать  
Spider_kz писал(а) 11. Декабря 2009 :: 11:40:
Функция не обнаружена (cast)

Только что в qa отработал
select cast('20091212' as datetime) и вернул дату


поставь Query.Отладка(1);
и смотри на запрос или выложи что получится здесь.
  
Наверх
 
IP записан
 
Spider_kz
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 7
Местоположение: Актобе
Зарегистрирован: 04. Декабря 2009
Пол: Мужской
Re: Ошибка Query.Prepare
Ответ #8 - 11. Декабря 2009 :: 11:51
Печать  
Проведение документа: 01.10.09 Реализация товаров АК0000000189885
exec _1sp_R_6287__Ostatki_Na
@ID_Товар='Либелла Гранат 0,5л (н/газ)',
@ID_Склад='Основной склад',
@Цена='',
@ПозицияДокумента='Реализация товаров АК0000000189885 (01.10.09)'
If Query.ВыполнитьИнструкцию(ТекстSELECT)=1 Then // исполняем
{Глобальный модуль(7168)}: State 22007, native 241, message [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting datetime from character string.

просто дальше это уходит в хранимую процедуру а там и позиция используется и дата

DECLARE @ДатаНачалаМесяца datetime, @ДатаНачалаПредыдущегоМесяца datetime
SELECT цияДокумента,8))
SELECT @ДатаНачалаПредыдущегоМесяца=DateAdd(mm,-1,@ДатаНачалаМесяца)
  
Наверх
GTalkICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Ошибка Query.Prepare
Ответ #9 - 11. Декабря 2009 :: 11:58
Печать  
а так
Query = СоздатьОбъект("ODBCRecordSet");
//cast( 'ИндДок' as datetime );
ТекстSELECT="
| @ID_Товар='"+Номенклатура+"',
| @ID_Склад='"+Склад+"',
| @Цена='"+Цена+"',
| @ПозицияДокумента=:МояПозиция";
Query.УстановитьТекстовыйПараметр("МояПозиция", ИндДок);

Query.Отладка(1);
Query.ОбратныйРасчетОтТА(1);
ТекстSELECT="exec _1sp_R_6287__Ostatki_Na "+ТекстSELECT;
КолВ=0;
If Query.ВыполнитьИнструкцию(ТекстSELECT)=1 Then


поставь пока пустую хранимую процедуру а то не понятно ошибка при передаче параметров или внутри хп
  
Наверх
 
IP записан
 
Spider_kz
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 7
Местоположение: Актобе
Зарегистрирован: 04. Декабря 2009
Пол: Мужской
Re: Ошибка Query.Prepare
Ответ #10 - 11. Декабря 2009 :: 12:10
Печать  
Проведение документа: 01.10.09 Реализация товаров АК0000000189885
exec _1sp_R_6287__Ostatki_Na
@ID_Товар='Либелла Гранат 0,5л (н/газ)',
@ID_Склад='Основной склад',
@Цена='',
@ПозицияДокумента='  ASK5A  '
  
Наверх
GTalkICQ  
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Ошибка Query.Prepare
Ответ #11 - 11. Декабря 2009 :: 13:41
Печать  
Только мне одному непонятно, что у Автора в ИндДок?
//Добавлю
Правила обозначения Модификаторов из документации
Цитата:
4: Позиция переданного объекта в формате date_time_iddoc.

Таким образом, если у тебя ИндДок - это ссылка на Документ, то указать надо так:
ТекстSELECT="
| @ID_Товар='"+Номенклатура+"',
| @ID_Склад='"+Склад+"',
| @Цена='"+Цена+"',
| @ПозицияДокумента=:МояПозиция~~~~";
Query.УстановитьТекстовыйПараметр("МояПозиция", ИндДок);
  
Наверх
ICQ  
IP записан
 
Spider_kz
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 7
Местоположение: Актобе
Зарегистрирован: 04. Декабря 2009
Пол: Мужской
Re: Ошибка Query.Prepare
Ответ #12 - 20. Декабря 2009 :: 05:08
Печать  
Однако в таком случае получатся

@ПозицияДокумента='200910013KF76O  ASK5A  '
If Query.ВыполнитьИнструкцию(ТекстSELECT)=1 Then // исполняем
{Глобальный модуль(7172)}: State 42000, native 8114, message [Microsoft][ODBC SQL Server Driver][SQL Server]Error converting data type varchar to numeric.
  
Наверх
GTalkICQ  
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Ошибка Query.Prepare
Ответ #13 - 21. Декабря 2009 :: 05:44
Печать  
Если у тебя Позиция в хранимой процедуре объявлена как Дата_тайм, то зачем тогда тебе это: Left(@ПозицияДокумента,8)? Вобщем, либо в хранимой процедуре править, например установив параметр "ПозицияДокумента" в char(23), либо в тексте запроса передавать Дату в виде
Код
Выбрать все
ДатаЗапроса=Формат(ИндДок.ДатаДок,"ДГГГГММДД");
| @ПозицияДокумента=:МояПозиция~~";
Query.УстановитьТекстовыйПараметр("МояПозиция", ДатаЗапроса); 


Либо править в консерватории
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать