суббота, 16 мая 2015 г.

Делаем статистику без "Статистики"

В этом посте я хочу показать, как можно расширить "статистические" возможности АС-Библиотека-3 нештатными способами. Сразу оговорюсь, это лишь обзор с простыми примерами.

Начнём с простого. Вопрос - какая книга самая выдаваемая? Если отбросить все тонкости, можно свести к вопросу какая запись самая выдаваемая? Открываем "Администратор", переходим на вкладку "SQL". Пишем SQL запрос (Да, да, к сожалению, без SQL никак не обойтись. В крайнем случае, можно просто скопировать. И не забудь первое правило админа - сделать резервную копию:):

select top 10 SubDB, DocID, COUNT(DocID) as [Выдач] from All__Delivery
where BookState = 'Завершено'
group by SubDB, DocID
order by COUNT(DocID) desc

жмём "SQL Select" получаем результат.




Это первые 10 записей, с максимальной выдачей. Теперь достаточно открыть "Каталогизатор" и по имени логической базы (SubDB) и номеру записи (DocID) найти нужную запись.





Понятно, что этот запрос "разовый" - результат не изменится ни завтра, ни послезавтра. Поэтому в данном случае нет смысла что-то усложнять, хватит и "Администратора".

Однако таблицы скучны до безобразия. Добавим наглядной графики. Вспоминаем что база АС-3 - это база Access (если ты не перешёл на MS SQL). Иными словами это просто mdb файл. А значит, его можно открывать и обрабатывать "Офисными" средствами. Например, Excel. Но сначала подготовим запрос:

select Weekday(DeliveryDate, 2) as [День недели], count(*) as [Посещений]
from All__Delivery
where BookState = 'Посещение'
group by Weekday(DeliveryDate, 2)

Здесь происходит подсчёт количества посещений, приходящихся на каждый день недели. В этом нам помогает функция Weekday(), она преобразует дату в день недели. Не ищи её в справочнике SQL, это функция VB (можно посмотреть в справке к Access). По этой причине для базы на MS SQL запрос будет такой:

SET DATEFIRST 1;
select DATEPART(weekday, cast((DeliveryDate-2) as datetime)) as [День недели], count(*) as [Посещений]
from All__Delivery
where BookState = 'Посещение'
group by DATEPART(weekday, cast((DeliveryDate-2) as datetime))
order by [День недели]

Здесь всё из справочника, за исключением (DeliveryDate-2). Зачем минус два? Этот "пенёк" заслуживает отдельной статьи.

Открываем Excel. Вкладка "Данные"->"Получить внешние данные"->"Из Access".




Появится диалог похожий на открытие файла. Выбираем файл базы.




Следующий диалог выбора таблицы - просто жмём Ок.
Появится окошко "Импорт данных"



Здесь оставляем всё как есть и нажимаем "Свойства". В свойствах подключения нас интересует вкладка "Определение"



Здесь указываем "Тип команды": SQL, а в поле "Текст команды" копируем подготовленный скрипт.



Дальше всё зависит от того, работаешь ли ты с собственной копией базы (что я всячески рекомендую, кроме того офисный пакет на сервере это нонсенс) или с рабочей, параллельно с EServer. Если с копией, то ничего делать не надо. А если с рабочей, то в поле "Строка подключения" надо изменить параметры "Mode=Share Deny Write" на "Mode=Share Deny None" и "Jet OLEDB:Database Locking Mode=0" на "Jet OLEDB:Database Locking Mode=1", иначе ЗАБЛОКИРУЕШЬ РАБОТУ ОСТАЛЬНЫХ ПОЛЬЗОВАТЕЛЕЙ! Если в этот момент никто не работает с базой - тоже ничего страшного. Вообще тема режимов и блокировок для отдельной статьи. Здесь этого достаточно. Что касается MS SQL, то у него таких параметров просто нет.
Жмём Ок и получаем табличку с данными нашего запроса.



Осталось вставить диаграмму. Вкладка "Вставка"->"Диаграммы"->"Гистограмма".


Выбираем "Гистограмма с группировкой". Получаем диаграмму



В принципе всё готово. Надо только немного окультурить. Щёлкаем правой кнопкой по диаграмме, выбираем пункт меню "Выбрать данные..."



Здесь удаляем "День недели" - он уже идёт по горизонтали. Жмём Ок и выбираем "Экспресс стиль" по вкусу.



Это всё. Выглядит довольно громоздко, но на самом деле, при готовом запросе, занимает 5 минут. Можешь убедиться в этом, посмотрев небольшую видеодемонстрацию ЗДЕСЬ. Только её надо скачать, иначе при перекодировке всё теряется.
Так же можно работать и с MS SQL. Надо выбрать соответствующий источник данных. А настроить подключение не сложнее чем для EServer.
Понятно, что вид и стиль диаграммы можно выбирать и менять на свой вкус. Но это ты найдёшь в букваре по Офису, а их написано не мало. Что-то наверняка завалялось и в твоей библиотеке.
Ты спросишь, а как же Access. В нём возможностей даже больше чем в Excel. Это полноценная программируемая оболочка с графическими средствами и движком SQL.

Статистические данные можно получать с помощью "hta скрипта". Эта технология была разработана для автоматизации задач администрирования. "Hta скрипт" представляет собой HTML страницу с JavaScript. Файл имеет расширение .hta и запускается в браузере. Если табличных данных недостаточно, можно "сваять" простенькую гистограмму DIV-ами. А можно подключить какую нибудь библиотеку визуализации графиков. Получится универсальное средство, для обработки статистических данных. Я использовал эту технологию в "Скрипте проверки БД".
На этом пока всё. Пиши комментарии (регистрация не требуется) или на почту acbib3@yandex.ru

P.S.
В практике админа есть немало вещей, способных повергнуть в уныние. Но SQL в этом списке занимает особое место. Однако есть хорошая новость - если ты его осилишь, то это навсегда. Не многие технологии могут похвастаться такой фундаментальностью и долгожительством.