Переключение на Главную Страницу Страницы: [1] 2 3 ... 6 ОтправитьПечать
Очень популярная тема (более 25 ответов) аналог слова "Все" или "Вошедшие в запрос" (число прочтений - 22426 )
valeriy99
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 6
Местоположение: Киев
Зарегистрирован: 03. Марта 2012
Пол: Мужской
аналог слова "Все" или "Вошедшие в запрос"
28. Сентября 2012 :: 10:09
Печать  
Подскажите если знаете. Как в прямом запросе указать выводить все значения параметра (аналогия запроса 1С "Все" или "Вошедшие в запрос")? Круглые глаза

     ТекстЗапроса = "
     |SELECT
     |      $спрТТ.КодТТ as КодТТ,
     |      РегОборот.ТорговаяТочка as [ТТ $Справочник.ТТ],
     |      "+?(ПоТМЦ=0,"","спрТМЦ.Code as КодТМЦ, РегОборот.ТМЦ as [ТМЦ $Справочник.ТМЦ],")+"
     |      РегОборот.Период as "+Период+",
     |      $спрТМЦ.ЕдиницаПоУмолчанию as [Ед $Справочник.Единицы],
     |      SUM(РегОборот.РасходКвоОборот) as РасхКвоЕд,
     //|      SUM($спрЕД.Вес) as ВЕС,
     |      SUM(CAST(РегОборот.РасходКвоОборот AS NUMERIC(15)) * CAST($спрЕД.Вес AS NUMERIC(14,3))) as РасхКвоКГ
     |FROM
     |      $РегистрОбороты.Обороты(:ДатаН,:ДатаК~,"+Период+",,ТМЦ IN (SELECT Val FROM #Группа) AND ТорговаяТочка = :прТТ,(ТМЦ,ТорговаяТочка),(РасходКво)) as РегОборот
     |INNER JOIN
     |      $Справочник.ТМЦ as спрТМЦ ON спрТМЦ.ID = РегОборот.ТМЦ
     |INNER JOIN
     |      $Справочник.Единицы as спрЕД ON спрЕД.ParentExt = РегОборот.ТМЦ AND спрЕД.ID = $спрТМЦ.ЕдиницаПоУмолчанию
     |INNER JOIN
     |      $Справочник.ТТ as спрТТ ON спрТТ.ID = РегОборот.ТорговаяТочка
     |GROUP BY $спрТТ.КодТТ, РегОборот.ТорговаяТочка, "+?(ПоТМЦ=0,"","спрТМЦ.Code, РегОборот.ТМЦ, ")+"РегОборот.Период, $спрТМЦ.ЕдиницаПоУмолчанию
     |ORDER BY РегОборот.Период, РегОборот.ТорговаяТочка"+?(ПоТМЦ=0,"",", РегОборот.ТМЦ")+"
     |";

Данный запрос выводит продажи по периодам по Торговой точке, например, по неделям. Но если в какие-то недели продажи отсутствовали, то их нет и в результатах, а они нужны с нулевыми значениями.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #1 - 28. Сентября 2012 :: 10:39
Печать  
Аналог слова "Все" - это фулл джойн на справочник.
Если я правильно помню, что делает ключ "Все" в черных запросах.
Для недель: подготовь временную таблицу со значениями недель и сделай фуллджойн на нее.

"Все вошедшие в запрос" (если я, опять же, правильно помню как оно работает) имеет смысл только при кросс-таблице.
При работе с классом ИтогиПоГруппировкам, например, выгружается нужная колонка и сворачивается - полученный набор ключей используется для построение кросс-таблицы.
  
Наверх
 
IP записан
 
valeriy99
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 6
Местоположение: Киев
Зарегистрирован: 03. Марта 2012
Пол: Мужской
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #2 - 28. Сентября 2012 :: 15:04
Печать  
Нашел: существует параметр дополнение ("ДОПОЛНЕНИЕ") к Периодичности, т.е., например, "Месяц ДОПОЛНЕНИЕ" или "Неделя ДОПОЛНЕНИЕ". Но, этот метод применяется только к регистру остатков через $РегистрОстаткиОбороты. Где бы найти тоже но к регистру оборотов. Смущённый
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #3 - 29. Сентября 2012 :: 18:52
Печать  
Используй класс ПрямойЗапрос - в нем есть такой параметр и он действует и на регистр Обороты в отдельности для произвольной периодичности
  
Наверх
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #4 - 17. Октября 2012 :: 10:24
Печать  
Помогите, кто знает, как в прямом запросе реализовать "ВСЕ Вошедшие в запрос".

     ТекстЗапроса="
     |      SELECT  
     |            СпрНоменклатура.ID as      [СпрНом $Справочник.Номенклатура],
     |        РегОстатки.Товар as      [Тов $Справочник.Номенклатура],
     |            РегОстатки.Склад as [Скл $Справочник.МестаХранения],
     |            РегОстатки.ОстатокТовараОстаток
         |      FROM
     |            $РегистрОстатки.ОстаткиТоваров(:ДатаКон~,
     |            inner join $Справочник.Номенклатура as СпрНоменклатура (nolock) on СпрНоменклатура.id = Товар
     |            inner join $Справочник.МестаХранения as СпрСклады (nolock) on СпрСклады.id = Склад,
     |                               (Фирма='"+МД.ЗначениеВСтрокуБД(ПустаяФирма)+"') AND (СпрНоменклатура.IsFolder=2)"    
     +filter_vl("СпрНоменклатура",ВыбТовары)
     +filter_vl("СпрСклады",ВыбСклад)+" ,(Фирма, Товар, Склад), (ОстатокТовара)) as РегОстатки
         |   left join $Справочник.Номенклатура as СпрНоменклатура (nolock) on СпрНоменклатура.id = РегОстатки.Товар

     Данный запрос выводит остатки товаров на складах.
     В конкретном случае выходят остатки по двум товарам, первый товар есть на двух складах, а другой на трех.
     (Всего в таблицу попадает 5 строк)
     Нужно чтобы первый товар был показан с нулевым остатком и на третьем складе, т.е. как при "ВСЕ Вошедшие в запрос".
     (В таблице тогда будет 6 строк, 3 строки по каждому товару)
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #5 - 18. Октября 2012 :: 02:37
Печать  
Могу только предложить выгрузить данные во временную ТЗ,
а потом поджойнить ее на себя же (точнее, на сгруппированную выборку из ВТ).

примерно так:

Код
Выбрать все
Select
    склад,
    номенклатура,
    бла-бла-бла
Into ВТ
From
    бла-бла-бла

select
    бла-бла-бла
from
    (select distinct Номенклатура from ВТ) Все
    left Join ВТ on ВТ.Номенклатура = Все.Номенклатура 



не исключено, что в финальной выборке вместо Лефт джойна правильнее использовать Фулл джойн (на таком примере - не показательно, но вот если полей группировки будет 3, и по двум из них захочется "все вошедшие в запрос"...)
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #6 - 18. Октября 2012 :: 09:53
Печать  
Спасибо за участие.
Попробовал сделать так:
     ТекстЗапроса="
     |      SELECT  
     |            СпрНоменклатура.ID as      [СпрНом $Справочник.Номенклатура],
     |        РегОстатки.Товар as      [Тов $Справочник.Номенклатура],
     |            РегОстатки.Склад as [Скл $Справочник.МестаХранения],
     |            РегОстатки.ОстатокТовараОстаток
     |      into ВремТ
   |      FROM
     |            $РегистрОстатки.ОстаткиТоваров(:ДатаКон~,
     |            inner join $Справочник.Номенклатура as СпрНоменклатура (nolock) on СпрНоменклатура.id = Товар
     |            inner join $Справочник.МестаХранения as СпрСклады (nolock) on СпрСклады.id = Склад,
     |                               (Фирма='"+МД.ЗначениеВСтрокуБД(ПустаяФирма)+"') AND (СпрНоменклатура.IsFolder=2)"    
     +filter_vl("СпрНоменклатура",ВыбТовары)
     +filter_vl("СпрСклады",ВыбСклад)+"
   |,
     |                               (Фирма, Товар, Склад), (ОстатокТовара)) as РегОстатки
   |   left join $Справочник.Номенклатура as СпрНоменклатура (nolock) on СпрНоменклатура.id = РегОстатки.Товар
     |";
       Запрос.УстановитьТекстовыйПараметр("ДатаКон", ДатаКон);
     ПромТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);  
     
     ТекстЗапроса="
     |      SELECT *
     |      FROM
     |  (select distinct СпрНом from ВТ) Все
   |      left Join ВТ on ВТ.СпрНом = Все.СпрНом";
   ПромТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);

После одного запуска ругается что в базе уже есть объект ВТ,
эта таблица сама не удаляется что ли? И сам смысл такого объединения непонятен, объясни пож-ста, что должно получиться во временной таблице и откуда должны взяться строки с недостающими складами у товара после join?
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #7 - 18. Октября 2012 :: 10:07
Печать  
Зашел в "Management Studio", таблица ВТ действительно никуда не пропадает, после отработки отчета, ну да ничего, грохнуть ее  в студио не проблема. В 1С++ есть метод ИТ.ПолноеСоединение(стрКолонкиЛевойИТ, ПраваяИТ, ИндексПравойИТ, стрКолонкиПравойИТ) Это аналог full join. Есть аналоги всех типов join-ов.
Вот только бы знать что с чем соединять.
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #8 - 18. Октября 2012 :: 10:16
Печать  
В первой таблице имеем примерно так:
  Мороженое Склад1   5шт
  Мороженое Склад2   7шт.
  Мороженое Склад3   2шт.
  Яблоки Склад1   8шт.
  Яблоки Склад3   1шт.

А вот строки "Яблоки Склад2   0шт." нет. (Т.к. 0 -вые остатки регистр 1С не хранит)
Как в SQL с помощью каких временных таблиц и join-ов сделать так, чтобы добавилась такая строка?
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #9 - 19. Октября 2012 :: 04:17
Печать  
[quote author=Vlad7131 link=1348826949/0#6 date=1350553985]После одного запуска ругается что в базе уже есть объект ВТ,
эта таблица сама не удаляется что ли? [/quote]

0) ВТ в моем псевдокоде - просто обозначение временной таблицы.
1) То, как написано у тебя - ВТ это полноценная таблица (которая, кстати, еще и создается непосредственно в рабочей БД)
2) Чтоб запрос при повторном выполнении не ругался на существование такой таблицы - кошерно использовать, скажем GUID в качестве имени таблицы. Кстати, посколько таблица у тебя полноценная - то выполнив один раз запрос ты будешь получать ошибку даже из другого сеанса 1С.
3) Чтоб не засирать базу временными таблицами - необходимо после выполнения запроса выполнить "drop table ВТ"

но есть небольшой хинт
4) Если имя таблицы начинается с "#" - скуль будет создавать ее в tempdb, более того - эта таблица будет доступна только из текущего соединения (читай - из текущего сеанса 1С).
4а) Эта таблица будет автоматически удалена при закрытии текущего соединения.
4б) чтоб скуль не ругался на имя таблицы, начинающееся с #, необходимо заключить его в квадратные скобки: "[#ВТ]"
4в) если имя таблицы начинается с ## - то скуль ее создаст в tempdb, но доступна она будет для всех. Будет ли она удалена автоматически - сходу не скажу. Да и к делу это не относится.


[quote]И сам смысл такого объединения непонятен, объясни пож-ста, что должно получиться во временной таблице и откуда должны взяться строки с недостающими складами у товара после join?[/quote]
[s]Чтобы понять рекурсию нужно понять рекурсию[/s]
Чтоб понять смысл такого объединения - нужно понять как работает скулевый Джойн (да и не скулевый тоже).
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #10 - 19. Октября 2012 :: 04:33
Печать  
Мороженое Склад1   5шт
Мороженое Склад2   7шт.
Мороженое Склад3   2шт.
Яблоки Склад1   8шт.
Яблоки Склад3   1шт.
Слива Склад2   10шт.


Пусть это содержимое твоей ВТ.
Теперь ты хочешь сделать выборку "Номенклатура Все ВошедшиеВЗапрос, Склад Все ВошедшиеВЗапрос" (к сожалению, я уже в подробностях не помню, как себя ведет Все ВошедшиеВЗапрос, но общий смысл представляю).

пишем так
[code]Select
   ВсеТовары.Товар,
   ВсеСклады.Склад,
   IsNull(ВТ.Колво, 0) Колво
From
   (select distinct Товар from ВТ) ВсеТовары,
   (select distinct Склад from ВТ) ВсеСклады   -- тут мы получим декартово произведение товаров и складов
   Full Join ВТ on ВТ.Товар = ВсеТовары.Товар And ВТ.Склад = ВсеСклады.Склад[/code]

на выходе должно получится:
Мороженое Склад1   5шт
Мороженое Склад2   7шт.
Мороженое Склад3   2шт.
Яблоки Склад1   8шт.
Яблоки Склад2   0шт.
Яблоки Склад3   1шт.
Слива Склад1   0шт.
Слива Склад2   10шт.
Слива Склад3   0шт.


Вроде так все.
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #11 - 19. Октября 2012 :: 05:05
Печать  
Привет! Спасибо за дельные советы по SQL. Что в SELECT
можно использовать into я и не знал, сейчас нашел в книге Фленова into, но в операторе  
"INSERT INTO Имя Таблицы", это то же самое, просто insert опущено, или нет?
Где взять GUID для использования в качестве имени таблицы?

В этой конструкции, где две таблицы через запятую:
Select* From
  (select distinct Товар from ВТ) ВсеТовары,
  (select distinct Склад from ВТ) ВсеСклады
это и есть декартово произведение, cross join писать не надо?
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #12 - 19. Октября 2012 :: 06:03
Печать  
Написал в запросе:      
     |      SELECT  
     |        РегОстатки.Товар as [Тов $Справочник.Номенклатура],
     |      РегОстатки.Склад as [Скл $Справочник.МестаХранения],
     ..........................
     |      into [#ВТ]
Сессию не закрывал, просто в отчете еще раз нажал кнопку "сформировать", SQL
ругнулся "There is already an object named '#ВТ' in the database."
Юзеры всяко будут так делать, поэтому в начале отчета надо удалять ВТ.

А как к этой ВТ потом обращаться, тоже с # и в скобках ?
     |      SELECT
     |        ВсеТовары.Товар,
     |              ВсеСклады.Склад,
     |              IsNull([#ВТ].Колво, 0) Колво
     |      FROM
     |              (select distinct Тов from [#ВТ]) ВсеТовары,
         |              (select distinct Скл from [#ВТ]) ВсеСклады
         |            Full Join [#ВТ] on [#ВТ].Тов = ВсеТовары.Товар And [#ВТ].Скл = ВсеСклады.Склад
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #13 - 19. Октября 2012 :: 07:14
Печать  
Ну допиши в начале (только обязательно Выполнить, а не ВыполнитьСкалярный):
РС.Выполнить("DROP TABLE #ВТ");
РС - это ODBCRecordSet
  
Наверх
ICQ  
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #14 - 19. Октября 2012 :: 07:18
Печать  
# - обязательна, квадратные скобки - не очень
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 ... 6
ОтправитьПечать