【Dynamics365】建立報表
阿新 • • 發佈:2018-12-17
建立報表有三種資料來源可以選擇,這裡主要講最常用的資料供應器(Report Data Provider)
建立一張臨時表:Add>New Item>Table
- 命名規範:尾部加Tmp
- 檢視屬性,設定 TableType 為 TempDB
- 新增報表中需要用到的資料欄位:Fields>New
建立Query查詢:Add>New Item>Query
- 命名規範:尾部加Query
- 新增資料來源:Data Sources>New Data Source,檢視屬性,在Table填入實體表的名字,設定Dynamic Fields為Yes
- 如果需要子表,在已新增的資料來源中再次Data Sources>New Data Source,在子資料來源中Relations>New Relation新增與父表的關係,在AOT中查詢關係,開啟Relation屬性,Join Data Source填入父表名,Field填入父表連線欄位,Related Field填入當前表字段
建立一個引數類,用於處理對話方塊,包括引數及互動:Add>New Item>Class
- 命名規範:尾部加Contract
- 編寫程式碼
//字串DataContractAttribute指示此類是資料協定,[]表示它是一個屬性 [DataContractAttribute] class UNI_StockReportDetailsContract { //宣告需要的引數成員 TransDate transDate; str packedQuery; //DataMemberAttribute傳過來的 RecId ,使用SysOperationLabelAttribute屬性指定標籤 [DataMemberAttribute,SysOperationLabelAttribute(literalStr("@SYS11284"))] public TransDate parmTransDate(TransDate _transDate = transDate) { transDate = _transDate; return transDate; } //使用AifQueryTypeAttribute指定查詢,查詢KlForCustomers只是AOT中的一個查詢,其中CustTable作為資料來源 [DataMemberAttribute,AifQueryTypeAttribute('_packedQuery', querystr(KlForCustomers))] public str parmQuery(str _packedQuery = packedQuery) { packedQuery = _packedQuery; return packedQuery; } //To get the query: public Query getQuery() { return new Query(SysOperationHelper::base64Decode(packedQuery)); } //To set the query: public void setQuery(Query _query) { packedQuery = SysOperationHelper::base64Encode(_query.pack()); }
建立一個啟動類:Add>New Item>Class
- 命名規範:尾部加Controller
- 編寫程式碼
public class UNI_StockReportDetailsController extends SrsReportRunController { public static void main(Args _args) { UNI_StockReportDetailsController controller = new UNI_StockReportDetailsController(); //ssrsReportStr 兩個引數(報表名稱,報表中的deign) controller.parmReportName(ssrsReportStr(UNI_StockReportDetails,StockReportDetails)); controller.parmArgs(_args); controller.startOperation(); } }
建立一個DP類,用於處理業務邏輯以及填充臨時表:Add>New Item>Class
- 命名規範:尾部加DP
- 編寫程式碼
[ //引數類 SRSReportParameterAttribute(classStr(UNI_StockReportDetailsContract)), //Query 資料 SRSReportQueryAttribute(queryStr(UNI_StockReportDetailsQuery)) ] class UNI_StockReportDetailsDP extends SRSReportDataProviderBase { //臨時資料表 UNI_StockReportDetailsTmp TempDB; //表 InventTrans InventTrans InventTrans; //引數 str RecId; /// <summary> /// 獲取臨時表 /// </summary> /// <returns> UNI_StockReportDetailsTmp </returns> [SrsReportDataSetAttribute(tablestr(UNI_StockReportDetailsTmp))] public UNI_StockReportDetailsTmp getStockReportDetailsTmp() { select TempDB; return TempDB; } public void insertStockReportDetailsTmp() { QueryRun queryRun= new QueryRun(this.parmQuery()); while(queryRun.next()) { InventTrans=queryRun.get(tableNum(InventTrans)); TempDB.clear(); TempDB.RmCode=InventTrans.ItemId; TempDB.Issue=InventTrans.StatusIssue; TempDB.Receipt=InventTrans.StatusReceipt; TempDB.insert(); } } /// <summary> /// 處理報表業務邏輯 /// </summary> [SysEntryPointAttribute] public void processReport() { //傳遞引數 UNI_StockReportDetailsContract Contract=this.parmDataContract(); RecId =Contract.parmRecId(); this.insertStockReportDetailsTmp(); } }
建立一個報表:Add>New Item>Report
- 命名規範:尾部加Report
- 建立一個數據集:Datasets>New DataSet,在資料集的屬性中指定資料來源型別(Data Source Type)為報表資料供應器(Report Data Provider),在屬性查詢(Query)中點選…標記的瀏覽按鈕,在彈出的對話方塊中選擇新建的DP類,點選下一步(Next)並選擇所需要顯示的欄位,然後點選確定(OK)按鈕完成設定。
**注意如果對DP類的引數等進行過改動,建議刪除DataSet,重新建立。同時需要手動刪除報表中Parameters裡面的多餘引數,Parameters引數來自Controller。
建立一個輸出選單項:Add>New Item>Output Menu Item
- 命名規範:尾部加OutputMenuItem
- 檢視屬性,Label是在選單中顯示的名稱,Object是要顯示的報表,Object Type是報表型別,一般都為SSRSReport,Report Design是顯示的設計