代码之家  ›  专栏  ›  技术社区  ›  Joseph Caruana

以编程方式生成报告

  •  2
  • Joseph Caruana  · 技术社区  · 7 年前

    假设我已经使用Acumatica报表设计器创建了一个报表,并且它链接到了相关的DAC。

    我还有一个带有动作的自定义屏幕。当用户执行此操作时,我希望生成报告,以便用户将其下载为pdf。

    通过Acumatica API以编程方式将报告生成为PDF的方法是什么?

    3 回复  |  直到 7 年前
        1
  •  2
  •   RuslanDev Simon ML    7 年前

    有关如何以编程方式将报告生成为PDF文件并显示SaveFileDialog以下载/保存生成的PDF的示例,请参阅下面的代码段:

    public PXAction<IOITInboundTestWorkOrder> GenerateReportAndRedirectToFile;
    [PXButton]
    [PXUIField(DisplayName = "Generate Report and Download as PDF")]
    protected void generateReportAndSaveToDB()
    {
        Actions.PressSave();
        PXLongOperation.StartOperation(this, () =>
        {
            PX.SM.FileInfo file = null;
            using (Report report = PXReportTools.LoadReport("SO641012", null))
            {
                var orderNbr = ITWO.Current.OrderNbr;
                if (report == null) throw new Exception("Unable to access Acumatica report writter for specified report : " + "SO641012");
                Dictionary<string, string> prams = new Dictionary<string, string>();
                prams["ITWONbr"] = orderNbr;
                PXReportTools.InitReportParameters(report, prams, PXSettingProvider.Instance.Default);
                ReportNode repNode = ReportProcessor.ProcessReport(report);
                IRenderFilter renderFilter = ReportProcessor.GetRenderer(ReportProcessor.FilterPdf);
    
                using (StreamManager streamMgr = new StreamManager())
                {
                    renderFilter.Render(repNode, null, streamMgr);
                    string fileName = string.Format("Inbound Test Work Order #{0}.pdf", orderNbr);
                    file = new PX.SM.FileInfo(fileName, null, streamMgr.MainStream.GetBytes());
                }
            }
            if (file != null)
            {
                throw new PXRedirectToFileException(file, true);
            }
        });
    }
    
        2
  •  1
  •   June B    6 年前

    如果不想公开URL,可接受的方法似乎是调用一个方法将文件存储到Acumatica记录,然后通过API检索文件: Get report output in PDF fromat via Acumatica REST API

        3
  •  -1
  •   micwallace    3 年前

    由于我使用的是REST API,并且由于某种原因,PXRedirectToFileException确实可以在那里工作(它不返回位置头),所以我对接受的答案有问题。我想出了一个非常笨拙的解决方案,导致文件URL在异常中公开。

    using SiteStatus = PX.Objects.IN.Overrides.INDocumentRelease.SiteStatus;
    using System.Linq;
    using PX.Common;
    using CRLocation = PX.Objects.CR.Standalone.Location;
    using PX.Objects.AR.CCPaymentProcessing;
    using PX.Objects.AR.CCPaymentProcessing.Common;
    using PX.Objects.AR.CCPaymentProcessing.Helpers;
    using PX.Objects.Common;
    using PX.Objects;
    using PX.Objects.SO;
    using PX.Reports;
    using PX.Reports.Data;
    using PX.Data.Reports;
    using PX.SM;
    
    namespace PX.Objects.SO
    {
      
      public class SOInvoiceEntry_Extension:PXGraphExtension<SOInvoiceEntry>
      {
    
        #region Event Handlers
        protected virtual void ARInvoice_RowSelected(PXCache cache, PXRowSelectedEventArgs e){
            CreateInvoicePDF.SetEnabled(true);
        }
    
         public PXAction<ARInvoice> CreateInvoicePDF;
         [PXButton]
         [PXUIField(DisplayName = "Create Invoice PDF", Enabled = true, Visible = false)]
         public virtual void createInvoicePDF()
         {
                //Report Paramenters
                Dictionary<String, String> parameters = new Dictionary<String, String>();
                parameters["DocType"] = Base.Document.Current.DocType;
                parameters["RefNbr"] = Base.Document.Current.RefNbr;
    
                //Report Processing
                PX.Reports.Controls.Report _report = PXReportTools.LoadReport("SO643000",null);
                PXReportTools.InitReportParameters(_report, parameters, SettingsProvider.Instance.Default);
                ReportNode reportNode = ReportProcessor.ProcessReport(_report);
    
                // Generate PDF
                byte[] data = PX.Reports.Mail.Message.GenerateReport(reportNode, ReportProcessor.FilterPdf).First();
                FileInfo file = new FileInfo(Guid.NewGuid(), "Invoice" + Base.Document.Current.RefNbr + ".pdf", null, data);
    
                // Store data in session
                PXContext.SessionTyped<PXSessionStatePXData>().FileInfo[file.UID.ToString()] = file;
    
                // Include file URL in exception. The client will parse the filname and fetch the URL in a subsequent request.
                PXRedirectToFileException e =  new PXRedirectToFileException(file.UID, 0, true, true);
    
                string url = e.Url;
    
                throw new FileUrlException(url);
         }
    
        #endregion
    
        }
    
        class FileUrlException : PXException {
            public FileUrlException(string message) : base(message) {
    
            }
        }
    
    }
    

    缺点是此操作只能通过API使用。 我将该操作添加到web服务端点。在另一端,我使用regex从异常消息中提取字符串,并执行get请求来获取文件。