Переключение на Главную Страницу Страницы: 1 [2] 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) Как сделать аналог Все по группировке "День"? (число прочтений - 15007 )
Славко
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 записан
 
Переключение на Главную Страницу Страницы: 1 [2] 3 
ОтправитьПечать