Обработайте несколько счетов и покажите их все в одном отчете, например, как «Распечатать отчет по счетам / заметкам» работает в Acumatica - PullRequest
1 голос
/ 12 марта 2020

В основном я хочу создать новую кнопку действия. На экране Print Invoice and Memos вы можете распечатать отчет по выбранным счетам.

Почему мы создаем новую кнопку действия, здесь нам нужно распечатать разные форматы для каждого счет-фактура (тип SO), поэтому, когда пользователь выбирает 3 разных записи в сетке для примера 1. INV1234 и т. д. типа TS, тогда мне нужно распечатать отчет xyz 2. INV9875, и он не был создан через SO, тогда мне нужно напечатать AB C отчет 3. CRM4567 и тип SO - это TS (как вышеупомянутый вариант 1)

, поэтому здесь 1 и 3 должны печататься на одной странице (как то же самое, как кнопка процесса работает в acumatica по умолчанию) 2 отчет отчета опции должен печататься в Новая вкладка.

Если я получу образец кода для печати того же отчета на одной странице, а другой на другой вкладке - это нормально.

Ниже приведен код

public PXAction<PrintInvoicesFilter> PrintReport;
        [PXUIField(DisplayName = "Print Sales Invoice with Price", MapEnableRights = PXCacheRights.Select, MapViewRights = PXCacheRights.Select)]
        [PXLookupButton]
        public virtual IEnumerable printReport(PXAdapter adapter, [PXString] string reportID)
        {
            PXReportRequiredException ex = null;

            foreach (ARInvoice doc in Base.ARDocumentList.Cache.Cached)
            {
                var parameters = new Dictionary<string, string>();
                if (doc.Selected == true)
                {
ARTran TranData = PXSelectReadonly<ARTran, Where<ARTran.tranType, Equal<Required<ARTran.tranType>>,
                        And<ARTran.refNbr, Equal<Required<ARTran.refNbr>>>>>.Select(Base, doc.DocType, doc.RefNbr);

                    if (TranData != null)
                    {
                        if (TranData.SOOrderType == "WS" || TranData.SOOrderType == "WO" || TranData.SOOrderType == "TS" || TranData.SOOrderType == "IM")
                        {
                            if (reportID == null) reportID = "KR501011";

                            if (reportID == "KR501011")
                            {
                                parameters["DocType"] = doc.DocType;
                                parameters["RefNbr"] = doc.RefNbr;
                            }
                            ex = PXReportRequiredException.CombineReport(ex, "KR501011", parameters,false);
                        }
if (TranData.SOOrderType == "RX")
                        {
                            if (reportID == null) reportID = "KR501016";

                            if (reportID == "KR501016")
                            {
                                parameters["DocType"] = doc.DocType;
                                parameters["RefNbr"] = doc.RefNbr;
                            }
                            ex = PXReportRequiredException.CombineReport(ex, "KR501016", parameters,false);
                        }

                        if (string.IsNullOrEmpty(TranData.SOOrderType))
                        {
                            if (reportID == null) reportID = "KR501038";

                            if (reportID == "KR501038")
                            {
                                parameters["DocType"] = doc.DocType;
                                parameters["RefNbr"] = doc.RefNbr;
                            }
                            ex = PXReportRequiredException.CombineReport(ex, "KR501038", parameters,false);
                        }
                    }
                }
            }
if (ex != null)
            {
                ex.Mode = PXBaseRedirectException.WindowMode.New;
                ex.SeparateWindows = false;
                throw ex;
            }

Заранее спасибо.

1 Ответ

0 голосов
/ 12 марта 2020

Перенаправление на несколько отчетов или объединение нескольких отчетов в одном документе может быть достигнуто только с помощью метода PXReportRequiredException.CombineReport.

Исключение перенаправления имеет два варианта управления объединением отчетов:

  1. Печать всего отчета в виде одного файла PDF - напр. Отдельный Windows = false;

  2. Открытие каждого отдельного отчета в новой вкладке - напр. Отдельный Windows = верно;

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

Причина ограничения заключается в том, что для перенаправления в отчет необходимо сгенерировать исключение. После создания исключения вы больше не сможете выполнять код для запуска нового отчета. Можно распечатать несколько отчетов с одним исключением, как описано ниже, но вам нужно выбрать между всеми отчетами на одной вкладке (один и тот же документ) или одним отчетом на вкладку (один документ на отчет).

Источник блога: https://asiablog.acumatica.com/2017/03/launch-multiple-reports-with-one-exception.html

Пример кода из этого блога:

PXReportRequiredException ex = null;

if(row.ARRefNumber != null)
{
  Dictionary<string, string> dictionary = new Dictionary<string, string>();
  dictionary["DocType"] = row.ARDocType;
  dictionary["RefNbr"] = row.ARRefNumber;
  ex = PXReportRequiredException.CombineReport(ex, row.ARBatchNumber == null ? "AR610500" : "AR622000", dictionary, false);
}

if (row.APRefNumber != null)
{
  APInvoice inv = PXSelectorAttribute.Select<DocHeader.aPRefNumber>(Document.Cache, row) as APInvoice;
  Dictionary<string, string> dictionary = new Dictionary<string, string>();
  dictionary["DocType"] = row.APDocType;
  dictionary["RefNbr"] = row.APRefNumber;
  dictionary["PeriodTo"] = PX.Objects.GL.OpenPeriodAttribute.FormatForDisplay(inv.FinPeriodID);
  dictionary["PeriodFrom"] = PX.Objects.GL.OpenPeriodAttribute.FormatForDisplay(inv.FinPeriodID);
  ex = PXReportRequiredException.CombineReport(ex, row.APBatchNumber == null ? "AP610500" : "AP622000", dictionary, false);
}

if (ex != null)
{
  ex.Mode = PXBaseRedirectException.WindowMode.New;
  ex.SeparateWindows = true;
  throw ex;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...