Переключение на Главную Страницу Страницы: 1 [2] 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) Создание OLAP cube 1С77 (число прочтений - 11307 )
Nikolaj
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 19
Зарегистрирован: 11. Июня 2008
Re: Создание OLAP cube 1С77
Ответ #15 - 20. Июня 2008 :: 07:20
Печать  
berezdetsky писал(а) 20. Июня 2008 :: 07:19:

Спасибо. Ошибка не в этом. Уже сам нашел методом втыка.
Все работает. Всем спасибо.
  
Наверх
 
IP записан
 
Nikolaj
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 19
Зарегистрирован: 11. Июня 2008
Re: Создание OLAP cube 1С77
Ответ #16 - 20. Июня 2008 :: 07:23
Печать  
berezdetsky писал(а) 20. Июня 2008 :: 07:19:


Спасибо. Уже нашел.
Все заработало.
Всем спасибо.
  
Наверх
 
IP записан
 
Nikolaj
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 19
Зарегистрирован: 11. Июня 2008
Re: Создание OLAP cube 1С77
Ответ #17 - 20. Июня 2008 :: 08:47
Печать  
ТекстЗапроса = "
     |SELECT ОборотыОбороты.Фирма [Фирма $Справочник.Фирмы]
     |, ОборотыОбороты.ТМЦ [ТМЦ $Справочник.ТМЦ]
     |, ОборотыОбороты.Клиент [Клиент $Справочник.Клиенты]
     |, Sum(ОборотыОбороты.РасходГрнОборот) ФактГрн
     |, Sum(ОборотыОбороты.РасходКвоОборот) Кво
     |FROM $РегистрОбороты.Обороты(:НачДата,:КонДата~,,,,
     |      (Фирма, ТМЦ, Клиент),
     |      (РасходГрн, РасходКво)) AS ОборотыОбороты
     |GROUP BY ОборотыОбороты.Фирма
     |, ОборотыОбороты.ТМЦ
     |, ОборотыОбороты.Клиент
     |TOTALS Sum(ФактГрн), Sum(Кво)
     |BY ALL
     |      , [Фирма $Справочник.Фирмы]
     |      , [ТМЦ $Справочник.ТМЦ]
     |      , [Клиент $Справочник.Клиенты]
     |";

Еще вопрос. В этом запросе в куб попадают только те клиенты по которым были движения.
Как сделать что б попадали все (т.е. из справочника Клиенты) ?
Как включить в куб менеджера? (Клиенты.Менеджер тип справочник Сотрудники)
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание OLAP cube 1С77
Ответ #18 - 20. Июня 2008 :: 09:37
Печать  
В куб можно включить только ту информацию, которая есть в таблице фактов. Перепиши базовый запрос так, чтобы он возвращал всех клиентов и менеджеров - и будет тебе счастье.  Улыбка
  

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


I Love YaBB 2!

Сообщений: 19
Зарегистрирован: 11. Июня 2008
Re: Создание OLAP cube 1С77
Ответ #19 - 20. Июня 2008 :: 09:54
Печать  
berezdetsky писал(а) 20. Июня 2008 :: 09:37:
В куб можно включить только ту информацию, которая есть в таблице фактов. Перепиши базовый запрос так, чтобы он возвращал всех клиентов и менеджеров - и будет тебе счастье.  Улыбка

Можно пример, если незатруднит? Я с кубом только начинаю разбираться и несовсем понимаю логику запроса под него.
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание OLAP cube 1С77
Ответ #20 - 20. Июня 2008 :: 10:43
Печать  
Nikolaj писал(а) 20. Июня 2008 :: 09:54:
несовсем понимаю логику запроса под него.

Нет под ним никакой логики. Смех Т.е. никакие дополнительные ограничения на базовый запрос не накладываются.
Это могло бы быть что-то вроде
Код
Выбрать все
SELECT Клиенты.ID [Клиент $Справочник.Клиенты]
    , $Клиенты.Менеджер [Менеджер $Справочник.Сотрудники]
    , IsNull(ОборотыОбороты.Фирма, $ПустойИд) [Фирма $Справочник.Фирмы]
    , IsNull(ОборотыОбороты.ТМЦ, $ПустойИд) [ТМЦ $Справочник.ТМЦ]
    , IsNull(ОборотыОбороты.РасходГрнОборот, 0) ФактГрн
    , IsNull(ОборотыОбороты.РасходКвоОборот, 0) Кво
FROM $Справочник.Клиенты AS Клиенты With (NOLOCK)
    LEFT OUTER JOIN $РегистрОбороты.Обороты(:НачДата,:КонДата~,,,,
	  (Фирма, ТМЦ, Клиент),
	  (РасходГрн, РасходКво)) AS ОборотыОбороты ON Клиенты.ID = ОборотыОбороты.Клиент)
TOTALS Sum(ФактГрн), Sum(Кво)
BY ALL
    , [Клиент $Справочник.Клиенты]
    , [Менеджер $Справочник.Сотрудники]
    , [Фирма $Справочник.Фирмы]
    , [ТМЦ $Справочник.ТМЦ]  

  

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


I Love YaBB 2!

Сообщений: 19
Зарегистрирован: 11. Июня 2008
Re: Создание OLAP cube 1С77
Ответ #21 - 20. Июня 2008 :: 10:55
Печать  
berezdetsky писал(а) 20. Июня 2008 :: 10:43:
Нет под ним никакой логики. 

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


I Love YaBB 2!

Сообщений: 19
Зарегистрирован: 11. Июня 2008
Re: Создание OLAP cube 1С77
Ответ #22 - 27. Июня 2008 :: 11:07
Печать  
Ну вот, частично получилось.
Но че-то туплю (может пятница влияет):
1. Как добавить ТМЦ из справочника ТМЦ (причем все ТМЦ, так же как и с Клиентами) ? В регистре Обороты есть измерение ТМЦ (вид - справочник.ТМЦ) с которым и нужно объединить.
2. Почему в запрос №2 (куб) попадает не весь список Клиентов? В запрос №1 попадают все - проверял.
3. В справочнике Клиенты есть реквизит "активный" (тип - число, длина 1, точность 0). Почему он непопадает в запрос №2 ? В запрос №1 попадает.
Помогите кто может, немогу понять где затык.  Плачущий
Запрос №1.
Код
Выбрать все
	тТЗ.Очистить();
	Запрос = СоздатьОбъект("ODBCRecordset");
	ТекстЗапроса = "
	|SELECT Клиенты.ID [Клиент $Справочник.Клиенты]
	|, $Клиенты.ВидДоставки [ВидДоставки $Перечисление.ВидДоставки]
	|, $Клиенты.КатегорияКлиента [КатегорияКлиента $Перечисление.КатегорииКлиента]
	|, $Клиенты.Менеджер [Менеджер $Справочник.Сотрудники]
	|, $Клиенты.НаселенныйПункт [Территория $Справочник.НаселенныеПункты]
	|, НаселенныеПункты.PARENTEXT [Область $Справочник.Территории]
	|, $Клиенты.Отдел [КаналСбыта $Перечисление.Отделы]
	|, $ПоследнееЗначение.Клиенты.Плательщик(Клиенты.ID, :КонДата) [Плательщик $Справочник.Клиенты]
	|, $Клиенты.ФорматКлиента [ФорматКлиента $Перечисление.КатегорииКлиента]
	|, $Клиенты.активный активный
	|, Sum($Обороты.РасходКво) Кво
	|, Sum($Обороты.РасходГрн) ФактГрн
	|, ($НачалоПериода.День(Обороты.DATE_TIME_IDDOC)) Период
	|FROM $Справочник.Клиенты AS Клиенты
	|INNER JOIN $Справочник.НаселенныеПункты AS НаселенныеПункты ON $Клиенты.НаселенныйПункт = НаселенныеПункты.ID
	|LEFT JOIN $Регистр.Обороты AS Обороты ON (Клиенты.ID = $Обороты.Клиент) AND (Обороты.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~) AND (Обороты.IDDOCDEF = $ВидДокумента.РасходнаяНакладная)
	|WHERE (Клиенты.ISFOLDER = 2)
	|GROUP BY Клиенты.ID
	|, $Клиенты.ВидДоставки
	|, $Клиенты.КатегорияКлиента
	|, $Клиенты.Менеджер
	|, $Клиенты.НаселенныйПункт
	|, НаселенныеПункты.PARENTEXT
	|, $Клиенты.Отдел
	|, $Клиенты.ФорматКлиента
	|, $Клиенты.активный
	|, Обороты.DATE_TIME_IDDOC
	|
	|";
	Запрос.УстановитьТекстовыйПараметр("НачДата", НачДата);
	Запрос.УстановитьТекстовыйПараметр("КонДата", КонДата);
	ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
	тТЗ.Загрузить(ТЗ);
	Если тТЗ.КоличествоСтрок()>0 Тогда
		Сообщить("строк "+тТЗ.КоличествоСтрок(),);
	КонецЕсли;
 



Запрос №2 (куб)
Код
Выбрать все
	ТекстЗапроса = "
	|SELECT Клиенты.ID [Клиенты $Справочник.Клиенты]
	|, $Клиенты.ВидДоставки [ВидДоставки $Перечисление.ВидДоставки]
	|, $Клиенты.КатегорияКлиента [КатегорияКлиента $Перечисление.КатегорииКлиента]
	|, $Клиенты.Менеджер [Менеджер $Справочник.Сотрудники]
	|, $Клиенты.НаселенныйПункт [Территория $Справочник.НаселенныеПункты]
	|, НаселенныеПункты.PARENTEXT [Область $Справочник.Территории]
	|, $Клиенты.Отдел [КаналСбыта $Перечисление.Отделы]
	|, $ПоследнееЗначение.Клиенты.Плательщик(Клиенты.ID, :КонДата) [Плательщик $Справочник.Клиенты]
	|, $Клиенты.ФорматКлиента [ФорматКлиента $Перечисление.КатегорииКлиента]
	|, $Клиенты.активный активный
	|, $Обороты.РасходКво Кво
	|, $Обороты.РасходГрн ФактГрн
	|, ($НачалоПериода.День(Обороты.DATE_TIME_IDDOC)) Период
	|FROM $Справочник.Клиенты AS Клиенты
	|LEFT JOIN $Справочник.НаселенныеПункты AS НаселенныеПункты ON $Клиенты.НаселенныйПункт = НаселенныеПункты.ID
	|LEFT JOIN $Регистр.Обороты AS Обороты ON (Клиенты.ID = $Обороты.Клиент) AND (Обороты.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~) AND (Обороты.IDDOCDEF = $ВидДокумента.РасходнаяНакладная)
	|WHERE (Клиенты.ISFOLDER = 2)
	|TOTALS Sum(ФактГрн), Sum(Кво)
	|BY ALL
    |, [Клиенты $Справочник.Клиенты]
	|, [ВидДоставки $Перечисление.ВидДоставки]
	|, [КатегорияКлиента $Перечисление.КатегорииКлиента]
    |, [Менеджер $Справочник.Сотрудники]
	|, [Территория $Справочник.НаселенныеПункты]
	|, [Область $Справочник.Территории]
	|, [КаналСбыта $Перечисление.Отделы]
	|, [Плательщик $Справочник.Клиенты]
	|, [ФорматКлиента $Перечисление.КатегорииКлиента]
	|, активный
	|, Период PERIODS
	|";
	Консоль.УстановитьТекстовыйПараметр("НачДата", НачДата);
	Консоль.УстановитьТекстовыйПараметр("КонДата", КонДата);
	Консоль.СоздатьКуб(ТекстЗапроса, "D:\mytest.cub");
 

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


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание OLAP cube 1С77
Ответ #23 - 27. Июня 2008 :: 11:37
Печать  
Nikolaj писал(а) 27. Июня 2008 :: 11:07:
1. Как добавить ТМЦ из справочника ТМЦ (причем все ТМЦ, так же как и с Клиентами) ? В регистре Обороты есть измерение ТМЦ (вид - справочник.ТМЦ) с которым и нужно объединить.

Соединением со справочником ТМЦ по аналогии с клиентами.

Nikolaj писал(а) 27. Июня 2008 :: 11:07:
2. Почему в запрос №2 (куб) попадает не весь список Клиентов? В запрос №1 попадают все - проверял.

В запрос № 2 не попадают те клиенты, у которых не выбран населённый пункт - в соответствии с заданным типом соединения.

Nikolaj писал(а) 27. Июня 2008 :: 11:07:
3. В справочнике Клиенты есть реквизит "активный" (тип - число, длина 1, точность 0). Почему он непопадает в запрос №2 ? В запрос №1 попадает.

Как это проявляется?
  

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


I Love YaBB 2!

Сообщений: 19
Зарегистрирован: 11. Июня 2008
Re: Создание OLAP cube 1С77
Ответ #24 - 27. Июня 2008 :: 12:03
Печать  
Цитата:
Соединением со справочником ТМЦ по аналогии с клиентами.

Понимаю что через JOIN. Но вот как именно??? Подскажи...

Цитата:
В запрос № 2 не попадают те клиенты, у которых не выбран населённый пункт - в соответствии с заданным типом соединения.

Да, неувидел как-то сразу. Переправил INNER на LEFT, вроде получилось.
|LEFT JOIN $Справочник.НаселенныеПункты AS НаселенныеПункты ON $Клиенты.НаселенныйПункт = НаселенныеПункты.ID

Цитата:
Как это проявляется?

В запросе №1 все данные сгружаю в ТЗ на форме (тТЗ). Визуально вижу что выгружено правильно (мне просто так проще проверять, т.к. только начинаю ковырять 1СРР), после чего переношу в запрос №2 (куб) - в кубе нету.
  
Наверх
 
IP записан
 
Nikolaj
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 19
Зарегистрирован: 11. Июня 2008
Re: Создание OLAP cube 1С77
Ответ #25 - 27. Июня 2008 :: 12:05
Печать  
Т.е. в куб попадает "активный", но только со значением 0. А в справочниках есть 0 и 1.
  
Наверх
 
IP записан
 
Nikolaj
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 19
Зарегистрирован: 11. Июня 2008
Re: Создание OLAP cube 1С77
Ответ #26 - 27. Июня 2008 :: 12:50
Печать  
Странно. В запросе №1 в ТЗ все падает четко, а в №2 - куб не со всеми клиентами и признаком "активный". Почему так? Где я протупил в №2?
И как все же присоединить ТМЦ?
Понимаю что нужно добавить что-то типа
...
ТМЦ.ID [ТМЦ $Справочник.ТМЦ]
...
LEFT JOIN $Регистр.Обороты AS Обороты2 ON (ТМЦ.ID = $Обороты2.ТМЦ) AND (Обороты2.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~) AND (Обороты2.IDDOCDEF = $ВидДокумента.РасходнаяНакладная)

Но думаю так задвоятся суммы. Подскажите...
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание OLAP cube 1С77
Ответ #27 - 28. Июня 2008 :: 06:53
Печать  
Nikolaj писал(а) 27. Июня 2008 :: 12:03:
Цитата:
Соединением со справочником ТМЦ по аналогии с клиентами.

Понимаю что через JOIN. Но вот как именно??? Подскажи...

