Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Соединение в запросе (число прочтений - 3369 )
Юзеверъ
YaBB Newbies
*
Отсутствует



Сообщений: 9
Зарегистрирован: 30. Августа 2012
Пол: Мужской
Соединение в запросе
17. Июля 2013 :: 07:36
Печать  
Добрый день.
Прошу помочь в объединении запросов. Данный вариант работает:

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

	СписокНакладных = СоздатьОбъект("СписокЗначений");
	ИсхТаб = СоздатьОбъект("ИндексированнаяТаблица");
	ТабНакл = СоздатьОбъект("ТаблицаЗначений");

	//{ Установка параметров отбора запроса
	ФильтрТовар = "";
	Если ПустоеЗначение(ВыбТовар) = 0 Тогда
		Если ВыбТовар.ЭтоГруппа() = 1 Тогда
			ИмяТаблицы="#ГруппаТоваров";
			Запрос.УложитьСписокОбъектов(ВыбТовар,ИмяТаблицы,"ВидыТоваров");
			ФильтрТовар=ФильтрТовар+" AND Товар IN (SELECT Val FROM "+ИмяТаблицы+")";
		Иначе
			ФильтрТовар = ФильтрТовар+" AND Товар = :ВыбТовар";
			Запрос.УстановитьТекстовыйПараметр("ВыбТовар", ВыбТовар);
		КонецЕсли;
	КонецЕсли;
	ФильтрКонтр = "";
	Если ПустоеЗначение(ВыбКонтрагент) = 0 Тогда
		Если ВыбКонтрагент.ЭтоГруппа() = 1 Тогда
			ИмяТаблицы="#ГруппаКонтрагентов";
			Запрос.УложитьСписокОбъектов(ВыбКонтрагент,ИмяТаблицы,"Контрагенты");
			ФильтрКонтр=ФильтрКонтр+" AND ПодзапросКонтр.Ссылка IN (SELECT Val FROM "+ИмяТаблицы+")";
		Иначе
			ФильтрКонтр = ФильтрКонтр+" AND ПодзапросКонтр.Ссылка = :ВыбКонтрагент";
			Запрос.УстановитьТекстовыйПараметр("ВыбКонтрагент", ВыбКонтрагент);
		КонецЕсли;
	КонецЕсли;

	ФильтрФилиал = "";
	Если ПустоеЗначение(ВыбФилиал) = 0 Тогда
		ФильтрФилиал = "AND Подзапрос.ФилиалСотр = :ВыбФилиал";
		Запрос.УстановитьТекстовыйПараметр("ВыбФилиал", ВыбФилиал);
	КонецЕсли;

	ФильтрСклад = "";
	Если ПустоеЗначение(ВыбСклад) = 0 Тогда
		Если ВыбСклад.ЭтоГруппа() = 1 Тогда
			ИмяТаблицы="#ГруппаСкладов";
			Запрос.УложитьСписокОбъектов(ВыбСклад,ИмяТаблицы,"Склады");
			ФильтрСклад=ФильтрСклад+" AND (COALESCE($ДокТТН.МОЛ, $ДокАкт.МОЛ, $ДокВозвр.МОЛ) IN (SELECT Val FROM "+ИмяТаблицы+"))";
		Иначе
			ФильтрСклад = ФильтрСклад+" AND (COALESCE($ДокТТН.МОЛ, $ДокАкт.МОЛ, $ДокВозвр.МОЛ) = :ВыбСклад)";
			Запрос.УстановитьТекстовыйПараметр("ВыбСклад", ВыбСклад);
		КонецЕсли;
	КонецЕсли;
	//}

	//{ Текст запроса
	ТекстЗапроса = "
		|SELECT
		|	  РеализацияОбороты.Покупатель [Покупатель $Справочник.Контрагенты]
		|	, РеализацияОбороты.Товар [Товар $Справочник.ВидыТоваров]
		|	, РеализацияОбороты.ТипЦены [ТипЦены $Справочник.ТипыЦен]
		|	, ПодзапросФилиал.Филиал [Филиал $Справочник.Подразделение]
		|	, ПодзапросДок.СсылкаНаДокумент [СсылкаНаДокумент $Документ]
		|	, Sum(РеализацияОбороты.СуммаПриходнаяОборот) СуммаПриходная
		|	, Sum(РеализацияОбороты.СуммаОборот) СуммаСНДС
		|	, Sum(РеализацияОбороты.СуммаБезНДСОборот) СуммаБезНДС
		|	, Sum(РеализацияОбороты.КоличествоОборот) Количество
		|FROM $РегистрОбороты.Реализация(:НачДата
		|		,:КонДата~,,
		|		INNER JOIN (SELECT Сотрудники.ID Ссылка
		|					,$Сотрудники.Филиал  ФилиалСотр
		|					FROM $Справочник.Сотрудники AS Сотрудники) as Подзапрос ON 	Подзапрос.Ссылка=Менеджер "+ФильтрФилиал+"
		|		INNER JOIN (SELECT Контрагенты.ID Ссылка
		|				FROM $Справочник.Контрагенты AS Контрагенты) AS ПодзапросКонтр ON ПодзапросКонтр.Ссылка=Покупатель "+ФильтрКонтр+"
		|		INNER JOIN (SELECT Товары.ID Ссылка
		|				FROM $Справочник.ВидыТоваров AS Товары) AS ПодзапросТовар ON ПодзапросТовар.Ссылка=Товар "+ФильтрТовар+"
		|		,,
		|		(Накладная, Покупатель, Товар, ТипЦены, Менеджер),) AS РеализацияОбороты
		|
		|INNER JOIN (SELECT Документы.ID Ссылка
		|			, $Документы.СсылкаНаДокумент СсылкаНаДокумент
		|		FROM $Справочник.Документы AS Документы
		|) AS ПодзапросДок ON РеализацияОбороты.Накладная = ПодзапросДок.Ссылка
		|
		|INNER JOIN (SELECT Сотрудники.ID Ссылка
		|					,$Сотрудники.Филиал  Филиал
		|					FROM $Справочник.Сотрудники AS Сотрудники
		|) as ПодзапросФилиал ON ПодзапросФилиал.Ссылка=РеализацияОбороты.Менеджер
		|GROUP BY РеализацияОбороты.Покупатель
		|	, ПодзапросДок.СсылкаНаДокумент
		|	, РеализацияОбороты.Товар
		|	, РеализацияОбороты.ТипЦены
		|	, ПодзапросФилиал.Филиал
		|";
	//}
	Запрос.УстановитьТекстовыйПараметр("НачДата", НачДата);
	Запрос.УстановитьТекстовыйПараметр("КонДата", КонДата);
	Запрос.ВыполнитьИнструкцию(ТекстЗапроса,ИсхТаб,1);

	ИсхТаб.Выгрузить(ТабНакл,,,"СсылкаНаДокумент, СуммаПриходная");
	ТабНакл.Свернуть("СсылкаНаДокумент","СуммаПриходная");
	ТабНакл.Выгрузить(СписокНакладных,,,"СсылкаНаДокумент");


	ТекстЗапроса = "
		|SELECT Журнал.IDDOC [Документ $Документ]
		|	, Журнал.IDDOCDEF [Документ_вид $ВидДокумента]
		|, COALESCE($ДокТТН.МОЛ, $ДокАкт.МОЛ, $ДокВозвр.МОЛ) [Склад $Справочник.Склады]
		|FROM _1SJOURN AS Журнал
		|		LEFT OUTER JOIN	$Документ.ТТННаОрганизациюТовары as ДокТТН With (NOLOCK) ON Журнал.IDDoc = ДокТТН.IDDoc
		|		LEFT OUTER JOIN	$Документ.АктПриема as ДокАкт With (NOLOCK) ON Журнал.IDDoc =  ДокАкт.IDDoc
		|		LEFT OUTER JOIN	$Документ.ВозвратИзОрганизацииТоваров as ДокВозвр With (NOLOCK) ON Журнал.IDDoc =  ДокВозвр.IDDoc
		|WHERE (Журнал.IDDOC IN (SELECT val FROM #СписокДокументов)) "+ФильтрСклад+"
		|GROUP BY Журнал.IDDOC
		|	, Журнал.IDDOCDEF
		|	, COALESCE($ДокТТН.МОЛ, $ДокАкт.МОЛ, $ДокВозвр.МОЛ)
		|";
	Запрос.УложитьСписокОбъектов(СписокНакладных, "#СписокДокументов");
	тз2 = Запрос.ВыполнитьИнструкцию(ТекстЗапроса); 



Хотелось бы объеденить все в один запрос, но увы, не понимаю как... При попытке соединения выдает пустую таблицу (данных нет). И по возможности, указать на явные ошибки в запросах, если такие есть.
Прошу строго не судить, начинаю углуб##ться в прямые запросы.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Соединение в запросе
Ответ #1 - 17. Июля 2013 :: 10:56
Печать  
Выкинуть все соединения унутри ВТ таблички обороты, это для начала

inner join co справочником, тоже выкинуть, он не нужен, совсем.
  
Наверх
 
IP записан
 
Юзеверъ
YaBB Newbies
*
Отсутствует



Сообщений: 9
Зарегистрирован: 30. Августа 2012
Пол: Мужской
Re: Соединение в запросе
Ответ #2 - 17. Июля 2013 :: 11:07
Печать  
Это сделал, но больше интересует, как связать РеализацияОбороты.Накладная с реквизитом МОЛ в документе.

Нужный реквизит по пути: Справочник.Документы.СсылкаНаДокумент.Мол

(для запроса РеализацияОбороты.Накладная.СсылкаНаДокумент.Мол )

не могу верный подзапрос сделать (
  
Наверх
 
IP записан
 
Юзеверъ
YaBB Newbies
*
Отсутствует



Сообщений: 9
Зарегистрирован: 30. Августа 2012
Пол: Мужской
Re: Соединение в запросе
Ответ #3 - 17. Июля 2013 :: 13:27
Печать  
Спасибо, вопрос снят.
Дочитал, что ВТ с периодичностью "Документ" имеет дополнительное поле date_time_iddoc
  
Наверх
 
IP записан
 
Юзеверъ
YaBB Newbies
*
Отсутствует



Сообщений: 9
Зарегистрирован: 30. Августа 2012
Пол: Мужской
Re: Соединение в запросе
Ответ #4 - 17. Июля 2013 :: 13:38
Печать  
могут ли быть какие-то варианты по оптимизации запроса (все же новичок)?

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

	ИсхТаб = СоздатьОбъект("ИндексированнаяТаблица");

	//{ Установка параметров отбора запроса
	Фильтр = "";
	Если ПустоеЗначение(ВыбТовар) = 0 Тогда
		Если ВыбТовар.ЭтоГруппа() = 1 Тогда
			ИмяТаблицы="#ГруппаТоваров";
			Запрос.УложитьСписокОбъектов(ВыбТовар,ИмяТаблицы,"ВидыТоваров");
			Фильтр=Фильтр+"Товар IN (SELECT Val FROM "+ИмяТаблицы+")";
		Иначе
			Фильтр = Фильтр+"Товар = :ВыбТовар";
			Запрос.УстановитьТекстовыйПараметр("ВыбТовар", ВыбТовар);
		КонецЕсли;
	КонецЕсли;

	Если ПустоеЗначение(ВыбКонтрагент) = 0 Тогда
		Если Фильтр <> "" Тогда
			Фильтр=Фильтр+" AND ";
		КонецЕсли;
		Если ВыбКонтрагент.ЭтоГруппа() = 1 Тогда
			ИмяТаблицы="#ГруппаКонтрагентов";
			Запрос.УложитьСписокОбъектов(ВыбКонтрагент,ИмяТаблицы,"Контрагенты");
			Фильтр=Фильтр+"Покупатель IN (SELECT Val FROM "+ИмяТаблицы+")";
		Иначе
			Фильтр = Фильтр+"Покупатель = :ВыбКонтрагент";
			Запрос.УстановитьТекстовыйПараметр("ВыбКонтрагент", ВыбКонтрагент);
		КонецЕсли;
	КонецЕсли;

	ФильтрФилиал = "";
	Если ПустоеЗначение(ВыбФилиал) = 0 Тогда
		ФильтрФилиал = "AND ПодзапросФилиал.Филиал = :ВыбФилиал";
		Запрос.УстановитьТекстовыйПараметр("ВыбФилиал", ВыбФилиал);
	КонецЕсли;

	ФильтрСклад = "";
	Если ПустоеЗначение(ВыбСклад) = 0 Тогда
		Если ВыбСклад.ЭтоГруппа() = 1 Тогда
			ИмяТаблицы="#ГруппаСкладов";
			Запрос.УложитьСписокОбъектов(ВыбСклад,ИмяТаблицы,"Склады");
			ФильтрСклад=ФильтрСклад+" AND ПодзапросСклад.Склад IN (SELECT Val FROM "+ИмяТаблицы+")";
		Иначе
			ФильтрСклад = ФильтрСклад+" AND ПодзапросСклад.Склад = :ВыбСклад";
			Запрос.УстановитьТекстовыйПараметр("ВыбСклад", ВыбСклад);
		КонецЕсли;
	КонецЕсли;
	//}

	//{ Текст запроса
	ТекстЗапроса = "
		|SELECT
		|	  РеализацияОбороты.Покупатель [Покупатель $Справочник.Контрагенты]
		|	, РеализацияОбороты.Товар [Товар $Справочник.ВидыТоваров]
		|	, РеализацияОбороты.ТипЦены [ТипЦены $Справочник.ТипыЦен]
		|   , RIGHT(РеализацияОбороты.ПозицияДокумента,9) [Док $Документ]
		|   , MAX(РеализацияОбороты.ВидДокумента) [Док_вид $ВидДокумента]
		|	, ПодзапросФилиал.Филиал [Филиал $Справочник.Подразделение]
		|	, ПодзапросСклад.Склад [Склад $Справочник.Склады]
		|	, Sum(РеализацияОбороты.СуммаПриходнаяОборот) СуммаПриходная
		|	, Sum(РеализацияОбороты.СуммаОборот) СуммаСНДС
		|	, Sum(РеализацияОбороты.СуммаБезНДСОборот) СуммаБезНДС
		|	, Sum(РеализацияОбороты.КоличествоОборот) Количество
		|FROM $РегистрОбороты.Реализация(
		|		:НачДата
		|		,:КонДата~
		|		,Документ
		|		,INNER JOIN (SELECT Сотрудники.ID Ссылка
		|					,$Сотрудники.Филиал  ФилиалСотр
		|					FROM $Справочник.Сотрудники AS Сотрудники) as Подзапрос ON 	Подзапрос.Ссылка=Менеджер
		|		,"+Фильтр+"
		|		,( Покупатель, Товар, ТипЦены, Менеджер),) AS РеализацияОбороты
		|INNER JOIN (SELECT Сотрудники.ID Ссылка
		|					,$Сотрудники.Филиал  Филиал
		|					FROM $Справочник.Сотрудники AS Сотрудники
		|) as ПодзапросФилиал ON ПодзапросФилиал.Ссылка=РеализацияОбороты.Менеджер "+ФильтрФилиал+"
		|
		|INNER JOIN(SELECT Журнал.IDDOC ЖурДок
		|			, Журнал.IDDOCDEF [Документ_вид $ВидДокумента]
		|			, COALESCE($ДокТТН.МОЛ, $ДокАкт.МОЛ, $ДокВозвр.МОЛ) Склад
		|		FROM _1SJOURN AS Журнал
		|			LEFT OUTER JOIN	$Документ.ТТННаОрганизациюТовары as ДокТТН With (NOLOCK) ON Журнал.IDDoc = ДокТТН.IDDoc
		|			LEFT OUTER JOIN	$Документ.АктПриема as ДокАкт With (NOLOCK) ON Журнал.IDDoc =  ДокАкт.IDDoc
		|			LEFT OUTER JOIN	$Документ.ВозвратИзОрганизацииТоваров as ДокВозвр With (NOLOCK) ON Журнал.IDDoc =  ДокВозвр.IDDoc
		|) AS ПодзапросСклад ON RIGHT(РеализацияОбороты.ПозицияДокумента,9) = ПодзапросСклад.ЖурДок "+ФильтрСклад+"
		|
		|GROUP BY РеализацияОбороты.Покупатель
		|	, ПодзапросСклад.Склад
		|	, РеализацияОбороты.Товар
		|	, РеализацияОбороты.ТипЦены
		|	, ПодзапросФилиал.Филиал
		|	, РеализацияОбороты.ПозицияДокумента
		|";
	//}
	Запрос.УстановитьТекстовыйПараметр("НачДата", НачДата);
	Запрос.УстановитьТекстовыйПараметр("КонДата", КонДата);

	Запрос.ВыполнитьИнструкцию(ТекстЗапроса,ИсхТаб,1);
	глПечать_иТЗ(ИсхТаб);	 

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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Соединение в запросе
Ответ #5 - 18. Июля 2013 :: 05:46
Печать  
да.
Выкинуть все соединения унутри виртуальной таблички $РегистрОбороты.Реализация
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Соединение в запросе
Ответ #6 - 18. Июля 2013 :: 06:21
Печать  
На вот, занимайся

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

	ИсхТаб = СоздатьОбъект("ИндексированнаяТаблица");

	//{ Установка параметров отбора запроса
	Фильтр = "";
	Если ПустоеЗначение(ВыбТовар) = 0 Тогда
		Если ВыбТовар.ЭтоГруппа() = 1 Тогда
			ИмяТаблицы="#ГруппаТоваров";
			Запрос.УложитьСписокОбъектов(ВыбТовар,ИмяТаблицы,"ВидыТоваров");
			Фильтр=Фильтр+"Товар IN (SELECT Val FROM "+ИмяТаблицы+")";
		Иначе
			Фильтр = Фильтр+"Товар = :ВыбТовар";
			Запрос.УстановитьТекстовыйПараметр("ВыбТовар", ВыбТовар);
		КонецЕсли;
	КонецЕсли;

	Если ПустоеЗначение(ВыбКонтрагент) = 0 Тогда
		Если Фильтр <> "" Тогда
			Фильтр=Фильтр+" AND ";
		КонецЕсли;
		Если ВыбКонтрагент.ЭтоГруппа() = 1 Тогда
			ИмяТаблицы="#ГруппаКонтрагентов";
			Запрос.УложитьСписокОбъектов(ВыбКонтрагент,ИмяТаблицы,"Контрагенты");
			Фильтр=Фильтр+"Покупатель IN (SELECT Val FROM "+ИмяТаблицы+")";
		Иначе
			Фильтр = Фильтр+"Покупатель = :ВыбКонтрагент";
			Запрос.УстановитьТекстовыйПараметр("ВыбКонтрагент", ВыбКонтрагент);
		КонецЕсли;
	КонецЕсли;

	Условия = "";
	Если ПустоеЗначение(ВыбФилиал) = 0 Тогда
		Условия = " Where $Сотрудники.Филиал = :ВыбФилиал";
		Запрос.УстановитьТекстовыйПараметр("ВыбФилиал", ВыбФилиал);
	КонецЕсли;

	Если ПустоеЗначение(ВыбСклад) = 0 Тогда
		Если ПустаяСтрока(Условия)=1 Тогда
			Условия = "Where ";
		Иначе
			Условия = Условия +" and ";
		КонецЕсли;
		Если ВыбСклад.ЭтоГруппа() = 1 Тогда
			ИмяТаблицы="#ГруппаСкладов";
			Запрос.УложитьСписокОбъектов(ВыбСклад,ИмяТаблицы,"Склады");
			Условия=Условия+" COALESCE($ДокТТН.МОЛ, $ДокАкт.МОЛ, $ДокВозвр.МОЛ) IN (SELECT Val FROM "+ИмяТаблицы+")";
		Иначе
			Условия = Условия+" COALESCE($ДокТТН.МОЛ, $ДокАкт.МОЛ, $ДокВозвр.МОЛ) = :ВыбСклад";
			Запрос.УстановитьТекстовыйПараметр("ВыбСклад", ВыбСклад);
		КонецЕсли;
	КонецЕсли;
	//}

	//{ Текст запроса
	ТекстЗапроса = "
		|SELECT
		|	  РеализацияОбороты.Покупатель [Покупатель $Справочник.Контрагенты]
		|	, РеализацияОбороты.Товар [Товар $Справочник.ВидыТоваров]
		|	, РеализацияОбороты.ТипЦены [ТипЦены $Справочник.ТипыЦен]
		|   , RIGHT(РеализацияОбороты.ПозицияДокумента,9) [Док $Документ]
		|   , MAX(РеализацияОбороты.ВидДокумента) [Док_вид $ВидДокумента]
		|	, $Сотрудники.Филиал [Филиал $Справочник.Подразделение]
		|	, COALESCE($ДокТТН.МОЛ, $ДокАкт.МОЛ, $ДокВозвр.МОЛ)  [Склад $Справочник.Склады]
		|	, Sum(РеализацияОбороты.СуммаПриходнаяОборот) СуммаПриходная
		|	, Sum(РеализацияОбороты.СуммаОборот) СуммаСНДС
		|	, Sum(РеализацияОбороты.СуммаБезНДСОборот) СуммаБезНДС
		|	, Sum(РеализацияОбороты.КоличествоОборот) Количество
		|FROM $РегистрОбороты.Реализация(
		|		:НачДата
		|		,:КонДата~
		|		,Документ
		|	 ,
		|		,"+Фильтр+"
		|		,( Покупатель, Товар, ТипЦены, Менеджер),) AS РеализацияОбороты
		|LEFT JOIN $Справочник.Сотрудники AS Сотрудники (nolock) on Сотрудники.id = РеализацияОбороты.Менеджер
		|LEFT  JOIN	$Документ.ТТННаОрганизациюТовары as ДокТТН (NOLOCK) ON RIGHT(РеализацияОбороты.ПозицияДокумента,9) = ДокТТН.IDDoc
		|LEFT  JOIN	$Документ.АктПриема as ДокАкт (NOLOCK) ON RIGHT(РеализацияОбороты.ПозицияДокумента,9) =  ДокАкт.IDDoc
		|LEFT  JOIN	$Документ.ВозвратИзОрганизацииТоваров as ДокВозвр (NOLOCK) ON RIGHT(РеализацияОбороты.ПозицияДокумента,9) =  ДокВозвр.IDDoc
		|
		|Условия
		|GROUP BY
		|     РеализацияОбороты.Покупатель
		|	, РеализацияОбороты.Товар
		|	, РеализацияОбороты.ТипЦены
		|	, РеализацияОбороты.ПозицияДокумента
		|	, $Сотрудники.Филиал
		|	, COALESCE($ДокТТН.МОЛ, $ДокАкт.МОЛ, $ДокВозвр.МОЛ)
		|";
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"Условия",Условия);
	//}
	Запрос.УстановитьТекстовыйПараметр("НачДата", НачДата);
	Запрос.УстановитьТекстовыйПараметр("КонДата", КонДата);

	Запрос.ВыполнитьИнструкцию(ТекстЗапроса,ИсхТаб,1);
	глПечать_иТЗ(ИсхТаб);	 

« Последняя редакция: 18. Июля 2013 :: 09:59 - Eprst »  
Наверх
 
IP записан
 
Юзеверъ
YaBB Newbies
*
Отсутствует



Сообщений: 9
Зарегистрирован: 30. Августа 2012
Пол: Мужской
Re: Соединение в запросе
Ответ #7 - 18. Июля 2013 :: 07:41
Печать  
Спасибо. Кое чего подчерпнул и запомнил.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать