Расписание- как его построить?

отредактировано September 2005 Раздел: FastReport 2.xx VCL
Есть 2 набор данных:

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"])]

Есть слабенькая надежда, что такой мощный билдер репортов справится с этой в общем-то распространенной задачей.
Очень прошу помочь реально работающим примером реализации этого расписания, я выдохся... ;)
Готов помощь поощрить материально ;)

Комментарии

  • отредактировано 10:17
    посмотри в демке - календарь
  • Andrew_ShAndrew_Sh г.Минск
    отредактировано 10:17
    isumen написал:
    2) продвинутый кросс-таб
    - во-первых успешно упорядочивает поля группировки по алфавиту, таким образом, по его понятиям, дни недели идут так: "Вс", "Вт", "Пн", "Пт", "Ср", "Сб", "Чт",
    - во-вторых, данные внутри таблицы невозможно выделять разными шрифтами, вызывать функции типа [UPCASE([Query."KLASS"])]
    во-первых, если вам не нужна сортировка по возрастанию значения колонки, то и отключите ее: в строке с нужной колнкой щелкните по стрелке возле 'A-Z' и выберите в появившемся меню 'No sort'.

    во-вторых, данные в таблице можно выделять: для этого можно
    либо задать условие и форматирование для Higlight (вызывается по кнопке в режиме дизайна Cross-Tab) см. пример из демки Cross-Tabs -> Highlight

    либо написать обработчик для события OnPrintCell. Как это делается очень подробно описано в доке.
    procedure Cross1OnPrintCell(Memo: TfrxMemoView; RowIndex, ColumnIndex, CellIndex: Integer; RowValues, ColumnValues, Value: Variant);
    begin
      if (Value>=2001) and (Value<=3000) then
        Memo.Font.Color := clGreen
      else if Value>=3001 then
        Memo.Font.Color := clBlue
      else
        Memo.Font.Color := clRed;
    end;
    
  • отредактировано 10:17
    написал:
    в строке с нужной колнкой щелкните по стрелке возле 'A-Z' и выберите в появившемся меню 'No sort'.
    Это Вы о чем? У меня A-Z (версия 2.54) на кросс-вью (TCrossView) нет

    Вариант с HighLight скорее всего не катит, т.к. в каждой клетке реально у меня 4 поля (занятие, педагог, длительность занятия, класс).
    Надо
    1) Занятие сделать Ариалом 12 жирным,
    2) педагогу сделать [NAMECASE],
    3) исходя из длительности занятия вычислить конец занятия, и вывести строку "09:00"-"09:45"
    4) Класс сделать Таймсом 7, курсивом, с переносом на другую строку, если он длинный.

    Хайлайт, насколько я понял из хелпа и демы, умеет только расцвечивать шрифт и заливку ячейки целиком.

    За совет с демкой календаря сенкс - изучу, если подойдет, милости прошу № сотового, для финансового пополнения, так сказать ;)
  • Andrew_ShAndrew_Sh г.Минск
    отредактировано 10:17
    isumen написал:
    isumen написал:
    в строке с нужной колонкой щелкните по стрелке возле 'A-Z' и выберите в появившемся меню 'No sort'.
    Это Вы о чем? У меня A-Z (версия 2.54) на кросс-вью (TCrossView) нет
    Мои извинения ;) Упустил из виду, что ветка по FR 2.xx, а не 3-ке.
  • отредактировано September 2005
    Значит, полноценного расписания с помощью TCrossView в 2.хх не построить ;)
    Жаль.

    Посмотрел я демку "calendar". Проблема заключается в том, в моем практическом (клиническом) случае источник данных - запрос, а не Virtual dataset. С виртуал датасетом и simple cross-report построен, виртуально все очень красиво работает, а как до базы доходит - работает не так как хочется - вниз только 1 строка печатается.

    Может кто сможет помочь работающим примером расписания с источником-базой?

    Уважаемый А.Ц. - может ваше веское слово как родителя - расставит все точки над "ё"? Нельзя - и ша!
    Или все-таки можно?
  • отредактировано 10:17
    Сделал через ж... (ой,чуть не написал "жопа")
    Строю расписание на невидимом TStringGrid, сохраняя в ячейках день и порядковый номер занятия. А дальше - как в демке "prngrid" - через OnUserDataset
    при возникновении события OnGetValue:
    - определяю строку и столбец,
    - вынимаю день и номер из ячейки,
    - делаю Query.Locate( 'DAYNO,S_NO'....,

    При данном алгоритме мега-fastreport работает как гипер-тормоз-куку-репорт.
    А попроще никак?
    Ау, разработчики!!! Может подбросите идею зарегистрированному юзверю? Или на FR 2.xx гарантия кончилась? ;)
  • Andrew_ShAndrew_Sh г.Минск
    отредактировано September 2005
    isumen написал:
    Внимание, вопрос!

    Каким образом можно вывести расписание по этому набору в таблицу вида:
    Можно сделать так. Это точно работающий вариант.
    Нужно 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."ДЕНЬ_НЕДЕЛИ"]

    Отчеты с такой структурой давно и успешно использую, так что если сделаете как написано, то все будет Ок.

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.