Есть несколько способов. Например,
Код
Выбрать все
	|SELECT Клиенты.ID [Клиенты $Справочник.Клиенты]
	|, $Клиенты.ВидДоставки [ВидДоставки $Перечисление.ВидДоставки]
	|, $Клиенты.КатегорияКлиента [КатегорияКлиента $Перечисление.КатегорииКлиента]
	|, $Клиенты.Менеджер [Менеджер $Справочник.Сотрудники]
	|, $Клиенты.НаселенныйПункт [Территория $Справочник.НаселенныеПункты]
	|, IsNull(НаселенныеПункты.PARENTEXT, $ПустойИд) [Область $Справочник.Территории]
	|, $Клиенты.Отдел [КаналСбыта $Перечисление.Отделы]
	|, $ПоследнееЗначение.Клиенты.Плательщик(Клиенты.ID, :КонДата) [Плательщик $Справочник.Клиенты]
	|, $Клиенты.ФорматКлиента [ФорматКлиента $Перечисление.КатегорииКлиента]
	|, $Клиенты.активный активный
	|, IsNull($Обороты.РасходКво, 0) Кво
	|, IsNull($Обороты.РасходГрн, 0) ФактГрн
	|, ($НачалоПериода.День(IsNull(Обороты.DATE_TIME_IDDOC, '17530101'))) Период
	|, ТМЦ.ID [ТМЦ $Справочник.ТМЦ]
	|FROM $Справочник.Клиенты AS Клиенты (nolock)
	|CROSS JOIN $Справочник.ТМЦ AS ТМЦ (nolock)
	|LEFT JOIN $Справочник.НаселенныеПункты AS НаселенныеПункты (nolock) ON $Клиенты.НаселенныйПункт = НаселенныеПункты.ID
	|LEFT JOIN $Регистр.Обороты AS Обороты (nolock) ON (Клиенты.ID = $Обороты.Клиент) AND (Обороты.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~) AND (Обороты.IDDOCDEF = $ВидДокумента.РасходнаяНакладная) AND (ТМЦ.ID = $Обороты.ТМЦ)
	|WHERE (Клиенты.ISFOLDER = 2) AND (ТМЦ.ISFOLDER = 2)
	|TOTALS Sum(ФактГрн), Sum(Кво)
	|BY ALL
	|, [Клиенты $Справочник.Клиенты]
	|, [ВидДоставки $Перечисление.ВидДоставки]
	|, [КатегорияКлиента $Перечисление.КатегорииКлиента]
	|, [Менеджер $Справочник.Сотрудники]
	|, [Территория $Справочник.НаселенныеПункты]
	|, [Область $Справочник.Территории]
	|, [КаналСбыта $Перечисление.Отделы]
	|, [Плательщик $Справочник.Клиенты]
	|, [ФорматКлиента $Перечисление.КатегорииКлиента]
	|, активный
	|, Период PERIODS
	|, [ТМЦ $Справочник.ТМЦ] 


Предполагается, что все клиенты и ТМЦ в регистре заполнены.

Nikolaj писал(а) 27. Июня 2008 :: 12:05:
Т.е. в куб попадает "активный", но только со значением 0. А в справочниках есть 0 и 1.

Не воспроизводится. Если подготовишь тестовую конфигурацию - посмотрю.
  

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


I Love YaBB 2!

Сообщений: 19
Зарегистрирован: 11. Июня 2008
Re: Создание OLAP cube 1С77
Ответ #28 - 01. Июля 2008 :: 14:01
Печать  
Код неработает. Че-то колбасится, но учитывая что период берется в 2 дня - максимум 3-5 минут должно занимать времени. Ждал минут 30 - потом прервал.
Вопрос: каким образом строка
Код
Выбрать все
CROSS JOIN $Справочник.ТМЦ AS ТМЦ (nolock)
 


может объединить таблицу ТМЦ с Клиентами, если неуказано связуещее поле? Может я конечно чего-то и недопонимаю...  Печаль
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание OLAP cube 1С77
Ответ #29 - 01. Июля 2008 :: 15:39
Печать  
Nikolaj писал(а) 01. Июля 2008 :: 14:01:
Че-то колбасится, но учитывая что период берется в 2 дня - максимум 3-5 минут должно занимать времени. Ждал минут 30 - потом прервал.

Фигасе.  Озадачен А сколько у тебя записей в справочнике ТМЦ?

Nikolaj писал(а) 01. Июля 2008 :: 14:01:
Вопрос: каким образом строка
Код
Выбрать все
CROSS JOIN $Справочник.ТМЦ AS ТМЦ (nolock) 


может объединить таблицу ТМЦ с Клиентами, если неуказано связуещее поле?

Так ты же хотел всех клиентов со всеми ТМЦ.
http://msdn.microsoft.com/en-us/library/aa213229(SQL.80).aspx
К примеру, 1000 клиентов * 50000 ТМЦ = 50000000 записей. Оно тебе точно надо?
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 3 
ОтправитьПечать