{"id":4797,"date":"2021-03-30T10:45:30","date_gmt":"2021-03-30T09:45:30","guid":{"rendered":"https:\/\/solidt.eu\/site\/?p=4797"},"modified":"2022-02-08T11:12:47","modified_gmt":"2022-02-08T10:12:47","slug":"uniconta-userreportapi-devexpress-reports","status":"publish","type":"post","link":"https:\/\/solidt.eu\/site\/uniconta-userreportapi-devexpress-reports\/","title":{"rendered":"Uniconta UserReportAPI (DevExpress reports)"},"content":{"rendered":"\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"csharp\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">\/\/ using DevExpress.XtraReports.UI;\n\/\/ using Uniconta.API.Service;\n\/\/ using Uniconta.API.System;\n\/\/ using Uniconta.ClientTools;\n\/\/ using Uniconta.ClientTools.Controls;\n\/\/ using Uniconta.ClientTools.DataModel;\n\/\/ using Uniconta.ClientTools.Page;\n\/\/ using Uniconta.DataModel;\n\/\/ using Uniconta.Reports.Utilities;\n\/\/ using UnicontaClient.Pages;\n\nprivate static async Task&lt;XtraReport> LoadReport&lt;T>(CrudAPI api, string reportName) where T : UserReportDevExpressClient, UnicontaBaseEntity, new()\n{\n\tvar apiWrapper = new ApiWrapper&lt;T>(api);\n\n\tvar reportRow = (await apiWrapper.Filter()\n\t   .WhereEqual(x => x.Name, reportName)\n\t   .Run()).FirstOrDefault();\n\n\treturn await GetReportInternal(api, reportName, reportRow);\n}\n\nprivate static async Task&lt;byte[]> GetByteArrayFromReport(XtraReport report)\n{\n\tvar stream = new MemoryStream();\n\tawait report.ExportToPdfAsync(stream, new PdfExportOptions());\n\tstream.Position = 0;\n\treturn stream.ToArray();\n}\n\nprivate static async Task&lt;XtraReport> GetReportInternal(CrudAPI api, string reportName, UserReportDevExpressClient reportRow)\n{\n\tif (reportRow == null)\n\t\tthrow new Exception($\"Kon rapport '{reportName}' niet vinden!\");\n\t\/\/ Load Layout bytes in repord\n\t_ = await api.Read(reportRow);\n\tvar reportLayout = reportRow.Layout;\n\tif (reportLayout == null)\n\t\tthrow new Exception($\"Kon rapport '{reportName}' layout niet laden!\");\n\n\tXtraReport report;\n\ttry\n\t{\n\t\treport = ReportUtil.GetXtraReportFromLayout(reportLayout);\n\t}\n\tcatch (Exception)\n\t{\n\t\treport = null;\n\t}\n\n\tif (report == null)\n\t\tthrow new Exception($\"Kon rapport '{reportName}' niet laden! (error while loading layout)\");\n\n\treturn report;\n}\n\nprivate static async Task&lt;UserDocsClient> GetOfferReportBasedOnProjectType(CrudAPI api, GiftProject giftProject, string reportName)\n{\n\tvar report = await LoadReport&lt;UserReportDevExpressClient>(api, reportName);\n\tvar orderService = new OrderService();\n\tvar projectConvertedToOrder = orderService.ConvertProjectToOrder&lt;UniDebtorOffer>(giftProject);\n\tvar lines = orderService.GetOrderlinesForProject&lt;UniDebtorOfferLine>(giftProject);\n\treport.DataSource = ConvertToMasterDetailDataSource(projectConvertedToOrder, lines.ToArray());\n\n\tvar reportAsByteArray = await GetByteArrayFromReport(report);\n\n\treturn new UserDocsClient()\n\t{\n\t\t_Data = reportAsByteArray,\n\t\t_Text = $\"Offerte {giftProject.Code}\",\n\t\t_DocumentType = FileextensionsTypes.PDF\n\t};\n}\n\npublic void ViewUserDoc(UserDocsClient attachment)\n{\n\tViewDocument(\"UserDocsPage3\", attachment);\n}\n\n\n\npublic class CustomPrintReport : IPrintReport\n{\n\tpublic DevExpress.XtraReports.UI.XtraReport Report { get; set; }\n\n\tpublic Task InitializePrint()\n\t{\n\t\treturn Task.FromResult(0);\n\t}\n}\n\nprivate void SetReportParameter(DevExpress.XtraReports.UI.XtraReport report, string name, object value)\n{\n\tvar p = report.Parameters\n\t\t.AsQueryable()\n\t\t.Cast&lt;DevExpress.XtraReports.Parameters.Parameter>()\n\t\t.FirstOrDefault(x => string.Equals(x.Name, name));\n\n\tif (p == null)\n\t{\n\t\tp = new DevExpress.XtraReports.Parameters.Parameter\n\t\t{\n\t\t\tName = name\n\t\t};\n\t\treport.Parameters.Add(p);\n\t}\n\tp.Value = value;\n}\n\n\nvar reportApi = new UserReportAPI(api);\nvar reportName = \"MyReportName\";\nvar customReport = false;\nif (!string.IsNullOrWhiteSpace(e.ArticleReport))\n{\n\tcustomReport = true;\n\treportName = e.ArticleReport;\n}\n\nbyte[] reportLayout;\nXtraReport report;\n\ntry\n{\n\treportLayout = ThreadsHelper.RunSync(() => reportApi.LoadForRun(reportName, 1));\n\treport = ReportUtil.GetXtraReportFromLayout(reportLayout);\n}\ncatch (Exception ex)\n{\n\tthrow new Exception($\"Kon rapport {reportName} niet laden!\", ex);\n}\nif (report == null)\n\tthrow new Exception($\"Kon rapport {reportName} niet laden! (2)\");\n\nif (customReport)\n{\n\tvar dataSource = new List&lt;UnicontaMasterDetail>();\n\t\/\/var master = productionOrder;\n\n\t\/\/ #1. Laatste productie gereedmeld-regel opzoeken (productie artikel)\n\tvar productionPostedClients = await api.Query&lt;ProductionPostedClient>(productionOrder);\n\tvar productionPostedClient = productionPostedClients.OrderByDescending(x => x.LineNumber).FirstOrDefault();\n\tif (productionPostedClient == null)\n\t\treturn;\n\n\t\/\/ #2. Laatste gereedmeld-detailregel opzoeken\n\tvar invTransClients = await api.Query&lt;InvTransClient>(productionPostedClient);\n\tvar invTransClient = invTransClients.Where(x => x.MovementTypeEnum == InvMovementType.ReportAsFinished).OrderByDescending(x => x.LineNumber).FirstOrDefault();\n\n\t\/\/var filter = new List&lt;PropValuePair>\n\t\/\/{\n\t\/\/    PropValuePair.GenereteWhereElements(nameof(InvSerieBatchClient.Number), e.BatchNumber, CompareOperator.Equal),\n\t\/\/    PropValuePair.GenereteWhereElements(nameof(InvSerieBatchClient.Item), productionOrder.Item, CompareOperator.Equal),\n\t\/\/};\n\n\t\/\/ #3. var de invTransClient de bijbehorende batchnummers opzoeken\n\tvar batchNumbers = await api.Query&lt;InvSerieBatchClient>(invTransClient);\n\t\/\/ Force re-check\n\tvar specificBatchNumbers = batchNumbers.Where(x => x.Number == e.BatchNumber &amp;&amp; x.Item == productionOrder.Item).ToArray();\n\t\n\tdataSource.Add(new UnicontaMasterDetail()\n\t{\n\t\tMaster = invTransClient,\n\t\tDetails = specificBatchNumbers\n\t});\n\t\n\treport.DataSource = dataSource;\n}\nelse\n{\n\treport.DataSource = new List&lt;ProductionOrderClient>() { productionOrder };\n}\nSetReportParameter(report, \"EmployeeNumber\", employee.Number);\nSetReportParameter(report, \"EmployeeName\", employee.Name);\nSetReportParameter(report, \"Quantity\", e.Quantity);\nSetReportParameter(report, \"QuantityToBook\", e.QuantityToBook);\nSetReportParameter(report, \"BatchNumber\", e.BatchNumber);\nSetReportParameter(report, \"Date\", e.Date);\nSetReportParameter(report, \"BatchExpiryDate\", e.BatchExpiryDate);\nSetReportParameter(report, \"ArticleDescription\", e.ArticleDescription);\nSetReportParameter(report, \"ArticleCode\", e.ArticleCode);\nSetReportParameter(report, \"BookingDescription\", e.BookingDescription);\nSetReportParameter(report, \"ProductionDate\", ProductionOrderList.ProductionDate);\nSetReportParameter(report, \"ProductionOrderDescription\", e.ProductionOrderDescription);\n\n\/\/ Via GUI\nDispatcher.Invoke(() =>\n{\n\tIPrintReport printReport = new CustomPrintReport() { Report = report };\n\tvar dockName = $\"{Localization.lookup(\"ProductionOrder\")} {productionOrder.KeyStr}\";\n\tAddDockItem(UnicontaTabs.StandardPrintReportPage, new object[] { new List&lt;IPrintReport> { printReport }, reportName }, dockName);\n});\n\n\n\/\/ As stream \/ byte[]\nvar pdfOptions = new PdfExportOptions() { };\nvar stream = new MemoryStream();\nawait report.ExportToPdfAsync(stream, pdfOptions);\nstream.Position = 0;\nreturn stream.ToArray();\n<\/pre><\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-4797","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/4797","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/comments?post=4797"}],"version-history":[{"count":8,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/4797\/revisions"}],"predecessor-version":[{"id":5980,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/4797\/revisions\/5980"}],"wp:attachment":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/media?parent=4797"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/categories?post=4797"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/tags?post=4797"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}