Переключение на Главную Страницу Страницы: 1 2 [3] 4 5 ... 7 ОтправитьПечать
Очень популярная тема (более 25 ответов) Запросы для OLAP (число прочтений - 42640 )
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #30 - 29. Ноября 2006 :: 15:10
Печать  
steban писал(а) 29. Ноября 2006 :: 14:52:
Код
Выбрать все
	     ТекстЗапроса="
     |	SELECT $Прод.Фирма as ФирмаИД,
     |		IIF($Прод.АдресДоставки = '     0   ','"+ПустойАдресИД +"',Адр.id) as АдресИД,
     |		IIF($Прод.Поставщик = '     0   ','"+ПустойКонтрагентИД +"',Пост.id) as ПостИД,
     |		Ном.id as НомИД,
     |		IIF(Мен.id = '     0   ','"+ПустойМенеджерИД+"',Мен.id) as МенИД,
     |		Прод.date as Дата,
     |		CAST(($Прод.ПродСтоимость-$Прод.ПродСтоимостьВ) as NUMERIC(10,2)) as ПрСт,
     |		CAST(($Прод.Себестоимость-$Прод.СебестоимостьВ) as NUMERIC(10,2)) as Себ,
     |		CAST(($Прод.Количество-$Прод.КоличествоВ) as NUMERIC(10,2)) as Кол  
     |	FROM $Регистр.Продажи AS Прод
     | into table tolap"
     ; 


Код
Выбрать все
ПустойАдресИД = МетаДата.ЗначениеВСтрокуБД(ПустойАдрес);
ПустойКонтрагентИД = МетаДата.ЗначениеВСтрокуБД(ПустойКонтрагент);
ПустойМенеджерИД = МетаДата.ЗначениеВСтрокуБД(ПустойМенеджер); 


Дык у меня менеджер (Мен) - это реквизит справочника "Договоры", поэтому вот это:
Код
Выбрать все
	|	LEFT JOIN $Справочник.Договоры AS Дог ON Дог.ID=$Прод.Договор
	|	LEFT JOIN $Справочник.ФизЛица AS Мен ON Мен.ID=$Дог.Менеджер  


надо,
а зачем писать:
Код
Выбрать все
IIF($Прод.АдресДоставки = '     0   ','"+ПустойАдресИД +"',Адр.id) as АдресИД, 


И потом тащить этот ИД дальше? Ведь мне просто нужно его наимнование:
Код
Выбрать все
CAST(IIF($Прод.АдресДоставки = '     0   ','<не выбран>',Адр.descr) as Character(50)) as АдрДост, 


  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #31 - 29. Ноября 2006 :: 15:13
Печать  
steban писал(а) 29. Ноября 2006 :: 15:05:
IDDOC и IDDOCDEF пихать в измерения куба - эта пять  Смех

Это я хотел в дальнейшем отрабатывать открытие документа по даблклику на него (если это, конечно, возможно) - для этого IDDOC тащил, а IDDOCDEF цеплял, чтобы преобразовывать в нормальный (понятный менеджеру) вид типа "Реализация", "Возврат" (понимаю, конечно, что это в запросе надо было сделать, но пока это не первостепенная задача. Процесс идёт!)
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #32 - 29. Ноября 2006 :: 15:18
Печать  
JohnyDeath писал(а) 29. Ноября 2006 :: 15:10:
Дык у меня менеджер (Мен) - это реквизит справочника "Договоры", поэтому вот это:
Код
Выбрать все
	|	LEFT JOIN $Справочник.Договоры AS Дог ON Дог.ID=$Прод.Договор
	|	LEFT JOIN $Справочник.ФизЛица AS Мен ON Мен.ID=$Дог.Менеджер  


надо,

согласен

JohnyDeath писал(а) 29. Ноября 2006 :: 15:10:
а зачем писать:
Код
Выбрать все
IIF($Прод.АдресДоставки = '     0   ','"+ПустойАдресИД +"',Адр.id) as АдресИД, 


И потом тащить этот ИД дальше?

А наименование тащить лучше?
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #33 - 29. Ноября 2006 :: 15:20
Печать  
JohnyDeath писал(а) 29. Ноября 2006 :: 13:15:
Мне почем-то казалось, что построение куба запросом из одной таблицы будет выполнятся быстрее, чем анологичное по четырём-пяти

OLAP-процессор лучше нас с тобой знает как будет быстрее Улыбка
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #34 - 30. Ноября 2006 :: 08:04
Печать  
steban писал(а) 29. Ноября 2006 :: 15:18:
JohnyDeath писал(а) 29. Ноября 2006 :: 15:10:
а зачем писать:
Код
Выбрать все
IIF($Прод.АдресДоставки = '     0   ','"+ПустойАдресИД +"',Адр.id) as АдресИД, 


И потом тащить этот ИД дальше?

А наименование тащить лучше?

Так я сразу вытащу наименование и поставлю его в куб, а по твоей схеме: из одного запроса вытаскивается id, потом на основе этого ид в другом запросе (при построении куба) прикручивается ещё одна таблица, по-моему это лишнее, к тому же не нужно заводить элемент справочника "АдресаДоставки" с наименованием "<не выбран>"
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #35 - 30. Ноября 2006 :: 08:41
Печать  
JohnyDeath писал(а) 30. Ноября 2006 :: 08:04:
а по твоей схеме: из одного запроса вытаскивается id, потом на основе этого ид в другом запросе (при построении куба) прикручивается ещё одна таблица

Ты не переживай по этому поводу Улыбка.
OLAP-процессор - он сцуко умный Улыбка.
Запусти трассировку ODBC и увидишь, что запрос к таблице справочника АдресаДоставки будет выполнен 1 раз.
И в других запросах, которые он выполняет при построении куба эта таблица фигурировать не будет.
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #36 - 30. Ноября 2006 :: 09:05
Печать  
Теперь по поводу того нах я вообще тащил IDDOC и IDDOCDEF.
1) IDDOC - для открытия этого док-та в одинэсине, т.е. хочу сделать вот так:
Код
Выбрать все
Процедура ФСводная_DblClick()
	АО = Сводная.Объект.ActiveObject;
	//Сообщить(""+АО);
КонецПроцедуры	// ФСводная_DblClick()  


т.е. по даблклику открывать текущий элемент. Для этого нужно всего-навсего вытащить KEY этого элемента. Только чё-т у меня хреново это получается: чувствую, что в Объект.ActiveObject сидит, а как достать оттуда - ХЗ.  Нерешительный
2) Хотелось, чтобы пользователи видели документ в виде "Реализация 0002 от 25.06.06" (как в обычном журнале). По этому поводу в голову приходит только одно, не самое, мягко сказать, оптимальное решение:
при формировании временной таблицы делать ИИФы типа таких:
Код
Выбрать все
IIF(Прод.IDDOCDEF = '     2T  ', 'Реализация',IIF(Прод.IDDOCDEF = '     2B  ', 'Возврат','ХЗ')) as ВидДок 


Раскритикуй, пжлст.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #37 - 30. Ноября 2006 :: 09:31
Печать  
И ещё.
Я так понимаю по кнопке "Обновить", которая на панельке находится, вызывается метод "Refresh", значит в моём слечае надо эту кнопку вообще убрать из панели, добавить свою на форму обработки, к-ая будет вызывать проц-ру:
Код
Выбрать все
Процедура ОбновитьКуб()
     СоздатьВременнуюТаблицу();
     Сводная.Объект.Refresh();
КонецПроцедуры 


?
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #38 - 30. Ноября 2006 :: 09:38
Печать  
OLAP-отчетность строят как правило для анализа (On-Line - Analytical Processing).
Для анализа детализация до первички не нужна.
Детализация до первички нужна в оперативной отчетности.

Обычно делают так: при клаце на интересующую тебя цифру показывают отдельный отчет с детализацией до записей таблицы фактов.
Получение данных таблицы фактов из которых сложился нужный тебе агрегат называется мудреным словом drillthrough.

http://sql.ru/forum/actualthread.aspx?bid=26&tid=150883&hl=drillthrough
http://sql.ru/forum/actualsearch.aspx?search=drillthrough&sin=0&a=&ma=0&bid=26&d...
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #39 - 30. Ноября 2006 :: 09:49
Печать  
Конкретно в этой обработке можно при клаце на интересующую тебя сумму определить измерения строк и столбцов, на пересечении которых находится это значение, и выполнить запрос к таблице фактов с нужными фильтрами.
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #40 - 30. Ноября 2006 :: 10:10
Печать  
steban писал(а) 30. Ноября 2006 :: 09:38:
OLAP-отчетность строят как правило для анализа (On-Line - Analytical Processing).
Для анализа детализация до первички не нужна.
Детализация до первички нужна в оперативной отчетности.

Обычно делают так: при клаце на интересующую тебя цифру показывают отдельный отчет с детализацией до записей таблицы фактов.
Получение данных таблицы фактов из которых сложился нужный тебе агрегат называется мудреным словом drillthrough.

http://sql.ru/forum/actualthread.aspx?bid=26&tid=150883&hl=drillthrough
http://sql.ru/forum/actualsearch.aspx?search=drillthrough&sin=0&a=&ma=0&bid=26&d...

Спасибо, понял. Заодно увидел ссылку на интересный сайт по этой теме.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #41 - 30. Ноября 2006 :: 10:11
Печать  
А по поводу рефреша что скажешь? (Пост #37)
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #42 - 30. Ноября 2006 :: 10:17
Печать  
Код
Выбрать все
	ТекстЗапроса="PROVIDER=MSOLAP.2;DATA SOURCE="+КаталогИБ()+"Продажи.cub;
	|REFRESH CUBE Продажи";
	Соединение = СоздатьОбъект("ADODB.Connection");
	Соединение.Open(ТекстЗапроса);
 

  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #43 - 30. Ноября 2006 :: 11:51
Печать  
Т.е. будет примерно так:
Код
Выбрать все
Процедура ОбновитьКуб()
     СоздатьВременнуюТаблицу();
     ТекстЗапроса="PROVIDER=MSOLAP.2;DATA SOURCE="+КаталогИБ()+"Продажи.cub;
	|REFRESH CUBE Продажи";
	Соединение = СоздатьОбъект("ADODB.Connection");
	Соединение.Open(ТекстЗапроса);
КонецПроцедуры  

?
Цитата:
Конкретно в этой обработке можно при клаце на интересующую тебя сумму определить измерения строк и столбцов, на пересечении которых находится это значение, и выполнить запрос к таблице фактов с нужными фильтрами.

А как бы получить значение измерений строк, столбцов и фильтров?
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #44 - 30. Ноября 2006 :: 11:59
Печать  
"C:\Program Files\Common Files\Microsoft Shared\Web Components\11\1049\OWCVBA11.CHM"

http://msdn2.microsoft.com/en-us/library/aa207546(office.11).aspx
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 2 [3] 4 5 ... 7
ОтправитьПечать