Как экспортировать данные повторного расположения сетки в Excel, используя pzRDExportWrapper в Pega 7.1.8?
Я пытаюсь экспортировать данные повторной сетки, чтобы преуспеть. Для этого я предоставил кнопку, которая запускает действие "MyCustomActivity" посредством нажатия. Кнопка находится над сеткой в том же макете. Стоит также отметить, что я использую статью в качестве руководства по настройке. Согласно руководству моя деятельность "MyCustomActivity" состоит из двух шагов:
- Метод: набор свойств, параметры метода: Param.exportmode = "excel"
- Метод: вызов pzRDExportWrapper. И я передаю текущие параметры (есть только один из 1-го шага).
Но после того, как у меня возникла проблема, я изменил 2-й шаг с помощью Call Rule-Obj-Report-Definition.pzRDExportWrapper
Но, как вы уже поняли, решение не работает. Я проверил файлы журналов и обнаружил интересную ошибку:
2017-04-11 21: 08: 27,992 [WebContainer: 4] [OpenPortal] [] [MyFW: 01.01.02] (ctionWrapper._baseclass.Action) ОШИБКА as1|172.22.254.110 bar - Операция "MyCustomActivity" не выполнена; Не удалось найти "RULE-OBJ-ACTIVITY" с именем "PZRESOLVECOPYFILTERS", которое относится к "COM-FW-MyFW-Work". В rulebase было 3 правила с этим именем, но ни одно не соответствовало этому запросу. 3 правила с именем 'PZRESOLVECOPYFILTERS', определенные в базе правил: 2017-04-11 21:08:42,807 [ WebContainer: 4] [TABTHREAD1] [ ] [ MyFW:01.01.02] (fileSetup.Code_Security.Action) ОШИБКА as1 | 172.22.254.110 бар - внешняя аутентификация не удалась:
Если у кого-то есть какие-либо предложения и поделитесь ими, я буду признателен за это. Спасибо.
1 ответ
Я хотел обеспечить функциональность экспорта извлеченных работ в файл CSV. Функциональность должна иметь возможность выбирать поля для извлечения, все результаты должны быть на украинском языке и иметь возможность использовать любые правила SearchFilter Pages и Report Definition.
На пользовательском портале у меня есть два раздела: первый раздел содержит текстовые поля и кнопку поиска, а также раздел с сеткой повторов для отображения результатов. Текстовые поля используются для фильтрации результатов и используют страницу Org-Div-Work-SearchFilter.
Я сделал собственный парсер для CSV. Я создал два вида деятельности и написал код на Java. Я должен упомянуть, что я взял некоторый код из pzPDExportWrapper.
Деятельность:
- ExportToCSV - получает параметры от пользователей, получает данные, вызывает ConvertResultsToCSV;
- ConvertResultsToCSV - преобразует полученные данные в файл.CSV.
Конфигурации деятельности ExportToCSV:
Вкладка "Страницы и классы":
- ReportDefinition является объектом определенного определения отчета.
- SearchFilter - это страница со значениями, введенными пользователем.
- ReportDefinitionResults - это список восстановленных работ для экспорта.
ReportDefinitionResults.pxResults обозначает тип определенной работы.
FileName - это имя сгенерированного файла
- ColumnsNames имена столбцов, разделенных запятой. Если параметр пуст, тогда CSVProperties экспортируется.
- CSVProperties - это реквизиты для отображения в электронной таблице через запятую.
- SearchPageName - это имя страницы для фильтрации результатов.
- ReportDefinitionName - это имя RD, используемое для получения результатов.
- ReportDefinitionClass - это класс используемого определения отчета.
Давайте посмотрим на шаги:
1. Получить страницу SearchFilte с именем из параметра с заполненными полями:
2. Если SearchFilter не пуст, вызовите преобразование данных, чтобы преобразовать свойства SearchFilter в свойства Paramemer:
Фрагмент данных Transform:
3. Получает объект определения отчета
4. Установите параметры для определения отчета
5. Вызовите определение отчета и сохраните результаты в ReportDefinitionResults:
6. Запустите действие ConvertResultsToCSV:
7. Удалите страницу результатов:
Обзор действия ConvertResultsToCSV.
Вкладка "Параметры", если действие ConvertResultsToCSV:
- CSVProperties - это свойства для извлечения и экспорта.
- ColumnsNames - это имена столбцов для отображения.
- PageListProperty имя свойства, которое будет прочитано на первичной странице
- FileName - имя сгенерированного файла. Может быть пустым.
- AppendTimeStampToFileName - если true, время создания файла.
- CSVString строка сгенерированного CSV для сохранения в файл.
- FileName имя файла.
listSeperator всегда является точкой с запятой для разделения полей.
Давайте рассмотрим все шаги в упражнении:
- Получить локализацию из пользовательских настроек (прокомментировано):
Теоретически он может поддерживать локализацию на многих языках. - Установите всегда "ук" (украинская) локализация.
Получить разделитель в соответствии с локализацией. Это всегда точка с запятой на украинском, английском и русском языках. Требуется проверить на других языках.
Шаг содержит код Java, который формирует строку CSV:
- Получить локализацию из пользовательских настроек (прокомментировано):
StringBuffer csvContent = new StringBuffer(); // a content of buffer String pageListProp = tools.getParamValue("PageListProperty"); ClipboardProperty resultsProp = myStepPage.getProperty(pageListProp); // fill the properties names list java.util.List<String> propertiesNames = new java.util.LinkedList<String>(); // names of properties which values display in csv String csvProps = tools.getParamValue("CSVProperties"); propertiesNames = java.util.Arrays.asList(csvProps.split(",")); // get user's colums names java.util.List<String> columnsNames = new java.util.LinkedList<String>(); String CSVDisplayProps = tools.getParamValue("ColumnsNames"); if (!CSVDisplayProps.isEmpty()) { columnsNames = java.util.Arrays.asList(CSVDisplayProps.split(",")); } else { columnsNames.addAll(propertiesNames); } // add columns to csv file Iterator columnsIter = columnsNames.iterator(); while (columnsIter.hasNext()) { csvContent.append(columnsIter.next().toString()); if (columnsIter.hasNext()){ csvContent.append(listSeperator); // listSeperator - local variable } } csvContent.append("\r"); for (int i = 1; i <= resultsProp.size(); i++) { ClipboardPage propPage = resultsProp.getPageValue(i); Iterator iterator = propertiesNames.iterator(); int propTypeIndex = 0; while (iterator.hasNext()) { ClipboardProperty clipProp = propPage.getIfPresent((iterator.next()).toString()); String propValue = ""; if(clipProp != null && !clipProp.isEmpty()) { char propType = clipProp.getType(); propValue = clipProp.getStringValue(); if (propType == ImmutablePropertyInfo.TYPE_DATE) { DateTimeUtils dtu = ThreadContainer.get().getDateTimeUtils(); long mills = dtu.parseDateString(propValue); java.util.Date date = new Date(mills); String sdate = dtu.formatDateTimeStamp(date); propValue = dtu.formatDateTime(sdate, "dd.MM.yyyy", "", ""); } else if (propType == ImmutablePropertyInfo.TYPE_DATETIME) { DateTimeUtils dtu = ThreadContainer.get().getDateTimeUtils(); propValue = dtu.formatDateTime(propValue, "dd.MM.yyyy HH:mm", "", ""); } else if ((propType == ImmutablePropertyInfo.TYPE_DECIMAL)) { propValue = PRNumberFormat.format(localeCode,PRNumberFormat.DEFAULT_DECIMAL, false, null, new BigDecimal(propValue)); } else if (propType == ImmutablePropertyInfo.TYPE_DOUBLE) { propValue = PRNumberFormat.format(localeCode,PRNumberFormat.DEFAULT_DECIMAL, false, null, Double.parseDouble(propValue)); } else if (propType == ImmutablePropertyInfo.TYPE_TEXT) { propValue = clipProp.getLocalizedText(); } else if (propType == ImmutablePropertyInfo.TYPE_INTEGER) { Integer intPropValue = Integer.parseInt(propValue); if (intPropValue < 0) { propValue = new String(); } } } if(propValue.contains(listSeperator)){ csvContent.append("\""+propValue+"\""); } else { csvContent.append(propValue); } if(iterator.hasNext()){ csvContent.append(listSeperator); } propTypeIndex++; } csvContent.append("\r"); } CSVString = csvContent.toString();
5. Этот шаг формирует и сохраняет файл в дереве каталога сервера.
char sep = PRFile.separatorChar; String exportPath= tools.getProperty("pxProcess.pxServiceExportPath").getStringValue(); DateTimeUtils dtu = ThreadContainer.get().getDateTimeUtils(); String fileNameParam = tools.getParamValue("FileName"); if(fileNameParam.equals("")){ fileNameParam = "RecordsToCSV"; } //append a time stamp Boolean appendTimeStamp = tools.getParamAsBoolean(ImmutablePropertyInfo.TYPE_TRUEFALSE,"AppendTimeStampToFileName"); FileName += fileNameParam; if(appendTimeStamp) { FileName += "_"; String currentDateTime = dtu.getCurrentTimeStamp(); currentDateTime = dtu.formatDateTime(currentDateTime, "HH-mm-ss_dd.MM.yyyy", "", ""); FileName += currentDateTime; } //append a file format FileName += ".csv"; String strSQLfullPath = exportPath + sep + FileName; PRFile f = new PRFile(strSQLfullPath); PROutputStream stream = null; PRWriter out = null; try { // Create file stream = new PROutputStream(f); out = new PRWriter(stream, "UTF-8"); // Bug with Excel reading a file starting with 'ID' as SYLK file. If CSV starts with ID, prepend an empty space. if(CSVString.startsWith("ID")){ CSVString=" "+CSVString; } out.write(CSVString); } catch (Exception e) { oLog.error("Error writing csv file: " + e.getMessage()); } finally { try { // Close the output stream out.close(); } catch (Exception e) { oLog.error("Error of closing a file stream: " + e.getMessage()); } }
Наконец, мы можем разместить кнопку в каком-то разделе или где-то еще и настроить вкладку Действия следующим образом:
Он также отлично работает внутри действия "Обновить раздел".Возможный результат может быть
Спасибо за прочтение.