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



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Запросы для OLAP
27. Ноября 2006 :: 11:21
Печать  
Посмотрел обработку Степана и понял что это ОЙ КАКАЯ ХОРОШАЯ вещь!
Но возникли некоторые вопросы/проблемы:
Хотел добавить DIMENSION "Менеджер", который является реквизитом справочника "Договоры", пишу:
Код:
Код
Выбрать все
FROM $Регистр.Продажи AS Прод, $Справочник.Фирмы AS Фирмы,
		|		$Справочник.Контрагенты AS Пок,
		|		$Справочник.Контрагенты AS Пост,
		|		$Справочник.Номенклатура AS Ном,
		|		$Справочник.АдресаДоставки AS Адр,
		|		$Справочник.Договоры AS Дог
		|	WHERE
		|		($Прод.Фирма=Фирмы.id) AND ($Прод.Покупатель=Пок.id) AND
		|		($Прод.Поставщик=Пост.ID) AND ($Прод.Номенклатура=Ном.id) AND
		|		(Адр.ID = $Прод.АдресДоставки) AND (Дог.ID=$Прод.Договор)
		|	LEFT JOIN $Справочник.ФизЛица AS Мен ON Мен.ID=$Дог.Менеджер  




На что меня обругали следующим образом:
: Microsoft® OLE DB Provider for Analysis Services: Column expression cannot involve more than one table, near: Мен.id
Подскажи, в каком направлении двигаться...

P.S. В курилке так в курилке
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #1 - 27. Ноября 2006 :: 11:36
Печать  
Запрос на выборку данных для куба пишется не на чистом SQL а на некотором подмножестве языка (в частности не поддерживаются JOIN).
OLAP-процессор этот запрос не выполняет в том виде в каком он передан в CREATE CUBE.
Из текста этого запроса он выделяет таблицу фактов и таблицы с значениями измерений, свойств измерений и т.п.
Потом выполняются запросы к таблицам измерений и множество запросов к таблице фактов.
Так что запрос на выборку данных для куба должен иметь примерно такой вид:
Код
Выбрать все
SELECT <columns-list>
FROM <tables-list>
[ WHERE <where-clause> ] 


Вместо JOIN должны использоваться условия WHERE.
Схема связей таблиц в запросе (в IDEF1) должна иметь вид звезды или снежинки с таблицей фактов в центре.
Если таблица фактов в базе в явном виде не присутствует её можно смоделировать при помощи Indexed View.
  

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
Ответ #2 - 27. Ноября 2006 :: 11:37
Печать  
в твоем случае надо LEFT JOIN внести в группу условий WHERE.
  

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
Ответ #3 - 27. Ноября 2006 :: 11:40
Печать  
  

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
Ответ #4 - 27. Ноября 2006 :: 11:41
Печать  
Спасибо, вот так написал:
Код
Выбрать все
	FROM $Регистр.Продажи AS Прод, $Справочник.Фирмы AS Фирмы,
		|		$Справочник.Контрагенты AS Пок,
		|		$Справочник.Контрагенты AS Пост,
		|		$Справочник.Номенклатура AS Ном,
		|		$Справочник.АдресаДоставки AS Адр,
		|		$Справочник.Договоры AS Дог,
		|		$Справочник.ФизЛица AS Мен
		|	WHERE
		|		($Прод.Фирма=Фирмы.id) AND ($Прод.Покупатель=Пок.id) AND
		|		($Прод.Поставщик=Пост.ID) AND ($Прод.Номенклатура=Ном.id) AND
		|		(Адр.ID = $Прод.АдресДоставки) AND (Дог.ID=$Прод.Договор) AND
		|	 (Мен.ID=$Дог.Менеджер) 


вроде пошло (сейчас выполняется)
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #5 - 27. Ноября 2006 :: 11:49
Печать  
Степан, ещё такой вопрос:
У тебя твоё чудо нормально работает? Спрашиваю, потому что у меня некоторые значения не попадали в выборку для OLAPa. В частности: не совпадали суммы, начал смотреть где и чего, сравнивая с анализом продаж и движениями документа по регистру. Увидел, что некоторые строки из документа "реализация" не попадали в ОЛАП, хотя движения по регистру они делали. Подумал, что проблема в Кастах: создал здесь ветку на эту тему....
Подскажи, где капать...
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #6 - 27. Ноября 2006 :: 11:55
Печать  
JohnyDeath писал(а) 27. Ноября 2006 :: 11: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
Ответ #7 - 27. Ноября 2006 :: 12:09
Печать  
steban писал(а) 27. Ноября 2006 :: 11:55:
JohnyDeath писал(а) 27. Ноября 2006 :: 11:49:
Увидел, что некоторые строки из документа "реализация" не попадали в ОЛАП, хотя движения по регистру они делали.

Есть один нюанс: в таблице фактов не должно быть пустых ссылок.
Для регистра "Продажи" типовой ТиС такое возможно, когда остатки по складам введены документом ВводОстатковТМЦ и при реализации из этих партий в движениях регистра в измерении "Поставщик" указано пустое значение.
Лечится вводом остатков документом "ПоступлениеТМЦ".

Эхх, вот это да!  Плачущий
А если в каком либо документе реализации не будет выбран реквизит "АдресДоставки" (он есть в качестве реквизита регистра продаж), то будет такая же песня?
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #8 - 27. Ноября 2006 :: 12:17
Печать  
угу
  

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
Ответ #9 - 27. Ноября 2006 :: 12:26
Печать  
steban писал(а) 27. Ноября 2006 :: 12:17:
угу

Ёхарный бабай, чё делать-то?!!!
Может создать элемент справочника "АдресДоставки" с пустым наименованием или с наименованием "<не определён>" для каждого договора всех контрагентов; сделать так, чтоб пользователь не мог не выбирать АдресДоставки. А во всех уже проведённых документах заменить договора с невыбранными АдресамиДоставки на договора с "пустыми" АдресамиДоставки, перепровести....  Нерешительный

чё-т настроение сразу падать начало... там ещё последовательность не восстановлена...
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #10 - 27. Ноября 2006 :: 15:16
Печать  
Путаюсь тут "обмануть" ОЛАПа таким вот образом:
Код
Выбрать все
IIF(Адр.id = '     0   ',' 0',Адр.id),
IIF(Адр.id = '     0   ','БЯКА',Адр.descr), 


Обработка проходит, но мой обман раскусили и такой способ не прокатил...  Нерешительный (в QA отрабатывает нормально)
Степан, может подскажешь чего-нибудь? Как это можно обойти?
Что можно вставлять в      [Торговые точки].KEY, [Торговые точки].NAME (какой тип данных)?
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #11 - 27. Ноября 2006 :: 15:54
Печать  
То что в QA отрабатывает нормально - ничего не значит
steban писал(а) 27. Ноября 2006 :: 11:36:
OLAP-процессор этот запрос не выполняет в том виде в каком он передан в CREATE CUBE.

Цитата:
Как это можно обойти?

steban писал(а) 27. Ноября 2006 :: 11:36:
Если таблица фактов в базе в явном виде не присутствует её можно смоделировать при помощи Indexed View.

  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
aou1c
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 183
Местоположение: Екатеринбург
Зарегистрирован: 29. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #12 - 27. Ноября 2006 :: 15:57
Печать  
JohnyDeath писал(а) 27. Ноября 2006 :: 11:21:
Посмотрел обработку Степана и понял что это ОЙ КАКАЯ ХОРОШАЯ вещь!
Но возникли некоторые вопросы/проблемы:
Хотел добавить DIMENSION "Менеджер", который является реквизитом справочника "Договоры", пишу:
Код:
Код
Выбрать все
FROM $Регистр.Продажи AS Прод, $Справочник.Фирмы AS Фирмы,
		|		$Справочник.Контрагенты AS Пок,
		|		$Справочник.Контрагенты AS Пост,
		|		$Справочник.Номенклатура AS Ном,
		|		$Справочник.АдресаДоставки AS Адр,
		|		$Справочник.Договоры AS Дог
		|	WHERE
		|		($Прод.Фирма=Фирмы.id) AND ($Прод.Покупатель=Пок.id) AND
		|		($Прод.Поставщик=Пост.ID) AND ($Прод.Номенклатура=Ном.id) AND
		|		(Адр.ID = $Прод.АдресДоставки) AND (Дог.ID=$Прод.Договор)
		|	LEFT JOIN $Справочник.ФизЛица AS Мен ON Мен.ID=$Дог.Менеджер  




На что меня обругали следующим образом:
: Microsoft® OLE DB Provider for Analysis Services: Column expression cannot involve more than one table, near: Мен.id
Подскажи, в каком направлении двигаться...

P.S. В курилке так в курилке


А можешь кинуть обработку не членам клуба, т.е. мне  ? aoulc@planet-a.ru
  
Наверх
ICQ  
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #13 - 27. Ноября 2006 :: 16:00
Печать  
  

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
Ответ #14 - 28. Ноября 2006 :: 06:37
Печать  
Я понял, что ступил, ажник на работу сегодня на час раньше прилетел!  Улыбка
steban писал(а) 27. Ноября 2006 :: 15:54:
steban писал(а) 27. Ноября 2006 :: 11:36:
Если таблица фактов в базе в явном виде не присутствует её можно смоделировать при помощи Indexed View.


А можешь объяснить тупому?
У меня есть вот такая мысля. Выгрузить результаты запроса с ИИФами, ДжОЙНАМИ по таблице движения регистра во временный файл, а оттуда уже инсертом в ОЛАП. Но получается, что построение куба будет происходить примернов 2 раза дольше. И как быть с кнопкой "обновить"? Перехватить это событие и сделать опять тоже самое?
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #15 - 28. Ноября 2006 :: 07:21
Печать  
JohnyDeath писал(а) 28. Ноября 2006 :: 06:37:
У меня есть вот такая мысля. Выгрузить результаты запроса с ИИФами, ДжОЙНАМИ по таблице движения регистра во временный файл

"По взрослому" так и делается. Эта промежуточная база называется DataMart (витрина данных).
Данные в витрину сливаются по ночам, процессинг кубов делается также по ночам.
При таком подходе можно агрегировать в одной базе данные из нескольких OLTP систем.
При переходе на новую OLTP-систему или при свертке баз данные в витрине сохраняются.
Если очень хочется брать данные из базы напрямую - сделай таблицу фактов в виде View.
З.Ы.: Для DBF базы Indexed View сделать не получится, а так как при процессинге куба запросов к таблице фактов выполняется множество, то будут потери производительности при построении куба.
  

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
Ответ #16 - 28. Ноября 2006 :: 07:23
Печать  
И почитай букварь прежде чем принимать решение как организовать 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
Ответ #17 - 28. Ноября 2006 :: 13:12
Печать  
steban писал(а) 28. Ноября 2006 :: 07:23:
И почитай букварь прежде чем принимать решение как организовать OLAP-отчетность.

Был я там: пока для меня этот сайт - дебри какие-то. думаю, что надо сначала книжку умную поситать, а потом уже туда...
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #18 - 28. Ноября 2006 :: 13:23
Печать  
А вообще анализ продаж я практически добил таким вот способом:
1. Создаём эленмент справочника "Контрагенты" с наименованием "<неопределён>":
Код
Выбрать все
	Спр = СоздатьОбъект("Справочник.Контрагенты");
	Если Спр.НайтиПоНаименованию("<неопределён>")=0 Тогда
		Спр.Новый();
		Спр.Наименование = "<неопределён>";
		Спр.ЮрФизЛицо = "<неопределён>";
		Спр.Записать();
		НеопрКонтр = Спр.ТекущийЭлемент();
	Иначе
		НеопрКонтр = Спр.ТекущийЭлемент();
	КонецЕсли;
	//получим его ИД и ИД его родителя
	МетаДата = СоздатьОбъект("MetaDataWork");
	НеопрИД = МетаДата.ЗначениеВСтрокуБД(НеопрКонтр);
	НеопрИДРодителя = МетаДата.ЗначениеВСтрокуБД(НеопрКонтр.Родитель);
	Сообщить("Неопр ИД = "+НеопрИД+", Неопр ИД родителя = "+НеопрИДРодителя);  




2. Подключаюсь по OLEDBData, выгружаю всё во временную табл. таким вот запросом:
Код
Выбрать все
	ТекстЗапроса="
	|	SELECT Фирмы.descr as Фирма,
	|		Пок.id as ПокИД, Пок.parentid as ПокРод, CAST(Пок.descr as Character(50)) as ПокИмя,
	|		CAST(IIF($Прод.АдресДоставки = '     0   ','<не выбран>',Адр.descr) as Character(50)) as АдрДост,
	|		IIF($Прод.Поставщик = '     0   ','"+НеопрИД+"',Пост.id) as ПостИД, IIF($Прод.Поставщик = '     0   ','"+НеопрИДРодителя+"',Пост.parentid) as ПостРод, IIF($Прод.Поставщик = '     0   ','<неопределён>',Пост.descr) as ПостИмя,
	|		Ном.id as НомИД,Ном.parentid as НомРод, CAST(Ном.descr as Character(50)) as НомИмя,
	|		IIF(Мен.id = '     0   ','"+НеопрИД_ФЛ+"',Мен.id) as МенИД, IIF(Мен.id = '     0   ','"+НеопрИДРодителя_ФЛ+"',Мен.parentid) as МенРод, IIF(Мен.id = '     0   ','<неопределён>',Мен.descr) as МенИмя,
	|		Прод.date as Дата1,Прод.date as Дата2,
	|		Прод.IDDOC as ДокИД, Прод.IDDOCDEF as ДокВид,
	|		$Прод.ПродСтоимость as ПрСт, $Прод.Себестоимость as Себ, $Прод.Количество as Кол
//	|		CAST($Прод.ПродСтоимость as NUMERIC(10,2)) as ПрСт, CAST($Прод.Себестоимость as NUMERIC(10,2)) as Себ, CAST($Прод.Количество as NUMERIC(10,2)) as Кол
	|	FROM $Регистр.Продажи AS Прод
	|	LEFT JOIN $Справочник.Фирмы AS Фирмы ON Фирмы.ID = $Прод.Фирма
	|	LEFT JOIN $Справочник.Контрагенты AS Пок ON Пок.ID = $Прод.Покупатель
	|	LEFT JOIN $Справочник.Контрагенты AS Пост ON Пост.ID = $Прод.Поставщик
	|	LEFT JOIN $Справочник.Номенклатура AS Ном ON Ном.ID = $Прод.Номенклатура
	|	LEFT JOIN $Справочник.АдресаДоставки AS Адр ON Адр.ID = $Прод.АдресДоставки
	|	LEFT JOIN $Справочник.Договоры AS Дог ON Дог.ID=$Прод.Договор
	|	LEFT JOIN $Справочник.ФизЛица AS Мен ON Мен.ID=$Дог.Менеджер
	| into table tolap" 




А потом уже для построение куба сую ему эту таблицу.
Т.о. решилась проблема пустых полей в таблице движения регистра!  

Степан, спасибо тебе огромное за помощь и  обработку!
« Последняя редакция: 28. Ноября 2006 :: 15:11 - JohnyDeath »  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #19 - 29. Ноября 2006 :: 09:40
Печать  
Степан, ты уж извини, но у меня к тебе опять вопросы.  Круглые глаза
Объясни, пожалуйста, технологию получения родителя. Чего-то не вкуриваю пока. В твоей обработке ИМЯ родителя откуда берётся и в какой момент?
Как сделать группировки у меня?  Смущённый
Как уже писалось выше, я выгружаю всё во временный файл tolap, а потом уже из него и формирую куб:

Код
Выбрать все
|INSERTINTO=INSERT INTO Продажи(
	|	[Фирма].[Фирма],
	|   [Покупатель].KEY,[Покупатель].PARENT,[Покупатель].NAME,
	|	[Торговые точки].[Торговые точки],
	|   [Поставщик].KEY,[Поставщик].PARENT,[Поставщик].NAME,
	|	[Номенклатура].KEY,[Номенклатура].PARENT,[Номенклатура].NAME,
	|	[Менеджер].KEY,[Менеджер].PARENT,[Менеджер].NAME,
	|	[Время по месяцам],[Время по неделям],
	|	[Документ].KEY, [Документ].NAME,
	|	Measures.[Продажа],Measures.[Себестоимость],Measures.[Количество])
	//*******************************************************************|
	|	SELECT tolap.Фирма,
//*******ИД покупателя, ИД родителя покупателя, Имя покупателя
	|		tolap.ПокИД, tolap.ПокРод, tolap.ПокИмя,
	|		tolap.АдрДост,
	|		tolap.ПостИД, tolap.ПостРод, tolap.ПостИмя,
	|		tolap.НомИД, tolap.НомРод, tolap.НомИмя,
	|		tolap.МенИД, tolap.МенРод, tolap.МенИмя,
	|		tolap.Дата1, tolap.Дата2,
	|		tolap.ДокИД, tolap.ДокВид,
	|		tolap.ПрСт, tolap.Себ, tolap.Кол
	|	FROM tolap" 



В кубе нет группировок, есть только отдельные элементы.
В общем помоги в очередной раз...
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #20 - 29. Ноября 2006 :: 10:06
Печать  
Ахринеть  Ужас
Зачем тебе в промежуточной таблице наименования измерений?
  

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
Ответ #21 - 29. Ноября 2006 :: 10:18
Печать  
Создай в справочниках измерений элементы, соответствующие пустым ссылкам ("неопределен", "не указан" и т.п.)
В промежуточную таблицу слей таблицу движений регистра с замененными пустыми ссылками.
Для наполнения куба используй тот-же запрос просто заменив в нем таблицу движений на твою таблицу.
  

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
Ответ #22 - 29. Ноября 2006 :: 13:15
Печать  
steban писал(а) 29. Ноября 2006 :: 10:06:
Ахринеть  Ужас
Зачем тебе в промежуточной таблице наименования измерений?

Мне почем-то казалось, что построение куба запросом из одной таблицы будет выполнятся быстрее, чем анологичное по четырём-пяти
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #23 - 29. Ноября 2006 :: 13:22
Печать  
steban писал(а) 29. Ноября 2006 :: 10:18:
Для наполнения куба используй тот-же запрос просто заменив в нем таблицу движений на твою таблицу.

Сейчас пишу так:
Код
Выбрать все
	ТекстМетаЗапроса="
	|	SELECT t.Фирма,
	|		Пок.id, Пок.parentid, Пок.descr,
	|		t.АдрДост,
	|		Пост.id, Пост.parentid, Пост.descr,
	|		Ном.id, Ном.parentid, Ном.descr,
	|		Мен.ID, Мен.parentid, Мен.descr,
	|		t.Дата1, t.Дата2,
	|		t.ДокИД, t.ДокВид,
	|		t.ПрСт, t.Себ, t.Кол
	|	WHERE
	|		(t.ПокИД  = Пок.id) AND
	|		(t.ПостИД = Пост.ID) AND
	|		(t.НомИД  = Ном.id) AND
	|		(t.МенИД  = Мен.id)
	|	FROM tolap as t,
	|		$Справочник.Контрагенты AS Пок,
	|		$Справочник.Контрагенты AS Пост,
	|		$Справочник.Номенклатура AS Ном,
	|		$Справочник.ФизЛица as Мен" 



Теперь он, непонятно для меня "почему", вообще не работает... Нерешительный
Ругается вот так:
Microsoft® OLE DB Provider for Analysis Services: Syntax error in column definition, near:  AND
           (t.НомИД  = Ном.id) AND
           (t.МенИД  = Мен.id)
     FROM tolap as t,
           sc172 AS Пок,
           sc172 AS Пост,
           sc84 AS Ном,
           sc503 as Мен

Я помню, что, если он проходит в QA, то не факт, что он пройдён здесь, но всё же проверил в QA - проходит...
Степан, взываю, помоги...   Плачущий
Уж близок конец!
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #24 - 29. Ноября 2006 :: 13:42
Печать  
полный текст в студию.
  

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
Ответ #25 - 29. Ноября 2006 :: 14:33
Печать  
     ТекстЗапроса="PROVIDER=MSOLAP.2;DATA SOURCE="+КаталогИБ()+"\Продажи.cub;SOURCE_DSN=trade;
     |
     |CREATECUBE=CREATE CUBE Продажи(
     |    DIMENSION [Фирма],
     |        LEVEL [Все] TYPE ALL,
     |        LEVEL [Фирма],
     |
     |    DIMENSION [Покупатель] DIMENSION_STRUCTURE PARENT_CHILD OPTIONS(UNIQUE_KEY,ALLOWSIBLINGSWITHSAMENAME,NOTRELATEDTOFACTTABLE),
     |    HIERARCHY [По группам],
     |        LEVEL [Все] TYPE ALL,
     |        LEVEL [Покупатель *] ROOT_MEMBER_IF ROOT_IF_PARENT_IS_BLANK_OR_SELF_OR_MISSING,
     |       HIERARCHY [Все],
     |        LEVEL [Все] TYPE ALL,
     |        LEVEL [Покупатель],
     |
     |       DIMENSION [Торговые точки],
     |        LEVEL [Все] TYPE ALL,
     |        LEVEL [Торговые точки],
     |
     |    DIMENSION [Поставщик] DIMENSION_STRUCTURE PARENT_CHILD OPTIONS(UNIQUE_KEY,ALLOWSIBLINGSWITHSAMENAME,NOTRELATEDTOFACTTABLE),
     |    HIERARCHY [По группам],
     |        LEVEL [Все] TYPE ALL,
     |        LEVEL [Поставщик *] ROOT_MEMBER_IF ROOT_IF_PARENT_IS_BLANK_OR_SELF_OR_MISSING,
     |       HIERARCHY [Все],
     |        LEVEL [Все] TYPE ALL,
     |        LEVEL [Поставщик],
     |
     |       DIMENSION [Номенклатура] DIMENSION_STRUCTURE PARENT_CHILD OPTIONS(UNIQUE_KEY,ALLOWSIBLINGSWITHSAMENAME,NOTRELATEDTOFACTTABLE),
     |       HIERARCHY [По группам],
     |        LEVEL [Все] TYPE ALL,
     |        LEVEL [Номенклатура *] ROOT_MEMBER_IF ROOT_IF_PARENT_IS_BLANK_OR_SELF_OR_MISSING,
     |       HIERARCHY [Вся],
     |        LEVEL [Все] TYPE ALL,
     |        LEVEL [Номенклатура],
     |
     |       DIMENSION [Менеджер] DIMENSION_STRUCTURE PARENT_CHILD OPTIONS(UNIQUE_KEY,ALLOWSIBLINGSWITHSAMENAME,NOTRELATEDTOFACTTABLE),
     |       HIERARCHY [По группам],
     |        LEVEL [Все] TYPE ALL,
     |        LEVEL [Менеджер *] ROOT_MEMBER_IF ROOT_IF_PARENT_IS_BLANK_OR_SELF_OR_MISSING,
     |       HIERARCHY [Все],
     |        LEVEL [Все] TYPE ALL,
     |        LEVEL [Менеджер],
     |
     |    DIMENSION [Время по месяцам] TYPE TIME,
     |        LEVEL [Все]  TYPE ALL,
     |        LEVEL [Год]  TYPE YEAR,
     |        LEVEL [Квартал]  TYPE QUARTER,
     |        LEVEL [Месяц]  TYPE MONTH,
     |        LEVEL [День]  TYPE DAY,
     |
     |    DIMENSION [Время по неделям] TYPE TIME,
     |        LEVEL [Все]  TYPE ALL,
     |        LEVEL [Год]  TYPE YEAR,
     |        LEVEL [Неделя]  TYPE WEEK,
     |        LEVEL [День]  TYPE DAY,
     |
     |    DIMENSION [Документ],
     |        LEVEL [Все] TYPE ALL,
     |        LEVEL [Документ],
     |
     |    MEASURE [Продажа]
     |        Function Sum
     |        Format '#.#',
     |
     |    MEASURE [Себестоимость]
     |        Function Sum
     |        Format '#.#',
     |
     |    MEASURE [Количество]
     |        Function Sum
     |        Format '#.#',
     |
     |      COMMAND (CREATE MEMBER [Продажи].[Measures].[Прибыль] AS '[Продажа]-[Себестоимость]'),
     |      COMMAND (CREATE MEMBER [Продажи].[Measures].[Прибыль %] AS '[Прибыль]/[Себестоимость]')
     |);
     |
     |INSERTINTO=INSERT INTO Продажи(
     |      [Фирма].[Фирма],
     |   [Покупатель].KEY,[Покупатель].PARENT,[Покупатель].NAME,
     |      [Торговые точки].[Торговые точки],
     |   [Поставщик].KEY,[Поставщик].PARENT,[Поставщик].NAME,
     |      [Номенклатура].KEY,[Номенклатура].PARENT,[Номенклатура].NAME,
     |      [Менеджер].KEY,[Менеджер].PARENT,[Менеджер].NAME,
     |      [Время по месяцам],[Время по неделям],
     |      [Документ].KEY, [Документ].NAME,
     |      Measures.[Продажа],Measures.[Себестоимость],Measures.[Количество])
     |";
                                      
     Если СоздатьВременнуюТаблицу()=0 Тогда
           Возврат;
     КонецЕсли;                     
     
     ТекстМетаЗапроса="
     |      SELECT t.Фирма,
     |            Пок.id, Пок.parentid, Пок.descr,
     |            t.АдрДост,         
     |            Пост.id, Пост.parentid, Пост.descr,
     |            Ном.id, Ном.parentid, Ном.descr,
     |            Мен.ID, Мен.parentid, Мен.descr,
     |            t.Дата1, t.Дата2,
     |            t.ДокИД, t.ДокВид,
     |            t.ПрСт, t.Себ, t.Кол
     |      WHERE            
     |            (t.ПокИД  = Пок.id) AND
     |            (t.ПостИД = Пост.ID) AND
     |            (t.НомИД  = Ном.id) AND
     |            (t.МенИД  = Мен.id)
     |      FROM tolap as t,
     |            $Справочник.Контрагенты AS Пок,
     |            $Справочник.Контрагенты AS Пост,
     |            $Справочник.Номенклатура AS Ном,
     |            $Справочник.ФизЛица as Мен"
     ;
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #26 - 29. Ноября 2006 :: 14:34
Печать  
Запрос в ф-ии СоздатьВременнуюТаблицу:
           ТекстЗапроса="
     |      SELECT Фирмы.descr as Фирма,
     |            Пок.id as ПокИД,
     |            CAST(IIF($Прод.АдресДоставки = '     0   ','<не выбран>',Адр.descr) as Character(50)) as АдрДост,
     |            IIF($Прод.Поставщик = '     0   ','"+НеопрИД+"',Пост.id) as ПостИД,
     |            Ном.id as НомИД,
     |            IIF(Мен.id = '     0   ','"+НеопрИД_ФЛ+"',Мен.id) as МенИД,
     |            Прод.date as Дата1,Прод.date as Дата2,
     |            Прод.IDDOC as ДокИД, Прод.IDDOCDEF as ДокВид,
     |            CAST(($Прод.ПродСтоимость-$Прод.ПродСтоимостьВ) as NUMERIC(10,2)) as ПрСт, CAST(($Прод.Себестоимость-$Прод.СебестоимостьВ) as NUMERIC(10,2)) as Себ, CAST(($Прод.Количество-$Прод.КоличествоВ) as NUMERIC(10,2)) as Кол
     |      FROM $Регистр.Продажи AS Прод
     |      LEFT JOIN $Справочник.Фирмы AS Фирмы ON Фирмы.ID = $Прод.Фирма
     |      LEFT JOIN $Справочник.Контрагенты AS Пок ON Пок.ID = $Прод.Покупатель
     |      LEFT JOIN $Справочник.Контрагенты AS Пост ON Пост.ID = $Прод.Поставщик
     |      LEFT JOIN $Справочник.Номенклатура AS Ном ON Ном.ID = $Прод.Номенклатура
     |      LEFT JOIN $Справочник.АдресаДоставки AS Адр ON Адр.ID = $Прод.АдресДоставки
     |      LEFT JOIN $Справочник.Договоры AS Дог ON Дог.ID=$Прод.Договор
     |      LEFT JOIN $Справочник.ФизЛица AS Мен ON Мен.ID=$Дог.Менеджер
     |where (Прод.Date = {d '2006-09-21'})
     | into table tolap"
     ;
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #27 - 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"
     ; 


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

  

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
Ответ #28 - 29. Ноября 2006 :: 15:04
Печать  
Код
Выбрать все
     |INSERTINTO=INSERT INTO Продажи(
     |	[Фирма].[Фирма],
     |   [Покупатель].KEY,[Покупатель].PARENT,[Покупатель].NAME,
     |	[Торговые точки].[Торговые точки],
     |   [Поставщик].KEY,[Поставщик].PARENT,[Поставщик].NAME,
     |	[Номенклатура].KEY,[Номенклатура].PARENT,[Номенклатура].NAME,
     |	[Менеджер].KEY,[Менеджер].PARENT,[Менеджер].NAME,
     |	[Время по месяцам],[Время по неделям],
     |	Measures.[Продажа],Measures.[Себестоимость],Measures.[Количество])
     |";  


Код
Выбрать все
     ТекстМетаЗапроса="
     |	SELECT Фирмы.descr,
     |		Пок.id, Пок.parentid, Пок.descr,
     |		Адреса.descr,
     |		Пост.id, Пост.parentid, Пост.descr,
     |		Ном.id, Ном.parentid, Ном.descr,
     |		Мен.ID, Мен.parentid, Мен.descr,
     |		t.Дата, t.Дата,
     |		t.ПрСт, t.Себ, t.Кол
     |	FROM tolap as t,
     |		$Справочник.Фирмы AS Фирмы,
     |		$Справочник.Контрагенты AS Пок,
     |		$Справочник.АдресаДоставки AS Адреса,
     |		$Справочник.Контрагенты AS Пост,
     |		$Справочник.Номенклатура AS Ном,
     |		$Справочник.ФизЛица as Мен"
     |	WHERE
     |		(t.ФирмаИД  = Фирмы.id) AND
     |		(t.АдресИД  = Адреса.id) AND
     |		(t.ПокИД  = Пок.id) AND
     |		(t.ПостИД = Пост.ID) AND
     |		(t.НомИД  = Ном.id) AND
     |		(t.МенИД  = Мен.id)
     ; 

  

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
Ответ #29 - 29. Ноября 2006 :: 15:05
Печать  
IDDOC и IDDOCDEF пихать в измерения куба - эта пять  Смех
  

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
Ответ #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 записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #45 - 30. Ноября 2006 :: 12:13
Печать  
steban писал(а) 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

О! Хорошая штука!
P.S. Только у неё один минус есть (для меня): она на Англицком...

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



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #46 - 30. Ноября 2006 :: 12:54
Печать  
Наконец-то нашёл ссылку на книгу по ОЛАП на русском!  Очень довольный
Теперь будет чем заняться на выходных.  Подмигивание
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #47 - 19. Декабря 2006 :: 13:16
Печать  
Вот в этой книжке вычитал про компонент ChartSpace (графики, диаграммы). Да, я построил его для своего куба. Теперь хочется, чтобы объект класса ChartSpace менялся синхронно с объектом класса PivotTable, который расположен "здесь же".
В книге написано, что это просто сделать:
Цитата:
Следующий этап создания диаграммы заключается в выборе источника данных для
построения. В нашем случае это будет уже имеющийся компонент PivotTable List (см. прикреплённый файл)

Млин, а програмно как-нить можно установить такую "КоннекшнСтринг"? Я бы сам посмотрел во ФронтПадже чё он там делает, но за неимением последнего спрашиваю здесь. Возможно ли? Или это только в веб?

Вот если ещё вот это вот прикрутить, то практически идеальная подсистемка анализа продаж получится.
  

chart.JPG ( 22 KB | Загрузки )
chart.JPG
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #48 - 20. Декабря 2006 :: 10:20
Печать  
Отвечаю сам (после долгих изысканий).
Чтобы сделать их синхронными, достаточно атребут "DataSource" объекта ChartSpace установить в нужный вам объект класса PivotTable. Вот как это выглядит у меня:
Код
Выбрать все
	//создаем график
	Диаграмма=СоздатьОбъект("АктивИкс");
	гРФорма.ПолучитьАтрибут("фГрафик").СоздатьЭлементУправления(Диаграмма);
	Диаграмма.СоздатьЭУ("OWC11.ChartSpace");

	Диаграмма.Объект.DataSource = Сводная.Объект;
 



П.С. Здесь "Сводная" - это "OWC11.PivotTable"

Теперь у меня такая загвоздка. Не могу установить нужный мне тип диаграммы. Вот такой вот код:
Код
Выбрать все
ChartSpace1.Charts(0).Type = chChartTypeBar3D 


в VB отрабатывается нормально.
Пытаюсь переложить тоже самое в 1С, делаю вот так:
Код
Выбрать все
	Scr=СоздатьОбъект("MSScriptControl.ScriptControl");
	scr.Language="vbscript";
	   scr.AddObject("ch1", Диаграмма.Объект);
	Scr.ExecuteStatement("ch1.Charts(0).Type = chChartTypeAreaOverlapped3D"); 


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



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #49 - 20. Декабря 2006 :: 10:38
Печать  
предупреждаю сразу, с OLAP не знаком вообще, так что могу ступить, но используя общий принцип, может в MSDN посмотреть значение chChartTypeAreaOverlapped3D, которое к примеру может быть 3, и тогда:
Код
Выбрать все
	Scr=СоздатьОбъект("MSScriptControl.ScriptControl");
	scr.Language="vbscript";
	   scr.AddObject("ch1", Диаграмма.Объект);
	Scr.ExecuteStatement("ch1.Charts(0).Type = 3");  


  

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



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #50 - 20. Декабря 2006 :: 11:01
Печать  
Нет, не канает.  Нерешительный
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #51 - 20. Декабря 2006 :: 12:35
Печать  
JohnyDeath писал(а) 20. Декабря 2006 :: 11:01:
Нет, не канает.  Нерешительный

Дико извиняюсь, всё работает, просто так случилось, что '3' и то что ставилось по умолчанию - одно и то же!

Вот тут нашёл соответствие циферок и констант
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #52 - 21. Декабря 2006 :: 11:30
Печать  
Степан (ну или кто-нибудь, кто хоть немного знает язык этих запросов), возможно ли добавить измерение "КоличествоКлиентов" - характерезующее количество уникальных контрагентов, которым делали отгрузку?
Я чего-то вообще не соображу как это сделать...  Нерешительный

П.С. А синхронное построение таблички и диаграммы СДЕЛАЛ!
+ Возможность интерактивного изменения типа диаграммы
+ Доп. измерения, которые являлись свойствами контрагентов\номенклатуры.
Итог: OLAP - бомба!

П.С.2.
И ещё с печатью немного не понятно. Я не нашёл такого метода ни в PivotTable, ни в ChartSpace.
Но извернутся можно так (из тех методов, которые я обнаружил):
1) Сохраняем(экспортируем\копируем) текущую картинку ChartSpace
2) Экспортируем данные PivotTable в Excel
3) Добавляем в экселевский файл картинку из п.1
4) Печатаем экселевский файл
5) Удаляем (если были сохранены) картинку и экселевский файл.
Мутновато конечно, но жить можно, а вот как быть с "КоличествоКлиентов" ума не приложу
  
Наверх
 
IP записан
 
igorru
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 2
Зарегистрирован: 21. Декабря 2006
Re: Запросы для OLAP
Ответ #53 - 21. Декабря 2006 :: 14:35
Печать  
В первый раз зашел на сайт.
Глаза просто разбегаются !!
Может ступлю но расскажите как юзает Olap конечный пользователь ? как он использует measures и dimensions ?
я так просто гружу данные из 1с  через Ado  или Ole в Sql таблицы, потом обновляю куб
через Analysis Manager (куб естественно уже создан) и потом юзера через клиентов
ProClarity (лучше), Hyperion и Crystal Reports (хуже) работают.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #54 - 21. Декабря 2006 :: 15:11
Печать  
igorru писал(а) 21. Декабря 2006 :: 14:35:
В первый раз зашел на сайт.
Глаза просто разбегаются !!
Может ступлю но расскажите как юзает Olap конечный пользователь ? как он использует measures и dimensions ?
я так просто гружу данные из 1с  через Ado  или Ole в Sql таблицы, потом обновляю куб
через Analysis Manager (куб естественно уже создан) и потом юзера через клиентов
ProClarity (лучше), Hyperion и Crystal Reports (хуже) работают.

А у тебя база 1С ДБФ?
У меня - да. Я делал на основе Степановской обработки. За что ему очередной ОГРОМНЕЙШИЙ респект.

А ты случаем по моему последнему вопросу ничего не скажешь?
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #55 - 26. Февраля 2007 :: 03:57
Печать  
JohnyDeath писал(а) 30. Ноября 2006 :: 12:54:
Наконец-то нашёл ссылку на книгу по ОЛАП на русском!  Очень довольный

Книга называется "Введение в OLAP". Авторы: Алексей Федоров и Наталия Елманова.
Кстати очень хороший бук именно как "введение".
Ничего нового там не нашел, однако сильно пожалел, что эта книга не попалась мне лет 5 назад.
Там в сжатом виде изложены основы OLAP, необходимые для понимания и некоторые технические подробности о реализации OLAP в Microsoft Analysis Services.
Когда-то эту инфу приходилось добывать по крупицам из разных источников.
  

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
Ответ #56 - 26. Февраля 2007 :: 04:08
Печать  
JohnyDeath писал(а) 21. Декабря 2006 :: 11:30:
возможно ли добавить измерение "КоличествоКлиентов" - характерезующее количество уникальных контрагентов, которым делали отгрузку?

Скорее всего возможно. Надо курить MDX Reference.
Кстати в OWC.PivotTable можно интерактивно добавлять вычисляемые члены, что очень удобно при отладке.
Когда MDX-выражение для вычисляемого члена отлажено, можно его вставить в определение куба.
  

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



Сообщений: 1570
Зарегистрирован: 19. Мая 2006
Re: Запросы для OLAP
Ответ #57 - 26. Февраля 2007 :: 06:10
Печать  
Цитата:
Книга называется "Введение в OLAP". Авторы: Алексей Федоров и Наталия Елманова.

Алексей Федоров aka АЛьФ? Очень довольный
  
Наверх
ICQ  
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Запросы для OLAP
Ответ #58 - 18. Сентября 2007 :: 02:43
Печать  
Люди ктонить это сейчас юзает? Посмотрел, нравится, есть два вопроса:
1. Быстродействие - как моожно ускорить отображение
2. печать средствами 1С
  
Наверх
ICQ  
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #59 - 18. Сентября 2007 :: 06:05
Печать  
Nick писал(а) 18. Сентября 2007 :: 02:43:
Люди ктонить это сейчас юзает?

Насколько я знаю, до сих пор юзают Улыбка

Nick писал(а) 18. Сентября 2007 :: 02:43:
1. Быстродействие - как можно ускорить отображение

При отображении ничего не должно тормозить. В локальных кубах уже все агрегаты посчитаны. При отображении сводной никаких расчетов не производится. Может быть, в природе существуют и другие ActiveX-компоненты, способные отображать локальные кубы (файлы .cub), может быть даже работают быстрее.

Nick писал(а) 18. Сентября 2007 :: 02:43:
2. печать средствами 1С

Ничего лучше, чем копировать через Clipboard в Excel и оттуда печатать я не придумал.
  

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
Ответ #60 - 18. Сентября 2007 :: 06:21
Печать  
Nick писал(а) 18. Сентября 2007 :: 02:43:
Люди ктонить это сейчас юзает? Посмотрел, нравится, есть два вопроса:
1. Быстродействие - как моожно ускорить отображение
2. печать средствами 1С

Я одному клиенту поставил - он был доволен как слон (ну ес-но, после 1С-ких отчетов). Думаю, что и по сей день этим пользуется.
1. ИМХО, отображение и так очень быстрое. Может ты имел ввиду построение самого куба? Если да, то строй куб за определённый период, т.е. в запросе пиши примерно так:
Код
Выбрать все
...
FROM $Регистр.Продажи AS Прод
...
WHERE Прод.Date BETWEEN :НачДата~~ AND :КонДата~~
...
 


2. А с печатью я тоже долго мудохался, так и не поборол  Печаль
Был вариант, описанный мной в 52-м посте этой ветки, но очень уж некрасивым он мне показался. В итоге сейчас делается так: на панели нажимаем кнопку "В Excel" (иликак-то так), а оттуда уже и печатаем.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #61 - 18. Сентября 2007 :: 07:57
Печать  
Тут сегодня на инфостарте появился отчет по построении OLAP-кубов на основе другой компоненты: http://www.pivotcube.com/
Правда там в бесплатном режиме можно отрабатывать не более 5000 записей, при большем колличестве появляется Nag screen. Но там уже нет заморочек с печатью: "олл инклуд", так сказать.
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Запросы для OLAP
Ответ #62 - 18. Сентября 2007 :: 09:13
Печать  
Цитата:
1. ИМХО, отображение и так очень быстрое. Может ты имел ввиду построение самого куба? Если да, то строй куб за определённый период



Нет именно вывод у тебя какого размера данных скока на сколько?
у меня порядка  800X300  - тормозит, хотя конечно это изврат
Но даже когда просто использую группы скажем 800X5 тоже тормозит???
  
Наверх
ICQ  
IP записан
 
alest
Senior Member
****
Отсутствует



Сообщений: 380
Местоположение: Гродно, Беларусь
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #63 - 22. Октября 2007 :: 08:59
Печать  
Ребята,  а если из дбф в таблицу postgres вытащить данные, как тогда куб создавать? Кто-нибудь переносил в mssql, например?
  
Наверх
ICQ  
IP записан
 
alest
Senior Member
****
Отсутствует



Сообщений: 380
Местоположение: Гродно, Беларусь
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #64 - 22. Октября 2007 :: 09:27
Печать  
Нужно просто выборку писать уже из postgres? А в строке соединения нужно указывать
DATA SOURCE="+КаталогИБ()+"\ОстаткиТоваров.cub;SOURCE_DSN=olap1c;
или просто SOURCE_DSN=olap1c
?
  
Наверх
ICQ  
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #65 - 22. Октября 2007 :: 10:03
Печать  
Нужно просто настроить системный ODBC-источник с именем olap1c на соединение с твоей postgres-базой
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
alest
Senior Member
****
Отсутствует



Сообщений: 380
Местоположение: Гродно, Беларусь
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #66 - 22. Октября 2007 :: 10:10
Печать  
Соединение.Open(ТекстЗапроса);
{E:\1C\2006\EXTFORMS\ОБРАБОТКИ\OLAP.ERT(43)}: ADODB.Connection: Не удается найти указанного поставщика. Вероятно, он установлен неправильно.

И офис 2003 стоит, и mssql2000%-) Или это на pg ругается... В настройке DSN тест подключения нормально проходит.
Я уже pts отдельно установку повторил. В списке драйверов для источников данных PROVIDER=MSOLAP.2 нетуПечаль А, там же одбс драйвера...
  
Наверх
ICQ  
IP записан
 
alest
Senior Member
****
Отсутствует



Сообщений: 380
Местоположение: Гродно, Беларусь
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #67 - 22. Октября 2007 :: 10:23
Печать  
В excel, например, если создавать подключение к кубу, то параметры подключения к Microsoft OLE DB Provider for OLAP Services 8.0 вообще не выдает, а Microsoft OLE DB Provider for OLAP Services (без 8-ки) можно настроить...
Хотя, наверное, pts я зря установил, надо сервис пак теперь устанавливать. Счас перегружу и попробую.
  
Наверх
ICQ  
IP записан
 
alest
Senior Member
****
Отсутствует



Сообщений: 380
Местоположение: Гродно, Беларусь
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #68 - 22. Октября 2007 :: 10:44
Печать  
Да, сервис пак вылечил- в excel открывается.
  
Наверх
ICQ  
IP записан
 
alest
Senior Member
****
Отсутствует



Сообщений: 380
Местоположение: Гродно, Беларусь
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #69 - 25. Октября 2007 :: 08:13
Печать  
Че-то у меня прокрутка не работает. И клавишами по этой сводной таблице курсор тоже не ходитПечаль
Что сделать можно? Это все та же чудо обработка.
1с++ 2.5.0.3

Блин, уже работает Улыбка Это при установке "автоматически подбирать размер элемента" такая фигня
  
Наверх
ICQ  
IP записан
 
alest
Senior Member
****
Отсутствует



Сообщений: 380
Местоположение: Гродно, Беларусь
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #70 - 29. Октября 2007 :: 08:00
Печать  
У меня частенько  падает на
Код
Выбрать все
	Сводная.Уничтожить();
	ДеревоНастроек.Уничтожить();
 


И на 2.5.0.3 и на ночнойПечаль
  
Наверх
ICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #71 - 29. Октября 2007 :: 08:03
Печать  
А ты вообще убери эти строки или пиши:
Код
Выбрать все
Сводная="";
ДеревоНастроек=""; 

  
Наверх
 
IP записан
 
alest
Senior Member
****
Отсутствует



Сообщений: 380
Местоположение: Гродно, Беларусь
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #72 - 29. Октября 2007 :: 08:16
Печать  
Файл куба остается занятымПечаль И в случае "уничтожить" тоже... У вас так же?
  
Наверх
ICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #73 - 29. Октября 2007 :: 08:19
Печать  
Да, есть такое. Приходится только закрывать 1С. Я пытался как-то побороть это, но не хватило знаний и сил  Печаль
  
Наверх
 
IP записан
 
alest
Senior Member
****
Отсутствует



Сообщений: 380
Местоположение: Гродно, Беларусь
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #74 - 29. Октября 2007 :: 08:31
Печать  
Еще вопрос, сделал такую же отдельную процедуру создания временной таблицы, туда выгрузил
     |      Товар.id AS ТоварИд,
     |      Товар.parentid AS ТоварПИд,
     |      Товар.descr AS Товар,
Но в кубе не цепляются ТоварИд и ТоварПИд - показывает без группировки товары. Это почему такое может быть?

Ой, кажется поднимался вопрос, минутку...
  
Наверх
ICQ  
IP записан
 
alest
Senior Member
****
Отсутствует



Сообщений: 380
Местоположение: Гродно, Беларусь
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #75 - 29. Октября 2007 :: 08:42
Печать  
Чтоб группировка была обязательно надо в запросе куба опять цеплять Справочник.Номенклатура? Странно... условие на равенство срабатывает, какая тогда разница для драйвера между этими таблицами?
Логично, во  временной таблице нету групп и их наименований...
« Последняя редакция: 29. Октября 2007 :: 12:05 - alest »  
Наверх
ICQ  
IP записан
 
alest
Senior Member
****
Отсутствует



Сообщений: 380
Местоположение: Гродно, Беларусь
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #76 - 29. Октября 2007 :: 14:53
Печать  
JohnyDeath
У вас получилось Обновить сделать? У меня пишет, что файл.cub не может быть открыт для записи...
  
Наверх
ICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #77 - 29. Октября 2007 :: 15:08
Печать  
Нет, я ж уже ответил.
  
Наверх
 
IP записан
 
alest
Senior Member
****
Отсутствует



Сообщений: 380
Местоположение: Гродно, Беларусь
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #78 - 05. Ноября 2007 :: 09:42
Печать  
Что-то не пойму как добавлять поля детализации? Это которые можно в таблице потом "Добавить в Детали" в списке полей...
  
Наверх
ICQ  
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #79 - 05. Ноября 2007 :: 12:50
Печать  
"Детали" доступны только для реляционных источников.
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
alest
Senior Member
****
Отсутствует



Сообщений: 380
Местоположение: Гродно, Беларусь
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #80 - 05. Ноября 2007 :: 12:56
Печать  
steban писал(а) 05. Ноября 2007 :: 12:50:
"Детали" доступны только для реляционных источников.

Хотел бы закинуть в куб разные цены товара, чтоб их можно было смотреть как вспомогательную информацию и чтоб можно было добавить вычисляемое поле Цена*Количество.
Т.е. для такого мне нужен OLAP-сервер? У кого какой стоит уже? и во сколько обошелся?
  
Наверх
ICQ  
IP записан
 
alest
Senior Member
****
Отсутствует



Сообщений: 380
Местоположение: Гродно, Беларусь
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #81 - 05. Ноября 2007 :: 14:19
Печать  
Если нужно разделить товары по ценовым категориям: до 1000, 1000-5000 и т.д.- можно ли это сделать средствами куба? Или в куб нужно уже номер категории вставлять рассчитанный? Хотелось бы пользователю дать возможность выбирать эти интервалы...
  
Наверх
ICQ  
IP записан
 
alest
Senior Member
****
Отсутствует



Сообщений: 380
Местоположение: Гродно, Беларусь
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #82 - 05. Ноября 2007 :: 14:37
Печать  
Я вообще начал с OLAP  этим разбираться, чтобы набить в куб из базы все возможные данные, а менеджеры чтобы делали какие им нужно выборки и ко мне не приставали: нужна группировка такая, изменяемый порядок группировок, по группам товаров, складов и прочее. Правильно ли я предположил, что OLAP-куб поможет мне решить эту проблему?
  
Наверх
ICQ  
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #83 - 05. Ноября 2007 :: 17:38
Печать  
alest писал(а) 05. Ноября 2007 :: 12:56:
steban писал(а) 05. Ноября 2007 :: 12:50:
"Детали" доступны только для реляционных источников.


Имелось ввиду, что если в качестве источника данных для сводной таблицы OWC использовать не OLEDB провайдер MSOLAP, а какой-нибудь реляционный источник (например ODBC), то станет доступным добавление полей в "Детали".
Под "деталями" там понимаются исходные данные, из которых сложилась сумма.
Источники из OLAP-баз таких данных не возвращают.

alest писал(а) 05. Ноября 2007 :: 12:56:
Хотел бы закинуть в куб разные цены товара, чтоб их можно было смотреть как вспомогательную информацию и чтоб можно было добавить вычисляемое поле Цена*Количество

ИМХО, лучше в фактах хранить Количество и Сумму, а цену сделать вычисляемой мерой. Возможны продажи со скидками, тогда цена при вычислении будет усреднена.

Можно к измерениям добавить дополнительную информацию (PROPERTIES) и настроить сводную OWC на отображение этой информации во всплывающих подсказках или прямо в таблице. Использовать PROPERTIES в вычислениях не получится.
  

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
Ответ #84 - 05. Ноября 2007 :: 17:42
Печать  
alest писал(а) 05. Ноября 2007 :: 14:37:
нужна группировка такая, изменяемый порядок группировок, по группам товаров, складов и прочее. Правильно ли я предположил, что OLAP-куб поможет мне решить эту проблему?

Правильно.
  

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
Ответ #85 - 05. Ноября 2007 :: 17:45
Печать  
alest писал(а) 05. Ноября 2007 :: 14:19:
Если нужно разделить товары по ценовым категориям: до 1000, 1000-5000 и т.д.- можно ли это сделать средствами куба? Или в куб нужно уже номер категории вставлять рассчитанный? Хотелось бы пользователю дать возможность выбирать эти интервалы...

я такого не делал, но всякие извраты можно реализовать при помощи MDX-запросов к локальным кубам, в которых накоплены нужные данные.
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
alest
Senior Member
****
Отсутствует



Сообщений: 380
Местоположение: Гродно, Беларусь
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #86 - 08. Ноября 2007 :: 14:40
Печать  
А в чем вообще преимущество кубов, не могу понять. Если я на mysql/pgsql залью нужную информацию, потом сводную таблицу можно использовать также как и куб, так ведь? Или в сводной нельзя получить группировки по датам?

Если я слишком "ленивые" вопросы задаю, можете не отвечать, но ответ в пару слов знающему написать - секунды, а незнающему добыть эти пару слов не так уж и просто бывает...
  
Наверх
ICQ  
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #87 - 08. Ноября 2007 :: 14:56
Печать  
alest писал(а) 08. Ноября 2007 :: 14:40:
А в чем вообще преимущество кубов, не могу понять.

В скорости получения отчетных данных.
Многомерные БД хранят часть просуммированных данных. В случае локальных кубов, в файле куба сохраняются ВСЕ агрегаты в любых комбинациях.

alest писал(а) 08. Ноября 2007 :: 14:40:
Если я на mysql/pgsql залью нужную информацию, потом сводную таблицу можно использовать также как и куб, так ведь?

Так, только скорость получения данных из таких таблиц (при очень большом количестве фактов) будет как правило ниже, чем если построить по ним куб и тянуть данные из него.
К тому-же при изменении способа группировки запрос придется выполнять заново.
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
alest
Senior Member
****
Отсутствует



Сообщений: 380
Местоположение: Гродно, Беларусь
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #88 - 09. Ноября 2007 :: 07:41
Печать  
Спасибо вам за просветительскую работу.
Осталось разобраться с property и обновлением. У вас, Steban, REFRESH cube работает? Приведенный вами рецепт в этой ветке почему-то не срабатывает. В доке написано, что файл куба должен перестроиться, но данные не обновляютсяПечаль
  
Наверх
ICQ  
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #89 - 09. Ноября 2007 :: 08:04
Печать  
alest писал(а) 09. Ноября 2007 :: 07:41:
У вас, Steban, REFRESH cube работает?

Я его не использую.
Я просто научил пользователей нажимать кнопочку с красным восклицательным знаком Улыбка
« Последняя редакция: 09. Ноября 2007 :: 11:12 - steban »  

refreshbutton.gif ( 1 KB | Загрузки )
refreshbutton.gif

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
alest
Senior Member
****
Отсутствует



Сообщений: 380
Местоположение: Гродно, Беларусь
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #90 - 23. Ноября 2007 :: 09:59
Печать  
С датами проблема:
Во временную таблицу пишу дату поступления партии
Код
Выбрать все
|	, IIF($Партия.ДатаПоступления = CAST ('' AS DATETIME), CAST ('01.01.1980' AS DATETIME), $Партия.ДатаПоступления) AS ДатаПост 


     
Потом ее вставляю в куб
Код
Выбрать все
	|	DIMENSION [Дата поступления] TYPE TIME,
    |		LEVEL [Год]  TYPE YEAR,
    |		LEVEL [Месяц]  TYPE MONTH,
    |		LEVEL [День]  TYPE DAY,
...
|		, Партия.ДатаПост
 



Как только добавляю это измерение в куб- сразу выводит не понять что, товары даже не все показываетПечаль
Кто-то сталкивался с такой проблемой? Может что-то особенное нужно знать при работе с датами?
  
Наверх
ICQ  
IP записан
 
alest
Senior Member
****
Отсутствует



Сообщений: 380
Местоположение: Гродно, Беларусь
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Запросы для OLAP
Ответ #91 - 23. Ноября 2007 :: 10:32
Печать  
В сводной таблице: ставлю группировку Товар- показывает не все, Год поступления/Товар-все ок, Товар/Год поступления- похоже на правду, но колонка остатка по Товару с датой поступления пустая, цифры есть только по второй группировке. Товары, по которым была в запросе проведена замена CAST ('01.01.1980' AS DATETIME), показывает с итогами. Применение того же CAST к $Партия.ДатаПоступления не помогает%), но все же, наверное, какая-то проблема с типами.
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать