創建報表有三種數據源可以選擇,這裏主要講最常用的數據供應器(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是顯示的設計