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