Переключение на Главную Страницу Страницы: 1 ... 33 34 [35] 36 37 ... 51 ОтправитьПечать
Очень популярная тема (более 25 ответов) Класс "ПрямойЗапрос" - обсуждения. Часть № 2. (число прочтений - 258675 )
Asakra
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 83
Местоположение: Иркутск
Зарегистрирован: 28. Августа 2012
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #510 - 09. Февраля 2013 :: 08:07
Печать  
Asakra писал(а) 09. Февраля 2013 :: 08:01:
я думаю, что в ВТ стоит HAVING (SUM(Количество) <> 0) И HAVING (SUM(Сумма) <> 0) И HAVING (SUM(НДС) <> 0)

точнее не И, а ИЛИ... тогда получается если все = 0, то такая запись не попадет в выборку
  
Наверх
 
IP записан
 
Asakra
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 83
Местоположение: Иркутск
Зарегистрирован: 28. Августа 2012
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #511 - 09. Февраля 2013 :: 08:14
Печать  
Проверять думаю проще с помощью РегистрОстаткиОбороты, взяв 1 ресурс. И если НачОст, Приход, Расход и КонОст = 0, то запись в выборку не попадет
  
Наверх
 
IP записан
 
Asakra
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 83
Местоположение: Иркутск
Зарегистрирован: 28. Августа 2012
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #512 - 09. Февраля 2013 :: 08:59
Печать  
кстати оно еще и неверно работает. если НачОст = 0.0000009, оборотов нет и КонОст, соответственно,  = 0.0000009, то запись попадает в выборку, но после типизации Число.15.2, она естественно = 0 и получается в выборке строка с нулевыми ресурсами (это наверно уже нюансы 1SQLite). Т.е. если логика ВТ такова, что в выборку не попадают строки по всем ресурсам = 0, то ВТ не может правильно работать!?

хотя такое, наверно, ни чем не залечиться... ведь там не 0  Улыбка
  
Наверх
 
IP записан
 
Asakra
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 83
Местоположение: Иркутск
Зарегистрирован: 28. Августа 2012
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #513 - 09. Февраля 2013 :: 09:31
Печать  
а ни кто не поделиться как с условиями по проще работать, допустим сравнение справочника. пользователь может выбрать 1 элемент, или группу, или вообще ничего не выбрать, а если условий несколько... а то какая-то шляпа с этим делом Улыбка
  
Наверх
 
IP записан
 
Dolly_EV
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 152
Местоположение: Чита
Зарегистрирован: 22. Октября 2009
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #514 - 10. Февраля 2013 :: 23:49
Печать  
Asakra писал(а) 09. Февраля 2013 :: 09:31:
а ни кто не поделиться как с условиями по проще работать, допустим сравнение справочника. пользователь может выбрать 1 элемент, или группу, или вообще ничего не выбрать, а если условий несколько... а то какая-то шляпа с этим делом Улыбка


У меня - класс МножественныйФильтр. В нем сделал примитивный парсер на замену в тексте запроса: замена "1=1" на условие. +уложение СпискаЗначений.

в тексте модуля выглядит примерно так:
Код
Выбрать все
,,1,1);
ОбъектМФ.СформироватьУсловиеЗапроса(ТекстЗапросаОстатки,ПЗапрос,"Виды алк. продукции","СпрАлк.ВидПродукции",,2,1);
Номенклатура",,4,1);
мпортеры","СпрАлк.ПроизвИмп",,5,1);
"$СпрПодр.ТекущийЭлемент",,6,1);
 


в тексте запроса соответственно условия в нужных местах выглядят как "1=1 И 2=2...." и т.д.

Во вложении - сам класс.

Пы Сы.
Я кстати сам года 1,5 назад здесь вопрошал, как лучше с условиями работать - никто не ответил Злой
« Последняя редакция: 11. Февраля 2013 :: 03:28 - Dolly_EV »  

____________________001.ert ( 244 KB | Загрузки )
Наверх
ICQ  
IP записан
 
