Как сослаться на предыдущую группу для годовых расчетов в Crystal Report?

Я пишу отчет, который содержит 3 группы: Год, Месяц и Поставщик.

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

например верхний уровень моего отчета выглядит так:

2010  
   January    £20,000
   February   £30,000
   March      £15,000
   etc.

2011
    January   £16,000
    February  £14,000

Теперь я хочу сравнить значения января 2011 года с тем же периодом предыдущего года (в данном случае: 16 000 против 20 000), чтобы выполнить некоторые дополнительные вычисления.

В настоящее время я достигаю этого, используя глобальные переменные с именами JanGlobal, FebGlobal и т. д., которые сохраняются и извлекаются по мере необходимости. Это работает, потому что я знаю, что будет только 12 месяцев, поэтому я могу заранее назвать переменные.

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

Детализация моих поставщиков выглядит следующим образом:

2010
    January
        Company 1    £5,000
        Company 2    £7,000
        Company 3    £8,000

Поэтому мне нужно сравнить переменное количество поставщиков с их аналогами за 12 месяцев до этого, если они существуют. Любые идеи?


person Andy F    schedule 14.02.2011    source источник
comment
Какая версия Crystal Reports?   -  person MartW    schedule 14.02.2011
comment
@ Код версии XI. Я добавил тег для проверки.   -  person Andy F    schedule 15.02.2011
comment
Есть ли у вас разрешения на редактирование вашего источника данных каким-либо образом? Вы можете использовать какой-нибудь причудливый SQL, чтобы добавить данные в виде связанной таблицы.   -  person PowerUser    schedule 15.02.2011
comment
@PowerUser: у меня лично нет разрешений, но я мог бы убедить администратора базы данных сделать для меня код SQL ^_^. Ваше предложение может быть лучшим способом сделать это с минимальным снижением производительности в отчете.   -  person Andy F    schedule 15.02.2011


Ответы (1)


Решение здесь включает в себя достаточное количество манипуляций со строками. По сути, в нижних колонтитулах групп для компаний (если это 2010 год) вы создаете строку с названиями компаний и цифрами продаж. Если это 2011 год, вместо этого вы обрабатываете строку, чтобы извлечь данные, относящиеся к 2011 году (для данной компании и месяца), и использовать их для сравнения.

Итак, для строковой формулы с именем ProcessJan у вас может быть (используя трубы в качестве символа разделения):

Global StringVar JanGlobal;
Local NumberVar NumberToCompare := 0;
If Year(Sales) = 2010 Then
    JanGlobal := '||' + {CompanyName} + '|' + ToText({SalesFigure}); //append current value to Jan's formula
Else
(
    If UBound(SalesSearch) > 0
    (
        Local NumberVar Searching := 1;
        For Searching = 1 to UBound(SalesSearch)
            If SalesSearch[Searching] StartsWith ({CompanyName} + '|') Then
            (
                Local StringVar Array Matched := Split(SalesSearch[Searching], '|')
                NumberToCompare := ToNumber(Matched[2]);
            )          
        Next
    )
    //do whatever you want with the 2011 sales figure and the value of NumberToCompare
    //(which should be either zero or Jan 2010's sales figure for the company) here
)

Приложив немного усилий, вы можете адаптировать этот метод, чтобы иметь одну формулу и глобальную переменную, управляющую всеми месяцами и компаниями.

person MartW    schedule 15.02.2011