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



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

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

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

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #16 - 30. Августа 2010 :: 12:14
Печать  
так поименованные параметры тебе и  позволят  привязать
конкретную колонку к другому по порядку параметру sql

это тоже самое если пишешь
insert into tabl1 VALUES (1,2,3) то нужно упорядочивать колонки как они определены в таблице

если же указать явно столбцы то порядок не важен
insert into tabl1( kol_3,kol_2,kol_1 ) VALUES (3,2,1)
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



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

это тоже самое если пишешь
insert into tabl1 VALUES (1,2,3) то нужно упорядочивать колонки как они определены в таблице

если же указать явно столбцы то порядок не важен
insert into tabl1( kol_3,kol_2,kol_1 ) VALUES (3,2,1)


че-то не врубился...

Я же вставляю не вручную, а при помощи "ВыполнитьSQL_ИзТЗ".
Как я понял ты предлагаешь в списке колонок команды INSERT указать колонки в том порядке, в котором они содержатся в ТЗ?
В этом случае мне поименованные параметры никакого преимущества не дают. В этом случае порядок определяется порядком в команде INSERT. И все равно получается что я привязываюсь к порядку колонок в ТЗ.
  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #18 - 30. Августа 2010 :: 12:21
Печать  
А кажется врубился: ты все-таки говоришь про порядок КОЛОНОК в SQL-таблице в команде INSERT. А я говорю про порядок колонок в ТЗ для работы команды "ВыполнитьSQL_ИзТЗ"
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #19 - 30. Августа 2010 :: 12:30
Печать  
es3000 писал(а) 30. Августа 2010 :: 12:21:
А кажется врубился: ты все-таки говоришь про порядок КОЛОНОК в SQL-таблице в команде INSERT. А я говорю про порядок колонок в ТЗ для работы команды "ВыполнитьSQL_ИзТЗ"

insert  приведен только как наглядный пример.
с поименоваными параметрами просто аналогичная ситуация.

Смотри если есть хранимая процедура
CREATE PROCEDURE test_xp
@kl1  char(9)
,@kl2  char(9)
,@kl3  char(9)
as
......

То если мы ее вызовем
как
EXEC test_xp <Зн1>,  <Зн2>, <Зн3>
здесь порядок жестко фиксирован.

Можем же эту процедуру вызвать и по другому
EXEC test_xp @kl3 = <Зн3>,  @kl2 = <Зн2>, @kl1 = <Зн1>


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



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #20 - 30. Августа 2010 :: 13:03
Печать  
Я понял.
Но для "ВыполнитьSQL_ИзТЗ" поименованные параметры не помогут Печаль
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

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

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



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

Код
Выбрать все
insert into aaa (f1, f2, f3) values (?, ?, ?)  



при этом допустим что колонки в ТЗ расположены в таком порядке: k2, k3, k1
  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #23 - 30. Августа 2010 :: 17:00
Печать  
Что-то мне кажется, что запись ТЗ в базу при помощи "ВыполнитьSQL_ИзТЗ" стало медленнее работать, чем сохранение ТЗ построчно.

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



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #24 - 30. Августа 2010 :: 17:08
Печать  
es3000 писал(а) 30. Августа 2010 :: 17:00:
Что-то мне кажется,...
Может такое быть?

кажется - креститься надо.
научить замеры делать?
  

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



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #25 - 06. Сентября 2010 :: 12:55
Печать  
через день-два сделаю замер - выложу...
  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #26 - 07. Сентября 2010 :: 06:30
Печать  
Записываем ...
Время записи таблицы документа построчно: 72.954с
Время записи таблицы документа при помощи ExeSQL_FromTV: 148.771с

Количество строк: 20-30тыс.

Так что замедление ощутимое, хотя ожидалось ускорение Печаль
  
Наверх
ICQ  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #27 - 07. Сентября 2010 :: 06:44
Печать  
а можно посмотреть код первого и второго теста?
  

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



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #28 - 07. Сентября 2010 :: 06:56
Печать  
Еще более интересные результаты, теперь замерил при разных значениях второго параметра "кол-во строк":

