Переключение на Главную Страницу Страницы: 1 ... 3 4 [5] 6 7 8 ОтправитьПечать
Очень популярная тема (более 25 ответов) Выборка остатков прямым запросом (число прочтений - 30184 )
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #60 - 23. Сентября 2010 :: 05:02
Печать  
(leshik) получилось надо выполнитьскалярный() заменить на выполнить(). Здесь это принципиально.
Код
Выбрать все
Процедура Сформировать21()
 	спр=СоздатьОбъект("Справочник.СкладскиеЯчейки");
	стрдатыТА=строка(формат(НачМесяца(ПолучитьДатуТА()),"ДГГГГММДД"));
	стрдатыТА = " cast('" + стрдатыТА + "' as " +  ТипДата_sql  + "  )";
    глОстТовара = СоздатьОбъект("ODBCRecordset");
ТекстЗапроса = "
	 |SET NOCOUNT ON
     |declare @ВыбЯчейка  Char(9)
     |SET @ВыбЯчейка = ?
     |SELECT
     |	SUM($Рег.ОстатокТовара)
     |FROM
     |	$РегистрИтоги.ОстаткиТоваров Рег (NoLock)
     |WHERE
     |	Рег.PERIOD="+стрдатыТА+" AND
     |	$Рег.СклЯчейка = @ВыбЯчейка
     |";
	Если глОстТовара.Подготовить(ТекстЗапроса)=0 тогда
	     сообщить("Ошибка подготовки запроса остатков по складу (гл)! "+глОстТовара.ПолучитьОписаниеОшибки()+РазделительСтрок+"Свяжитесь с админитсратором!!!");
     КонецЕсли;
	глОстТовара.ПостроитьПараметры();
     Для Инд=1 По 10 Цикл
	     Сообщить("Попытка № "+Инд);
    
	     спр.ВыбратьЭлементы(0);
	     А=0;
	     ОбщееНачало=_GetPerformanceCounter();
	     Пока Спр.ПолучитьЭлемент()=1 Цикл
		     Если Спр.ЭтоГруппа()=1 Тогда
			     Продолжить;
				КонецЕсли;
				глОстТовара.УстПараметр(1, Спр.ТекущийЭлемент() );
			     //ост=глОстТовара.ВыполнитьСкалярный();
			     ост=глОстТовара.Выполнить();
		     А=А+1;
		     Если А=1000 Тогда
			     Прервать;
		     КонецЕсли;
	     КонецЦикла;
	     ОбщееВремя=(_GetPerformanceCounter()-ОбщееНачало)/1000;
	     Сообщить("Прямойзапрос Параметр 21 = "+ОбщееВремя);
     КонецЦикла;
КонецПроцедуры

 



Результат
Попытка № 1
Прямойзапрос Параметр 21 = 1.133
Попытка № 2
Прямойзапрос Параметр 21 = 0.797
Попытка № 3
Прямойзапрос Параметр 21 = 0.779
Попытка № 4
Прямойзапрос Параметр 21 = 0.879
Попытка № 5
Прямойзапрос Параметр 21 = 0.751
Попытка № 6
Прямойзапрос Параметр 21 = 0.744
Попытка № 7
Прямойзапрос Параметр 21 = 0.77
Попытка № 8
Прямойзапрос Параметр 21 = 0.905
Попытка № 9
Прямойзапрос Параметр 21 = 0.887
Попытка № 10
Прямойзапрос Параметр 21 = 0.753
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #61 - 23. Сентября 2010 :: 05:45
Печать  
А если текст запроса оставить старым и добавить такую строку:
Код
Выбрать все
глОстТовара.ДобПараметр(1,14,9,0); 


?
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #62 - 23. Сентября 2010 :: 05:57
Печать  
Z1 писал(а) 23. Сентября 2010 :: 05:02:
(leshik) получилось надо выполнитьскалярный() заменить на выполнить().

Ну вот и вполне ожидаемые результаты. Однако конечно же на столь простом запросе не видно затрат на время компиляции при использовании обычного запроса (без параметров). Главное результат достигнут и с запросом с параметрами.
  
Наверх
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #63 - 23. Сентября 2010 :: 05:58
Печать  
JohnyDeath писал(а) 23. Сентября 2010 :: 05:45:
А если текст запроса оставить старым и добавить такую строку:
Код
Выбрать все
глОстТовара.ДобПараметр(1,14,9,0); 


?

Уверен что будет с замедлением.
  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #64 - 23. Сентября 2010 :: 05:58
Печать  
JohnyDeath писал(а) 23. Сентября 2010 :: 05:45:
А если текст запроса оставить старым и добавить такую строку:
Код
Выбрать все
глОстТовара.ДобПараметр(1,14,9,0); 


?

работает долго и в этом случае нужен именно ВыполнитьСкалярный ( с Выполнить падает )
Код
Выбрать все
Процедура Сформировать22()
 	спр=СоздатьОбъект("Справочник.СкладскиеЯчейки");
	стрдатыТА=строка(формат(НачМесяца(ПолучитьДатуТА()),"ДГГГГММДД"));
	стрдатыТА = " cast('" + стрдатыТА + "' as " +  ТипДата_sql  + "  )";
    глОстТовара = СоздатьОбъект("ODBCRecordset");
ТекстЗапроса = "
	 |SET NOCOUNT ON
     |declare @ВыбЯчейка  Char(9)
     |SET @ВыбЯчейка = ?
     |SELECT
     |	SUM($Рег.ОстатокТовара)
     |FROM
     |	$РегистрИтоги.ОстаткиТоваров Рег (NoLock)
     |WHERE
     |	Рег.PERIOD="+стрдатыТА+" AND
     |	$Рег.СклЯчейка = @ВыбЯчейка
     |";
	Если глОстТовара.Подготовить(ТекстЗапроса)=0 тогда
	     сообщить("Ошибка подготовки запроса остатков по складу (гл)! "+глОстТовара.ПолучитьОписаниеОшибки()+РазделительСтрок+"Свяжитесь с админитсратором!!!");
	КонецЕсли;
	глОстТовара.ДобПараметр(1,14,9,0);
     Для Инд=1 По 10 Цикл
	     Сообщить("Попытка № "+Инд);

	     спр.ВыбратьЭлементы(0);
	     А=0;
	     ОбщееНачало=_GetPerformanceCounter();
	     Пока Спр.ПолучитьЭлемент()=1 Цикл
		     Если Спр.ЭтоГруппа()=1 Тогда
			     Продолжить;
				КонецЕсли;
				глОстТовара.УстПараметр(1, Спр.ТекущийЭлемент() );
			     ост=глОстТовара.ВыполнитьСкалярный();
			     //ост=глОстТовара.Выполнить();
		     А=А+1;
		     Если А=1000 Тогда
			     Прервать;
		     КонецЕсли;
	     КонецЦикла;
	     ОбщееВремя=(_GetPerformanceCounter()-ОбщееНачало)/1000;
	     Сообщить("Прямойзапрос Параметр 22 = "+ОбщееВремя);
     КонецЦикла;
КонецПроцедуры
 



Результат

Попытка № 1
Прямойзапрос Параметр 22 = 5.912
Попытка № 2
Прямойзапрос Параметр 22 = 5.915
Попытка № 3
Прямойзапрос Параметр 22 = 5.929
Попытка № 4
Прямойзапрос Параметр 22 = 5.978
Попытка № 5
Прямойзапрос Параметр 22 = 6.043
Попытка № 6
Прямойзапрос Параметр 22 = 5.942
Попытка № 7
Прямойзапрос Параметр 22 = 6.044
Попытка № 8
Прямойзапрос Параметр 22 = 6.038
Попытка № 9
Прямойзапрос Параметр 22 = 6.325
Попытка № 10
Прямойзапрос Параметр 22 = 6.033
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #65 - 23. Сентября 2010 :: 06:04
Печать  
Интересно. Не знал.
leshik, может в FAQ по прямым запросам закинешь?
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #66 - 23. Сентября 2010 :: 06:07
Печать  
JohnyDeath писал(а) 23. Сентября 2010 :: 06:04:
Интересно. Не знал.
leshik, может в FAQ по прямым запросам закинешь?

Эээ а как? Просто взять и написать? Туда просто смертным писать можно? И надо же тогда подумать как это правильно оформить...
  
Наверх
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #67 - 23. Сентября 2010 :: 06:13
Печать  
Да, там можно писать всем.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #68 - 23. Сентября 2010 :: 07:14
Печать  
офф/2

чёйто вы с периодом мудрите. Так не проще?:
     |WHERE
     |      Рег.PERIOD=:Период~~ AND
     |      $Рег.СклЯчейка = @ВыбЯчейка
     |";
     глОстТовара.УстановитьТекстовыйПараметр("Период", НачМесяца(ПолучитьДатуТА()));
     Если глОстТовара.Подготовить(ТекстЗапроса)=0 тогда
  

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #69 - 23. Сентября 2010 :: 07:19
Печать  
trad писал(а) 23. Сентября 2010 :: 07:14:
офф/2

чёйто вы с периодом мудрите. Так не проще?:
     |WHERE
     |      Рег.PERIOD=:Период~~ AND
     |      $Рег.СклЯчейка = @ВыбЯчейка
     |";
     глОстТовара.УстановитьТекстовыйПараметр("Период", НачМесяца(ПолучитьДатуТА()));
     Если глОстТовара.Подготовить(ТекстЗапроса)=0 тогда

это же ничего не меняет принципиально.
я обычно не смешиваю параметрич. запросы с УстановитьТекстовыйПараметр.
Либо все через параметры либо все через УстановитьТекстовыйПараметр
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #70 - 23. Сентября 2010 :: 07:26
Печать  
Z1 писал(а) 23. Сентября 2010 :: 07:19:
это же ничего не меняет принципиально.

да, конечно. потому и офф/2


Цитата:
я обычно не смешиваю параметрич. запросы с УстановитьТекстовыйПараметр.
Либо все через параметры либо все через УстановитьТекстовыйПараметр

непонятная предубежденность
  

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



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #71 - 23. Сентября 2010 :: 07:31
Печать  
офф/1
trad писал(а) 23. Сентября 2010 :: 07:14:
офф/2
чёйто вы с периодом мудрите.

и вообще ВТ проще применить и не заниматься вычислением начала периода ТА, к тому же не безопасным с точки зрения смены периодичности хранения итогов.

повторяю - это почти офф.
  

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



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #72 - 23. Сентября 2010 :: 07:45
Печать  
И странно, у меня ВыполнитьСкалярный не проигрывает Выполнить почти на порядок. Всего то около 40%
Улыбка
  

1&&2&&3
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #73 - 23. Сентября 2010 :: 08:01
Печать  
trad писал(а) 23. Сентября 2010 :: 07:45:
И странно, у меня ВыполнитьСкалярный не проигрывает Выполнить почти на порядок. Всего то около 40%
Улыбка

как не значительно - всего то 40%  Круглые глаза
  
Наверх
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #74 - 23. Сентября 2010 :: 09:20
Печать  
бегло посмотрел.
ВыполнитьСкалярный несколько сложнее устроен внутри. Зато безопаснее. Например при его использовании гарантированно не наступишь на "подключение занято ... hstmt"
А вот при Выполнить - вполне.
  

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