Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Как сделать аналог Все по группировке "День"? (число прочтений - 14997 )
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Как сделать аналог Все по группировке "День"?
27. Октября 2006 :: 08:21
Печать  
Пишу такой запрос:
Код
Выбрать все
|SELECT
	|    Рег.Клиент as [Клиент $Справочник.Клиенты],
	|    Рег.Период AS Период,
	|    Рег.СуммаГРННачальныйОстаток as СуммаГРННачальныйОстаток,
	|    Рег.СуммаГРНПриход as СуммаГРНПриход,
	|    Рег.СуммаГРНРасход as СуммаГРНРасход,
	|    Рег.СуммаГРНКонечныйОстаток as СуммаГРНКонечныйОстаток
	|FROM
	|    $РегистрОстаткиОбороты.Взаиморасчеты(:НачДата, :КонДата~, День, ДвиженияИГраницыПериода,
	|										 ,,
	|										(Клиент), (СуммаГРН)) as Рег
 


Как заставить такой код получать в качестве Период не только даты, по которым были движения (есть записи в RA), а все даты за период?
Напрямую в SQL это делается так:
Код
Выбрать все
SELECT
	TMP.Клиент AS Клиент,
	TMP.День AS День,
	SUM(TMP.Приход) AS Приход,
	SUM(TMP.Рассход) AS Рассход
INTO #Tab_obor
FROM
(
	SELECT
		TabR2.SP1061 AS Клиент,
		CAST(LEFT(TabJ.DATE_TIME_IDDOC,8) AS DateTime) AS День,
		SUM(TabR2.SP7593*((TabR2.DEBKRED+1)%2)) AS Приход,
		SUM(TabR2.SP7593*TabR2.DEBKRED) AS Рассход
	FROM
		RA1060 AS TabR2 (NOLOCK)
	INNER JOIN _1SJOURN As TabJ (NOLOCK) ON (TabR2.IDDOC = TabJ.IDDOC)
	WHERE
		TabJ.DATE_TIME_IDDOC >= '20060901'
		AND TabJ.DATE_TIME_IDDOC < '20060901Z'
	GROUP BY
		TabR2.SP1061,
		CAST(LEFT(TabJ.DATE_TIME_IDDOC,8) AS DateTime)

	UNION ALL
	SELECT
		DISTINCT tmp_t.Клиент  AS Клиент,
		TabPer.PeriodDate,
		0,
		0
	FROM #PeriodTMP AS TabPer, #TMP_obor AS tmp_t
) AS TMP
GROUP BY
	TMP.Клиент,
	TMP.День
 


Но как теперь в виртуальную таблицу вставить необходимый мне код?
Или по другому, как заменить ту виртуальную таблицу, которую формирует 1С++ на ту, которая нужна для получения желаемого результата?
  
Наверх
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #1 - 27. Октября 2006 :: 08:32
Печать  
Вась, я понимаю твое состояние, но ты бы успокоился, попробовал бы вопспользоваться поиском по этому ресурсу, эта тема тут обсасывалась неоднократно...
не найдешь, помогу тебе поисковиком воспользоваться...
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #2 - 27. Октября 2006 :: 09:05
Печать  
Цитата:
Вась, я понимаю твое состояние, но ты бы успокоился, попробовал бы вопспользоваться поиском по этому ресурсу, эта тема тут обсасывалась неоднократно...
не найдешь, помогу тебе поисковиком воспользоваться...

Какие параметры поиска?
Буду признателен за ссылку на ветку.
  
Наверх
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #3 - 27. Октября 2006 :: 09:34
Печать  
pvase писал(а) 27. Октября 2006 :: 09:05:
Какие параметры поиска?

ну как минимум $РегистрОстаткиОбороты

pvase писал(а) 27. Октября 2006 :: 09:05:
Буду признателен за ссылку на ветку.

думаю стоит почитать:
http://www.1cpp.ru/forum/YaBB.pl?num=1158643277/0#0
http://www.1cpp.ru/forum/YaBB.pl?num=1157379745/0#0
и аналогичные ветки... а вообще очень сильно помогает дока, в твоем случае нада с доки начинать... причем по SQL...
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #4 - 27. Октября 2006 :: 09:39
Печать  
Цитата:
и аналогичные ветки... а вообще очень сильно помогает дока, в твоем случае нада с доки начинать... причем по SQL...

Сенкс.
По поводу доки - что может быть, скажем в Мамаеве или Хендерсоне, чего не подскажут на sql.ru, а там я уже все прошерстил по поводу получения итогов с накоплением.
  
Наверх
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #5 - 27. Октября 2006 :: 09:42
Печать  
pvase писал(а) 27. Октября 2006 :: 09:39:
По поводу доки - что может быть, скажем в Мамаеве или Хендерсоне, чего не подскажут на sql.ru, а там я уже все прошерстил по поводу получения итогов с накоплением.

Вась, ни в одной доке не рекомендуют делать группировку по полю, по которому нет индекса, в то время, когда есть связанное с ним поле, по которому есть индекс, а тем более уникальных... на основании какой доки ды фиганул группировку по полю, по которому нет индекса?
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #6 - 27. Октября 2006 :: 10:23
Печать  
Цитата:
pvase писал(а) 27. Октября 2006 :: 09:39:
По поводу доки - что может быть, скажем в Мамаеве или Хендерсоне, чего не подскажут на sql.ru, а там я уже все прошерстил по поводу получения итогов с накоплением.

Вась, ни в одной доке не рекомендуют делать группировку по полю, по которому нет индекса, в то время, когда есть связанное с ним поле, по которому есть индекс, а тем более уникальных... на основании какой доки ды фиганул группировку по полю, по которому нет индекса?

Т.е. если вместо временных таблиц использовать подзапросы до RA и их обрабатывать - будет на порядок быстрее?
Теперь по поводу индексов - ни в одной литературе не рекомендуют ставить индексы (тем более кластерные) на записи, которые часто удаляются и вставляются (система OLTP), разве что если затраты на вставку записей с такими индексами меньше затрат на получение записей в запросе. Но кроме времени есть еще параметр объем базы, который для систем OLTP также есть существенным, особенно если речь идет о вводе и удалении записей, которые уже были в таблице.

На счет индексов - вчера как раз над этим подумал, но сновая же кластерным индексом это быть не может, так как тогда индекс должен быть составной, причем в порядке проставления условий в WHERE.

ЗЫ
Но причем тут 1С++ и виртуальная таблица?
ЗЫ2
А где в доке описано что 1С++ поддерживает параметры "Все" и "Все вошедшие в запрос"?
  
Наверх
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #7 - 27. Октября 2006 :: 10:55
Печать  
5-й ответ был по опводу твоей статьи...
а речь об индексах не о твоей временной таблице, а том как ты строишь запрос к существующим таблицам...
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #8 - 27. Октября 2006 :: 11:13
Печать  
Цитата:
5-й ответ был по опводу твоей статьи...
а речь об индексах не о твоей временной таблице, а том как ты строишь запрос к существующим таблицам...

Запросы к существующим таблицам выполняются за 2-3 секунды (ну можно указать ), а вот потом пересчет данных во временной - вот где затык (до 5-9 минут может длится). Но в 1С++ - эта проблема решена тем, что пересчет происходит на C++ в ОЗУ, а не возложен на SQL, но в 1С++ - пока не могу понять как его заставить сделать обьединение с таблицей где есть все даты и клиенты.
ЗЫ
Кстати добавление кластерного составного индекса (состоящего из всех группировок) для временных таблиц уменьшило время выполнения в 2 раза и снизило нагрузку на CPU на 20%.
  
Наверх
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #9 - 27. Октября 2006 :: 11:34
Печать  
Вася, сколько раз тебе объяснять, что 1С++ - это чистый T-SQL, за исключением того, что у него есть свой метапарсер, который облегчает тебе работу с объектами 1С???
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #10 - 27. Октября 2006 :: 11:41
Печать  
pvase писал(а) 27. Октября 2006 :: 08:21:
Пишу такой запрос:
Код
Выбрать все
|SELECT
|    Рег.Клиент as [Клиент $Справочник.Клиенты],
|    Рег.Период AS Период,
|    Рег.СуммаГРННачальныйОстаток as СуммаГРННачальныйОстаток,
|    Рег.СуммаГРНПриход as СуммаГРНПриход,
|    Рег.СуммаГРНРасход as СуммаГРНРасход,
|    Рег.СуммаГРНКонечныйОстаток as СуммаГРНКонечныйОстаток
|FROM
|    $РегистрОстаткиОбороты.Взаиморасчеты(:НачДата, :КонДата~, День, ДвиженияИГраницыПериода,,,
|	(Клиент), (СуммаГРН)) as Рег
 


Как заставить такой код получать в качестве Период не только даты, по которым были движения (есть записи в RA), а все даты за период?

Код
Выбрать все
FROM (SELECT Дата, Клиент
	FROM Даты CROSS JOIN Клиенты) ДатыКлиенты LEFT OUTER JOIN $ВТ... 

  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #11 - 27. Октября 2006 :: 11:48
Печать  
а может все таки
Код
Выбрать все
select TabDate.MyDate, TabOst. ...
from TabDate
left outer join $VT...  as TabOst ON TabData.MyDate=TabOst.Date 

  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #12 - 27. Октября 2006 :: 11:55
Печать  
Цитата:
а может все таки
Код
Выбрать все
select TabDate.MyDate, TabOst. ...
from TabDate
left outer join $VT...  as TabOst ON TabData.MyDate=TabOst.Date 


Так будут даты без клиентов. Это не подойдёт для разворота клиентов по датам.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #13 - 27. Октября 2006 :: 11:57
Печать  
berezdetsky писал(а) 27. Октября 2006 :: 11:55:
Так будут даты без клиентов. Это не подойдёт для разворота клиентов по датам.

ты точно в этом уверен?
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #14 - 27. Октября 2006 :: 12:00
Печать  
хотя у тебя тоже что и у меня, только ты джионишь по клиентам, привязав клиентов к датам, все таки думаю что мой вариант оптимальнее... у тебя просто идет лишний кросс...
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #15 - 27. Октября 2006 :: 12:06
Печать  
просто мое решение по Все Дни, а у тя Все Дни + Все Клиенты
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #16 - 27. Октября 2006 :: 12:05
Печать  
Цитата:
berezdetsky писал(а) 27. Октября 2006 :: 11:55:
Так будут даты без клиентов. Это не подойдёт для разворота клиентов по датам.

ты точно в этом уверен?

Да, если порядок обхода группировок - (Клиент, День). Для порядка (День, Клиент) хватит и твоего варианта.
К сожалению, в (0) порядок обхода не указан.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #17 - 27. Октября 2006 :: 12:15
Печать  
У Васи просто изначально было:
Код
Выбрать все
Таблица остатков left join Таблица дат 

я как бы ему на это указал, он согласился через 3 года шо этот джоин никакого ни физического, ни логического смысла не несет, но при этом стал везде справшивать как же все таки ему то сделать, не понимая что всего то навсего ему нада было стороны поменять... вобщем судя по тому шо Вася не понимает 3-й день чо ему сделать чтобы появились "провалившиеся" даты, мной был сделан вывод что он не совсем понимает что тако джион вообще, и уже 3-й день советую ознакомиться с документацией, у Васи же 1С++ уже 3-й виновата в том, что не так приджинивается у него все, хотя изначально он 1С++ не юзал...
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #18 - 27. Октября 2006 :: 12:57
Печать  
Цитата:
У Васи просто изначально было:
Код
Выбрать все
Таблица остатков left join Таблица дат 

я как бы ему на это указал, он согласился через 3 года шо этот джоин никакого ни физического, ни логического смысла не несет, но при этом стал везде справшивать как же все таки ему то сделать, не понимая что всего то навсего ему нада было стороны поменять... вобщем судя по тому шо Вася не понимает 3-й день чо ему сделать чтобы появились "провалившиеся" даты, мной был сделан вывод что он не совсем понимает что тако джион вообще, и уже 3-й день советую ознакомиться с документацией, у Васи же 1С++ уже 3-й виновата в том, что не так приджинивается у него все, хотя изначально он 1С++ не юзал...


Я сделал UNION еще до того как начал задавать вопрос на Реалнете, просто в спешке перепутал что сделал вместо джойна юнион.
  
Наверх
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #19 - 27. Октября 2006 :: 12:59
Печать  
berezdetsky писал(а) 27. Октября 2006 :: 11:55:
Цитата:
а может все таки
Код
Выбрать все
select TabDate.MyDate, TabOst. ...
from TabDate
left outer join $VT...  as TabOst ON TabData.MyDate=TabOst.Date 


Так будут даты без клиентов. Это не подойдёт для разворота клиентов по датам.

А как я могу в запросе, указанном в 0, обратится в вирутальной таблице, ведь она создается во время выполнения запроса? Как я могу знать ее имя, или есть зитрое указание на данные с VT?
  
Наверх
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #20 - 27. Октября 2006 :: 13:07
Печать  
pvase писал(а) 27. Октября 2006 :: 12:59:
berezdetsky писал(а) 27. Октября 2006 :: 11:55:
Цитата:
а может все таки
Код
Выбрать все
select TabDate.MyDate, TabOst. ...
from TabDate
left outer join $VT...  as TabOst ON TabData.MyDate=TabOst.Date 


Так будут даты без клиентов. Это не подойдёт для разворота клиентов по датам.

А как я могу в запросе, указанном в 0, обратится в вирутальной таблице, ведь она создается во время выполнения запроса? Как я могу знать ее имя, или есть зитрое указание на данные с VT?

странно, а почему у меня получается выборка с ними? может ты все таки почитаешь описание джинов?
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #21 - 27. Октября 2006 :: 13:22
Печать  
pvase писал(а) 27. Октября 2006 :: 12:59:
А как я могу в запросе, указанном в 0, обратится в вирутальной таблице, ведь она создается во время выполнения запроса? Как я могу знать ее имя, или есть зитрое указание на данные с VT?
  Подмигивание
Цитата:
РегистрОстаткиОбороты

Виртуальная таблица остатков и оборотов

Синтаксис:

$РегистрОстаткиОбороты.<ИмяРегистра>([<НачалоПериода>][, <КонецПериода>][, <Периодичность>][,<МетодДополнения>][,        <Соединение>][,        <Условие>][,        <Измерение>][,<Ресурс>]
) [as <Алиас>]

Или я не понял вопрос.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #22 - 27. Октября 2006 :: 13:23
Печать  
berezdetsky писал(а) 27. Октября 2006 :: 11:41:
pvase писал(а) 27. Октября 2006 :: 08:21:
Пишу такой запрос:
Код
Выбрать все
|SELECT
|    Рег.Клиент as [Клиент $Справочник.Клиенты],
|    Рег.Период AS Период,
|    Рег.СуммаГРННачальныйОстаток as СуммаГРННачальныйОстаток,
|    Рег.СуммаГРНПриход as СуммаГРНПриход,
|    Рег.СуммаГРНРасход as СуммаГРНРасход,
|    Рег.СуммаГРНКонечныйОстаток as СуммаГРНКонечныйОстаток
|FROM
|    $РегистрОстаткиОбороты.Взаиморасчеты(:НачДата, :КонДата~, День, ДвиженияИГраницыПериода,,,
|	(Клиент), (СуммаГРН)) as Рег
 


Как заставить такой код получать в качестве Период не только даты, по которым были движения (есть записи в RA), а все даты за период?

Код
Выбрать все
FROM (SELECT Дата, Клиент
	FROM Даты CROSS JOIN Клиенты) ДатыКлиенты LEFT OUTER JOIN $ВТ... 


Не совсем понял, куда в первом запросе  вставить приведенный Вами код Печаль.

"ДатыКлиенты" - это таблица со всеми датами и клиентами? И что означает $ВТ?
  
Наверх
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #23 - 27. Октября 2006 :: 13:33
Печать  
pvase писал(а) 27. Октября 2006 :: 13:23:
"ДатыКлиенты" - это таблица со всеми датами и клиентами? И что означает $ВТ?

ВТ - это Виртуальная Таблица
Вась, сколько раз мне тебе посоветовать прочесть доку и не пытаться атаковать ветрянные мельницы?
причем доку как по SQL, так и 1С++
в миллионный раз повторяю, 1С++ это тоже самое что и T-SQL...
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #24 - 27. Октября 2006 :: 14:00
Печать  
Цитата:
pvase писал(а) 27. Октября 2006 :: 13:23:
"ДатыКлиенты" - это таблица со всеми датами и клиентами? И что означает $ВТ?

ВТ - это Виртуальная Таблица
Вась, сколько раз мне тебе посоветовать прочесть доку и не пытаться атаковать ветрянные мельницы?
причем доку как по SQL, так и 1С++
в миллионный раз повторяю, 1С++ это тоже самое что и T-SQL...

Если покажешь мне запрос, где в 1С++ происходти рассчет остатков на каждую дату средствами SQL (именно на дату), а не расчет итогов в одной таблице а движений в другой, а потом занесение в переменные и дальнейший рассчет прстрочно внутри самого 1С++, а потом лиш заполнение через sp_execute - то поверю что это чистый SQL. А пока только вижу через профайлер как получаются данные, а потом обратно запихиваются в временную таблицу, при этом сам SQL ничего не считает, он просто выступает как хранилище, с которого потом выберут всталвенные данные.
  
Наверх
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #25 - 27. Октября 2006 :: 14:03
Печать  
Цитата:
pvase писал(а) 27. Октября 2006 :: 13:23:
"ДатыКлиенты" - это таблица со всеми датами и клиентами? И что означает $ВТ?

ВТ - это Виртуальная Таблица

$РегистрОстаткиОбороты - является вирутальной таблицей. К вашему сведению в T-SQL вирутальной таблицы вообще нет, она есть только в описании к 1С++, а єто типичаня временная таблица, причем даже не уверен что эта таблица вообще полностью висит в tempdb, скорее всего она там как хранилище, а разные методы с виртуальными таблицами - есть просто обработка самой временной таблицей (хотя могу и ошибатся, возможно что временную таблицу каждый раз создают и каждый раз это новая ВТ, но не думаю что разработчики 1С++ не могли предусмотреть оставлять ее в tempdb и дальнейшуюю ее обработку через методы, по принципу временных иртогов в 1С).
  
Наверх
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #26 - 27. Октября 2006 :: 14:16
Печать  
Вася, ВТ - это запрос, он нечто инное как select... заметь это образно, понимаешь, образно...
Так что давай ты не будешь сильно возмущаться и делать поспешные выводы о, чьих либо сведениях,  а просто прочитаешь документацию к 1С++, если собираешься с ней работать...
пока ты занимаешься только хаеньем данной компоненты...

почитай в доке по SQL как сделать:
select ... from Tab1 "join" (select ... from Tab2) as Tab3 ON Tab1....=Tab3....

а потом делай такие вот выводы...

Вась, ты же говорил шо знаешь об волшебной опции Отладка() в 1C++, да запусти ты отладку блин, да посмотри шо такое ВТ...
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #27 - 27. Октября 2006 :: 14:32
Печать  
Цитата:
Вася, ВТ - это запрос, он нечто инное как select... заметь это образно, понимаешь, образно...
Так что давай ты не будешь сильно возмущаться и делать поспешные выводы о, чьих либо сведениях,  а просто прочитаешь документацию к 1С++, если собираешься с ней работать...
пока ты занимаешься только хаеньем данной компоненты...

почитай в доке по SQL как сделать:
select ... from Tab1 "join" (select ... from Tab2) as Tab3 ON Tab1....=Tab3....

а потом делай такие вот выводы...

Вась, ты же говорил шо знаешь об волшебной опции Отладка() в 1C++, да запусти ты отладку блин, да посмотри шо такое ВТ...

Я не спорю компонента суппер, и можно что хочешь в ней исправить (если знаешь С++).
А на счет select ... from Tab1 "join" (select ... from Tab2) as Tab3 ON Tab1....=Tab3.... - полностью согласен, если долго не работешь с подобным начинаешь забывать, надо подчитать (хотя помню что читал же это года 3 назад), но уже все забыл Печаль.
  