Время записи таблицы  документа построчно: 74.25с
Время записи таблицы  документа при помощи ExeSQL_FromTV (кол-во строк = 10): 177.283с
Время записи таблицы  документа при помощи ExeSQL_FromTV (кол-во строк = 100): -1124.513с
Время записи таблицы  документа при помощи ExeSQL_FromTV (кол-во строк = 200): 96.092с
Время записи таблицы  документа при помощи ExeSQL_FromTV (кол-во строк = 500): 192.257с
Время записи таблицы  документа при помощи ExeSQL_FromTV (кол-во строк = 1000): 122.371с
Время записи таблицы  документа при помощи ExeSQL_FromTV (кол-во строк = 2000): 142.18с
Время записи таблицы  документа при помощи ExeSQL_FromTV (кол-во строк = 5000): 125.863с


Почему отрицательное число выскочило - х\з
  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #29 - 07. Сентября 2010 :: 07:09
Печать  
Мой код:
Код
Выбрать все
Функция ПодготовитьТекстЗапроса(пТекстЗапроса)

	мИмяТаблицыМногострочнойЧастиДокумента = "_dt1859";
	мИмяТаблицыМногострочнойЧасти = "_dt1859_x";
	мИмяИндексаТаблицыМногострочнойЧасти = "PK_dt1859_x";

	лТекстЗапроса = пТекстЗапроса;

	лТекстЗапроса = СтрЗаменить(лТекстЗапроса, "$ДокументСтроки.Таблица.Реквизит", "$ДокументСтроки.ВыгрузкаДанных");
	лТекстЗапроса = СтрЗаменить(лТекстЗапроса, "$ДокументСтроки.Таблица.Таблица", мИмяТаблицыМногострочнойЧасти);
	лТекстЗапроса = СтрЗаменить(лТекстЗапроса, "$ДокументСтроки.Таблица.Индекс", мИмяИндексаТаблицыМногострочнойЧасти);

	лТекстЗапроса = СтрЗаменить(лТекстЗапроса, "$ДокументСтроки.ТаблицаДокумента", мИмяТаблицыМногострочнойЧастиДокумента);

	Возврат лТекстЗапроса;

КонецФункции


Функция ЗаписатьТаблица_УдалитьСтроки(пТекущийДокумент)

	пРС = СоздатьОбъект("ODBCRecordset");

	пРС.УстановитьТекстовыйПараметр("ТЧ_ГУИД", пТекущийДокумент.ГУИД);
	лТекстЗапроса = "DELETE FROM $ДокументСтроки.Таблица.Таблица WHERE $ДокументСтроки.Таблица.Реквизит.ТЧ_ГУИД = :ТЧ_ГУИД";
	лТекстЗапроса = ПодготовитьТекстЗапроса(лТекстЗапроса);
	лРез = пРС.Выполнить(лТекстЗапроса);
	Если лРез <> 1 Тогда
		Предупреждение("Ошибка при записи документа!" + РазделительСтрок + пРС.ПолучитьОписаниеОшибки());
		Возврат 0;
	КонецЕсли;

	Возврат 1;

КонецФункции


