Как экспортировать данные повторного расположения сетки в Excel, используя pzRDExportWrapper в Pega 7.1.8?

Я пытаюсь экспортировать данные повторной сетки, чтобы преуспеть. Для этого я предоставил кнопку, которая запускает действие "MyCustomActivity" посредством нажатия. Кнопка находится над сеткой в ​​том же макете. Стоит также отметить, что я использую статью в качестве руководства по настройке. Согласно руководству моя деятельность "MyCustomActivity" состоит из двух шагов:

  1. Метод: набор свойств, параметры метода: Param.exportmode = "excel"
  2. Метод: вызов 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 всегда является точкой с запятой для разделения полей.

    Давайте рассмотрим все шаги в упражнении:

    1. Получить локализацию из пользовательских настроек (прокомментировано):

      Теоретически он может поддерживать локализацию на многих языках.
    2. Установите всегда "ук" (украинская) локализация.
    3. Получить разделитель в соответствии с локализацией. Это всегда точка с запятой на украинском, английском и русском языках. Требуется проверить на других языках.

    4. Шаг содержит код 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());
  }
}

  1. Последний шаг вызывает @baseclass.DownloadFile для загрузки файла:

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

Он также отлично работает внутри действия "Обновить раздел".

Возможный результат может быть

Спасибо за прочтение.

Другие вопросы по тегам