翻譯|使用教程|編輯:龔雪|2023-10-18 10:45:21.250|閱讀 105 次
概述:本文主要介紹如何完成Telerik Reporting REST服務和報表服務器的切換,歡迎下載最新版組件體驗!
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
Telerik Reporting擁有直觀、無代碼的Win、網頁與PDF報表的創建功能,直觀的設計與具有特定風格的報表,無代碼數據打包、向導、語法開發工具、自動操作。分類整理、過濾、有條件格式化、轉化器格式,活動報表,水晶報表,附加報表。
本文主要目的是展示在這兩種呈現報表的方法(Telerik Report Server (TRS)和Telerik Reporting REST)之間切換是多么容易,我們還將展示每種方法的優缺點,以及如何同時運行兩種解決方案并在兩者之間切換。
需要注意的一點是:它需要一點設置,您需要有一個ASP. NET Core站點,這用于通過HTML5 Telerik Report查看器調用TRS 和REST報表實例。
技術交流群:726377843 歡迎一起進群討論
對于在TRS和REST報表之間切換的初始設置,我們需要做以下工作:
確保版本與ASP.NET Core站點上的Telerik Reporting版本匹配。
1. 這涉及到創建一個Telerik Reporting REST服務項目,注意:在本例中創建了一個.NET Framework版本的Reporting REST服務,這是因為已經在.NET框架項目中使用了一些用戶函數,這些函數在.NET Core環境中無法工作。另外注意:可以從.NET Core網站和.NET Core Worker調用.NET框架項目(也就是說不需要有一個UI來調用REST項目)。
(或者,您可以使用名為CSharp.NetFramework.ReportingRestServiceCorsDemo的項目。Csproj作為模板隨產品安裝一起分發,如果您不熟悉CORS配置這可能會加快速度。注意:這可以通過初始的Visual Studio Project對話框使用。)
有必要用下面的代碼來修飾Controller類,否則就會出現CORS錯誤。
[EnableCors(origins: "http://staging.buku.uk" , headers: "*", methods: "*") ] public class ReportsController : ReportsControllerBase
2. 另外,有必要將一些報表放在項目根目錄下的一個名為Reports的目錄中,您可以使用子目錄分隔報表。
3. 使用自定義報表解析器來修復由調用函數提供的連接字符串和參數。在大多數情況下,這是一個Telerik HTML5報表查看器,但是后臺任務可以從始終在線的Worker進程中運行。
注意:Booking.Data.NET.Classes.Configuration. _sBookingConnectionString屬性解析為基于_nServerInstance變量的連接字符串,即Dev, Staging或Live。
using System.Collections.Generic; using System.IO; using System.Linq; using Telerik.Reporting; using Telerik.Reporting.Services; using Booking.Library.NET.Classes; namespace Booking.Reporting.NET.REST.Classes { public class CustomReportSourceResolver : IReportSourceResolver { public string ReportsPath { get; set; } public CustomReportSourceResolver(string reportsPath) { this.ReportsPath = reportsPath; } public ReportSource Resolve(string reportId, OperationOrigin operationOrigin, IDictionary<string, object> currentParameterValues) { try { string reportPath = Path.Combine(this.ReportsPath, reportId); var reportPackager = new ReportPackager(); Report report = null; using (var sourceStream = System.IO.File.OpenRead(reportPath)) { report = (Report)reportPackager.UnpackageDocument(sourceStream); } if (currentParameterValues.Any(CPV => CPV.Key == "nServerInstance")) { var lnServerInstance = currentParameterValues.Where(CPV => CPV.Key == "nServerInstance").FirstOrDefault().Value; Booking.Data.NET.Classes.Configuration._nServerInstance = (int)(long)lnServerInstance; } ReportConnectionStringManager loReportConnectionStringManager = new ReportConnectionStringManager(Booking.Data.NET.Classes.Configuration._sBookingConnectionString); ReportSource loReportSource = loReportConnectionStringManager.UpdateReportSource(new InstanceReportSource() { ReportDocument = report }); foreach (var parameter in currentParameterValues) { loReportSource.Parameters.Add(parameter.Key, parameter.Value); } return loReportSource; } catch (System.Exception loException) { Logger.LogException(loException); } return null; } } }
選擇其中一個或另一個的利弊主要與成本有關。雖然TRS是物有所值的,但一些客戶有預算限制,可能會在某些條件下妨礙銷售。Buku平臺被設計為在客戶端基礎設施上運行,客戶端希望這樣做(即,他們自己的服務器和網絡,以及產品,可以完全運行在Windows筆記本電腦上)。所以,如果發現一個想要運行軟件的客戶,他們也必須購買TRS,他們的成本就會顯著上升。
REST解決方案可以呈現與TRS解決方案相同的報表,客戶端唯一的成本是硬盤空間和計算機功率。(在TRS下面是REST服務的實現,它使這種切換場景變得輕松。)請注意,還將有一個云版本,客戶可以在其中注冊使用該產品,并且數據位于安全的云中。
TRS解決方案在能夠從服務器本身運行報表方面有一些額外的優勢,盡管我們沒有在Buku平臺中完全使用這個特性,客戶只能看到Buku平臺報表引擎。目前官方正在計劃一個額外的Reporting模塊,它將允許用戶根據預編程的數據源設計自定義報表。
因此 HTML5 Report Viewer 的配置方式是設計考慮的因素之一,它可以在TRS和REST之間來回切換。
下面是報表查看器的頂部,有幾點需要注意:
1. TRS具有不需要登錄憑據的來賓模式,從URL下面的行中可以看到這一點。
2. REST沒有身份驗證方法,但是將憑據行保留在原來的位置會被忽略。
3. TRS數據源由TRS數據連接器控制,它實際上是一個連接字符串。對于一些較小的報表,也有一些對象數據源。
4. REST程序總是使用_nServerInstance安排來確定連接字符串,這取決于是Dev、Staging還是Live。
5. 不同類型的報表具有不同類型和數量的參數,但是有些報表使用相同的參數和參數類型,可以對多個報表使用相同的塊將它們組合在一起。
$(document).ready(function () { $("#rvMain").telerik_ReportViewer({ reportServer: { url: "@this.Model._sReportingUrl", username: null, password: null }, reportSource: { report: '@this.Model._sReport', parameters: { @switch ((Booking.Library.Classes.Enums.Reports)this.Model._nReport) { case Booking.Library.Classes.Enums.Reports.AdHocSLInvoice1: case Booking.Library.Classes.Enums.Reports.AdHocSLInvoice2: case Booking.Library.Classes.Enums.Reports.AdHocSLCreditNote1: case Booking.Library.Classes.Enums.Reports.AdHocSLCreditNote2: case Booking.Library.Classes.Enums.Reports.AdHocPLInvoice1: case Booking.Library.Classes.Enums.Reports.AdHocPLInvoice2: case Booking.Library.Classes.Enums.Reports.AdHocPLCreditNote1: case Booking.Library.Classes.Enums.Reports.AdHocPLCreditNote2: case Booking.Library.Classes.Enums.Reports.AdHocPLPayment: case Booking.Library.Classes.Enums.Reports.AdHocSLReceipt: { <text> nServerInstance: @Booking.Data.Classes.Configuration._nServerInstance, gTransactionId: '@this.Model._gId.ToString()', gCompanyId: gCompanyId, sCulture: sCompanyCulture </text> } break; case Booking.Library.Classes.Enums.Reports.AdHocDisbursementBatch: { <text> nServerInstance: @Booking.Data.Classes.Configuration._nServerInstance, gBatchId: '@this.Model._gId.ToString()', sCulture: sCompanyCulture </text> } break; case Booking.Library.Classes.Enums.Reports.DisbursementBatch: { <text> nServerInstance: @Booking.Data.Classes.Configuration._nServerInstance, gCompanyId: gCompanyId, dStart: kendo.parseDate('@this.Model._dStart.ToString("dd/MM/yyyy")', "dd/MM/yyyy"), dEnd: kendo.parseDate('@this.Model._dEnd.Date.AddDays(1).ToString("dd/MM/yyyy")', "dd/MM/yyyy"), bPosted: '@this.Model._bPosted.ToString().ToLower()', nReport: @this.Model._nReport, bAll: '@this.Model._bAll.ToString().ToLower()' == 'true', sCulture: sCompanyCulture </text> } break; case Booking.Library.Classes.Enums.Reports.AdHocJournalBatch:
在某些方面,REST報表有一種更簡單的機制來保持報告的最新狀態,磁盤上的報表是最新的,并且總是保存回磁盤,TRS報告需要發布回服務器。
為了管理切換,我使用了兩個控件,一個開關和一個TRS / REST Url字段。開關就是簡單的TRS開或關,包含Url的字段將用于TRS //trs.buku.uk和REST //rs.buku.uk(報表暫存(RS))。
在使用REST后切換回TRS有點麻煩,因為報表在TRS上經常不是最新的,所以需要再次推送。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:慧都網