Наверх
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #28 - 27. Октября 2006 :: 14:37
Печать  
ага, не знал, да еще и забыл...  Круглые глаза
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #29 - 30. Октября 2006 :: 12:08
Печать  
Вот пример. Правда так и не получилось запихнуть в подзарос (виртуальную таблицу) все даты - поэтому пришлось извратиться с временной таблицей:
Код
Выбрать все
	НачДата = '01.01.2006';
	КонДата = '30.09.2006';
	глODBCRecordset.Отладка(1);
	глODBCRecordset.ВыполнитьСкалярный("
	|IF EXISTS (SELECT * from tempdb..sysobjects where id = object_id('tempdb..#ТабИт'))
	|DROP TABLE #ТабИт");
	глODBCRecordset.УстановитьТекстовыйПараметр("НачДата",НачДата);
	глODBCRecordset.УстановитьТекстовыйПараметр("КонДата",КонДата);
	Текст = "
	|
	|SELECT
	|    Рег.Клиент as Клиент,
	|    Рег.Период AS Период,
	|    Рег.СуммаГРННачальныйОстаток as СуммаГРННачальныйОстаток,
	|    Рег.СуммаГРНПриход as СуммаГРНПриход,
	|    Рег.СуммаГРНРасход as СуммаГРНРасход,
	|    Рег.СуммаГРНКонечныйОстаток as СуммаГРНКонечныйОстаток
	|INTO #ТабИт
	|FROM
	|    $РегистрОстаткиОбороты.Взаиморасчеты(:НачДата, :КонДата~, День, ДвиженияИГраницыПериода,
	|										 ,,
	|										(Клиент), (СуммаГРН)) as Рег
	|";      
	глODBCRecordset.ВыполнитьСкалярный(Текст);
	Текст = "
	|Declare @PERIODN Char(8)
	|Declare @PERIODK Char(23)
	|SET @PERIODN = '"+глMDW.ПолучитьСтрИзДаты(НачДата)+"'			  -- Начало периода
	|SET @PERIODK = '"+глMDW.ПолучитьСтрИзДаты(КонДата)+"'			  -- Конец периода
    |
	|IF EXISTS (SELECT * from tempdb..sysobjects where id = object_id('tempdb..#Клиенты_Дата'))
	|DROP TABLE #Клиенты_Дата
	|
	|SELECT ТабКл.Клиент, ТабД.Дата
	|INTO #Клиенты_Дата
	|FROM (SELECT DISTINCT Клиент FROM #ТабИт) AS ТабКл,
	|(select A.date AS Дата
	|from (select date = cast((b.number * 0x100) + a.number as datetime)
	|from master..spt_values a
	|join master..spt_values b
	|	on (b.number * 0x100) + a.number <= cast(cast(@PERIODK  as datetime) as integer)
	|	and (b.number * 0x100) + a.number >= cast(cast(@PERIODN as datetime) as integer)
	|where
	|	a.type = 'p'
	|	and b.type = 'p'
	|	and b.number * 0x100 <= cast(cast(@PERIODK as datetime) as integer)
	|) as A
	|--order by A.date
	|) AS ТабД";
	глODBCRecordset.ВыполнитьСкалярный(Текст);
	Текст = "
	|SELECT
	|	T.Клиент AS [Клиент $Справочник.Клиенты],
	|	T.Дата AS Дата,
	|	SUM(ISNULL(T.СуммаГРННачальныйОстаток,0)) AS СуммаГРННачальныйОстаток,
	|	SUM(ISNULL(T.СуммаГРНПриход,0)),
	|	SUM(ISNULL(T.СуммаГРНРасход,0)),
	|	SUM(ISNULL(T.СуммаГРНКонечныйОстаток,0))
	|FROM(
	|	SELECT
	|		ПолнТаб.Клиент,
	|		ПолнТаб.Дата,
	|		CASE WHEN ТабДан.СуммаГРННачальныйОстаток IS NOT NULL THEN ТабДан.СуммаГРННачальныйОстаток ELSE
	|		(SELECT Таб2.СуммаГРННачальныйОстаток FROM #ТабИт AS Таб2 WHERE (Таб2.Клиент = ПолнТаб.Клиент) AND (Таб2.Период = (SELECT MAX(Таб3.Период) FROM #ТабИт AS Таб3 WHERE (Таб3.Клиент = ПолнТаб.Клиент) AND (Таб3.Период <=ПолнТаб.Дата))))
	| 		END
	|		AS СуммаГРННачальныйОстаток,
	|		ТабДан.СуммаГРНПриход AS СуммаГРНПриход,
	|		ТабДан.СуммаГРНРасход AS СуммаГРНРасход,
	|		CASE WHEN ТабДан.СуммаГРНКонечныйОстаток IS NOT NULL THEN ТабДан.СуммаГРНКонечныйОстаток ELSE
	|		(SELECT Таб2.СуммаГРНКонечныйОстаток FROM #ТабИт AS Таб2 WHERE (Таб2.Клиент = ПолнТаб.Клиент) AND (Таб2.Период = (SELECT MAX(Таб3.Период) FROM #ТабИт AS Таб3 WHERE (Таб3.Клиент = ПолнТаб.Клиент) AND (Таб3.Период <=ПолнТаб.Дата))))
	|		END	AS СуммаГРНКонечныйОстаток
	|
	|	FROM #Клиенты_Дата AS ПолнТаб
	|	LEFT OUTER JOIN #ТабИт AS ТабДан
	|		ON ((ПолнТаб.Клиент = ТабДан.Клиент) AND (ПолнТаб.Дата = ТабДан.Период))
	|	) AS T
	|GROUP BY
	|	T.Клиент,
	|	T.Дата
	|ORDER BY
	|	T.Клиент,
	|	T.Дата";
	ТЗ = СоздатьОбъект("ТаблицаЗначений");
	Попытка
		//ТЗ = глODBCRecordset.ВыполнитьИнструкцию("SELECT * FROM #ТабИт ORDER BY Клиент, Период");
		ТЗ = глODBCRecordset.ВыполнитьИнструкцию(Текст);
	Исключение      
		глODBCRecordset.ПолучитьОписаниеОшибки();
		Сообщить(Текст);
	КонецПопытки;
 



Не уверен что и этот код оптимальный по скорости выполнения, так как получение итоговой таблицы возложено на SQL, хотя можно было прямо в 1С проверять, если остатки равны 0 (NULL в запросе) - то брать последний существующий сотаток.
  
Наверх
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #30 - 30. Октября 2006 :: 12:28
Печать  
Запрос, приведенный вище работает в 4 раза быстрее чем запрос, обсуждающейся на Реалнете. Но все же он выполняется 2 минуты - что не есть приемлымым по скорости.
Наверное придется выгружать данные в OLAP и делать отчет вне 1С, ну или загрузить терминальный сервер проверками при формировании печатной формы отчета.
  
Наверх
IP записан
 
smile
Junior Member
**
Отсутствует


бррр... ужас...

Сообщений: 50
Зарегистрирован: 23. Мая 2006
Re: Как сделать аналог Все по группировке "День"?
Ответ #31 - 31. Октября 2006 :: 07:24
Печать  
Прошу прощения. не очень вчитывался в тему. возможно это и обсуждалось выше. Времени нет =(

реализовать ключевое слова "все" в sql можно через OLAP кубы... это обсуждалось на itland.ru

http://itland.ru/forum//index.php?showtopic=10356&st=0
  
Наверх
 
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #32 - 31. Октября 2006 :: 07:42
Печать  
smile писал(а) 31. Октября 2006 :: 07:24:
Прошу прощения. не очень вчитывался в тему. возможно это и обсуждалось выше. Времени нет =(

реализовать ключевое слова "все" в sql можно через OLAP кубы... это обсуждалось на itland.ru

http://itland.ru/forum//index.php?showtopic=10356&st=0

Этот вопрос меня также очень интересует (но пока его актуальность не высокая), в частности как получить с Analysis Server данные в Excel например, по всем данным измерения, а не только тем, которые есть в таблице фактов? Т.е. другими словами, как заставить Севрер в момент процессирования запихнуть в рассчитываемые итоги данные по тем измерениям, по которым не было вообще записей в таблице фактов? Вот такое у меня не получилось. Пока вижу только решение - запихивать данные с 0, дабы происходило процессирование и сверткта итогов по всем элементам измерения.

Но это вопрос немного к другому форуму.
  
Наверх
IP записан
 
aou1c
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 183
Местоположение: Екатеринбург
Зарегистрирован: 29. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #33 - 09. Ноября 2006 :: 05:58
Печать  
berezdetsky писал(а) 27. Октября 2006 :: 11:41:
pvase писал(а) 27. Октября 2006 :: 08:21:
Пишу такой запрос:
Код
Выбрать все
|SELECT
|    Рег.Клиент as [Клиент $Справочник.Клиенты],
|    Рег.Период AS Период,
|    Рег.СуммаГРННачальныйОстаток as СуммаГРННачальныйОстаток,
|    Рег.СуммаГРНПриход as СуммаГРНПриход,
|    Рег.СуммаГРНРасход as СуммаГРНРасход,
|    Рег.СуммаГРНКонечныйОстаток as СуммаГРНКонечныйОстаток
|FROM
|    $РегистрОстаткиОбороты.Взаиморасчеты(:НачДата, :КонДата~, День, ДвиженияИГраницыПериода,,,
|	(Клиент), (СуммаГРН)) as Рег
 


Как заставить такой код получать в качестве Период не только даты, по которым были движения (есть записи в RA), а все даты за период?

Код
Выбрать все
FROM (SELECT Дата, Клиент
	FROM Даты CROSS JOIN Клиенты) ДатыКлиенты LEFT OUTER JOIN $ВТ... 


Это все работает, но в записях с вставленными записями дней остаток всегда ноль, а это не правильно.
Может кто знает как заполнить остатки в запросе по вставленным дням
  
Наверх
ICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #34 - 09. Ноября 2006 :: 16:17
Печать  
aou1c писал(а) 09. Ноября 2006 :: 05:58:
Это все работает, но в записях с вставленными записями дней остаток всегда ноль, а это не правильно.
Может кто знает как заполнить остатки в запросе по вставленным дням

Посмотри набросок. Тщательно не проверял (что-то у меня с головой сегодня Печаль ), вроде работает.
  

draft.zip ( 6 KB | Загрузки )

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
aou1c
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 183
Местоположение: Екатеринбург
Зарегистрирован: 29. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #35 - 09. Ноября 2006 :: 16:41
Печать  
berezdetsky писал(а) 09. Ноября 2006 :: 16:17:
aou1c писал(а) 09. Ноября 2006 :: 05:58:
Это все работает, но в записях с вставленными записями дней остаток всегда ноль, а это не правильно.
Может кто знает как заполнить остатки в запросе по вставленным дням

Посмотри набросок. Тщательно не проверял (что-то у меня с головой сегодня Печаль ), вроде работает.


Спасибо, правда я уже сам допер.
а идея такая-же <= :КонДата

Короче вот как у меня получилось


процедура РасчетКолвоДней()
     рс.ВыполнитьИнструкцию("CREATE TABLE #Дни (День DateTime)");
     для промДата=НачДата по КонДата Цикл          
           рс.УстановитьТекстовыйПараметр("промДата",промДата);
           рс.ВыполнитьИнструкцию("INSERT #Дни VALUES (:промДата)");
     КонецЦикла;

     рс.УстановитьТекстовыйПараметр("НачДата",НачДата);
     рс.УстановитьТекстовыйПараметр("КонДата",КонДата);
     рс.УложитьСписокОбъектов(ВыбТовары, "#ВыбТовары", "Номенклатура");
     рс.УложитьСписокОбъектов(ВыбВидыДеятельности, "#Производители", "Контрагенты"); [/tt]      
     
     
     
     рс.УстановитьТекстовыйПараметр("ВыбТовары",ВыбТовары.РазмерСписка());
     писка());

     Состояние("Расчет остатков...");

     ТекстЗапроса = "
     |select Товар, Период, ОстатокТовараНАчальныйОстаток  ОстатокТовараНАчальныйОстаток
     |,ОстатокТовараПриход ОстатокТовараПриход
     |,ОстатокТовараПриход ОстатокТовараРасход          
     |,ОстатокТовараКонечныйОстаток ОстатокТовараКонечныйОстаток
     |into #ОстаткиТоваров
     |from
     |$РегистрОстаткиОбороты.ОстаткиТоваров(:НачДата,:КонДата~,День
     |            ,ActionsAndPeriodBoundaries
     |       ,
     |            INNER JOIN $Справочник.Номенклатура Товары ON Товары.id = Товар
     |            ,
     |            (:ВыбТовары='0' or Товар in (select val from #ВыбТовары))
     |and      (:ВыбВидыДеятельности='0' or $Товары.Производитель in (select val from #Производители))
     |            ,Товар,ОстатокТовара)  ОстаткиТоваров
     |";  
     тб = рс.ВыполнитьИнструкцию(ТекстЗапроса);
     //тб.ВыбратьСтроку();

     Состояние("Расчет кол-ва дней...");
     рс.УстановитьТекстовыйПараметр("ВыбТовары",ВыбТовары.РазмерСписка());
     писка());
     
     
     тб = СоздатьОбъект("ТаблицаЗначений");
     ТекстЗапроса = "
     |select ДниТовары.Товар, ДниТовары.День,
     |CASE WHEN
     |isnull(Остатки.ОстатокТовараНАчальныйОстаток+Остатки.ОстатокТовараПриход,
     |(select top 1 Ост.ОстатокТовараКонечныйОстаток from #ОстаткиТоваров Ост
     |where Ост.Период <= ДниТовары.День and Ост.Товар = ДниТовары.Товар
     |order by Ост.Товар, Ост.Период Desc
     |))
     |>0 THEN 1 ELSE 0 END
     |ЕстьОстаток
     |from
     |(select День, Тов.id Товар  from #Дни CROSS JOIN $Справочник.Номенклатура Тов
     |Where (:ВыбТовары='0' or Тов.id in (select val from #ВыбТовары))
     |and (:ВыбВидыДеятельности='0' or $Тов.Производитель in (select val from #Производители))
     |) ДниТовары
     |LEFT OUTER JOIN
     |#ОстаткиТоваров  as Остатки ON Остатки.Период = ДниТовары.День and Остатки.Товар = ДниТовары.Товар
     |";  
     
     ТекстЗапроса = "
     |SELECT Товар,
     //|ЕстьОстаток, День
     |SUM(ЕстьОстаток) КолДней
     |INTO #Остатки
     |FROM ("+ТекстЗапроса+") ЕстьОстатки
     |GROUP BY Товар
     //|order by Товар, День
     |";
     
     тб = рс.ВыполнитьИнструкцию(ТекстЗапроса);
конецпроцедуры
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать