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


I Love YaBB 2!

Сообщений: 19
Зарегистрирован: 11. Июня 2008
Создание OLAP cube 1С77
19. Июня 2008 :: 05:18
Печать  
Запросом данные в ТЗ получил. Как далее из имеющейся ТЗ создать OLAP-куб?
Может кто выкинет пример кода, а то мозг уже кипит...
Система: Win2003, SQL2000.
  
Наверх
 
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание OLAP cube 1С77
Ответ #1 - 19. Июня 2008 :: 05:46
Печать  
Если вирутальный - смотри в PivotTable и MDX.
Если реальный - тогда надо Analysis Services ставить, писать витрину данных, писать куб, заполнять витрину, процессировать куб.
Если найду пример - выложу.

Здесь был пример использования ActiveX для просмотра данных с использованием  PivotTable, попробуй поищи.
  
Наверх
IP записан
 
Nikolaj
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 19
Зарегистрирован: 11. Июня 2008
Re: Создание OLAP cube 1С77
Ответ #2 - 19. Июня 2008 :: 06:23
Печать  
Нужен реальный а не виртуальный.
В данный момент формирую через создание файла .mdb используя
Cat = СоздатьОбъект("ADOX.Catalog");
Cat.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+ФайлБазы);
Cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+ФайлБазы;
Tab = СоздатьОбъект("ADOX.Table");
...
Но сами понимаете, это как гланды через одно место. Работает, но очччень долго. Возможно кто-то уже решал подобное более быстрым путем, а то на большом объеме - хоть вешайся. Т.е. как пропустить создание промежуточной .mdb и создать из ТЗ???
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

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

Сюда смотрел?
  

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


LinuxMint, python, CodeTyphon

Сообщений: 83
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 21. Февраля 2008
Пол: Мужской
Re: Создание OLAP cube 1С77
Ответ #4 - 19. Июня 2008 :: 08:15
Печать  
http://infostart.ru/profile/4456/projects/1264/
Как то делал для себя.. лежит теперь в общем доступе
  
Наверх
ICQ  
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание OLAP cube 1С77
Ответ #5 - 19. Июня 2008 :: 09:18
Печать  
quick писал(а) 19. Июня 2008 :: 08:15:
http://infostart.ru/profile/4456/projects/1264/
Как то делал для себя.. лежит теперь в общем доступе

Не сбивай народ с пути истинного.
Если выгрузка ТЗ в mdb не устраивает Nikolaj, то эта "поделка" ему точно не подойдет.

2 Nikolay:
Если база SQL, то можно сделать Indexed View для нужных таблиц и куб строить по этому View.
Если база DBF, то можно слить данные в промежуточную таблицу при помощи OLEDB
Код
Выбрать все
SELECT тырыпыры......skipped
INTO TABLE факты.dbf
 


ИМХО, самый бастрый вариант. Без получения результатов в ТЗ вообще.

Или попробуй воспользоваться чудной консолькой от berezdetsky
  

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


I Love YaBB 2!

Сообщений: 19
Зарегистрирован: 11. Июня 2008
Re: Создание OLAP cube 1С77
Ответ #6 - 19. Июня 2008 :: 09:37
Печать  
quick писал(а) 19. Июня 2008 :: 08:15:
http://infostart.ru/profile/4456/projects/1264/
Как то делал для себя.. лежит теперь в общем доступе


Не то.
  
Наверх
 
IP записан
 
Nikolaj
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 19
Зарегистрирован: 11. Июня 2008
Re: Создание OLAP cube 1С77
Ответ #7 - 19. Июня 2008 :: 09:42
Печать  
berezdetsky писал(а) 19. Июня 2008 :: 06:53:
Nikolaj писал(а) 19. Июня 2008 :: 05:18:
Запросом данные в ТЗ получил. Как далее из имеющейся ТЗ создать OLAP-куб?

Сюда смотрел?


Да. Только непонятно как создается сам файл куба. У меня его вообще нету, когда указываю Итоги: Куб. Группировки и вычисляемые поля в запросе имеются. ТЗ получаю с правильными данными, а вот самого файла .cub нету. Может нетуда смотрю, - где он вообще должен сохраниться???
  
Наверх
 
IP записан
 
Nikolaj
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 19
Зарегистрирован: 11. Июня 2008
Re: Создание OLAP cube 1С77
Ответ #8 - 19. Июня 2008 :: 09:51
Печать  
steban писал(а) 19. Июня 2008 :: 09:18:
2 Nikolay:
Если база SQL, то можно сделать Indexed View для нужных таблиц и куб строить по этому View.
Если база DBF, то можно слить данные в промежуточную таблицу при помощи OLEDB
Код
Выбрать все
SELECT тырыпыры......skipped
INTO TABLE факты.dbf
 


ИМХО, самый бастрый вариант. Без получения результатов в ТЗ вообще.

Или попробуй воспользоваться чудной консолькой от berezdetsky


База в SQL2000. Поподробней насчет "Если база SQL, то можно сделать Indexed View для нужных таблиц и куб строить по этому View."
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание OLAP cube 1С77
Ответ #9 - 19. Июня 2008 :: 10:06
Печать  
Nikolaj писал(а) 19. Июня 2008 :: 09:42:
Да. Только непонятно как создается сам файл куба. У меня его вообще нету, когда указываю Итоги: Куб. Группировки и вычисляемые поля в запросе имеются. ТЗ получаю с правильными данными, а вот самого файла .cub нету. Может нетуда смотрю, - где он вообще должен сохраниться???

Итоги: Куб на вкладке Дополнительно - это не о том (это опция секции GROUP BY). Смотри вкладку Итоги.
Файл куба можно сделать и без конструктора - задав секцию TOTALS инструкции SELECT. Синтаксис секции TOTALS, место сохранения куба и многое другое описаны в документации:
Пуск\Все программы\1C Предприятие 7.7\Консоль запросов 1С++
  

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


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Создание OLAP cube 1С77
Ответ #10 - 19. Июня 2008 :: 13:48
Печать  
Лучше разобраться с Анилизис сервисес имхо...
СКЛ 2005 + Ексель 7 показывают хорошие результаты
Базы у нас и в том числе для куба на СКЛ 2000
  

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


I Love YaBB 2!

Сообщений: 19
Зарегистрирован: 11. Июня 2008
Re: Создание OLAP cube 1С77
Ответ #11 - 19. Июня 2008 :: 14:56
Печать  
berezdetsky писал(а) 19. Июня 2008 :: 10:06:
Файл куба можно сделать и без конструктора - задав секцию TOTALS инструкции SELECT. Синтаксис секции TOTALS, место сохранения куба и многое другое описаны в документации:
Пуск\Все программы\1C Предприятие 7.7\Консоль запросов 1С++


Читал несколько раз. В итоге так и непонял как создать файл куба. Вот запрос который делаю:
рс = СоздатьОбъект("ODBCRecordset");
     ТекстЗапроса = "
     |SELECT $Обороты.Фирма [Фирма $Справочник.Фирмы]
     |, $Обороты.Клиент [Клиент $Справочник.Клиенты]
     |, $Обороты.Склад [Склад $Справочник.Склады]
     |, $Обороты.ТМЦ [ТМЦ $Справочник.ТМЦ]
     |, ($НачалоПериода.День(Обороты.DATE_TIME_IDDOC)) Период
     |, $Обороты.РасходГрн ФактГрн
     |, $Обороты.РасходКво Кво
     |FROM $Регистр.Обороты AS Обороты
     |FULL OUTER JOIN _1SJOURN AS Журнал ON Обороты.IDDOC = Журнал.IDDOC
     |FULL OUTER JOIN $Справочник.Склады AS Склады ON $Обороты.Склад = Склады.ID
     |FULL OUTER JOIN $Справочник.ТМЦ AS ТМЦ ON $Обороты.ТМЦ = ТМЦ.ID
     |FULL OUTER JOIN $Справочник.Фирмы AS Фирмы ON $Обороты.Фирма = Фирмы.ID
     |FULL OUTER JOIN $Справочник.Клиенты AS Клиенты ON $Обороты.Клиент = Клиенты.ID AND Журнал.$ОбщийРеквизит.Фирма = Фирмы.ID
     |FULL OUTER JOIN $Справочник.Сотрудники AS Сотрудники ON $Клиенты.Менеджер = Сотрудники.ID
     |WHERE (Склады.ISFOLDER = 2)
     |AND (Сотрудники.ISFOLDER = 2)
     |AND (ТМЦ.ISFOLDER = 2)
     |AND (Клиенты.ISFOLDER = 2)
     |AND (Журнал.IDDOCDEF = $ВидДокумента.РасходнаяНакладная)
     |AND (Журнал.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~)
     |TOTALS Sum(ФактГрн, Кво)
     |BY ALL
     |      , [Фирма $Справочник.Фирмы]
     |      , [ТМЦ $Справочник.ТМЦ]
     |      , [Склад $Справочник.Склады]
     |      , [Клиент $Справочник.Клиенты]
     |      , Период PERIODS
     |";
     рс.УстановитьТекстовыйПараметр("НачДата", НачДата);
     рс.УстановитьТекстовыйПараметр("КонДата", КонДата);

Как дальше создать куб??? Подскажите, если незатруднит.
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание OLAP cube 1С77
Ответ #12 - 19. Июня 2008 :: 15:49
Печать  
Nikolaj писал(а) 19. Июня 2008 :: 14:56:
Читал несколько раз. В итоге так и непонял как создать файл куба.

O_o


рс = СоздатьОбъект("ODBCRecordset");
рс = СоздатьОбъект("AddIn.qryConsole");

     |TOTALS Sum(ФактГрн, Кво)
     |TOTALS Sum(ФактГрн), Sum(Кво)

Nikolaj писал(а) 19. Июня 2008 :: 14:56:
Как дальше создать куб???

рс.СоздатьКуб(ТекстЗапроса, ТребуемыйПутьКФайлу);

или

ПутьКФайлу = рс.СоздатьКуб(ТекстЗапроса);
- файл будет создан во временной папке и будет существовать, пока существует объект рс.
  

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


I Love YaBB 2!

Сообщений: 19
Зарегистрирован: 11. Июня 2008
Re: Создание OLAP cube 1С77
Ответ #13 - 20. Июня 2008 :: 06:20
Печать  
В глобальнике:
...
Перем Консоль Экспорт;
...
Процедура ПриНачалеРаботыСистемы()      
...
Если ЗагрузитьВнешнююКомпоненту("qryConsole.dll") = 1 Тогда
     Консоль = СоздатьОбъект("AddIn.qryConsole");
Иначе
     Сообщить("qryConsole.dll незагружена.",);
КонецЕсли;




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

На форме задаю НачДата=01.01.2008  КонДата=10.01.2008 , к примеру. Тип реквизита соответственно - дата.
При попытке выполнить вываливает ошибку:
qryConsole : State 42S22, native 207, message [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name 'DATE_TIME_IDDOC'.

Где ошибка???
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

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

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
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 записан
 
Nikolaj
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 19
Зарегистрирован: 11. Июня 2008
Re: Создание OLAP cube 1С77
Ответ #30 - 02. Июля 2008 :: 09:38
Печать  
berezdetsky писал(а) 01. Июля 2008 :: 15:39:
К примеру, 1000 клиентов * 50000 ТМЦ = 50000000 записей. Оно тебе точно надо?

Надо, но не все - часть ТМЦ потом отсеку (когда в справочнике ТМЦ упорядочится).
Запустил и нетрогал. Минут через 40-45 выдало в окне сообщений:
Код
Выбрать все
Error # -2147217915 : Объект был открыт.
Консоль.СоздатьКуб(ТекстЗапроса, "D:\mytest.cub");
 


Что б это сообщение значило??? Куда рыть???  Печаль
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание OLAP cube 1С77
Ответ #31 - 02. Июля 2008 :: 12:07
Печать  
Nikolaj писал(а) 02. Июля 2008 :: 09:38:
berezdetsky писал(а) 01. Июля 2008 :: 15:39:
К примеру, 1000 клиентов * 50000 ТМЦ = 50000000 записей. Оно тебе точно надо?

Надо, но не все - часть ТМЦ потом отсеку (когда в справочнике ТМЦ упорядочится).

Круглые глаза

Вот тебе алгоритм со сложностью n+m (а не n*m, как у cross join).
Код
Выбрать все
SELECT IsNull(sq.Клиент, $ПустойИд) [Клиент $Справочник.Клиенты]
	, ТМЦ.ID [ТМЦ $Справочник.ТМЦ]
	, sq.РасходКво Кво
	, sq.РасходГрн ФактГрн
FROM (
		SELECT ID
		FROM $Справочник.ТМЦ (nolock)
		WHERE (ISFOLDER = 2)
		UNION ALL
		SELECT $ПустойИд
	) ТМЦ
	LEFT OUTER JOIN (
		SELECT Клиенты.ID Клиент
			, IsNull($Обороты.ТМЦ, $ПустойИд) ТМЦ
			, Sum($Обороты.РасходКво) РасходКво
			, Sum($Обороты.РасходГрн) РасходГрн
		FROM $Справочник.Клиенты Клиенты (nolock)
			LEFT OUTER JOIN $Регистр.Обороты Обороты (nolock) ON Клиенты.ID = $Обороты.Клиент
		WHERE (Клиенты.ISFOLDER = 2)
		GROUP BY Клиенты.ID
			, $Обороты.ТМЦ
	) sq ON ТМЦ.ID = sq.ТМЦ
TOTALS Sum(Кво)
	, Sum(ФактГрн)
BY ALL
	, [Клиент $Справочник.Клиенты]
	, [ТМЦ $Справочник.ТМЦ] 


Удачи.  Улыбка
  

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


I Love YaBB 2!

Сообщений: 19
Зарегистрирован: 11. Июня 2008
Re: Создание OLAP cube 1С77
Ответ #32 - 03. Июля 2008 :: 06:45
Печать  
Ну в общем попробовал алгоритм n*m - работает только когда ограничиваю количество ТМЦ или Клиентов. Т.е. при записей примерно 3500000 - формирует все нормально, но мне нужно от 40000000 записей и тут возникает затык - вываливает ошибку Error RunTime.
Работает ли эта длл на таком объеме? Или может плюнуть и сразу писать запрос например в Microsoft Query (потянет ли Query такой объем - незнаю)? Или все же придется делать по уму - ставить SQL2005 и Анализ сервисом крутить?
Что посоветуете?!!
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать