Skip to content

Набор данных программы - Справка FineReport | Разработка отчетов | Использование отчетов | Учебные пособия

Наборы программных данных

1. Обзор

1.1 Сценарии применения

Иногда пользователям необходимо использовать пользовательские типы источников данных для анализа данных и представления приборных панелей.

1.2 Функциональный профиль

FineBI может установить удаленное соединение с FineReport для использования пользовательских наборов данных из источников данных, чтобы BI-движок считывал заданные источники данных для анализа данных и создания приборных панелей.

Примечание: данные программы были изменены с полнообъемного извлечения данных на потоковое извлечение из памяти, которое поддерживает извлечение миллиардных объемов данных.

2. Примеры

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

2.1 Определение программы источника данных

Нажмите, чтобы загрузить файл журнала выполнения шаблона: ExecuteLog.class

Нажмите, чтобы загрузить файл журнала управления платформой: OperateLog.class

1) Выполните файлLog.class и скопируйте его в %FineBI%/webapps/webroot/WEB-INF/classes/com/fr/log, в это время определение источника данных программы проходит успешно, как показано ниже:

1588070434776739.png

Код файла журнала выполнения шаблона показан ниже и может быть скомпилирован в файл класса:

  
  
  
  
package com.fr.log; import com.fr.data.AbstractTableData; import com.fr.decision.log.ExecuteMessage; import com.  
  
fr.general.data.TableDataException; import com.fr.intelli.record.MetricRegistry; import com.fr.stable.query.QueryFactory.  
  
  
  
  
  
  
 import com.fr.third.springframework.util.CollectionUtils; import java.util.ArrayList; import java.util.List; /**.  
  
  
 * @author Munin * @version 5.1.3 * Created by Munin on 2020/4/27 */  
  
  
 public class ExecuteLog extends AbstractTableData { private static final  
 long serialVersionUID = -3233073054624031382L; private String[] columnNames&  
  
 nbsp;= {"tname", &  
 nbsp; "type",  
  
 "userrole", "param", &  
 nbsp; "ip", &  
 nbsp; "username", "consume", "sql", & nbsp; "ip", & nbsp; "username",  
  
 "sql",  
 "браузер", "  
  
 память", "время", &  
  
 nbsp; "reportId" }; private  
  
  
 List<List<Object>> cacheData = new ArrayList<>(); public  
  
  
  
  
 ExecuteLog() { } /** * Ленивая загрузка для решения проблем с производительностью ненужных деталей выборки &nbsp  
  
; */ private List<List<Object>> getExecuteData() { &  
 nbsp; if (CollectionUtils.isEmpty(cacheData)) { &  
  
 nbsp; init(); } &  
  
  
  
 nbsp; return cacheData; } private void init() {  
 try { List< ExecuteMessage> messages = MetricRegistry.getMetric().find(ExecuteMessage.class, QueryFactory.create()).  
 getList(); if (messages !  
 = null && !messages.isEmpty()) { &  
 nbsp; for (ExecuteMessage message : messages) { &nbsp ; List<Object> objects =  
 new ArrayList<Object>(); &nbsp  
; objects.add(message.getTemplate()); &nbsp ; List<Object> objects = new ArrayList<Object>(); &nbsp  
 nbsp; objects.add(message.getType()); &  
 nbsp; objects.add(message.getUserrole()); objects.add(message.  
 getParameters()); &nbsp  
 nbsp; objects.add(message.getIp()); &nbsp; objects.add(message.getParameters()); &nbsp  
 nbsp; objects.add(message.getUsername());  
 objects.add(message.getConsume());  
 objects.add(message.getSql()); & nbsp; objects.add(message.  
 getBrowser()); &  
 nbsp; objects.add(message.getMemory()); &  
 nbsp; objects.add(message.getTime()); &  
 nbsp; objects.add(message.getReportId());  
 cacheData.add(objects); &nbsp  
; } &  
  
 nbsp; } } catch (Exception e) { &  
 nbsp; FineLoggerFactory.getLogger().error(e.getMessage(), e); &nbsp  
  
  
  
; } } @Override public int  
 getColumnCount() throws TableDataException { return columnNames  
  
  
  
.length; } @Override public String getColumnName(  
  
 int i) throws TableDataException { return columnNames[i]; &  
  
  
 nbsp; } @Override public int getRowCount() throws&  
  
 nbsp;TableDataException { return getExecuteData().size(); &  
  
  
 nbsp; } @Override public Object getValueAt(int i, int  
  
 i1) { List<List<Object>> data = getExecuteData(); &  
 nbsp; if (i < data.size()) { &  
 nbsp; List<Object> message = data.get(i); &  
 nbsp; if (i1 < message.size()) { &  
 nbsp; return message.get(i1); &  
  
 nbsp; } } return&  
 nbsp;null; }

2.2 Установка удаленного соединения

Сначала вам нужно удаленно подключить конструктор к серверу FineBI. Дополнительную информацию см. здесь:Удаленное подключение к конструктору FineReport

1 ) Откройте конструктор и выберитеServer > Server Dataset,как показано ниже:

432.png

2) Перейдите на экран Server Dataset Setup и выберите +>Programmes (Программы ), как показано ниже:

31.png

3) Нажмите Select (Выбрать), выберите добавленный файл ExecuteLog.class и нажмите OK, чтобы сохранить его. Как показано на рисунке ниже:

320.png

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

Примечание: Если вы хотите добавить сюда несколько файлов, вы можете повторить описанные выше действия, чтобы выбрать файл OperateLog.class для добавления.

38.png

2.3 Добавление таблицы данных программы в FineBI

1) Администратор входит в систему FineBI, нажимает "Public Data", выбирает любую папку, нажимает "New Dataset > Database Table", как показано на рисунке ниже:

2) В разделе Server Dataset вы можете увидеть процедуру 4, которую вы только что добавили в конструкторе, выберите таблицу и нажмите OK, чтобы добавить ее в используемый бизнес-пакет. Как показано на рисунке ниже: