Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Вопрос по СКД (число прочтений - 5843 )
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Вопрос по СКД
18. Июля 2013 :: 14:39
Печать  
Коллеги, подскажите, как сделать вот такой простейший отчет по некому регистру накопления (Номенклатура, Склад; Колво)
Колонки: Номенклатура, Остаток1, Остаток2
где Остаток1 - конечный остаток по скаладу(-ам), который выбран в отборе СКД, а Остаток2 - по складу(-ам), заданному жестко, как параметр.
Т.е. в не зависимости, от того, какие склады установлены в отборе, третья колонка должна формироваться по определенному складу.
 
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Вопрос по СКД
Ответ #1 - 19. Июля 2013 :: 07:42
Печать  
Примерчик наваял в типовой КА 1.1:
Код
Выбрать все
ВЫБРАТЬ
	ТоварыНаСкладахОстатки.Склад,
	ТоварыНаСкладахОстатки.Номенклатура,
	ТоварыНаСкладахОстатки.КоличествоОстаток КАК Остаток1,
	0 КАК Остаток2
ПОМЕСТИТЬ Остатки
ИЗ
	РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Склад <> &ОпорныйСклад) КАК ТоварыНаСкладахОстатки

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	ТоварыНаСкладахОстатки.Склад,
	ТоварыНаСкладахОстатки.Номенклатура,
	0,
	ТоварыНаСкладахОстатки.КоличествоОстаток
ИЗ
	РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Склад = &ОпорныйСклад) КАК ТоварыНаСкладахОстатки
;


ВЫБРАТЬ
	Остатки.Номенклатура,
	СУММА(Остатки.Остаток1) КАК Остаток1,
	СУММА(Остатки.Остаток2) КАК Остаток2
ИЗ
	Остатки КАК Остатки
ГДЕ
	(Остатки.Склад = &ОпорныйСклад
			ИЛИ Остатки.Склад В (&ОтборПоСкладам))

СГРУППИРОВАТЬ ПО
	Остатки.Номенклатура 



Во вложении СКД
  

0.xml ( 7 KB | Загрузки )
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Вопрос по СКД
Ответ #2 - 19. Июля 2013 :: 12:56
Печать  
Все не так....без всяких параметров.

Вот как оказывается нужно делать.

Код
Выбрать все
ВЫБРАТЬ
	Номенклатура 		КАК Номенклатура,
	КоличествоОстаток 	КАК КоличествоОстаток1,
	Склад				Склад1
into
	t1
ИЗ
	РегистрНакопления.ТоварыНаСкладах.Остатки() КАК ТоварыНаСкладахОстатки
;

ВЫБРАТЬ
	Номенклатура 		КАК Номенклатура,
	КоличествоОстаток 	КАК КоличествоОстаток2,
	Склад				Склад2
	into t2
ИЗ
	РегистрНакопления.ТоварыНаСкладах.Остатки() КАК ТоварыНаСкладахОстатки
;


Select
	t1.Номенклатура,
	КоличествоОстаток1,
	КоличествоОстаток2
from
	t1
inner join
	t2
on
	t1.Номенклатура = t2.Номенклатура
{WHERE
	Склад1, Склад2}
 



Отбор по полю склад запрещаем, по Склад1 и Склад2 соответственно разрешаем.
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Вопрос по СКД
Ответ #3 - 22. Июля 2013 :: 04:32
Печать  
Не обижайся, но ты сделал то же самое, только через анус ...
Если ты так уж сильно боишься параметров, то правильнее будет сделать так:
Код
Выбрать все
ВЫБРАТЬ
	ТоварыНаСкладахОстатки.Склад,
	ТоварыНаСкладахОстатки.Номенклатура,
	ТоварыНаСкладахОстатки.КоличествоОстаток КАК Остаток
ПОМЕСТИТЬ Остатки
ИЗ
	РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад <> &ОпорныйСклад) КАК ТоварыНаСкладахОстатки
;


ВЫБРАТЬ
	ТоварыНаСкладахОстатки.Номенклатура,
	ТоварыНаСкладахОстатки.КоличествоОстаток КАК Остаток
