Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Запрос по регистру (число прочтений - 929 )
Павел 1c
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 3
Зарегистрирован: 21. Февраля 2019
Запрос по регистру
21. Февраля 2019 :: 15:52
Печать  
1с ТиС, SQL.
На форме "выбор период"; списки значений: "ВыбТовар", "ВыбСклады", "ВыбКатегории"; поля выбора справочников (может быть группа): "ВыбМарка", "ВыбПоставщик", "ВыбПоставщикКарточка"; выбор документа: "ВыбПартияТовара"; выбор даты: "ДоДаты"; флаг "ОтрицательныеОстатки"
Необходимо чтобы из регистра выбирались данные в зависимости от выбранных условий. Написал запрос:
[code]      Запрос = СоздатьОбъект("ODBCRecordset");
           ТекстЗапроса = "
           |SELECT ОстаткиТМЦ.Товар [Товар $Справочник.Номенклатура]
           |            , ОстаткиТМЦ.Сотрудник [Склад $Справочник.МестаХранения]
           |            , ОстаткиТМЦ.ПрихДокумент [Партия $Документ]
           |            , $ТМЦ.ВидЛитературы [Марка $Справочник.ВидЛитературы]
           |            , $ТМЦ.Категория [Категория $Справочник.Категория]
           |            , $ТМЦ.Поставщик [ПоставщикКар $Справочник.Контрагенты]
           
           |            , Sum(ОстаткиТМЦ.ОстатокНачальныйОстаток)  ОстатокТовараНачОст
           |            , Sum(ОстаткиТМЦ.ОстатокКонечныйОстаток)   ОстатокТовараКонОст
           |            , Sum(ОстаткиТМЦ.ОстатокПриход)               ОстатокТовараПриход
           |            , Sum(ОстаткиТМЦ.ОстатокРасход)                ОстатокТовараРасход";
           
           ВидРесурса = "";
     Если ЗакупкаСебестоимость = 1 Тогда
                 ВидРесурса = "Закупочная стоимость";
                 ТекстЗапроса = ТекстЗапроса + "
           |            ,Sum(ОстаткиТМЦ.ЗакупочнаяСтоимостьНачальныйОстаток)    СтоимостьНачОст
           |            ,Sum(ОстаткиТМЦ.ЗакупочнаяСтоимостьКонечныйОстаток)      СтоимостьКонОст
           |            ,Sum(ОстаткиТМЦ.ЗакупочнаяСтоимостьПриход)                СтоимостьПриход
           |            ,Sum(ОстаткиТМЦ.ЗакупочнаяСтоимостьРасход)                        СтоимостьРасход
           |
           |FROM $РегистрОстаткиОбороты.ОстаткиТовара(:НачДата,:КонДата~,,,,";
     Иначе
                 ВидРесурса = "Себестоимость";
                 ТекстЗапроса = ТекстЗапроса + "
           |            ,Sum(ОстаткиТМЦ.СебестоимостьНачальныйОстаток)         СтоимостьНачОст
           |            ,Sum(ОстаткиТМЦ.СебестоимостьКонечныйОстаток)         СтоимостьКонОст
           |            ,Sum(ОстаткиТМЦ.СебестоимостьПриход)                 СтоимостьПриход
           |            ,Sum(ОстаткиТМЦ.СебестоимостьРасход)                     СтоимостьРасход
           |
           |FROM $РегистрОстаткиОбороты.ОстаткиТовара(:НачДата,:КонДата~,,,,";
     КонецЕсли;
     
     Если ЗакупкаСебестоимость = 1 Тогда
           ТекстЗапроса = ТекстЗапроса +",(Товар,Сотрудник,ПрихДокумент),(Остаток,ЗакупочнаяСтоимость)) AS ОстаткиТМЦ";
     Иначе
           ТекстЗапроса = ТекстЗапроса +",(Товар,Сотрудник,ПрихДокумент),(Остаток,Себестоимость)) AS ОстаткиТМЦ";
     КонецЕсли;      
           ТекстЗапроса = ТекстЗапроса+"
           |             LEFT JOIN $Справочник.Номенклатура AS Номенклатура With (NOLOCK) ON Товар =Номенклатура.ID
           |             LEFT JOIN $Справочник.МестаХранения AS МестаХранения      With (NOLOCK) ON  Сотрудник = МестаХранения.ID
           |             LEFT JOIN $Справочник.ВидЛитературы AS Марка With (NOLOCK) ON        $ТМЦ.ВидЛитературы = Марка.ID
           |             LEFT JOIN $Справочник.Категория AS Категория With (NOLOCK) ON       $ТМЦ.Категория = Категория.ID
           |             LEFT JOIN $Справочник.Контрагенты AS Контрагенты With (NOLOCK) ON      $ТМЦ.Поставщик = Контрагенты.ID
           |             LEFT JOIN _1SJOURN AS Журнал With (NOLOCK) ON ПрихДокумент = Журнал.IDDOC
           |";
     
     естьпоступление=0;
     Если (ПартииДоДаты = 1) Тогда
           ТекстЗапроса = ТекстЗапроса+"
           |            LEFT JOIN $Документ.ПоступлениеТовара AS ПоступлениеТовара With (NOLOCK) ON ПоступлениеТовара.IDDOC = Журнал.IDDOC
           |";
           естьпоступление =1;
     ИначеЕсли (ВыбПоставщик.Выбран() = 1) и (естьпоступление = 0)Тогда      
           ТекстЗапроса = ТекстЗапроса+"
           |            LEFT JOIN $Документ.ПоступлениеТовара AS ПоступлениеТовара With (NOLOCK) ON ПоступлениеТовара.IDDOC = Журнал.IDDOC AND $ПоступлениеТовара.Поставщик = Контрагенты.ID
           |";
     ИначеЕсли (ВыбПоставщик.Выбран() = 1) и (естьпоступление = 1)Тогда
           ТекстЗапроса = ТекстЗапроса+"
           |            AND $ПоступлениеТовара.Поставщик = Контрагенты.ID
           |";
     КонецЕсли;
     естьусловие=0;
     Если ВыбТовар.РазмерСписка() > 0 Тогда
                 ТекстЗапроса = ТекстЗапроса + "WHERE(Товар IN (SELECT val FROM #ВыбТовары))";
                 естьусловие = 1;
     КонецЕсли;
     Если  ВыбСклады.РазмерСписка() > 0 Тогда
           Если естьусловие = 0 Тогда
                 ТекстЗапроса = ТекстЗапроса + "WHERE (Сотрудник IN (SELECT val FROM #СкладыВыбора))";
           Иначе
                 ТекстЗапроса = ТекстЗапроса + " AND (Сотрудник IN (SELECT val FROM #СкладыВыбора))";
           КонецЕсли;
           естьусловие = 1;
     КонецЕсли;
     Если ВыбПоставщикКарточка.Выбран() = 1 Тогда
           Если естьусловие = 0 Тогда
                 ТекстЗапроса = ТекстЗапроса + "WHERE($ТМЦ.Поставщик IN (SELECT val FROM #ВыбПостащикКарт))";
           Иначе
                 ТекстЗапроса = ТекстЗапроса + "AND ($ТМЦ.Поставщик IN (SELECT val FROM #ВыбПостащикКарт))";
           КонецЕсли;
           естьусловие = 1;
     КонецЕсли;      
     Если ВыбМарка.Выбран() =1 Тогда
           Если естьусловие = 0 Тогда
                 ТекстЗапроса = ТекстЗапроса + "WHERE ($ТМЦ.ВидЛитературы IN (SELECT val FROM #ВыбМарка))";
           Иначе
                 ТекстЗапроса = ТекстЗапроса + " AND ($ТМЦ.ВидЛитературы IN (SELECT val FROM #ВыбМарка))";
           КонецЕсли;      
           естьусловие = 1;
     КонецЕсли;
     Если  ВыбКатегории.РазмерСписка() > 0 Тогда
           Если естьусловие = 0 Тогда
                 ТекстЗапроса = ТекстЗапроса + "WHERE ($ТМЦ.Категория IN (SELECT val FROM #ВыбКатегория))";
           Иначе
                 ТекстЗапроса = ТекстЗапроса + " AND ($ТМЦ.Категория IN (SELECT val FROM #ВыбКатегория))";
           КонецЕсли;      
           естьусловие = 1;
     КонецЕсли;
     Если ВыбПартияТовара.Выбран() = 1 Тогда
           Если естьусловие = 0 Тогда
                 ТекстЗапроса = ТекстЗапроса + "WHERE (ПрихДокумент = ВыбПартияТовара)";
                       Иначе
                 ТекстЗапроса = ТекстЗапроса + " AND (ПрихДокумент = ВыбПартияТовара)";
                 КонецЕсли;      
           естьусловие = 1;
     КонецЕсли;
   
     
  
Наверх
 
IP записан
 
Павел 1c
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 3
Зарегистрирован: 21. Февраля 2019
Re: Запрос по регистру
Ответ #1 - 21. Февраля 2019 :: 15:54
Печать  
Код
Выбрать все
    Если ОтрицательныеОстатки = 1 Тогда
		Если естьусловие = 0 Тогда
			ТекстЗапроса = ТекстЗапроса + "WHERE (ОстатокНачальныйОстаток < 0)";
		Иначе
			ТекстЗапроса = ТекстЗапроса + " AND (ОстатокНачальныйОстаток < 0)";
		КонецЕсли;
		естьусловие = 1;
	КонецЕсли;

	Если ВыбПоставщик.Выбран() = 1 Тогда
		Если естьусловие = 0 Тогда
			ТекстЗапроса = ТекстЗапроса + "
				|	WHERE((Журнал.CLOSED & 1) = 1)
				|	AND (Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime)>=:НачДата)
				|	AND (Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime)<=:КонДата)
				|	AND (Журнал.IDDOCDEF = $ВидДокумента36.ПоступлениеТовара)
				|	AND ($ПоступлениеТовара.Поставщик IN (SELECT val FROM #ВыбПоставщик))";
		Иначе
			ТекстЗапроса = ТекстЗапроса + "
				|	AND ((Журнал.CLOSED & 1) = 1)
				|	AND (Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime)>=:НачДата)
				|	AND (Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime)<=:КонДата)
				|	AND (Журнал.IDDOCDEF = $ВидДокумента36.ПоступлениеТовара)
				|	AND ($ПоступлениеТовара.Поставщик IN (SELECT val FROM #ВыбПоставщик))";
		КонецЕсли;
		естьусловие = 1;
	КонецЕсли;

	Если ПартииДоДаты = 1 Тогда
		Если естьусловие = 0 Тогда
			Если  ВыбПоставщик.Выбран() = 1 Тогда
				ТекстЗапроса = ТекстЗапроса + " AND (Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime) < :ВыбДата)";
			Иначе
				ТекстЗапроса = ТекстЗапроса + "WHERE (Журнал.IDDOCDEF = $ВидДокумента36.ПоступлениеТовара) AND (Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime) < :ВыбДата)";
			КонецЕсли;
		Иначе
			Если  ВыбПоставщик.Выбран() = 1 Тогда
				ТекстЗапроса = ТекстЗапроса + " AND (Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime) < :ВыбДата)";
			Иначе
				ТекстЗапроса = ТекстЗапроса + " AND (Журнал.IDDOCDEF = $ВидДокумента36.ПоступлениеТовара) AND (Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime) < :ВыбДата)";
			КонецЕсли;
		КонецЕсли;
		естьусловие = 1;
	КонецЕсли;

	ТекстЗапроса = ТекстЗапроса + "
		|GROUP BY ОстаткиТМЦ.Товар
		|		, ОстаткиТМЦ.Сотрудник
		|		, ОстаткиТМЦ.ПрихДокумент
		|		, $ТМЦ.ВидЛитературы
		|		, $ТМЦ.Категория
		|		, $ТМЦ.Поставщик
		|";

	Запрос.УстановитьТекстовыйПараметр("НачДата", НачДата);
	Запрос.УстановитьТекстовыйПараметр("КонДата", КонДата);

	Если ПартииДоДаты = 1 Тогда
		Запрос.УстановитьТекстовыйПараметр("ВыбДата", ДоДаты);
	Конецесли;

	Если ВыбТовар.РазмерСписка() > 0 Тогда
		Запрос.УложитьСписокОбъектов(ВыбТовар,"#ВыбТовары","Номенклатура");
	Конецесли;

	Если ВыбСклады.РазмерСписка() > 0 Тогда
		Запрос.УложитьСписокОбъектов(ВыбСклады,"#СкладыВыбора","МестаХранения");
	КонецЕсли;

	Если ВыбПоставщикКарточка.Выбран() = 1 Тогда
		ы");
	КонецЕсли;

	Если ВыбМарка.Выбран() =1 Тогда
		Запрос.УложитьСписокОбъектов(ВыбМарка,"#ВыбМарка","ВидЛитературы");
	КонецЕсли;

	Если ВыбКатегории.РазмерСписка() > 0 Тогда
		Запрос.УложитьСписокОбъектов(ВыбКатегории,"#ВыбКатегория","Категория");
	КонецЕсли;

	Если ВыбПоставщик.Выбран() = 1 Тогда
		Запрос.УложитьСписокОбъектов(ВыбПоставщик,"#ВыбПоставщик","Контрагенты");
	КонецЕсли;

	Состояние("Выполняем запрос");

	Запрос.Отладка(Отладка);
	Попытка
		//Сообщить(ТекстЗапроса);
		Запрос.ВыполнитьИнструкцию(ТекстЗапроса,ТЗост,1);
	Исключение
		Запрос.ПолучитьОписаниеОшибки();
	КонецПопытки; 



Выдает пустую таблицу. Что не так?
  
Наверх
 
IP записан
 
Павел 1c
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 3
Зарегистрирован: 21. Февраля 2019
Re: Запрос по регистру
Ответ #2 - 21. Февраля 2019 :: 15:58
Печать  
SQL получается:
Код (SQL)
Выбрать все
SELECT ОстаткиТМЦ.Товар [Товар $Справочник.Номенклатура]
		, ОстаткиТМЦ.Сотрудник [Склад $Справочник.МестаХранения]
		, ОстаткиТМЦ.ПрихДокумент [Партия $Документ]
		, $ТМЦ.ВидЛитературы [Марка $Справочник.ВидЛитературы]
		, $ТМЦ.Категория [Категория $Справочник.Категория]
		, $ТМЦ.Поставщик [ПоставщикКар $Справочник.Контрагенты]
		, Sum(ОстаткиТМЦ.ОстатокНачальныйОстаток)  ОстатокТовараНачОст
		, Sum(ОстаткиТМЦ.ОстатокКонечныйОстаток)   ОстатокТовараКонОст
		, Sum(ОстаткиТМЦ.ОстатокПриход) 		   ОстатокТовараПриход
		, Sum(ОстаткиТМЦ.ОстатокРасход)  		   ОстатокТовараРасход
		,Sum(ОстаткиТМЦ.ЗакупочнаяСтоимостьНачальныйОстаток)    СтоимостьНачОст
		,Sum(ОстаткиТМЦ.ЗакупочнаяСтоимостьКонечныйОстаток) 	СтоимостьКонОст
		,Sum(ОстаткиТМЦ.ЗакупочнаяСтоимостьПриход)           	СтоимостьПриход
		,Sum(ОстаткиТМЦ.ЗакупочнаяСтоимостьРасход)			 	СтоимостьРасход

FROM хДокумент),(Остаток,ЗакупочнаяСтоимость)) AS ОстаткиТМЦ
		 LEFT JOIN $Справочник.Номенклатура AS Номенклатура With (NOLOCK) ON Товар =Номенклатура.ID
		 LEFT JOIN $Справочник.МестаХранения AS МестаХранения 	With (NOLOCK) ON  Сотрудник = МестаХранения.ID
		 LEFT JOIN $Справочник.ВидЛитературы AS Марка With (NOLOCK) ON 	  $ТМЦ.ВидЛитературы = Марка.ID
		 LEFT JOIN $Справочник.Категория AS Категория With (NOLOCK) ON  	$ТМЦ.Категория = Категория.ID
		 LEFT JOIN $Справочник.Контрагенты AS Контрагенты With (NOLOCK) ON 	$ТМЦ.Поставщик = Контрагенты.ID
		 LEFT JOIN _1SJOURN AS Журнал With (NOLOCK) ON ПрихДокумент = Журнал.IDDOC
		 LEFT JOIN $Документ.ПоступлениеТовара AS ПоступлениеТовара With (NOLOCK) ON ПоступлениеТовара.IDDOC = Журнал.IDDOC
WHERE(Товар IN (SELECT val FROM #ВыбТовары)) AND (Сотрудник IN (SELECT val FROM #СкладыВыбора))AND ($ТМЦ.Поставщик IN (SELECT val FROM #ВыбПостащикКарт)) AND ($ТМЦ.Категория IN (SELECT val FROM #ВыбКатегория)) AND (ОстатокНачальныйОстаток < 0)
	AND ((Журнал.CLOSED & 1) = 1)
	AND (Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime)>=:НачДата)
	AND (Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime)<=:КонДата)
	AND (Журнал.IDDOCDEF = $ВидДокумента36.ПоступлениеТовара)
	AND ($ПоступлениеТовара.Поставщик IN (SELECT val FROM #ВыбПоставщик)) AND (Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime) < :ВыбДата)
GROUP BY ОстаткиТМЦ.Товар
		, ОстаткиТМЦ.Сотрудник
		, ОстаткиТМЦ.ПрихДокумент
		, $ТМЦ.ВидЛитературы
		, $ТМЦ.Категория
		, $ТМЦ.Поставщик 



Но не всегда все выбранные условия заполняются
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать