Гость
Форумы / Отчетные системы [игнор отключен] [закрыт для гостей] / По MatrixObject в FastReport / 4 сообщений из 4, страница 1 из 1
26.07.2018, 16:09
    #39679735
ilshatkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
По MatrixObject в FastReport
Есть ли знатоки в FR ?

По ходу дела пришлось столкнуться с генерацией отчета для которого больше всего подходит объект матрица.

Мне например нужно бы делать в итоговых столбцах не сумму, а разность, для сравнения план факта.
В дизайнере появляется выбор "пользовательская", но как с ним работать так и не нашел. Подскажите каким образом можно такое сделать?

А так же можно ли как нибудь подставлять в заголовок другие значения.
Вот у меня например план идет со значением tip "1", а факт "0". и если я делаю как на скриншоте, то само собой вижу в заголовке 0 и 1, надо бы план факт.

В поиске специалиста по FR за сдельную оплату.
...
Рейтинг: 0 / 0
15.08.2018, 21:09
    #39688385
ilshatkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
По MatrixObject в FastReport
Отвечу сам себе.

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

Свою задачу решить смог. Служба поддержки FastReport не бросила меня в трудную минуту. Мой тикет в итоге передали Александру Циганенко основателю и техническому диерктору компании. В результате взаимодействия
Александр добавил дополнительный функционал для реализации посталенной задачи, поэтому представленные примеры будут работать только на билде выше 2018.3.36

Необходимо было реализовать отчет по сотрудникам для компании в сфере курьерских перевозок. Сотрудников много.

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



Данные предоставляются в отчет в таком формате

idnameproektgoroddogovorDate1Date2dopInfo3adres2exptipanalitikNamesumma 1998Титов Олег СергеевичbrkМСК554 2018.01.01NULLNULL NULL EPR0171Вознаграждения5000



Получилось сделать с помощью объекта Матрица

Как делать.

В дизайнере отрисовываем шаблон отчета на базе объекта Матрица с помощью перетаскивания мышкой полей с окна Данные. Таким образом матрица сама делает группировку строк и
подсчет итогов, чтобы итоги были наверху, выставляем соответствующую галочку.

Чтобы добавить столбцы с информацией о сотруднике (номер договора договор, дата найма) добавляем обекты Текст в строку в матрице и пишем них источник из данных, например [dannieSotr.dataNaima]




Далее переходим в скрипты

событие AfterData для добавления данных
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
 private void Matrix1_AfterData(object sender, EventArgs e)
    {
	
	// подключаем данные 
	
	DataSourceBase rowData = Report.GetDataSource("dannieSotr");
	Matrix1.DataSource = rowData; 
	rowData.Init(); 
	
	
	// таким образом добавляем нужные нам статические столбцы в нужном нам порядке, то есть добавляем пустую строку, которую потом удалим.
	 Matrix1.AddValue(new Object[] { "Общее", "ОС" }, new Object[] { "МСК","","" }, new Object[] { 0 });
	 Matrix1.AddValue(new Object[] { "Общее", "Прибыль" }, new Object[] { "МСК","" }, new Object[] { 0 });   
         Matrix1.AddValue(new Object[] { "Общее", "Количество смен" }, new Object[] { "МСК","" }, new Object[] { 0 }); 


	// пробегаем по данным и заполняем либо статические стобцы либо динамические 
	 while (rowData.HasMoreRows)
{    
        switch ((string)Report.GetColumnValue("dannieSotr.exp"))
        {
		
			// здесь для статических стобцов. Метод   AddValue и SetValue есть в исходнике 
          case "FIN036":
            
            Matrix1.AddValue(new Object[] {"Общее", "ОС"  }, new Object[] { (string)Report.GetColumnValue("dannieSotr.gorod"), (string)Report.GetColumnValue("dannieSotr.projectName"), (string)Report.GetColumnValue("dannieSotr.name") }, new Object[] { (Decimal)Report.GetColumnValue("dannieSotr.summa") });
          break;
	 
	 	  // здесь для динамических, делая разграничение на начисления и оплату
	   default: 
            if ((int)Report.GetColumnValue("dannieSotr.tip") == 1 ){
        
		// обратите внимание передаем уже напрямую с  Report.GetDataSource("dannieSotr").CurrentRowNo , это для того чтобы столбцы с информацией о сотруднике были соответствующее строке.
              Matrix1.Data.AddValue(new Object[] { "Начисления", (string)Report.GetColumnValue("dannieSotr.analitikName") }, new Object[] { (string)Report.GetColumnValue("dannieSotr.gorod"), (string)Report.GetColumnValue("dannieSotr.projectName"),(string)Report.GetColumnValue("dannieSotr.name") }, new Object[] { (Decimal)Report.GetColumnValue("dannieSotr.summa") }, Report.GetDataSource("dannieSotr").CurrentRowNo);
             
			 }
	 
	 	  // добавляем столбцы итогов для начисления и оплат
	  Matrix1.AddValue(new Object[] { "Начисления", "Итого" }, new Object[] { "МСК","","" }, new Object[] { 0 });
      Matrix1.AddValue(new Object[] { "Оплата", "Итого" }, new Object[] { "МСК","","" }, new Object[] { 0 });
             
			 
			  //удаляем пустую строку которая нужна была для выставления порядка столбцов
      Matrix1.Data.Rows.RemoveItem(new Object[] { "МСК","","" });
      Matrix1.Data.Rows.RemoveItem(new Object[] { "МСК","" });
	
	}
 


событие AfterTotals для расчета итогов
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
 private void Matrix1_AfterTotals(object sender, EventArgs e)
    {
	
	// пробегаем по строкам
      int[] rowIndices = Matrix1.Data.Rows.GetTerminalIndices();
      for (int i = 0; i < rowIndices.Length; i++)
      {
        rowIndex = rowIndices[i];
		
		 // Считаем итоги по динамичсеим столбцам, например в разжеле Оплата 
		  
        int[] columnIndices = Matrix1.Data.Columns.GetTerminalIndices(new Object[] { "Оплата" });
        float oplataSum = 0;
        foreach (int columnIndex in columnIndices)
        {
          oplataSum += GetValue(columnIndex);
        } 
		//Оплата;Итого = итог по всем оплатам  
        SetValue("Оплата;Итого", oplataSum);
		
		
		//считаем аналитические столбцы
		  SetValue("Общее;Баланс", GetValue("Начисления;Итого") - GetValue("Оплата;Итого"));
		  
		 if   (GetValue("Общее;Количество смен")>0) {
          
          SetValue("Общее;Прибыль на 1 смену",  GetValue("Общее;Баланс")/ GetValue("Общее;Количество смен"));   
          
        }  	
		
		
...
Рейтинг: 0 / 0
15.08.2018, 21:28
    #39688391
ilshatkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
По MatrixObject в FastReport
В итоге получается такой отчет, который можно экспортировать в любой формат, а так е можно нагрузить дополнительно функционалом, например при двойном клике по сотруднику открывать его "расчетку"





Как видите FastReport блестяще справился с поставленной задачей. Клиент счастлив, я как разработчик доволен "как слон". Меня радует что у меня "развязаны руки" формировать отчеты такого уровня сложности используя функционал генератора отчетов, передавая стандартный набор данных ,то есть иными словами, чтобы решать такие задачи не потребуется индивидуализировать запрос и набор предоставляемых данных к генератору отчета от моего приложения, таким образом мне легко подстраиваться под запросы пользователей, меняя только шаблон отчета и не делая изменений в ядро системы или разнообразные "костыли".
...
Рейтинг: 0 / 0
15.08.2018, 22:11
    #39688409
ilshatkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
По MatrixObject в FastReport
Дополнение:
В отчете условное выделение можно сделать в дизайнере. Можно менять фон, шрифт, рамку. Форма с условиями в данном случае выглядит так

...
Рейтинг: 0 / 0
Форумы / Отчетные системы [игнор отключен] [закрыт для гостей] / По MatrixObject в FastReport / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]