в 7-й части мы "украсили" невразумительную выдачу генератора отчётов так:
Таблица продаж Первомайск за январь
По Возле автовокзала
Крепёж 850.0
Сигареты 2500.0
ИТОГО 3350
По На авторынке
Крепёж 3005
Сигареты 2000
Кондитерка 300
ИТОГО 5305
По В парке
Крепёж 100
Сигареты 500
Кондитерка 2600
ИТОГО 3200
ИТОГО ВСЕГО 11855
- и выразили надежду, что хозяина это устроит.
Ну может быть. Но лучше бы выдача была такой:
Таблица продаж Первомайск за январь
Крепёж Сигареты Кондитерка Итого
Возле автовокзала 850.0 2500.0 3350.0
На авторынке 3005.0 2000.0 300.0 5305.0
В парке 100.0 500.0 2600.0 3200.0
------------------------------------------------------------------------------------------------------------------
ВСЕГО 11855.0
Ещё одна "шахматка", про которую было написано в начале.
Канонический генератор отчётов такое делать не умеет.
Хотя всего-то надо развернуть фрагменты его выдачи по горизонтали.
Правда, кроме этого, само просится вывести итоги по вертикали (чего в выдаче не было, и судя по алгоритму работы генератора отчётов, вряд ли можно ли получить от него эти итоги в этом же макете отчёта)
Вспомним про минутки отдыха. Минутка отдыха.
Когда писал этот фрагмент, полез поднимать свою разработку для коммерческой поликлиники, чтобы найти одну полезную штуку.
Приблизительно говоря, там то же самое, но по вертикали (слева в боковике) были диагнозы, сверху врачи.
Главному было интересно, а не ставят ли одни врачи больше определенных диагнозов, чем другие.
(в скобках: диагнозов может быть больше, чем один, диагноз может уточняться (первичный, вторичный), пациент может лечиться у нескольких врачей, и т.п. Это к вопросу о логической схеме базы данных).
Ему вообще было много чего интересно, то одно, то другое, и систему проектировали вместе.
Но я систематически избегал "программирования".
И выкрутил требуемый результат из базы данных, ИМЕЯ ПЕРЕД ГЛАЗАМИ СХЕМУ таблиц, на раз, за 5 минут, нарисовавши в генераторе отчётов, но в неудобном для просмотра виде (см. выше). Для того, чтобы развернуть выдачу по горизонтали, ШТАТНЫХ СРЕДСТВ НЕ НАШЛОСЬ.
Ну просто там применялись такие:
- генераторы входных и выходных форм;
- движок базы данных,
в которых не было штатных средств формирования шахматок.
Выход, приемлемый для меня - компьютерщика - мне был прекрасно известен. Выданные генератором отчётов цифры (фактически - результат ЗАПРОСА к базе данных, и запрос этот нарисован в генераторе отчётов) можно было перегнать в электронную таблицу вроде EXCEL. И далее - никаких проблем. Считай какие хочешь итоги хоть по горизонтали, хоть по вертикали, рисуй любые заголовки, рамочки, хвостовики и боковики. Никаких проблем по крайней мере в случае не слишком широкой "простыни" (spreadsheet-а).
Но тогда возникало другое неудобство, не известно, приемлемое ли для главврача, который не компьютерщик.
Цифры, выкрученные из базы данных, нужно было перегонять в EXCEL только вручную. То есть организовывать выдачу генератора отчётов в виде промежуточного файла вроде такого:
"", "Крепёж","Сигареты","Кондитерка",
"Возле автовокзала",850.0,2500.0,0.0,
"На авторынке", 3005.0,2000.0,300.0,
"В парке",100.0,500.0, 2600.0,
(группами по 4 значения. Текстовые значения - в кавычках)
Это один из форматов переноса данных между программами, так называемый CSV - Comma Separated Values - Запятыми Разделённые Значения. Лёгко читается (ИМПОРТИРУЕТСЯ) любой программой электронных таблиц, и размещается в строках электронной таблицы.
.... а .... а ... а где же здесь отдых?! :)
Обещали минутку отдыха.
Кончилась:) Но интересно?
Продолжим.
То есть результат запроса нужно было вывести на диск в файл с определенным именем.
Запустить EXCEL. Указать, из какого файла импорт (из этого самого), и в каком формате (в данном случае - импорт из CSV). В какие ячейки импортировать. Импортировать. И итоги сами появятся справа и снизу. Правда, ещё проблемка, что делать с лишними ячейками справа и снизу, там же их забито под много мест продажи и под много видов товара. Но эта проблемка для знающего EXCEL чисто техническая. Пустые ячейки можно замаскировать. (Для знатоков EXCEL: а КАК замаскировать?:)
Вроде нет здесь отдыха, но заметим, отметим -
то, что мы здесь делаем, ни сном ни духом не "забито жёстко" в системе, фактически мы здесь жонглируем данными и выдачами, как хотим, мы являемся ПОЛНЫМИ ХОЗЯЕВАМИ ситуации. Однако, это близко к отдыху. (Конец замечания).
Но главврач (или в нашем примере - хозяин лотков) не компьютерщик. И ЭТУ шахматку ему надо забить в программе жёстко. Чтобы она вызывалась по пункту меню.
Ну, поскольку я именно программист, то для меня было проще подцепить следом за генератором отчётов маленькую быструю программку, которая выдачу генератора таки разворачивала по горизонтали в шахматку.
Ну просто в макете запроса в конце фрагмента ставился спецпризнак вроде слова [СТРОКА], и всё, что выше, ужималось в одну строку.
Именно эту программку искал в своей старой разработке для медиков, но не нашёл. Потерялась:) Уже не помню, на чём была она написана: то ли на C таком, чтоб без библиотек, то ли на псевдокомпилирующем BASICе с единственной VBRUN100.DLL в пользовательской, а не системной директории:).
А следом за ней подцепил ещё другую программку, но не написанную мной, а найденную на просторах интернета, для показа на экран того, что получилось (то есть шахматки, которая, вообще говоря, шире экрана).
Итак, хозяин вызывал соответствующим пунктом меню "конвейер":
Запрос к базе генератором отчётов ---- промежуточный файл --- мой конвертор в шахматку ---- ещё файл --- визуализатор взятый с инета.
Вся цепочка выполнялась за кадром, невидимо для хозяина. Не нужно было ему знать ни про запросы, ни про исполняемые модули, ни про промежуточные файлы. Только выбрать пункт меню (но запрос, соответствующий пункту меню, был согласован, нарисован мной заранее, и форма представления результатов тоже была заранее согласована).
Отсюда интересный вопрос: ВАША система может ли выдавать шахматки?
Можно ли рисовать в ней СВОИ шахматки?
Продолжение следует