Переключение на Главную Страницу Страницы: 1 [2]  ОтправитьПечать
Горячая тема (более 10 ответов) множество вычисляемых столбцов в форме списка (число прочтений - 6611 )
ev-kov
God Member
*****
Отсутствует



Сообщений: 694
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: множество вычисляемых столбцов в форме списка
Ответ #15 - 17. Января 2009 :: 16:23
Печать  
monster писал(а) 17. Января 2009 :: 14:36:
кэширование конечно хорошо,но это не выход, т.к. требуется он-лайн режим

ну например поставь ограничение на максимальное время жизни кэша не более 5 секунд и делов то ...
  

Информация - то, что снижает неопределенность в какой-либо области и очень важно не ошибиться областью в наш информационный век!
Наверх
 
IP записан
 
monster
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 7
Зарегистрирован: 13. Января 2009
Re: множество вычисляемых столбцов в форме списка
Ответ #16 - 18. Января 2009 :: 15:13
Печать  
в общем вычисляемые поля выводят заранее объявленные переменные
заполнение этих переменных делается процедурой первого вычивляемого поля, т.е.
Код
Выбрать все
	Если ТекущийЭлемент().ЭтоГруппа() = 1 Тогда
		Трн1	= "";
		Свр1	= "";
		Уд1		= "";
		Трг1	= "";
		Осн1	= "";
		Рез1	= "";
		Рез2	= "";
		Цена1	= "";
		Валюта1	= "";
		Возврат Осн1;
	КонецЕсли;
	НомСтр	= 0;
	Если ТаблицаКЭША.НайтиЗначение(ТекущийЭлемент(),НомСтр,"Товар") = 1 Тогда
		Осн1	= ТаблицаКЭША.ПолучитьЗначение(НомСтр,"Осн1");
		Трг1	= ТаблицаКЭША.ПолучитьЗначение(НомСтр,"Трг1");
		Трн1	= ТаблицаКЭША.ПолучитьЗначение(НомСтр,"Трн1");
		Срв1	= ТаблицаКЭША.ПолучитьЗначение(НомСтр,"Срв1");
		Уд1		= ТаблицаКЭША.ПолучитьЗначение(НомСтр,"Уд1" );
		Рез1	= ТаблицаКЭША.ПолучитьЗначение(НомСтр,"Рез1");
		Рез2	= ТаблицаКЭША.ПолучитьЗначение(НомСтр,"Рез2" );
		Цена1	= ТаблицаКЭША.ПолучитьЗначение(НомСтр,"Цена" );
		Валюта1	= ТаблицаКЭША.ПолучитьЗначение(НомСтр,"Вал" );
	Иначе
		RS.УстПараметр(2, ТекущийЭлемент());

		RS.УстПараметр(1, ТранзитныйСклад);
		Трн1	= RS.ВыполнитьСкалярный();

		RS.УстПараметр(1, СервисныйСклад);
		Срв1	= RS.ВыполнитьСкалярный();

		RS.УстПараметр(1, УдаленныйСклад);
		Уд1	= RS.ВыполнитьСкалярный();

		Трг1	= 0;
		Для Сч = 1 По ТорговыйСклад.РазмерСписка()Цикл
			RS.УстПараметр(1,ТорговыйСклад.ПолучитьЗначение(Сч));
			Трг1	= Трг1 + RS.ВыполнитьСкалярный();
		КонецЦикла;

		RS.УстПараметр(1, ОсновнойСклад);
	    Осн1	= RS.ВыполнитьСкалярный();

		Рез1	= зервТовара");
		Если ВыбПодразделение.Выбран() = 1 Тогда
			Рез2	= ;
		Иначе
			Рез2	= Рез1 - РезервыТоваров.СводныйОстаток(ТекущийЭлемент(),,,"РезервТовара");
		КонецЕсли;

		Цена1	= "";
		Валюта1	= "";
		ТекЦена	= глВернутьЦену(ТекущийЭлемент(), ТипЦены);
		Если ПустоеЗначение(ТекЦена) = 0 Тогда
			ТекЦена.ИспользоватьДату(ДатаЦен);
			Валюта	= ТекЦена.Валюта;
			ЕдЦены	= ТекЦена.Единица;
			ЕдПоУм	= ТекущийЭлемент().ЕдиницаПоУмолчанию;
			Если ЕдЦены.Коэффициент <> ЕдПоУм.Коэффициент Тогда
				Если ЕдЦены.Коэффициент < ЕдПоУм.Коэффициент Тогда
					Цена1	= ТекЦена.Цена * (ЕдПоУм.Коэффициент / ?(ЕдЦены.Коэффициент = 0, 1, ЕдЦены.Коэффициент));
				ИначеЕсли ЕдЦены.Коэффициент > ЕдПоУм.Коэффициент Тогда
					Цена1	= ТекЦена.Цена / (ЕдЦены.Коэффициент / ?(ЕдПоУм.Коэффициент = 0, 1, ЕдПоУм.Коэффициент));
				КонецЕсли;
			Иначе
				Цена1	= ТекЦена.Цена;
			КонецЕсли;
			Цена1	= ?(Валюта = Рубли, Окр(Цена1, 0, 1), Цена1);
			Цена1 = Формат(Цена1,"Ч .2");
			Валюта1	= Валюта;
		КонецЕсли;

		ТаблицаКЭША.НоваяСтрока();
		ТаблицаКЭША.Товар 	= ТекущийЭлемент();
		ТаблицаКЭША.Осн1 	= Осн1;
		ТаблицаКЭША.Трг1 	= Трг1;
		ТаблицаКЭША.Уд1 	= Уд1;
		ТаблицаКЭША.Трн1 	= Трн1;
		ТаблицаКЭША.Срв1 	= Срв1;
		ТаблицаКЭША.Рез1	= Рез1;
		ТаблицаКЭША.Рез2	= Рез2;
		ТаблицаКЭША.Цена	= Цена1;
		ТаблицаКЭША.Вал		= Валюта1;
	КонецЕсли;

	Возврат Осн1;
 


Код
Выбрать все
	ТекстЗапроса = "
					|SELECT
					| $Рег.ОстатокТовара as Количество
					|FROM
					| $РегистрИтоги.ОстаткиТоваров as Рег
					|WHERE
					| Рег.Period = {d'2009-01-01'} AND
					| $Рег.Склад = ? AND
					| $Рег.Товар = ?";

	RS = СоздатьОбъект("ODBCRecordset");
	RS.Подготовить(ТекстЗапроса);
	RS.ПостроитьПараметры();
	ОсновнойСклад	= глПолучитьСкладПоУмолчанию("ОсновнойСклад");
	ТранзитныйСклад	= глПолучитьСкладПоУмолчанию("ТранзитныйСклад");
	СервисныйСклад	= глПолучитьСкладПоУмолчанию("СервисныйСклад");
	УдаленныйСклад	= глПолучитьСкладПоУмолчанию("УдаленныйСклад");

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

	ТаблицаКЭША	= СоздатьОбъект("ТаблицаЗначений");
	ТаблицаКЭША.НоваяКолонка("Товар","Справочник.Номенклатура");
	ТаблицаКЭША.НоваяКолонка("Осн1","Число");
	ТаблицаКЭША.НоваяКолонка("Трг1","Число");
	ТаблицаКЭША.НоваяКолонка("Уд1" ,"Число");
	ТаблицаКЭША.НоваяКолонка("Трн1","Число");
	ТаблицаКЭША.НоваяКолонка("Срв1","Число");
	ТаблицаКЭША.НоваяКолонка("Рез1","Число");
	ТаблицаКЭША.НоваяКолонка("Рез2","Число");
	ТаблицаКЭША.НоваяКолонка("Цена","Строка");
	ТаблицаКЭША.НоваяКолонка("Вал" );
 


как видно также используется КЭШ, но и это не особо помогает, т.к. проивзодительностьувеличилась приблизительно на 15-20%, но время открытия формы все еще не удовлетворительно Печаль

может еще есть какие-то советы?
  
Наверх
 
IP записан
 
ev-kov
God Member
*****
Отсутствует



Сообщений: 694
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: множество вычисляемых столбцов в форме списка
Ответ #17 - 19. Января 2009 :: 04:18
Печать  
Надо оптимизировать само заполнение ТЗ кэша, в идеале запрос к бд должен быть один.

Начни с того чтобы объединить в один запрос вот эти


           RS.УстПараметр(2, ТекущийЭлемент());

           RS.УстПараметр(1, ТранзитныйСклад);
           Трн1      = RS.ВыполнитьСкалярный();

           RS.УстПараметр(1, СервисныйСклад);
           Срв1      = RS.ВыполнитьСкалярный();

           RS.УстПараметр(1, УдаленныйСклад);
           Уд1      = RS.ВыполнитьСкалярный();

  

Информация - то, что снижает неопределенность в какой-либо области и очень важно не ошибиться областью в наш информационный век!
Наверх
 
IP записан
 
kriblya
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 313
Зарегистрирован: 24. Декабря 2007
Re: множество вычисляемых столбцов в форме списка
Ответ #18 - 20. Января 2009 :: 07:41
Печать  
и оптимизируй запрос для попадания в индекс
(скорость запроса вырастет в разы)
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: множество вычисляемых столбцов в форме списка
Ответ #19 - 21. Января 2009 :: 03:48
Печать  
kriblya писал(а) 20. Января 2009 :: 07:41:
и оптимизируй запрос для попадания в индекс
(скорость запроса вырастет в разы)


А как проверить в какой индекс попадаешь и попадаешь ли вообще? с sqlite все понятно, там отладка все говорит. А как в ODBC?
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
kriblya
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 313
Зарегистрирован: 24. Декабря 2007
Re: множество вычисляемых столбцов в форме списка
Ответ #20 - 21. Января 2009 :: 07:22
Печать  
смотри DD, меряй скорость запроса, читай http://www.1cpp.ru/forum/YaBB.pl?num=1210677779/15 ответ 27
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: множество вычисляемых столбцов в форме списка
Ответ #21 - 21. Января 2009 :: 09:23
Печать  
kriblya писал(а) 21. Января 2009 :: 07:22:
смотри DD, меряй скорость запроса, читай http://www.1cpp.ru/forum/YaBB.pl?num=1210677779/15 ответ 27

Это для Оле ДБ. Я думаю, что Сашу интересовала сама проверка попадания в индекс (и в какой) для подключения через ODBC.
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: множество вычисляемых столбцов в форме списка
Ответ #22 - 21. Января 2009 :: 12:28
Печать  
JohnyDeath писал(а) 21. Января 2009 :: 09:23:
kriblya писал(а) 21. Января 2009 :: 07:22:
смотри DD, меряй скорость запроса, читай http://www.1cpp.ru/forum/YaBB.pl?num=1210677779/15 ответ 27

Это для Оле ДБ. Я думаю, что Сашу интересовала сама проверка попадания в индекс (и в какой) для подключения через ODBC.


Абсолютно верно, для DBF я использую 1sqlite и там где мог уже все оптимизировал. Конечно эти же запросы и на sql-версии работают на ура, местами значительно выигрывая у 1sqlite, но все таки хочется знать.

Как пример: выборка из таблицы многострочной части документа в 1sqlite занимает очень много времени, в основном из-за JOIN, в sql же скорость значительно выше. Вот и подумал вдруг там индекс какой. Впрочем можно раскурить DD... пойду попробую. Но вопрос я не отменял Улыбка
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
kriblya
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 313
Зарегистрирован: 24. Декабря 2007
Re: множество вычисляемых столбцов в форме списка
Ответ #23 - 21. Января 2009 :: 13:51
Печать  
Цитата:
Это для Оле ДБ. Я думаю, что Сашу интересовала сама проверка попадания в индекс (и в какой) для подключения через ODBC.

а я не понял, это Для скуля?
хотя какая разница?
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 
ОтправитьПечать