ПОМЕСТИТЬ ОстаткиОпорные
ИЗ
	РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &ОпорныйСклад) КАК ТоварыНаСкладахОстатки
;


ВЫБРАТЬ
	Остатки.Номенклатура,
	СУММА(Остатки.Остаток) КАК Остаток1,
	СУММА(ОстаткиОпорные.Остаток) КАК Остаток2
ИЗ
	Остатки КАК Остатки
		ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиОпорные КАК ОстаткиОпорные
		ПО Остатки.Номенклатура = ОстаткиОпорные.Номенклатура

СГРУППИРОВАТЬ ПО
	Остатки.Номенклатура 

Никакие отборы запрещать не требуется.
Единственный минус (против множества в твоем варианте): непредсказуемое для пользователя поведение, когда в отборе указан опорный склад, т.к. по нему остатки показаны не будут; но если такая возможность нужна, то в параметре ВТ первого пакета надо убрать условие.
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Вопрос по СКД
Ответ #4 - 22. Июля 2013 :: 05:38
Печать  
Вот универсальный вариант, который мне требовался, без всяких параметров.
Код
Выбрать все
SELECT
	ТоварыНаСкладахОстатки1.Номенклатура,
	ТоварыНаСкладахОстатки1.КоличествоОстаток КАК Остаток1,
	ТоварыНаСкладахОстатки2.КоличествоОстаток КАК Остаток2
FROM
	РегистрНакопления.ТоварыНаСкладах.Остатки(, {(Склад) AS Склад1}) КАК ТоварыНаСкладахОстатки1
INNER JOIN
	РегистрНакопления.ТоварыНаСкладах.Остатки(, {(Склад) AS Склад2}) КАК ТоварыНаСкладахОстатки2
ON
	ТоварыНаСкладахОстатки1.Номенклатура = ТоварыНаСкладахОстатки2.Номенклатура
 

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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Вопрос по СКД
Ответ #5 - 22. Июля 2013 :: 06:49
Печать  
Ты забыл группировку и суммирование, а так то да. все будет решаться настройками, разрешающими отбор по полям ... непонятно только то, как ты собираешься задавать Склад2, не позволяя его менять юзверю ...
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Вопрос по СКД
Ответ #6 - 22. Июля 2013 :: 08:13
Печать  
Dmitry The Wing писал(а) 22. Июля 2013 :: 06:49:
Ты забыл группировку и суммирование

А это зачем?


Dmitry The Wing писал(а) 22. Июля 2013 :: 06:49:
непонятно только то, как ты собираешься задавать Склад2, не позволяя его менять юзверю ...

Я просто не знал, что так можно. Мне как раз нужен был, вот такой общий случай, когда можно выбрать разное подмножество складов. В этом случае, оба отбора по складам, нужно сделать доступными.
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Вопрос по СКД
Ответ #7 - 24. Июля 2013 :: 04:13
Печать  
chessman писал(а) 22. Июля 2013 :: 08:13:
Dmitry The Wing писал(а) 22. Июля 2013 :: 06:49:
Ты забыл группировку и суммирование
А это зачем?

Тут я не прав. Группировка здесь не обязательно, а вот внутреннее соединение точно не к месту, т.к. если остаток есть только на одном из складов (Склад1 или Склад2), то ты ничего не увидишь по такому товару.

chessman писал(а) 22. Июля 2013 :: 08:13:
Dmitry The Wing писал(а) 22. Июля 2013 :: 06:49:
непонятно только то, как ты собираешься задавать Склад2, не позволяя его менять юзверю ...
Я просто не знал, что так можно. Мне как раз нужен был, вот такой общий случай, когда можно выбрать разное подмножество складов. В этом случае, оба отбора по складам, нужно сделать доступными.

Есть еще вариант: задать склад2 прямо в запросе по коду, предопределенному элементу, либо по значению константы.
Это в случае, если он всегда должен быть задан без вариантов.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вопрос по СКД
Ответ #8 - 26. Июля 2013 :: 13:56
Печать  
Да, inner join явно лишний
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать