2014-02-14 3 views
3

Мне нужно создать бизнес-отчет, используя perl + Template Toookit и LaTeX.Как я могу сделать перерывы и промежуточные итоги в отчете?

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

Так, например, каждый раз, когда меняется поле «категория», мне нужно иметь общий объем продаж для этой категории и заголовок, показывающий, что начинается запуск другой категории; а затем сделать то же самое, когда поле «группа» - с дополнительным интересом к тому, что «группа» состоит из категорий, поэтому две вещи должны вложить.

Я думаю, кто-нибудь, кто создал отчеты с Microsoft Access (или, возможно, любое другое приложение для бизнес-отчетов), должен быть знаком с этой проблемой.

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

Я (на добровольной основе) ограничен LaTeX и TT: LaTeX из-за контроля, который он предоставляет по типографике, и возможности генерации пользовательской графики и TT (или что-либо еще, что работает в perl) из-за кривых обучения.

ответ

0

В TT нет встроенной функции субтитуляции, но вы можете поместить свои данные в объект Data::Table, что даст вам возможность обрабатывать субтотацию на уровне «meta», как вы говорите.

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

[%- 
MACRO printrow(rowtype, line) BLOCK; 
    # however you print the row as LaTeX 
    # rowtype is 'row', 'subtotal' or 'grandtotal' for formatting purposes 
END; 

SET sumcols = [ 'col3', 'col4', 'col5' ]; # cols to be accumulated 
SET s_tot = {}; SET g_tot = {}; 
FOREACH i IN sumcols; 
    SET s_tot.$i = 0; # initialise 
    SET g_tot.$i = 0; 
END; 

FOREACH row IN data; 
    IF s_tot.col2 AND s_tot.col2 <> row.col2; # start of new group 
     printrow('subtotal', s_tot); 
     FOREACH i IN sumcols; 
      SET s_tot.$i = 0; #re-init 
     END; 
    END; 
    printrow('row', row); 
    SET s_tot.col2 = row.col2; # keep track of group level 

    FOREACH i IN sumcols; 
     SET s_tot.$i = s_tot.$i + row.$i; 
     SET g_tot.$i = g_tot.$i + row.$i; 
    END; 
END; 
printrow('grandtotal', g_tot); 
-%] 

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

Смежные вопросы