Dolly_EV
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 152
Местоположение: Чита
Зарегистрирован: 22. Октября 2009
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #515 - 10. Февраля 2013 :: 23:52
Печать  
Asakra писал(а) 09. Февраля 2013 :: 08:59:
кстати оно еще и неверно работает. если НачОст = 0.0000009, оборотов нет и КонОст, соответственно,  = 0.0000009, то запись попадает в выборку, но после типизации Число.15.2, она естественно = 0 и получается в выборке строка с нулевыми ресурсами (это наверно уже нюансы 1SQLite). Т.е. если логика ВТ такова, что в выборку не попадают строки по всем ресурсам = 0, то ВТ не может правильно работать!?

хотя такое, наверно, ни чем не залечиться... ведь там не 0  Улыбка


Бред написал. Ты же сам типизируешь 15.2! Как ты при этом из 0.00000009 хочешь получить не 0?? что мешает вообще не типизировать в запросе числовые значения? - тогда на выходе будет не 0
  
Наверх
ICQ  
IP записан
 
Asakra
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 83
Местоположение: Иркутск
Зарегистрирован: 28. Августа 2012
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #516 - 11. Февраля 2013 :: 05:11
Печать  
Dolly_EV писал(а) 10. Февраля 2013 :: 23:49:
Во вложении - сам класс.

Пасиб!
я уже в класс так добавил, вроде работает:

Код
Выбрать все
Процедура УстановитьПараметр(ИмяПоля, Значение, ИмяУсловия = "") Экспорт

	Если ТипЗначенияСтр(Значение) = "Справочник" Тогда

		Если ПустоеЗначение(Значение) = 1 Тогда
			Текст = СтрЗаменить(Текст, ИмяУсловия, "");

		ИначеЕсли Значение.ЭтоГруппа() = 1 Тогда

			Список = СоздатьОбъект("СписокЗначений");

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

			Текст = СтрЗаменить(Текст, ИмяУсловия, ИмяПоля + " В (ВЫБРАТЬ val ИЗ #Список" + НомерУсловия + ")");
			УложитьСписокЗначений(Список, "#Список" + НомерУсловия);

		Иначе
			Текст = СтрЗаменить(Текст, ИмяУсловия, ИмяПоля + " = :ВыбЗначение" + НомерУсловия);
			УстановитьТекстовыйПараметр("ВыбЗначение" + НомерУсловия, Значение);

		КонецЕсли;

	ИначеЕсли ТипЗначенияСтр(Значение) = "СписокЗначений" Тогда
		Текст = СтрЗаменить(Текст, ИмяУсловия, ИмяПоля + " В (ВЫБРАТЬ val ИЗ #Список" + НомерУсловия + ")");
		УложитьСписокЗначений(Значение, "#Список" + НомерУсловия);

	Иначе
		УстановитьТекстовыйПараметр(ИмяПоля, Значение);

	КонецЕсли;

	НомерУсловия = НомерУсловия + 1;

КонецПроцедуры // УстановитьПараметр()
 



Странно, что разработчик ни че такого не делал  Озадачен
А с группами только так нужно поступать или есть более гуманные способы?
  
Наверх
 
IP записан
 
Dolly_EV
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 152
Местоположение: Чита
Зарегистрирован: 22. Октября 2009
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #517 - 11. Февраля 2013 :: 05:28
Печать  
Asakra писал(а) 11. Февраля 2013 :: 05:11:
Dolly_EV писал(а) 10. Февраля 2013 :: 23:49:
Во вложении - сам класс.

Пасиб!
я уже в класс так добавил, вроде работает:
...
Странно, что разработчик ни че такого не делал  Озадачен
А с группами только так нужно поступать или есть более гуманные способы?


Разработчик ни чего такого не делал, т.к. сделал намного более емкое и полезное - кучу прикладных объектов интерфейса ("ПоставщикДанных") и кроссплатформенный язык запросов. А уж фильтры, условия и т.д. - дело рук пользователей поделки.
Заметь, в самом 1cpp тоже "почему-то" нет условий и методов работы с ними.
Про группы - посмотри внимательно описание метода УложитьСписокЗначений
, параметр "ВидОбъекта"

и, ИМХО, МФ намного удобнее
  
Наверх
ICQ  
IP записан
 
Asakra
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 83
Местоположение: Иркутск
Зарегистрирован: 28. Августа 2012
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #518 - 11. Февраля 2013 :: 06:00
Печать  
Dolly_EV писал(а) 11. Февраля 2013 :: 05:28:
Про группы - посмотри внимательно описание метода УложитьСписокЗначений
, параметр "ВидОбъекта"


Нашел, спасибо, работает.... буду дальше разбираться Улыбка
  
Наверх
 
IP записан
 
BlueWind
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 14
Местоположение: Тирасполь
Зарегистрирован: 28. Ноября 2010
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #519 - 20. Марта 2013 :: 23:22
Печать  
vandalsvq
ПрямойЗапрос версия 1.8.5 23.05.2012

Класс эксплуатируется все больше и все шире.. Вещь хорошая и полезная. Спасибо. )

Есть запрос, в котором нужно получить остатки товара с ценами реализации. В запросе используются ВТ $БИОстатки и $ПоследнееЗначение

Код
Выбрать все
ПрямойЗапрос = СоздатьОбъект("ПрямойЗапрос");

...

ТекстЗапроса = "
|ВЫБРАТЬ
...
|, $ПоследнееЗначение.Серии.ЦенаОпт(Субконто3, :ДатаПериодических~) КАК [ЦенаОпт $Число.15.2]
...
|ИЗ $БИОстатки.Основной(:КонДата~,,(МОЛ,Номенклатура,Серии), (Количество, Сумма), (Счет В (:ЗапросСчет)),) КАК Би
...
 



Понадобилось (чтыбы не сказать "приспичило") дополнительно получить здесь же дату установки периодического значения ЦенаОпт. Руки интуитивно потянулись к ВТ $ПоследнееЗначение, чтобы в ней получить дату установки значения, но исследования ВТ показали, что кроме собственно периодического значения она ничего другого не возвращает. Возможным решением выглядит разворачивание ВТ $ПоследнееЗначение в запросе таким образом:

Код
Выбрать все
ПрямойЗапрос = СоздатьОбъект("ПрямойЗапрос");

...
ких+1);

мдв = СоздатьОбъект("MetaDataWork");
Серии_ЦенаОпт_ИдРеквизита = мдв.ИДРеквизитаСправочника("Серии", "ЦенаОпт");
пт_ИдРеквизита);


ТекстЗапроса = "
|ВЫБРАТЬ
...
|, $ПоследнееЗначение.Серии.ЦенаОпт(Субконто3, :ДатаПериодических~) КАК [ЦенаОпт $Число.15.2]

|,	(SELECT TOP 1 const_vt.DATE
|	FROM _1SCONST const_vt  (nolock)
|	WHERE const_vt.ID = :Серии_ЦенаОпт_ИдРеквизита
|	AND const_vt.OBJID = Субконто3
|	AND const_vt.DATE < :ДатаПериодических_Служ
|	ORDER BY const_vt.DATE DESC,const_vt.TIME DESC,const_vt.DOCID DESC,const_vt.ROW_ID DESC) AS [ЦенаОптДатаУстановки $Дата]

...
|ИЗ $БИОстатки.Основной(:КонДата~,,(МОЛ,Номенклатура,Серии), (Количество, Сумма), (Счет В (:ЗапросСчет)),) КАК Би
...

 


Результат дает нужный, но решение выглядит непривлекательно.. Чуя, что это мне нужно будет не в одном месте, решил попробовать заставить ВТ $ПоследнееЗначение возвращать не только пер. значение, но и прочие данные из таблицы констант. Сделал временно мод функции ПарсингВТПоследнееЗначение в классе: добавил третий параметр, в котором указывается возвращаемое значение из таблицы констант (VALUE при опущенном параметре):
Код
Выбрать все
Функция ПарсингВТПоследнееЗначение(ТекстДляОбработки)
	...
 	//[+]sv 180313
	спВозвращаемоеЗначение = СоздатьОбъект("СписокЗначений");
	спВозвращаемоеЗначение.Установить("ТЕКУЩИЙОБЪЕКТ", 		"OBJID"); 	//9 (0-const)
	спВозвращаемоеЗначение.Установить("ТЕКУЩИЙРЕКВИЗИТ", 	"ID"); 		//4
	спВозвращаемоеЗначение.Установить("ДАТАЗНАЧ", 			"DATE"); 	//8
	спВозвращаемоеЗначение.Установить("ЗНАЧЕНИЕ", 			"VALUE"); 	//DBF: 23 SQL: 255
	спВозвращаемоеЗначение.Установить("ТЕКУЩИЙДОКУМЕНТ", 	"DOCID"); 	//9 (При ручной установке значений равен «     0   »)
	спВозвращаемоеЗначение.Установить("ВРЕМЯ", 				"TIME"); 	//DBF: string 6 SQL: int 4
	спВозвращаемоеЗначение.Установить("НОМЕРДВИЖЕНИЯ",		"ACTNO"); 	//DBF: numeric 6 SQL: int 4 (номер движения документа по изменению периодического реквизита, который сделал запись.)
	спВозвращаемоеЗначение.Установить("ТИПЗНАЧЕНИЯ",		"TVALUE"); 	//3 (Заполняется в случае, если периодический реквизит неопределенного типа. В нем хранится ID типа значения из поля VALUE)
	Если ЭтоSQL = 1 Тогда
		//спВозвращаемоеЗначение.Установить("СЧЕТЧИК",	 	"ROW_ID");	//4 (Автоинкрементное поле типа INT. Служит для поддержки уникальности)
		спВозвращаемоеЗначение.Установить("НОМЕРСТРОКИ",	"LINENO_");	//2
	Иначе
		//спВозвращаемоеЗначение.Установить("НОМЕРЧАСТИ",		"PARTNO"); 	//3 (номер части порезанного значения длиннее 23)
		спВозвращаемоеЗначение.Установить("НОМЕРСТРОКИ", 	"LINENO");	//4
	КонецЕсли;

//	Параметры = ПолучитьСтрокуПараметров(2); //[-]sv 180313
	Параметры = ПолучитьСтрокуПараметров(3); //[+]sv 180313
	...
	Для НомерЗначения = 0 По Вектор.Количество()-1 Цикл
		...
		ВозвращаемоеЗначение = Врег(ПодготовитьПараметр(ВекторВыражения.Подвыражения.Получить(4))); //[+]sv 180313
		...
//		ИдентификаторКолонки = ПреобразоватьЗначение(МетаРеквизит,"const_vt"); //[-]sv 180313

 		//[+]sv 180313
		Если (ВозвращаемоеЗначение = "ЗНАЧЕНИЕ") или (ВозвращаемоеЗначение = "VALUE") или (ПустаяСтрока(ВозвращаемоеЗначение) = 1) Тогда
			ИдентификаторКолонки = ПреобразоватьЗначение(МетаРеквизит,"const_vt");
		Иначе
			ИдентификаторКолонки = спВозвращаемоеЗначение.Получить(ВозвращаемоеЗначение);
			Если ПустаяСтрока(ИдентификаторКолонки) = 0 Тогда
				ИдентификаторКолонки = "const_vt."+ИдентификаторКолонки;
			Иначе
				ИдентификаторКолонки = "const_vt."+ВозвращаемоеЗначение;
			КонецЕсли;
		КонецЕсли;
		...
	КонецЦикла;
	...
КонецФункции
 


Использование:
Код
Выбрать все
|ВЫБРАТЬ
...
|, $ПоследнееЗначение.Серии.ЦенаОпт(Субконто3, :ДатаПериодических~) КАК [ЦенаОпт $Число.15.2]
|, $ПоследнееЗначение.Серии.ЦенаОпт(Субконто3, :ДатаПериодических~, ДатаЗнач) КАК [ЦенаОптДатаУстановки $Дата]
...
 


Так, используя $ПоследнееЗначение можно получить и пер.значение, и дату установки, и документ...

Вопрос: Есть ли надежда, что нечто подобное будет реализовано в официальном классе? Если да, то то же хотелось бы и в $СрезПервых, $СрезПоследних при РазворачиватьПериоды = 0
« Последняя редакция: 21. Марта 2013 :: 14:26 - BlueWind »  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #520 - 22. Марта 2013 :: 05:43
Печать  
ПоследнееЗначение - это не ВТ. Это виртуальное значение. В принципе изначально не предусматривалось для получения кроме значения ничего больше. Другой логики я бы не хотел придерживаться. Для получения информации о дате, документе необходимо использовать ВТ "СрезПоследних". Она должна возвращать вроде бы, если не ошибаюсь.
  

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


1C++ rocks!

Сообщений: 53
Местоположение: Ульянвоск
Зарегистрирован: 25. Декабря 2008
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #521 - 15. Апреля 2013 :: 23:16
Печать  
Подскажите как написать.
Есть регистр взаиморасчетов содержит след измерения:
контрагент-ВидДолга-ДокументОтгрузки.
до недавнего времени документ отгрузки всегда был одного вида "РасходнаяНакладная", но сейчас политика поменялась и теперь в документе отгрузки три вида документов. Из документа отгрузки мне нужно получить дополнительную информацию в виде Агента, и Торговой точки (тТочка) оба реквизита присутствуют во вновь добавляемых документах. До этого использовал вот такой запрос.
[code]
     "ВЫБРАТЬ
     |      Доходы.ДокументОтгрузки      КАК [ДокументОтгрузки $Документ],
     |      Доходы.ВидДолга            КАК СтатусДолга,
     |      Доходы.СуммаОстаток [Доходы.СуммаОстаток :Число.15.2]
     |,      Жур.IDDOC
     |,      $Жур.ДатаДокумента            КАК [ДокДата $Дата]
     |,      $ДокРеал.ТТочка                  КАК [ТТочка $Справочник.ТорговыеTочки]
     |,      $ДокРеал.Агент                  КАК [Агент $Справочник.Сотрудники]
     | ИЗ $РегистрОстатки.Взаиморасчеты(:КонПериода,
     |                  (
     |                  Контрагент = :Покупатель и
     |                  ВидДолга = :ВидДолга
     |                  ),
     |                  (Контрагент,ВидДолга,ДокументОтгрузки),(Сумма)) КАК Доходы
     |внутреннее соединение ЖурналДокументов КАК Жур
     | ПО Жур.IDDOC = Сред(Доходы.ДокументОтгрузки,5,9) и Жур.Направление = :Направление
     |Внутреннее соединение Документ.РасходнаяНакладная КАК ДокРеал
     |      ПО ДокРеал.IDDOC = Жур.IDDOC
     |ГДЕ
     |      Доходы.СуммаОстаток<>0
     |Упорядочить
     |      $Жур.ДатаДокумента
     |";[/code]
Помогите, незнаю как написать такой запрос, что бы обработать несколько видов документов или вообще без привязки к виду документа.
  
Наверх
ICQ  
IP записан
 
Dolly_EV
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 152
Местоположение: Чита
Зарегистрирован: 22. Октября 2009
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #522 - 16. Апреля 2013 :: 01:26
Печать  
[quote author=undo link=1285352210/510#521 date=1366067810]Подскажите как написать.
Помогите, незнаю как написать такой запрос, что бы обработать несколько видов документов или вообще без привязки к виду документа.[/quote]

[code]"ВЫБРАТЬ
     |      Доходы.ДокументОтгрузки      КАК [ДокументОтгрузки $Документ]
     |      ,Доходы.ВидДолга            КАК СтатусДолга
     |      ,Доходы.СуммаОстаток      КАК [Доходы.СуммаОстаток :Число.15.2]
     |      ,Жур.IDDOC
     |      ,$Жур.ДатаДокумента      КАК [ДокДата $Дата]
     |      ,ДокРеал.ТТочка            КАК [ТТочка $Справочник.ТорговыеTочки]
     |      ,ДокРеал.Агент                  КАК [Агент $Справочник.Сотрудники]
     |ИЗ      $РегистрОстатки.Взаиморасчеты(:КонПериода,
     |                  (
     |                  Контрагент = :Покупатель и
     |                  ВидДолга = :ВидДолга
     |                  ),
     |                  (Контрагент,ВидДолга,ДокументОтгрузки),(Сумма)) КАК Доходы
     |ВНУТРЕННЕЕ СОЕДИНЕНИЕ      ЖурналДокументов КАК Жур $nolock
     |ПО Жур.IDDOC = Сред(Доходы.ДокументОтгрузки,5,9) и $Жур.Направление = :Направление
     |ЛЕВОЕ СОЕДИНЕНИЕ
     |      (ВЫБРАТЬ ДокРеал.IDDOC КАК ТекДок
     |                  ,$ДокРеал.ТТочка КАК ТТочка
     |                  ,$ДокРеал.Агент КАК Агент
     |      ИЗ
     |            Документ.РасходнаяНакладная КАК ДокРеал $nolock
     |      ОБЪЕДИНИТЬ
     |      ВЫБРАТЬ ДокРеал1.IDDOC КАК ТекДок
     |                  ,$ДокРеал1.ТТочка КАК ТТочка
     |                  ,$ДокРеал1.Агент КАК Агент
     |      ИЗ
     |            Документ.РасходнаяНакладная1 КАК ДокРеал1 $nolock
     |      ОБЪЕДИНИТЬ
     |      ВЫБРАТЬ ДокРеал2.IDDOC КАК ТекДок
     |                  ,$ДокРеал2.ТТочка КАК ТТочка
     |                  ,$ДокРеал2.Агент КАК Агент
     |      ИЗ
     |            Документ.РасходнаяНакладная2 КАК ДокРеал2 $nolock) КАК ДокРеал
     |      ПО ДокРеал.ТекДок = Жур.IDDOC
     |ГДЕ
     |      Доходы.СуммаОстаток<>0
     |Упорядочить
     |      $Жур.ДатаДокумента
     |";
[/code]

И в старом запросе не надо было ВНУТРЕННЕЕ СОЕДИНЕНИЕ к ДокРеал, достаточно ЛЕВОЕ
И, имхо, реквизит типа АГЕНТ - проще все же иметь общим. Но это имхо ))
  
Наверх
ICQ  
IP записан
 
undo
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 53
Местоположение: Ульянвоск
Зарегистрирован: 25. Декабря 2008
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #523 - 16. Апреля 2013 :: 08:06
Печать  
Спасибо за ответ, а есть варианты ускорить данный запрос, а то время выполнения выросло в 4 раза :(
Это данные моего запроса по одному виду.
[code]Подбор индекса для таблицы RG18857:
     Ограничения: PERIOD=; SP18858[Контрагент]=; SP18976[ВидДолга]=;
     В кэше не найдено
     Выбран индекс PROP: DTOS(PERIOD)+SP18858+STR(SP18976,2)+SP18977
     Стоимость: 24
Подбор индекса для таблицы RA18857:
     Ограничения: DATETIME[dx_DATE_TIME_IDDOC_LINENO_ACTNO]>=; DATETIME[dx_DATE_TIME_IDDOC_LINENO_ACTNO]<; SP18858[Контрагент]=; SP18976[ВидДолга]=;
     В кэше не найдено
     Выбран индекс DATETIME: DTOS(DATE)+TIME+IDDOC+STR(LINENO,4)+STR(ACTNO,6)
     Стоимость: 18
Подбор индекса для таблицы 1SJOURN:
     Ограничения:
     Упорядочить: DATE,
     В кэше не найдено
     Выбран индекс ACDATETIM: DTOS(DATE)+TIME+IDDOC
     Попадает в сортировку
     Стоимость: 60
Подбор индекса для таблицы 1SJOURN:
     Ограничения: IDDOC=;
     В кэше не найдено
     Выбран индекс IDDOC: IDDOC
     Стоимость: 20
Подбор индекса для таблицы DH16004:
     Ограничения: IDDOC=;
     В кэше не найдено
     Выбран индекс ID: IDDOC
     Стоимость: 18
Время подготовки запроса: 28 мс, время выполнения запроса: 266 мс.[/code]

а это по новой схеме запроса, для сравнения оставил тот же вид документа
[code]Подбор индекса для таблицы RG18857:
     Ограничения: PERIOD=; SP18858[Контрагент]=; SP18976[ВидДолга]=;
     В кэше не найдено
     Выбран индекс PROP: DTOS(PERIOD)+SP18858+STR(SP18976,2)+SP18977
     Стоимость: 24
Подбор индекса для таблицы RA18857:
     Ограничения: DATETIME[dx_DATE_TIME_IDDOC_LINENO_ACTNO]>=; DATETIME[dx_DATE_TIME_IDDOC_LINENO_ACTNO]<; SP18858[Контрагент]=; SP18976[ВидДолга]=;
     В кэше не найдено
     Выбран индекс DATETIME: DTOS(DATE)+TIME+IDDOC+STR(LINENO,4)+STR(ACTNO,6)
     Стоимость: 18
Подбор индекса для таблицы DH16004:
     Ограничения:
     В кэше не найдено
     Индекс не выбран.
     Стоимость: 9982
Подбор индекса для таблицы 1SJOURN:
     Ограничения:
     Упорядочить: DATE,
     В кэше не найдено
     Выбран индекс ACDATETIM: DTOS(DATE)+TIME+IDDOC
     Попадает в сортировку
     Стоимость: 60
Подбор индекса для таблицы 1SJOURN:
     Ограничения: IDDOC=;
     В кэше не найдено
     Выбран индекс IDDOC: IDDOC
     Стоимость: 20
Время подготовки запроса: 32 мс, время выполнения запроса: 1083 мс.[/code]
Понимаю что правомерно выросло время получения данных, но как его снизить, т.к. борьба идет за каждую мс, и за объем базы то же :)
  
Наверх
ICQ  
IP записан
 
undo
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 53
Местоположение: Ульянвоск
Зарегистрирован: 25. Декабря 2008
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #524 - 16. Апреля 2013 :: 09:08
Печать  
Подошел к вопросу немного по другому:
[code]            "ВЫБРАТЬ
           |      Доходы.ДокументОтгрузки      КАК [ДокументОтгрузки $Документ],
           |      Доходы.ВидДолга            КАК СтатусДолга,
           |      Доходы.СуммаОстаток [Доходы.СуммаОстаток :Число.15.2]
           |,      Жур.IDDOC
           |,      $Жур.ДатаДокумента            КАК [ДокДата $Дата]
           |,      ВЫБОР КОГДА ($ДокРеал.IDDOC<>:ПустойИД) ТОГДА $ДокРеал.ТТочка ИНАЧЕ $ДокКорр.ТТочка КОНЕЦ      КАК [ТТочка $Справочник.ТорговыеTочки]
           |,      ВЫБОР КОГДА ($ДокРеал.IDDOC<>:ПустойИД) ТОГДА $ДокРеал.Агент ИНАЧЕ $ДокКорр.Агент КОНЕЦ            КАК [Агент $Справочник.Сотрудники]
           | ИЗ $РегистрОстатки.Взаиморасчеты(:КонПериода,
           |                  (
           |                  Контрагент = :Покупатель и
           |                  ВидДолга = :ВидДолга
           |                  ),
           |                  (Контрагент,ВидДолга,ДокументОтгрузки),(Сумма)) КАК Доходы
           |Внутреннее соединение ЖурналДокументов КАК Жур
           | ПО Жур.IDDOC = Сред(Доходы.ДокументОтгрузки,5,9) "+?(СпПараметры.Получить("Клиент").РасчетКредиторки=0," и Жур.Направление = :Направление","")+"
           |ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасходнаяНакладная КАК ДокРеал
           |      ПО ДокРеал.IDDOC = Жур.IDDOC
           |ЛЕВОЕ СОЕДИНЕНИЕ Документ.ВводДолжников КАК ДокКорр
           |      ПО ДокКорр.IDDOC = Жур.IDDOC
           |ГДЕ
           |      Доходы.СуммаОстаток<>0
           |Упорядочить
           |      $Жур.ДатаДокумента
           |";
[/code]
Использовал метод ВЫБОР
Старый запрос по одному документу
[code]Подбор индекса для таблицы RG18857:
     Ограничения: PERIOD=; SP18858[Контрагент]=; SP18976[ВидДолга]=;
     В кэше не найдено
     Выбран индекс PROP: DTOS(PERIOD)+SP18858+STR(SP18976,2)+SP18977
     Стоимость: 24
Подбор индекса для таблицы RA18857:
     Ограничения: DATETIME[dx_DATE_TIME_IDDOC_LINENO_ACTNO]>=; DATETIME[dx_DATE_TIME_IDDOC_LINENO_ACTNO]<; SP18858[Контрагент]=; SP18976[ВидДолга]=;
     В кэше не найдено
     Выбран индекс DATETIME: DTOS(DATE)+TIME+IDDOC+STR(LINENO,4)+STR(ACTNO,6)
     Стоимость: 18
Подбор индекса для таблицы 1SJOURN:
     Ограничения: SP16165[Направление]=;
     Упорядочить: DATE,
     В кэше не найдено
     Выбран индекс VIA16165: SP16165+DTOS(DATE)+TIME+IDDOC
     Попадает в сортировку
     Стоимость: 26
Подбор индекса для таблицы 1SJOURN:
     Ограничения: IDDOC=; SP16165[Направление]=;
     В кэше не найдено
     Выбран индекс IDDOC: IDDOC
     Стоимость: 20
Подбор индекса для таблицы DH16004:
     Ограничения: IDDOC=;
     В кэше не найдено
     Выбран индекс ID: IDDOC
     Стоимость: 18
Время подготовки запроса: 30 мс, время выполнения запроса: 107 мс.[/code]
а вот новый по времени вырос, но уже не так значительно
[code]
Подбор индекса для таблицы RG18857:
     Ограничения: PERIOD=; SP18858[Контрагент]=; SP18976[ВидДолга]=;
     В кэше не найдено
     Выбран индекс PROP: DTOS(PERIOD)+SP18858+STR(SP18976,2)+SP18977
     Стоимость: 24
Подбор индекса для таблицы RA18857:
     Ограничения: DATETIME[dx_DATE_TIME_IDDOC_LINENO_ACTNO]>=; DATETIME[dx_DATE_TIME_IDDOC_LINENO_ACTNO]<; SP18858[Контрагент]=; SP18976[ВидДолга]=;
     В кэше не найдено
     Выбран индекс DATETIME: DTOS(DATE)+TIME+IDDOC+STR(LINENO,4)+STR(ACTNO,6)
     Стоимость: 18
Подбор индекса для таблицы 1SJOURN:
     Ограничения: SP16165[Направление]=;
     Упорядочить: DATE,
     В кэше не найдено
     Выбран индекс VIA16165: SP16165+DTOS(DATE)+TIME+IDDOC
     Попадает в сортировку
     Стоимость: 26
Подбор индекса для таблицы 1SJOURN:
     Ограничения: IDDOC=; SP16165[Направление]=;
     В кэше не найдено
     Выбран индекс IDDOC: IDDOC
     Стоимость: 20
Подбор индекса для таблицы DH16004:
     Ограничения: IDDOC=;
     В кэше не найдено
     Выбран индекс ID: IDDOC
     Стоимость: 18
Подбор индекса для таблицы DH15857:
     Ограничения: IDDOC=;
     В кэше не найдено
     Выбран индекс ID: IDDOC
     Стоимость: 8
Время подготовки запроса: 47 мс, время выполнения запроса: 204 мс.[/code]
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 33 34 [35] 36 37 ... 51
ОтправитьПечать