Переключение на Главную Страницу Страницы: [1] 2 3 ... 5 ОтправитьПечать
Очень популярная тема (более 25 ответов) Не работает ВыполнитьSQL_ИзТЗ (число прочтений - 11901 )
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Не работает ВыполнитьSQL_ИзТЗ
30. Августа 2010 :: 09:35
Печать  
Код
Выбрать все
	рс = СоздатьОбъект("ODBCRecordset");
	лТекущийДокумент = мКонтекст.ТекущийДокумент();

	лТЗ = СоздатьОбъект("ТаблицаЗначений");
	лТЗ.НоваяКолонка("iddoc");
	лТЗ.НоваяКолонка("lineno_");
	лТЗ.НоваяКолонка("ТЧ_ГУИД");
	лТЗ.НоваяКолонка("id");
	лТЗ.НоваяКолонка("address");
	лТЗ.НоваяКолонка("Улица");
	лТЗ.НоваяКолонка("Дом");
	лТЗ.НоваяКолонка("Квартира");
	лТЗ.НоваяКолонка("Физлицо");
	лТЗ.НоваяКолонка("ЕстьРасход");
	лТЗ.НоваяКолонка("Услуга");
	лТЗ.НоваяКолонка("Кубы");
	лТЗ.НоваяКолонка("ТарифУслуги");

        //
        // заполняем таблицу данными
        //
	мТабПотребление.Выбратьстроки();
	Пока мТабПотребление.ПолучитьСтроку() = 1 Цикл
		лТЗ.НоваяСтрока();
		лТЗ.iddoc = лТекущийДокумент;
		лТЗ.lineno_ = лТЗ.НомерСтроки;
		лТЗ.ТЧ_ГУИД = лТекущийДокумент.ГУИД;
		лТЗ.id = "";
		лТЗ.address = мТабПотребление.address;
		лТЗ.Улица = мТабПотребление.Улица;
		лТЗ.Дом = мТабПотребление.Дом;
		лТЗ.Квартира = мТабПотребление.Квартира;
		лТЗ.Физлицо = мТабПотребление.Физлицо;
		лТЗ.ЕстьРасход = мТабПотребление.ЕстьРасход;
		лТЗ.Услуга = мТабПотребление.Услуга;
		лТЗ.Кубы = мТабПотребление.Кубы;
		лТЗ.ТарифУслуги = мТабПотребление.ТарифУслуги;
	КонецЦикла;


	лТЗ.УстановитьПараметрыКолонки("iddoc",	"Строка",	9, , , , , );
	лТЗ.УстановитьПараметрыКолонки("lineno_", "Число",	, , , , , );
 	лТЗ.УстановитьПараметрыКолонки("ТЧ_ГУИД", 	"Строка",	50, , , , ,);
 	лТЗ.УстановитьПараметрыКолонки("id", "Строка", 10, , , , ,);
 	лТЗ.УстановитьПараметрыКолонки("address", "Строка", 100, , , , ,);
 	лТЗ.УстановитьПараметрыКолонки("Улица", "Строка", 99, , , , ,);
 	лТЗ.УстановитьПараметрыКолонки("Дом", 	"Строка", 10, , , , ,);
 	лТЗ.УстановитьПараметрыКолонки("Квартира", 	"Строка", 	10, , , , ,);
 	лТЗ.УстановитьПараметрыКолонки("Физлицо", "Справочник.ФизическиеЛица",	, , , , ,);
 	лТЗ.УстановитьПараметрыКолонки("ЕстьРасход","Число", 1, , , , ,);
 	лТЗ.УстановитьПараметрыКолонки("Услуга", "Справочник.УслугиСоцзащиты",	, , , , ,);
 	лТЗ.УстановитьПараметрыКолонки("Кубы",	"Число",10, 2, , , ,);
 	лТЗ.УстановитьПараметрыКолонки("ТарифУслуги", "Число", 10, 2, , , ,);


	лТекстЗапроса = "insert into dt1870_x2 (
			|
			|iddoc,
			|LINENO_,
			|
			|sp1908,
			|sp1910,
			|sp1911,
			|sp1912,
			|sp1914,
			|sp1915,
			|sp1916,
			|sp1917,
			|sp1918,
			|sp1919,
			|sp1920
			|
			|values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
	рс.Подготовить(лТекстЗапроса);
	рс.ExeSQL_FromTV(лТЗ);
 



выдается ошибка:
Код
Выбрать все
Произошла ошибка при формировании автоматических параметров.                
Необходимо выполнить подготовку запроса или проверить синтаксис!
 State 07009, native 0, message [Microsoft][ODBC SQL Server Driver]Недопустимый индекс дескриптора
рс.ExeSQL_FromTV(лТЗ);
 



Что у меня неправильно?
Помогите пожалуйста
  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #1 - 30. Августа 2010 :: 09:37
Печать  
Забыл написать, что таблица dt1870_x2 - это копия таблицы многострочной части документа.

Поля по номером 9 и 11 - это элементы справочников. Типы этих справочников я и указал в параметрах соответствующих колонок таблицы значений.

Может надо что-то еще указать?
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #2 - 30. Августа 2010 :: 10:14
Печать  
не показал как задаешь тип параметров.
у документов lineno_  имеет тип smallint
а ты скорее всего передаешь как int
Для поля входящее в  primary key это наверное недопустимо
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #3 - 30. Августа 2010 :: 10:20
Печать  
Z1 писал(а) 30. Августа 2010 :: 10:14:
не показал как задаешь тип параметров.
у документов lineno_  имеет тип smallint
а ты скорее всего передаешь как int
Для поля входящее в  primary key это наверное недопустимо


Я больше ничего не задаю.
Полностью привел весь мой код.

А как надо задавать тип параметров? Можно примерчик?
  
Наверх
ICQ  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #4 - 30. Августа 2010 :: 10:26
Печать  
не хватает ДобПараметр
  

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #5 - 30. Августа 2010 :: 10:29
Печать  
ИХМО лучше на 1с не надеяться а задавать тип самому
смотри  метод recordset :
ДобПараметр / AddParam

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



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #6 - 30. Августа 2010 :: 10:40
Печать  
Спасибо, помогло:
Код
Выбрать все
 	рс.ДобПараметр(1,14,9,0);
 	рс.ДобПараметр(1,3,0,0);
 	рс.ДобПараметр(1,14,50,0);
 	рс.ДобПараметр(1,14,10,0);
 	рс.ДобПараметр(1,14,100,0);
 	рс.ДобПараметр(1,14,99,0);
 	рс.ДобПараметр(1,14,10,0);
 	рс.ДобПараметр(1,14,10,0);
 	рс.ДобПараметр(1,14,9,0);
 	рс.ДобПараметр(1,4,1,0);
 	рс.ДобПараметр(1,14,9,0);
 	рс.ДобПараметр(1,4,10,2);
 	рс.ДобПараметр(1,4,10,2);
 



перед вызовом
Код
Выбрать все
	рс.Подготовить(лТекстЗапроса);
	рс.ExeSQL_FromTV(лТЗ);
 



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



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #7 - 30. Августа 2010 :: 10:41
Печать  
получается что  строки типа:
Код
Выбрать все
лТЗ.УстановитьПараметрыКолонки("iddoc",	"Строка",	9, , , , , ); 



вообще не нужны
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #8 - 30. Августа 2010 :: 10:49
Печать  
es3000 писал(а) 30. Августа 2010 :: 10:41:
получается что  строки типа:
Код
Выбрать все
лТЗ.УстановитьПараметрыКолонки("iddoc",	"Строка",	9, , , , , ); 



вообще не нужны

этой строкой ты задаешь структуру таблицы значений
а тебе еще нужно определить структуру параметров для sql
те которые ? ? ? ?

Также мое ИХМО если уж используешь параметры sql то лучше использовать поименованные параметры.
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #9 - 30. Августа 2010 :: 10:50
Печать  
Еще вопрос.

Метод "ВыполнитьSQL_ИзТЗ" использует порядок колонок для формирования значений параметров.
Из-за этого мне пришлось имеющуюся таблицу значений перекопировать в новую таблицу значений. Только для того чтобы в новой таблице значений порядок колонок соответствовал порядку полей в запросе. Это очень не удобно.

Можно ли изменить в существующей таблице значений порядок колонок? Или же как-то сказать методу "ВыполнитьSQL_ИзТЗ" в каком порядке брать колонки из ТЗ?
  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #10 - 30. Августа 2010 :: 10:52
Печать  
Z1 писал(а) 30. Августа 2010 :: 10:49:
этой строкой ты задаешь структуру таблицы значений
а тебе еще нужно определить структуру параметров для sql
те которые ? ? ? ?

Также мое ИХМО если уж используешь параметры sql то лучше использовать поименованные параметры.


1) Но поскольку структура ТЗ для метода "ВыполнитьSQL_ИзТЗ" не важна, то ее можно явно не задавать. Правильно?
2) Что значит "поименованные параметры"? Как ими пользоваться?
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #11 - 30. Августа 2010 :: 10:58
Печать  
es3000 писал(а) 30. Августа 2010 :: 10:52:
Z1 писал(а) 30. Августа 2010 :: 10:49:
этой строкой ты задаешь структуру таблицы значений
а тебе еще нужно определить структуру параметров для sql
те которые ? ? ? ?

Также мое ИХМО если уж используешь параметры sql то лучше использовать поименованные параметры.


1) Но поскольку структура ТЗ для метода "ВыполнитьSQL_ИзТЗ" не важна, то ее можно явно не задавать. Правильно?
2) Что значит "поименованные параметры"? Как ими пользоваться?

1) Но поскольку структура ТЗ для метода "ВыполнитьSQL_ИзТЗ" не важна, то ее можно явно не задавать. Правильно?
- неправильно откуда 1с узнает что строка это строка а не что либо иное. или как 1с отличит конкретный справочник от справочника общего вида.

поименованный параметр пишешь
values (@iddoc, @lineno итд


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



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #12 - 30. Августа 2010 :: 11:26
Печать  
Цитата:
1) Но поскольку структура ТЗ для метода "ВыполнитьSQL_ИзТЗ" не важна, то ее можно явно не задавать. Правильно?
- неправильно откуда 1с узнает что строка это строка а не что либо иное. или как 1с отличит конкретный справочник от справочника общего вида.


а по типу конкретного значения в ячейке таблицы??

Цитата:
поименованный параметр пишешь
values (@iddoc, @lineno итд


и что это дает?
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #13 - 30. Августа 2010 :: 11:34
Печать  
es3000 писал(а) 30. Августа 2010 :: 11:26:
Цитата:
1) Но поскольку структура ТЗ для метода "ВыполнитьSQL_ИзТЗ" не важна, то ее можно явно не задавать. Правильно?
- неправильно откуда 1с узнает что строка это строка а не что либо иное. или как 1с отличит конкретный справочник от справочника общего вида.


а по типу конкретного значения в ячейке таблицы??

Цитата:
поименованный параметр пишешь
values (@iddoc, @lineno итд


и что это дает?

по типу 1с не может отличить int от smallint
ты пойми sql сервер вообще ничего не знает об 1с и ему вообще то все равно где сформирован запрос главное чтобы запрос был правильным с точки зрения t-sql.

и что это дает?
поименованные параметры дают удобство и большую наглядность.
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #14 - 30. Августа 2010 :: 11:49
Печать  
Z1 писал(а) 30. Августа 2010 :: 11:34:
es3000 писал(а) 30. Августа 2010 :: 11:26:
Цитата:
1) Но поскольку структура ТЗ для метода "ВыполнитьSQL_ИзТЗ" не важна, то ее можно явно не задавать. Правильно?
- неправильно откуда 1с узнает что строка это строка а не что либо иное. или как 1с отличит конкретный справочник от справочника общего вида.


а по типу конкретного значения в ячейке таблицы??

Цитата:
поименованный параметр пишешь
values (@iddoc, @lineno итд


и что это дает?

по типу 1с не может отличить int от smallint
ты пойми sql сервер вообще ничего не знает об 1с и ему вообще то все равно где сформирован запрос главное чтобы запрос был правильным с точки зрения t-sql.

и что это дает?
поименованные параметры дают удобство и большую наглядность.


Хм.. я просто хочу понять...

1) Значения из ТЗ читает 1С. Как я понимаю, в этот момент SQL еще не причем. 1C-ке нужно преобразовать это значение в правильное SQL-значение параметра. То есть ей нужно само значение и описание соответствующего SQL-параметра, чтобы знать как преобразовывать. Так что, в принципе, явное указание типа  значения в ТЗ мне кажется лишним.
Кстати, у меня в вышеприведенном примере, без указания типов колонок ТЗ все работает.
Допустим в ячейке хранится число "5". Какая 1С разница какой тип этого значения в ячейке smallint или int. Главное - это SQL-тип в который надо преобразовать.
Если все-таки явное указание типа значения в ТЗ бывает необходимо, то приведи пример такой ситауции.

2) Опять же в моем примере я нигде вручную параметры не устанавливаю, то есть если я параметры сделаю поименованными то удобства они мне не добавят.
Наглядность - да, сагласен
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 ... 5
ОтправитьПечать