Функция ЗаписатьТаблица_ПоЗаписям()

	лВремяНачалоДействия = _GetPerformanceCounter();

	Мета = СоздатьОбъект("MetaDataWork");
	рс = СоздатьОбъект("ODBCRecordset");
	лТекущийДокумент = мКонтекст.ТекущийДокумент();

	//Сообщить("Удаляем строки");
	ЗаписатьТаблица_УдалитьСтроки(рс, лТекущийДокумент);

	лТекстЗапроса = "insert into $ДокументСтроки.Таблица.Таблица (
			|
			|iddoc,
			|LINENO_,
			|
			|$ДокументСтроки.Таблица.Реквизит.ТЧ_ГУИД,
			|$ДокументСтроки.Таблица.Реквизит.id,
			|$ДокументСтроки.Таблица.Реквизит.address,
			|$ДокументСтроки.Таблица.Реквизит.Адрес,
			|$ДокументСтроки.Таблица.Реквизит.Область,
			|$ДокументСтроки.Таблица.Реквизит.Город,
			|$ДокументСтроки.Таблица.Реквизит.Улица,
			|$ДокументСтроки.Таблица.Реквизит.ЕстьУлица,
			|$ДокументСтроки.Таблица.Реквизит.Дом,
			|$ДокументСтроки.Таблица.Реквизит.ЕстьДом,
			|$ДокументСтроки.Таблица.Реквизит.МногоквартирныйДом,
			|$ДокументСтроки.Таблица.Реквизит.ДомНулеваяСтрока,
			|$ДокументСтроки.Таблица.Реквизит.Квартира,
			|$ДокументСтроки.Таблица.Реквизит.КвартираНулеваяСтрока,
			|$ДокументСтроки.Таблица.Реквизит.НеУказанаКвартираВМногоквартирномДоме,
			|$ДокументСтроки.Таблица.Реквизит.ЕстьКвартира,
			|$ДокументСтроки.Таблица.Реквизит.Физлицо,
			|$ДокументСтроки.Таблица.Реквизит.ПризнакФизлица)
			|
			|values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
	лТекстЗапроса = ПодготовитьТекстЗапроса(лТекстЗапроса);

 	рс.ДобПараметр(1,14,9,0);
 	рс.ДобПараметр(1,3,0,0);
 	рс.ДобПараметр(1,14,50,0);
 	рс.ДобПараметр(1,14,10,0);
 	рс.ДобПараметр(1,14,100,0);
 	рс.ДобПараметр(1,14,512,0);
 	рс.ДобПараметр(1,14,99,0);
 	рс.ДобПараметр(1,14,99,0);
 	рс.ДобПараметр(1,14,99,0);
 	рс.ДобПараметр(1,14,1,0);
 	рс.ДобПараметр(1,14,10,0);
 	рс.ДобПараметр(1,4,1,0);
 	рс.ДобПараметр(1,4,1,0);
 	рс.ДобПараметр(1,4,1,0);
 	рс.ДобПараметр(1,14,10,0);
 	рс.ДобПараметр(1,4,1,0);
 	рс.ДобПараметр(1,4,1,0);
 	рс.ДобПараметр(1,4,1,0);
 	рс.ДобПараметр(1,14,9,0);
 	рс.ДобПараметр(1,4,1,0);

	рс.Подготовить(лТекстЗапроса);

	ТЗ.ВыбратьСтроки();
	Пока ТЗ.ПолучитьСтроку() = 1 Цикл

		//Сообщить("НомерСтроки: " + ТЗ.НомерСтроки);
		//Сообщить("Запись строки документа: " + ТЗ.НомерСтроки + "    " + ТЗ.НомерСтроки());
		Состояние("Запись строки документа: " + ТЗ.НомерСтроки);

		рс.УстПараметр(1, лТекущийДокумент);
		рс.УстПараметр(2, ТЗ.НомерСтроки);
		рс.УстПараметр(3, мКонтекст.ГУИД);
		рс.УстПараметр(4, ТЗ.id);
		рс.УстПараметр(5, ТЗ.address);
		рс.УстПараметр(6, ТЗ.Адрес);
		рс.УстПараметр(7, ТЗ.Область);
		рс.УстПараметр(8, ТЗ.Город);
		рс.УстПараметр(9, ТЗ.Улица);
		рс.УстПараметр(10, ТЗ.ЕстьУлица);
		рс.УстПараметр(11, ТЗ.Дом);
		рс.УстПараметр(12, ТЗ.ЕстьДом);
		рс.УстПараметр(13, ТЗ.МногоквартирныйДом);
		рс.УстПараметр(14, ТЗ.ДомНулеваяСтрока);
		рс.УстПараметр(15, ТЗ.Квартира);
		рс.УстПараметр(16, ТЗ.КвартираНулеваяСтрока);
		рс.УстПараметр(17, ТЗ.ЕстьКвартира);
		рс.УстПараметр(18, ТЗ.НеУказанаКвартираВМногоквартирномДоме);
		рс.УстПараметр(19, ТЗ.Физлицо);
		рс.УстПараметр(20, ТЗ.ПризнакФизлица);

		//Сообщить("тип значения ""квартира"":" + ТипЗначенияСтр(ТЗ.Квартира));
		//Сообщить("тип значения ""адрес распознан"":" + ТипЗначенияСтр(ТЗ.АдресРаспознан));

		лРез = 0;
		Попытка
			рс.ВыполнитьСкалярный();
			лРез = 1;
		Исключение
		КонецПопытки;

		Если лРез <> 1 Тогда
			Предупреждение("Ошибка при записи документа!" + РазделительСтрок + рс.ПолучитьОписаниеОшибки());
			Возврат 0;
		КонецЕсли;

	КонецЦикла;

    лВремяКонецДействия =_GetPerformanceCounter();
	лВремяДействия = лВремяКонецДействия - лВремяНачалоДействия;
	лВремяДействияВСек = лВремяДействия / 1000;
	Сообщить("Время записи таблицы  документа построчно: " + лВремяДействияВСек + "с");

	Возврат 1;

КонецФункции

 


  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 3 4 5
ОтправитьПечать