OLAP-отчет ActiveX: компонента v2.4.1.241 + ABC-анализ по любым измерениям




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

99 Comments

  1. cleaner_it

    Работа компоненты тестировалась на Win2003 и Win7. Для Win7/Win2003 цветовые схемы различаются. На рисунке цветовая схема Win7, для Win2003 она более темная.

    Reply
  2. JohnyDeath

    А зачем вообще зависимость от BDE?

    Reply
  3. JohnyDeath

    Ну и заодно бы написал чем твоя разработка лучше/хуже разработок Ukrandruha и quick.

    Reply
  4. cleaner_it

    (2) Насчет BDE смотрим руководство OLAP. В дальнейшем конечно планирую отказаться от него:)

    (3) Напишу, просто времени не хватает

    Reply
  5. cleaner_it

    Открыл доступ к файлам для пользователей Инфостарт (изначально был только для разработчиков)

    Reply
  6. cleaner_it

    Нашел неточность в документации — метод AddDimension, параметр SizeData — это длина значения измерения, а не наименования. В следующей версии в документацию будет внесены соответствующие поправки

    Reply
  7. PowerBoy

    Регистры 1С + СКД = OLAP !!!

    Не вижу потребности в данной компоненте, разве что для 7.7

    Reply
  8. Gamm
    PowerBoy 22.01.2010 12:20:31

    Регистры 1С + СКД = OLAP !!!

    Не вижу потребности в данной компоненте, разве что для 7.7

    Всё таки для перестройки изменения порядка аналитик в отчете СКД придется снова ждать получения данных, а плюс OLAP в более быстром получении результата.

    Reply
  9. cleaner_it

    Выложил отличия от других разработок подобной направленности «Отличия от других разработок.pdf»

    (7) Каждому свое, ИМХО СКД и OLAP решают разные задачи. Скорость изменения внешнего вида OLAP выше. Присутствует интерактивное добавление формул в куб, а также вывод НЕ ТОЛЬКО значения, но и при надобности процентов на колонку/строку, ее ранга и прочих вкусностей. А как-же возможность быстрого ABC-анализа (и такие вещи OLAP способен решать за считанные секунды)? А в СКД — возможность создания форматированного макета и вывода графиков наравне с таблицами. В любом случае мой опыт подсказывает, что для аналитиков OLAP намного удобнее

    Reply
  10. tango

    а почему перем — экспорт?

    Перем Куб Экспорт;

    Reply
  11. tango

    а какого-нибудь серверного варианта нет, чтоб на каждой юзерской машине не ставить?

    Reply
  12. tango

    а ваще +

    Reply
  13. tango

    ну, вот, блин, похвалил…

    {Форма.Форма(22)}: Ошибка при вызове метода контекста (AddDimension): Произошла исключительная ситуация (PivotCubeAXLibraryCleaner.OLAP): Table: Cannot perform this operation on an open dataset

    Куб.AddDimension(«Измерение1″,»Измерение 1»,101);

    по причине:

    Произошла исключительная ситуация (PivotCubeAXLibraryCleaner.OLAP): Table: Cannot perform this operation on an open dataset

    Reply
  14. cleaner_it

    (13) это происходит, когда куб построен, и его пытаются создать еще раз. для исправления этой ситуации я сделал метод CubeDeactivation, попробуй применить его перед созданием измерений, я его в тестовой обработке не применяю

    Reply
  15. cleaner_it

    (11) подумаю, вроде как имеется такая возможность — запуск ActiveX с удаленной машины. В HTML ведь используют ActiveX, и для этого его не требуется устанавливать

    Reply
  16. tango

    (15) прокомменть, пожалуйста, чего это я скачал у производителя?

    Reply
  17. cleaner_it

    (16) ActiveX компоненту, которую предлагает использовать PivotCube (они же ее разработчики). Куб к сожалению заполняется только SQL-запросами, заполнить ее из 1С будет более чем затруднительно.

    Reply
  18. cleaner_it

    Собственно говоря, моя компонента ActiveX создана на основе PivotCubeVCL, а не PivotCubeX

    Reply
  19. Saint

    Поправьте меня если я не прав, но разве сводные таблицы в 1С выполняют не аналогичную задачу?

    Reply
  20. cleaner_it

    (19) Не совсем. Да, внешний вид похож, но возможности совершенно другие, у OLAP их больше на порядок

    Reply
  21. JohnyDeath

    (4)

    Насчет BDE смотрим руководство OLAP. В дальнейшем конечно планирую отказаться от него

    Что-то не увидел. Не туда смотрю?

    Авансом +. Но для полного счастья еще нужно сделать очень много. Отказ от BDE — это первое и самое важное (ИМХО)

    Reply
  22. cleaner_it

    (21):

    Метод CreateFactTable

    Значение параметра ttParadox

    Для работы с данным типом таблицы требуется установленный BDE

    Reply
  23. JohnyDeath

    (22) Спасибо, приблизительно понял.

    А в сторону sqlite не хочешь посмотреть? Проект открытый. Очень шустрая встраеваемая БД, которая может хранится в памяти, что должно дать прирост в скорости чтения данных по сравнению с сохранением и чтением данных на локальный диск в базу ttParadox

    Страничка враперов. На чём, кстати, писал свой проект?

    Reply
  24. cleaner_it

    (23) Можно попробовать sqlite. Проект писал на Delphi 6

    Reply
  25. JohnyDeath

    (24) тогда попробуй это http://www.yunqa.de/delphi/doku.php/products/sqlite3/index (вроде как больше всего советуют)

    Reply
  26. cleaner_it

    Перед выходными выложу новую версию (возможно, переведенную на SQLite). Надеюсь, будут закончены практически все заявленные в предыдущей версии функции: загрузка/выгрузка/сортировка/группировка «parent-child»

    Reply
  27. wolfsoft

    Я правильно понимаю, что компонента PivotCubeVCL — платный компонент?

    Reply
  28. cleaner_it

    Да, он платный. Но никаких ограничений, кроме всплывающего окошка о необходимости регистрации (один раз, сразу после построения куба) нет, функционал полный

    Reply
  29. cleaner_it

    (26) Никак не могу собраться дописать руководство:) Уже много чего сделал, а выложить без руководства не могу:(

    В частности, реализована прозрачная работа с иерархическими измерениями (чего нет ни в одной из подобных разработок, где используются только линейные списки), добавлены и протестированы примеры работы с HTML (в том числе с автоматической установкой ActiveX на ПК клиента), 7.7 (с привязкой к краям формы), 8.2 (управляемые формы + web-сервер).

    P.S.: На SQLite перевод будет не скоро, сначала надо в нем хорошенько разобраться (он однонаправленный, и не могу пока найти компонент для визуального просмотра таблиц БД SQLite на форме компоненты)

    Reply
  30. cleaner_it

    Выпускаю в свет новую версию компоненты — 2.3.1 (предыдущая была — 2.2.0.2).

    Обновлены: документация, компонента.

    Изменен список файлов для скачивания.

    PS: Большая часть хотелок, которые я хотел реализовать — реализованы, удобство использования увеличено в разы:)

    Reply
  31. cleaner_it

    Инфостартовцы! Вы хоть напишите, в каких программах пригодился вам OLAP. Интересно:)

    Reply
  32. cleaner_it

    Накладочка вышла. В файле «FULL OLAP v2.3.1.zip» файл с руководством был выложен неправильный. Сегодня исправлю

    Reply
  33. brr

    А с печатью у нас как обстоят дела?

    Reply
  34. cleaner_it

    (33) Хотите — из Excel печатайте, хотите — используйте стандартную печать (в руководстве написано только про стандартную печать).

    PS: «FULL OLAP v2.3.1.zip» я перевыложил

    Reply
  35. kittystark

    класс !!!

    но есть пожелания/замечания

    1. под 7.7 ничего не происходит при вызове Куб.CollapseAll(1,1) или Куб.ExpandAll(1,1)

    (была создана иерархия по справочнику номенклатуры)

    2. хотелось бы чтобы были реализованы «оригинальные zCube.dll» методы, типа TopPanelVisible(…), MapSave(…), MapLoad(…), MapSwap() и др. — подсмотрены в оригинальном HTML примере, а лучше сразу «сделать мост» ко всем оригинальным методам/свойствам

    3. при использовании «оригинальной» компоненты («PivotCubeX») в HTА, также как и при использовании этой разработки под 7.7, при нажатии маленькой кнопочки «стрелки вверх-вниз» в области «Измерения»и в области «Колонки» — «мелькают» и затем пропадают все отображаемые данные (как будто бы куб пустой; в области строк при щелчке на такой же копке — все нормально), перерисовка производится при клике мышью в области данных/при прокрутке мышинного колеса/при щелчке на соседней кнопке (как квадратик, аля кнопка «развернуть»), можно как-то вылечить ?

    4. чего-то не пойму как должен график выводиться

    5. можно ли как-то программно из 4-х вкладок оставлять только 1-ю, имхо, пользователям последние 3 могут быть не нужны, да простит меня автор за «наезд» на вкладку «о программе», а то как-то не прикалывает формировать куб и сохранять его с помощью этой компоненты, а потом работать с ним через «оригинальную» компоненту

    6. новую версию архива еще не смотрел, но в руководстве.pdf методы AppendRecordHierarchical(), SetValueHierarchical(), PostRecordHierarchical() было бы не плохо подробно описать

    Reply
  36. cleaner_it

    (35) спасибо:) а где плюсик?

    1. Эти методы работают только для линейных списков, для иерархических списков этот метод не работает (и пока не знаю, как он будет работать при смешанном режиме отображения «линейные+иерархические списки»).

    2.

    а) Собственно, компонента и является тем самым «мостом», а просто говоря — оберткой.

    б) У оригинальной компоненты некоторые методы дублируются — для куба и для карты клеток (я всегда реализовываю метод куба), при этом наименования куба и карты клеток могут отличаться

    в) «оригинальный HTML пример» может быть только у PivotCubeX, я использую PivotCube VCL, наименования методов у них немного различаются. Если найду аналоги методов, указанных вами, то добавлю их

    3) Эта кнопочка называется «Отображение/скрытие фильтра». Воспроизвести ситуацию, подобную вашей, у меня не получилось. Какую версию компоненты вы используете? Если не трудно — пришлите выгрузку куба. И описание системы тоже — терминал или нет, сколько памяти, и т.д.

    4) На текущий момент нужно заново выбрать значения «Serie type», «pvcRows», «pvcMeasures», потом нажать кнопку «Обновить график». В следующем релизе работа с графиком будет упрощена и более прозрачна

    5) А как-же «О программе»:( Я так старался… Впрочем, подумаю

    6) Тогда стоит посмотреть новую версию: методы AppendRecordHierarchical(), SetValueHierarchical(), PostRecordHierarchical() не нужны

    Reply
  37. kittystark

    а, ну да… , плюсанул 😀

    1. сорри, оказывается методы CollapseAll() и ExpandAll() работают!, и действительно независимо от иерархичности измерений, а работают они если в области строк или колонок находится 2 измерения и больше (даже для иерархических измерений)

    видимо для раскрытия иерархий что-то другое нужно вызывать (через Object Browser насчитал у zCube.IMap по 6 методов Expand/Collapse, но вряд ли они помогут)

    2. пункт 2.б) пока для меня большей ясности не внес, поясню чего хотелось бы:

    — ночью пересчитали и заполнили куб данными, сохранили на диск

    — пользователи днем подгружают рассчитанный куб с диска (методы SaveToCube() и LoadFromCube() c этими задачами прекрасно справляются, хотя и «сбрасывают параметры просмотра»)

    — но вместо жестко предопределенного в коде порядка вызова методов PutToColumn()/PutToRow(), при загрузке воспользоваться выбором одной из ранее сохраненных карт (файлики *.zcd), будь то дефолтная «настройка» или один из «более других» вариантов срезов куба, сохраненных пользователем (со своими любимыми измерениями/фильтрами/перегруппировками иерархий и т.п. — типа «отчет» такой-то)

    у PivotCubeX есть методы MapSave(), MapLoad() как это сделать в твоей компоненте — поясни плиз…

    3. vista home ed sp1, локально не в терминале, 2Гб оперативки, oleview.exe выдал:

    PivotCubeX control: version = 3.37; TypeLib: 3.25 = PivotCubeXLib library

    OLAP Active X 2.2.0.2 [cleaner]: version 2.2; TypeLib: 2.2

    приаттаченная выгрузка для PivotCubeX — сформирована HTML-кой из C:Program FilesPivotCubeXDatacubedemo.mdb, по кнопкам Activate/Save cube

    6. только что качнул последний полный архив, в «примере программного кода.pdf» в процедуре ЗаполнитьИерархическуюСтруктуру эти методы присутствуют…

    Reply
  38. cleaner_it

    (37)

    6) точно, пропустил

    Reply
  39. kittystark

    допустим есть «предопределенные» измерения Месяц, Квартал, Сезон с устоявшимся общепринятым принципом очередности элементов этих измерений (Янв .. Дек, Iкв .. IVкв и т.п.)

    можно ли как-то до/после/во время заполнения куба данными задать ID элемента для таких измерений? а то получающаяся очередность при сортировке измерения по алфавиту не подходит, а сортировка по ключу — в итоге совпадает с сортировкой по алфавиту…

    вроде бы OnCustomWrapData в access-примере для PivotCubeX решает эту проблему, но как добраться до этого события в 7.7 — пока для меня темный лес

    или для этого нужно вводить иерархические измерения, без подчинений как таковых ?

    и как это скажется на производительности?

    Reply
  40. cleaner_it

    (39) ид-шник назначать можно, но я обошелся тем, что перед наименованием ставлю номера, например:

    01 — Январь



    12 — Декабрь

    Reply
  41. kittystark

    (40) пример кода с назначением ID, пожалуйста, в студию

    Reply
  42. cleaner_it

    выложу в следующем релизе 🙂

    Reply
  43. kittystark

    обнаружилась фича: после создания формы, но ДО загрузки куба, панели измерений и колонок можно таскать мышью и они способны перескакивать на правый край

    после добавления измерений, даже без заполнения, такого не происходит

    Reply
  44. cleaner_it

    Я знаю. Единственный способ обойти — блокировать доступ к элементам формы

    Reply
  45. kittystark

    а как прогнозами пользоваться?

    Reply
  46. kittystark

    (44)

    PCX.RowToolbar.Options.Floating = 0

    PCX.ColToolbar.Options.Floating = 0

    PCX.DimToolBar.Options.Floating = 0

    ???

    Reply
  47. cleaner_it

    (46) проверю:)

    Reply
  48. cleaner_it

    Выкладываю версию 2.4

    Изменения по сравнению с версией 2.3.1

    [*] — изменение

    [+] — добавление

    [–] — отказ/удаление

    РЕАЛИЗОВАНЫ МЕТОДЫ:

    [+] — Реализован метод SetIDByName (просьба kittystark)

    [+] — Реализован метод SaveToHTML

    ДОБАВЛЕНЫ СВОЙСТВА:

    [+] — Добавлено свойство ShowRowTotals [‘pvgtFixed’, ‘pvgtAtEnd’, ‘pvgtAtStart’, ‘pvgtDisabled’]

    [+] — Добавлено свойство ShowColumnTotals [‘pvgtFixed’, ‘pvgtAtEnd’, ‘pvgtAtStart’, ‘pvgtDisabled’]

    ДОПОЛНЕНА ДОКУМЕНТАЦИЯ:

    [+] — Описан метод AppendRecordHierarchical (Баг-репорт kittystark)

    [+] — Описан метод SetValueHierarchical (Баг-репорт kittystark)

    [+] — Описан метод PostRecordHierarchical (Баг-репорт kittystark)

    НАСТРОЙКИ КОМПОНЕНТЫ ПО УМОЛЧАНИЮ:

    [*] — Баг-репорт kittystark «После создания формы, но ДО загрузки куба, панели измерений и колонок можно таскать мышью влево-вправо». На текущий момент эта возможность убрана.

    ДРУГОЕ:

    [*] — Исправлено сворачивание раскрытых измерений при помещении любого измерения в строки и/или колонки (работает на линейных списках, при наличии иерархических измерений на верхнем уровне сворачивание происходит всегда)

    [*] — изменено имя файла компоненты на PivotCubeAX.ocx (ранее ActiveFormProj1.ocx)

    [+] — Добавлены типы итогов колонок и строк: pvgtFixed, pvgtAtEnd, pvgtAtStart, pvgtDisabled, см. «Атрибуты интерфейса»

    А также:

    1. Подправлена документация

    2. Дополнен всеми новыми возможностями пример использования компоненты для 1С v8.1

    Reply
  49. cleaner_it

    (45) что именно интересно про прогнозирование? Собственно, ничего особенного там нет, все зависит от вашей корпоративной политики и целей

    Reply
  50. cleaner_it

    Готовится к реализации в следующих версиях

    [*] — изменение

    [+] — добавление

    [–] — отказ/удаление

    Методы

    Наименование метода

    Описание

    [+] SetWidthMeasure

    Установка ширины колонок показателей

    [+] SetWidthDimension

    Установка ширины колонок измерений

    [+] SetFilter

    Программная установка фильтра

    [+] ClearFilter

    Программная отмена фильтра

    [+] SortDimension

    Сортировка измерений

    [+] SaveToOpenOffice

    Экспорт в Open Office

    [+] LoadFromWEB

    Загрузка куба, хранящегося на WEB-сайте

    [+] LoadFromStream

    Загрузка куба из потока данных

    [+] SetWidth

    Установка ширины формы компоненты

    [+] SetHeight

    Установка высоты формы компоненты

    Другое

    [+] — реализовать прогресс-бар для отображения процесса загрузки куба

    [+] — доработать руководство пользователя OLAP (будет произведено деление документации на другие логические блоки, а так же выделение в отдельный блок используемых в компоненте типов — сейчас они описаны в одном блоке со свойствами компоненты)

    [+] — доработать работу с графиком

    [+] — добавить возможность работы компоненты на переносимой СУБД SQLite

    [+] — добавить возможность сохранения/загрузки настроек положения/видимости колонок/строк/формул/показателей

    [+] — реализовать возможность переформировывать куб в рамках одной и той-же обработки (исправить ошибку «Cannot perform this operation on an open dataset»)

    Reply
  51. cleaner_it

    Поправка описания типов отображения итогов:

    pvgtFixed

    Значение типа отображения итогов зафиксировано — справа для колонок, снизу — для строк. При перемещении горизонтального/вертикального ползунков итоги сохраняют свое положение (аналог «Закрепить область» табличного документа или электронной таблицы OpenOffice (Excel))

    pvgtAtEnd

    Значение типа отображения итогов: в конце

    pvgtAtStart

    Значение типа отображения итогов: в начале

    pvgtDisabled

    Значение типа отображения итогов — не показывать

    Reply
  52. cleaner_it

    Выложил файл «Видеопрезентация «Общее представление об OLAP-кубе.zip» (для PivotCubeAX 2.4.0.1)»

    Reply
  53. cleaner_it

    Выложил файл «Видеопрезентация «Работа с измерениями в OLAP-кубе.zip» (для PivotCubeAX 2.4.0.1)»

    Reply
  54. cleaner_it

    Компонента заменена на версию 2.4.0.1 (наименование файла не изменилось, изменения по сравнению с версией 2.4 — чисто косметические)

    Reply
  55. kittystark

    (50)

    из «Другое»:



    [+] — реализовать возможность переформировывать куб в рамках одной и той-же обработки (исправить ошибку «Cannot perform this operation on an open dataset»)

    этого хотелось бы получить в первую очередь

    Reply
  56. kittystark

    (49) не понятно вообще, как эти «прогнозы» заюзать (если я правильно понял про группу элементов forecasting на форме редактора измерения)

    Reply
  57. cleaner_it

    (57) Насчет прогнозирования смотреть здесь:

    PivotCube VCL Users Guide

    (Пункт 2.1.3.4 Forecasting ability)

    В планах использование этих возможностей пока не скоро. Народ и 30% существующего использовать не может. А вообще, там можно и ABC-анализ проводить очень быстро средствами OLAP

    (56) Я помещаю обработку в макет, в нужном месте сохраняю на диск, открываю и использую. По мне, так реализация этого пункта вообще не нужна, но сильно уж просят:)

    Reply
  58. cleaner_it

    В первую очередь будет SQLLite, уж не обессудьте:) Скорость работы и удобство использования для меня прежде всего. Ну, плюс планируется качество преобразования типов улучшить

    Reply
  59. kittystark

    (58) Пункт 2.1.3.4 прочел, хотелось бы менять ConsequentName PrecedingName, т.к.

    PivotCube.lng не дает таких возможностей

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

    по поводу АВС-анализа пожалуйста подробней

    мы под 7.7 конечно без макетов, а при ночном пересчете кубов просто несколько раз подряд вызывается ОткрытьФормуМодально с нужными параметрами, но вот если юзер банально хочет поменять период, то либо форму закрывай-открывай, либо надо фиксить «Cannot perform this operation on an open dataset»

    кстати, у меня было замечено следующее: если несколько раз подряд открывать форму, формировать куб, закрывать форму, то процесс 1с-ки постепенно отжирает оперативную память не освобождая ее, т.е. со штатных 90-100 Мб только одними кубами можно постепенно доползти до 700Мб (дальше проверять не стал)

    вопрос: а как нужно грамотно высвобождать ресурсы при закрытии формы ?

    Reply
  60. cleaner_it

    (60) По поводу ABC — это как сам закончу разбираться. То же самое с прогнозированием:)

    Под 7.7, конечно, надо фиксить «Cannot perform this operation on an open dataset». Тут без вариантов.

    При закрытии формы память я освобождаю, но подобного теста на 7.7 я не проводил (на 8.1 замечено не было) — очень интересно, буду проверять (возможно, закрытие окна 1С 7.7 вовсе не означает закрытия формы Delphi, как я считал)

    PS: Есть желание показать сообществу «Пример использования OLAP ActiveX для 1С 7.7»?

    Reply
  61. brr

    вашу разработку можно использовать для работы с сервером олап?

    Reply
  62. cleaner_it

    (62) Думаю реализовать нечто подобное. Какой сервер используете?

    Reply
  63. brr

    Microsoft Analysis Services 2000

    Reply
  64. cleaner_it

    (64) Такого добра у меня нет:) Сейчас ищу PALO, он GPL — на нем только если пробовать

    Reply
  65. kittystark

    из созревших идей:

    1. запрещать некоторым пользователям открывать окно «редактор измерения» для конкретного измерения, смысл — сначала программно накладываем фильтрацию (переводом часть item’ов в репозиторий), а потом запрещаем менять фильтр, отсюда можем получить частичный доступ пользователя к информации

    у себя реализовал через WShell.appActivate и SendKey, это решение хоть и действенно, но ч/з одно место, вот если бы «кнопке с треугольником вниз» измерения можно было прикрутить нечто вроде enabled-свойства — было бы классно

    2. не плохо было бы организовать через Обработку Внешнего События реакцию на клик мышью в ячейке измерения/меры

    кстати по поводу русификации ConsequentName, PrecedingName в (60) — вопрос решил

    Reply
  66. cleaner_it

    (72)

    «1. … » — вполне резонно, но здесь лучше учитывать права при заполнении куба — чтобы не нужные ему данные просто не попадали в отчет. Может, есть и другие причины реализации такого функционала?

    «2. … » — сам давно об этом думаю, хочу расшифровку сделать, но там события, как ты говоришь, «через одно место». Со временем, думаю, появится:)

    Reply
  67. kittystark

    (73) думал я об этом…

    сейчас у меня схема такая: вечером, когда никого в базе нет, через виндовый шедулер в определенное время запускается vbs-скрипт, создающий V77.Application и запускающий обработку с использованием твоей компоненты (несколько раз с разными периодами), на выходе имеем несколько обновленных *.cub файлов, за разные периоды и с разными наборам измерений, но измерение «проект» (читай «менеджер») везде заполняется одинаково

    на следующий день пользователи запускают другую обработку и … юзают эти файлики через отдельно запускаемый HTML Application (*.hta ) со встроенной в него «оригинальной» компонентой, не тратя по 2 часа на расчет данных (база за 2,5 года), после выбора и загрузки файла куба производится принудительная фильтрация по измерению «проект» в зависимости от «прав на кубы» (почему юзается оригнальная компонента — отдельная песня)

    ПРИЧИНЫ: честно говоря, меня не прикалывает на каждого юзера формировать по несколько «фамильных» кубов, юзеров-то много, сколько это будет по времени — даже испытывать не стал, но по прикидкам тоже много

    плюс еще «Cannot perform this operation on an open dataset» с диалогом «PivotCube demo» портят всю картину (борьба с последним через wshell.AppActivate и SendKey происходит с переменным успехом 🙂 )

    для тех кто будет запускать OLAP.hta из прилагаемого архива: подразумевается расположение *.cub файлов в том же каталоге где и сам OLAP.hta, после загрузки куба при подведении курсора мыши на самый правый край — должно появиться меню, хелпик в разработке — можно прилепить свой, демо ролики — твои

    Reply
  68. cleaner_it

    (72) или имелось в виду убрать доступ к элементу, чтобы пользователь вообще не мог наложить СВОЕЙ фильтрации? Тогда пойму — чтобы подтасовки фактов не было (например, убрали из отчета «неблагополучных» клиентов)

    Reply
  69. cleaner_it

    (74) за hta’шник спасибо:) Я делал по другому — помещал выборку в индексированную таблицу 1cpp, которую затем можно сохранить в файл, а затем при необходимости восстанавливал ту версию куба, которая мне нужна. Но твой способ тоже ничего:)

    PS: проблему твою понял, в твоем случае конечно принудительная фильтрация нужна. Куб — один, пользователей куба — несколько, у каждого пользователя — свой фильтр. Нормальная ситуация

    Reply
  70. kittystark

    (76) да, именно запретить пользователю менять фильтрацию и оставлять ее только в «разрешенном» виде

    с этой целью пытался я воспользоваться PCX.CubeIntf.Dimension(i).DeleteKey(j), чтоб скрыть «не нужные»элементы, элемент измерения удаляется, но вот значения мер после этого становятся очень уж кривыми и всякие попытки пересчитать куб пока не возымели положительного результата, может подскажешь метод ?

    Reply
  71. cleaner_it

    (79) вроде сделал блокировку кнопки с треугольником вниз:) Как протестирую нормально, буду выкладывать новую версию компоненты

    Reply
  72. kittystark

    (80) дас ист комас — дас ист гуд, спасибо, ждемс

    Reply
  73. JohnyDeath

    (64) А зачем эта разработка, если есть Microsoft Analysis Services 2000

    Сервисы OLAP от Microsoft на порядок лучше компоненты, на базе которой сделан этот ActiveX и выглядит куда более приятней

    Reply
  74. cleaner_it

    (97) Вполне объективно — делают красиво, да и по быстродействию наверняка лучше за счет использования сервера. Но не у всех есть возможность купить себе Microsoft Analysis Services 2000:) Я, например, не могу.

    Reply
  75. JohnyDeath

    (98) Ну во-первых, я как бы описывал непонимание автора из (64). У него уже стоит Microsoft Analysis Services 2000

    А во-вторых, у тебя есть возможность не то что покупать, а скачать и пользоваться абсолютно бесплатно Microsoft SQL Server 2008 Express Edition with Advanced Services

    (99) а я считаю, что наглядность — один из самых важных факторов, который необходим при анализе данных.

    С компонентой на базе которой ты создал этот АХ я давно знакомился и именно из-за своей внешней убогости я её так и не смог (не захотел?) куда-либо внедрять.

    Вот взгляни на свой же скриншот № 3 из http://infostart.ru/public/72778/ . Контрагент абсолютно нечетаем. Интерективное добавление формул — вообще сказка. Я не знаю ни одного пользователя, кто бы мог что-то в этом понять и создать своё. Иконки, надписи, да и общий внешний вид — как крик из далёкого прошлого, к которому не хочется возвращаться, но понастальгировать можно. 😉

    Reply
  76. cleaner_it

    (100) Я прекрасно тебя понял, зачем ты еще раз объясняешь… Microsoft SQL Server 2008 Express Edition with Advanced Services имею, в целях обучения/ознакомления работы с VS C#, но использовать постоянно — желания не имею. Зачем я буду ставить везде сервер SQL? А если Клиент использует Linux/BCD? Я не в целях дискуссии, одна из целей развития компоненты — кросплатформенность, ради которой можно перейти и на другую компоненту.

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

    Про наглядность разговоров вообще никаких не было, о чем спор? Только наглядность не оценивается по принципу «большие красивые кнопочки и иконки». В самой компоненте, кстати, интерфейс можно менять, меня же больше привлекает простота.

    Клиент сможет добавлять формулы, если его этому научить. Думаешь, им прикольно каждый раз обращаться к программисту? Как-бы не так! Вот сделаю возможность сохранения настроек и пользовательских формул — и все вообще будет в ажуре:)

    Reply
  77. cleaner_it

    (100) Кстати, я делал поддержку смены скринов для компоненты, но мне не понравилось. Да и размер компоненты сильно увеличился, а хранить шкурки во внешнем хранилище — идея не самая лучшая. И аналитики вместо анализа будут заниматься сменой шкурок программы…

    Reply
  78. kittystark

    ну раз уж речь пошла про MS-продукт, так там есть такие штуки как защита размерности (по поводу (80) пока так и не увидел — подскажи, плиз), «custom rollups», «distinct count» (возвращаясь к (91),(94)), вот это бы реализовать 🙂

    по поводу юзерских формул, так там поведение действительно бывает непредсказуемым, особенно если воспользоваться рекурсивной конструкцией «новая мера» = «новая мера»[prev by row] + что-то, а чтоб не ломали голову с составлением формул 2 варианта: сохранение/считывание, или «джентельменский набор» по кнопке/меню

    кстати, а почему сохранению/считыванию карты куба вычисляемые меры абсолютно индифферентны?

    Reply
  79. cleaner_it

    (104) сделал, да что-то не работает:cry: к следующему релизу разберусь наверное. Насчет формул нужен конечно джентльменский набор.

    «кстати, а почему сохранению/считыванию карты куба вычисляемые меры абсолютно индифферентны?» — не скажу, но с проблемой такой сталкивался еще в пору использования компоненты quick. Конечно, классно было-бы эту задачку решить.

    По поводу MS: «Другой главной областью исправлений стал значительно улучшенный движок вычислений с поддержкой унарных операторов, пользовательских формул свертки (custom rollups) и многомерных выражений (cell calculations). Также новыми возможностями стали защита размерности, счет без повторов (distinct count), взаимодействие по HTTP, сессионные кубы, уровни группировки и др.» — со всем этим еще разбираться нужно. То, что я об этом не говорю, не означает что этого нет, просто я об этом ничего не знаю:)

    Reply
  80. kittystark

    (105) quick кстати, отошел от использования PivotCube и перешел на HireCube в своем ReportEx, вот только в текущем состоянии там сохранение куба очень кривое, и пока не реализована поддержка иерархий измерений (хотя в демо хаера она есть), только эти 2 момента склонили чашу весов при выборе в твою пользу

    ну и плюс еще твоя активность — проектик-то живой, развивается постепенно, за что тебе отдельное человеческое спасибо 🙂

    Reply
  81. cleaner_it

    (106) Мы с ним переписывались, я так понял, что главный козырь был — «бесплатность» HireCube, и потеря исходников предыдущей версии компоненты (пусть поправит, если я неверно понял)… А мне PivotCube понравился, я решил с ним поработать пока:)

    PS: Проект развивается и будет развиваться 😀

    Reply
  82. cleaner_it

    Ну вот, добрался:)

    Теперь куб можно построить в рамках одной обработки и при наличии иерархических измерений

    PS: Как только доделаю (80), так сразу выложу

    Reply
  83. kittystark

    (109) непременно ждемс

    в доке есть следующий пример для вычисляемых мер

    begin
    var a;
    var b;
    func xy;
    a = «Summa»;
    b = «Count»;
    Result = xy(a,b);
    end

    есть List of supported functions:

    SQRT(value)
    ABS(value)
    SIN(value)
    COS(value)
    POWER(value, power)
    POWER2(value)
    LOG10(value)
    LN(value)
    EXP(value)
    NEG(value)

    Показать

    не пойму про определение func xy;, как можно на основании существующих функций и арифметических операторов сворганить свою локальную функцию, скажем myF, чтобы потом при вычислении значения меры ее вызвать несколько раз, типа,

    begin
    func myF(x) <определение своей функции>
    Result = myF(1) + myF(10) + myF(50)
    end
    Reply
  84. cleaner_it

    (110) Обработчик событий нужно добавлять.

    To calculate own function, you need to create own event handler

    Записал в TODO, это хорошая возможность. Давно хотел сделать возможность задавать произвольные правила вычисления формул (например, чтобы не считались некоторые значения по заданному условию)

    Reply
  85. cleaner_it

    Чтобы работало (80), необходимо еще решить следующие проблемы:

    1. Кнопка измерения становится недоступной совершенно (даже заменить кнопку этого измерения другим не получится)

    2. При перестройке куба кнопка становится вновь доступной, т.е. нужно создавать обработчик события перестройки и вновь делать кнопку недоступной

    Поэтому пожалуй я просто сделаю подписку «Проверка изменения фильтра», и если будет попытка изменения — запрещать. Несколько релизов этой возможности не будет, пока приоритет сдвинут на ABC-анализ и документацию

    Reply
  86. kittystark

    (111) ну да ладно, обойдемся пока без обработчиков, пусть код вычисления меры будет не красивый, но будет хотя бы функциональный

    да и предполагалось это все задействовать для АВС-анализа, кстати (112), в этом АВС, на мой взгляд ничего сложного, можно даже с существующим функционалом назначать «категорию А/В/С», правда с одной оговоркой вместо А/В/С будут какие-нибудь числа, например 1/2/3 или 100/200/300 и дальше по аналогии можно будет совместить с такими же числами XYZ-анализа сложением

    возни на программирование «кнопки» по формированию чистого АВС-анализа по одному показателю, для некоего измерения на пару-тройку часов

    Reply
  87. cleaner_it

    (114) Так ABC уже почти готов:)

    (115) W7 x64 — не пробовал. Тестировалось на w2k3 x32, w2k3 x64, w7 x32, wxp x32. Разве есть проблемы с регистрацией? Просьба в таком случае прислать скриншот с ошибкой

    Reply
  88. Константин С.

    (116) вот два варианта ощибки,

    http://www.infostart.ru/profile/user/30749/photo/album/user_30749/3032/

    Reply
  89. kittystark

    (116) а у меня уже готов 🙂 , я ведь для юзеров все в *.hta-шке делаю с оригинальным активиксом, может и от твоих стараний почерпну идеи для воплощения у себя

    Reply
  90. cleaner_it

    (117) попробуй вручную regsvr32 или regasm — будет работать? А я пока посмотрю особенности компилирования под 64-битные системы (в таком случае буду выкладывать две отдельные сборки)

    Reply
  91. cleaner_it
  92. cleaner_it

    (118) у тебя на иерархических измерениях ABC нормально работает?

    Reply
  93. kittystark
    Reply
  94. kittystark

    (123) ❗ ❗ ❗ заметил еще что в комменте были съедены очень важные символы ❗ ❗ ❗

    в функции get_category_formula() вместо (1+()/ABS())/2 должно быть (1+(<символ доллара>1)/ABS(<символ доллара>1))/2 ❗ , а то иначе работать не будет

    Reply
  95. kittystark

    касаемо get_category_formula(…) (см.(123),(125))

    в коде в исходном виде

    s = s.replace(/H(([#k8SjZc9Dxk)]+))/gi,'(   (1+($ 1)/ABS($ 1))/2    )’).replace(/x/gi, TTL_perc_measure_name).replace(/./gi,’,’)

    …не учитываются 2 момента:

    1. системные настройки (локаль), в частности текущий десятичный разделитель

    2. измерение в своем наименовании может содержать точки/запятые

    поэтому для большей устойчивости в работе лучше заменить этот код на следующий

    s.replace(/H(([#k8SjZc9Dxk)]+))/gi,'(   (1+($ 1)/ABS($ 1))/2    )’).replace(/(d+)([.,])(d+)/gi,’$ 1’+(1.5).toLocaleString().substr(1,1)+’$ 3′).replace(/x/gi, TTL_perc_measure_name)

    ❗ ВНИМАНИЕ: после символов доллара никаких пробелов не должно быть, отредактируйте вручную при переносе кода к себе (издержки форума) ❗

    Reply
  96. cleaner_it

    (130) Пора свою публикацию делать:)

    (123) И все-же при построении ABC на иерархических измерениях должны возникать проблемы. Например, имеется группа X, в ней два элемента- Y и Z. Y нужно отнести к категории А, а Z — к категории С. Если сохранять иерархию — то в обоих категориях нужно создавать иерархическую структуру, подобную имеющейся — то есть создавать в каждой категории группу X. В итоге должна получиться следующая структура:

    Структура измерения ДО анализа:

    X

    -Y

    -Z

    Структура измерения ПОСЛЕ анализа:

    A

    -X

    —Y

    B

    C

    -X

    —Z

    Чем сложнее иерархическая структура, тем сложнее затем будет анализировать…

    Я склоняюсь к мысли, что при проведении ABC-анализа группы необходимо убирать, т.е. преобразовывать иерархическое измерение к линейному списку. А затем, при необходимости, возвращать обратно

    Reply
  97. kittystark

    (131) согласен, я этот момент тоже прочувствовал и для себя проблем не вижу, т.к. были сделаны следующие выводы:

    1. правильная постановка задачи, например для оптимизации складских запасов, именно такая как ты и говоришь — убрать группы, отсортировать, разнести по категориям

    2. для проведения анализа на высоком уровне, по товарным группам в целом — предложенного решения вполне достаточно, хотя есть те самые нюансы

    в виду того, что руки у меня не дошли до собственноручного написания включения/отключения групп (со времен (88)) возникают 2 ВРЕМЕННЫХ подхода: формировать 2 куба, отличающиеся только тем, что в одном есть иерархия, в другом нет; второй вариант — в один куб запихивать 2 измерения номенклатуры (с иерархией и без) и юзать подходящее

    так что пока на скорую руку выкручиваемся как можем, а по хорошему нужно осваивать технику программирования не вычисляемой МЕРЫ АВС=1/2/3, она, помимо вышесказанного, дальше совмещения с XYZ пойти не даст, а нужна техника создания в рантайме (по меню/кнопке) новых (возможно нескольких) ИЗМЕРЕНИЙ ABC, т.к. такой подход позволит совместить данные анализа АВС [+XYZ] по одному «измерению+показателю» с 2-мя/3-мя и тд. АВС анализами по другим «измерениям+показателям»,

    и тогда возникнет возможность, например, определить, что один товар по сумме продаж относится к категории А, по рентабельности к В, а по оборачиваемости к С, ну а другие товары по этим же показателям отнести к ААА, ААВ, АВА и т.д.

    имхо, перегруппировку измерения с созданием внутри него групп АВС лучше не рассматривать — геммора потом не оберешься

    Reply
  98. Medvedik

    (50)

    [+] — добавить возможность сохранения/загрузки настроек положения/видимости колонок/строк/формул/показателей

    cleaner_it, эти планы похоронены, или как?

    Reply
  99. cleaner_it

    (218) Скорее сдвинуты по времени:) Сроки назвать не рискую, потому что задача не приоритетная

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *