Расписание- как его построить?
Есть 2 набор данных:
1. день_недели, занятие, время начала, педагог, класс
'Понедельник', математика, '09:00','Иванов','5А'
'Понедельник', математика, '09:50','Иванов','5Б'
'Вторник', физика, '09:00','Иванов','6А'
'Четверг', физика, '09:50','Иванов','6Б'
2. №_дня, день_недели
1, Понедельник
2, Вторник
.....
6, Суббота
7, Воскресенье.
- набор данных "упорядочен" по дням недели (не алфавитный, а естественный порядок), а потом - по времени начала (опять же, не текстовая, а по времени).
Внимание, вопрос!
Каким образом можно вывести расписание по этому набору в таблицу вида:
1) простыми мастер- и кросс-бэндом с 2-мя источниками данных в отношениях master-detail дней недели к расписанию
2) adv. кроссом, с группировкой по дню недели и времени начала.
На деле - ни один вариант не работает.
1) дни недели вправо выводятся нормально, а вниз выводится только первое занятие, т.е. строчка 09:00 ......
2) продвинутый кросс-таб
- во-первых успешно упорядочивает поля группировки по алфавиту, таким образом, по его понятиям, дни недели идут так: "Вс", "Вт", "Пн", "Пт", "Ср", "Сб", "Чт",
- во-вторых, данные внутри таблицы невозможно выделять разными шрифтами, вызывать функции типа [UPCASE([Query."KLASS"])]
Есть слабенькая надежда, что такой мощный билдер репортов справится с этой в общем-то распространенной задачей.
Очень прошу помочь реально работающим примером реализации этого расписания, я выдохся...
Готов помощь поощрить материально
1. день_недели, занятие, время начала, педагог, класс
'Понедельник', математика, '09:00','Иванов','5А'
'Понедельник', математика, '09:50','Иванов','5Б'
'Вторник', физика, '09:00','Иванов','6А'
'Четверг', физика, '09:50','Иванов','6Б'
2. №_дня, день_недели
1, Понедельник
2, Вторник
.....
6, Суббота
7, Воскресенье.
- набор данных "упорядочен" по дням недели (не алфавитный, а естественный порядок), а потом - по времени начала (опять же, не текстовая, а по времени).
Внимание, вопрос!
Каким образом можно вывести расписание по этому набору в таблицу вида:
[font=Courier]
| Понедельник Вторник Среда Четверг Пятница
----------------------------------------------------------------------------------
09:00 | математика физика
| 5А (Иванов) 6А (Иванов)
----------------------------------------------------------------------------------
09:50 | математика физика
| 5Б (Иванов) 6Б (иванов)
[/font]
Как видим - это простейший вариант расписания, который по идее тривиально реализуется1) простыми мастер- и кросс-бэндом с 2-мя источниками данных в отношениях master-detail дней недели к расписанию
2) adv. кроссом, с группировкой по дню недели и времени начала.
На деле - ни один вариант не работает.
1) дни недели вправо выводятся нормально, а вниз выводится только первое занятие, т.е. строчка 09:00 ......
2) продвинутый кросс-таб
- во-первых успешно упорядочивает поля группировки по алфавиту, таким образом, по его понятиям, дни недели идут так: "Вс", "Вт", "Пн", "Пт", "Ср", "Сб", "Чт",
- во-вторых, данные внутри таблицы невозможно выделять разными шрифтами, вызывать функции типа [UPCASE([Query."KLASS"])]
Есть слабенькая надежда, что такой мощный билдер репортов справится с этой в общем-то распространенной задачей.
Очень прошу помочь реально работающим примером реализации этого расписания, я выдохся...
Готов помощь поощрить материально
Комментарии
во-вторых, данные в таблице можно выделять: для этого можно
либо задать условие и форматирование для Higlight (вызывается по кнопке в режиме дизайна Cross-Tab) см. пример из демки Cross-Tabs -> Highlight
либо написать обработчик для события OnPrintCell. Как это делается очень подробно описано в доке.
Вариант с HighLight скорее всего не катит, т.к. в каждой клетке реально у меня 4 поля (занятие, педагог, длительность занятия, класс).
Надо
1) Занятие сделать Ариалом 12 жирным,
2) педагогу сделать [NAMECASE],
3) исходя из длительности занятия вычислить конец занятия, и вывести строку "09:00"-"09:45"
4) Класс сделать Таймсом 7, курсивом, с переносом на другую строку, если он длинный.
Хайлайт, насколько я понял из хелпа и демы, умеет только расцвечивать шрифт и заливку ячейки целиком.
За совет с демкой календаря сенкс - изучу, если подойдет, милости прошу № сотового, для финансового пополнения, так сказать
Жаль.
Посмотрел я демку "calendar". Проблема заключается в том, в моем практическом (клиническом) случае источник данных - запрос, а не Virtual dataset. С виртуал датасетом и simple cross-report построен, виртуально все очень красиво работает, а как до базы доходит - работает не так как хочется - вниз только 1 строка печатается.
Может кто сможет помочь работающим примером расписания с источником-базой?
Уважаемый А.Ц. - может ваше веское слово как родителя - расставит все точки над "ё"? Нельзя - и ша!
Или все-таки можно?
Строю расписание на невидимом TStringGrid, сохраняя в ячейках день и порядковый номер занятия. А дальше - как в демке "prngrid" - через OnUserDataset
при возникновении события OnGetValue:
- определяю строку и столбец,
- вынимаю день и номер из ячейки,
- делаю Query.Locate( 'DAYNO,S_NO'....,
При данном алгоритме мега-fastreport работает как гипер-тормоз-куку-репорт.
А попроще никак?
Ау, разработчики!!! Может подбросите идею зарегистрированному юзверю? Или на FR 2.xx гарантия кончилась?
Нужно 3 запроса:
1) select ДЕНЬ_НЕДЕЛИ
from ДНИ_НЕДЕЛИ
order by НОМЕР_ДНЯ;
2) select distinct ВРЕМЯ_НАЧАЛА
from РАСПИСАНИЕ
where ...;
3) select занятие, педагог, класс,...
from РАСПИСАНИЕ
where время начала=:ВРЕМЯ_НАЧАЛА
order by день_недели
Связать этот запрос так, чтобы этот запрос был Detail по отношению к ЗАПРОСУ 2.
И очень важно, чтобы этот запрос всегда возвращал то же количество строк, что и запрос 1. Добиться этого можно несколькими путями:
либо вставлять в таблицу РАСПИСАНИЕ строки с пустыми полями "занятие, педагог, класс" если занятий на этот день и время нет
либо использовать внешнее объединение для дополнения результатов запроса 3 пустыми строками (если используете Oracle, то могу конкретно сказать как это сделать).
Далее размещаете в отчете:
1) MasterData и цепляете к нему Запрос №2;
2) Помещаете бэнд CrossHeader и на пересечении CrossHeader и MasterData
размещаете Memo с полем [Запрос №2."ВРЕМЯ_НАЧАЛА"];
3) помещаете бэнд CrossData, в списке "Источники данных" цепляте запрос №3 в качестве источника для MasterData;
Размещаете свои Memo на пересечении CrossData и MasterData;
4) выше MasterData разместите ColumnHeader.
в списке "Источники данных" для CrossData цепляте запрос №1 в качестве источника для ColumnHeader;
на пересечении ColumnHeader и CrossData размещаете Memo с полем [апрос №1."ДЕНЬ_НЕДЕЛИ"]
Отчеты с такой структурой давно и успешно использую, так что если сделаете как написано, то все будет Ок.