如何在矩陣FastReport.Net中創(chuàng)建自己的總計(jì)
FastReport.Net中的Matrix對(duì)象執(zhí)行用于顯示匯總表的典型任務(wù)。但是,當(dāng)任務(wù)不標(biāo)準(zhǔn)時(shí),只有報(bào)表腳本會(huì)幫助我們。在腳本本身中,您幾乎可以實(shí)現(xiàn)任何要求。 如您所知,矩陣具有內(nèi)置函數(shù),可按字段和列顯示總計(jì)。通常,匯總表中的總數(shù)是金額。如果您想要一個(gè)具有您自己的計(jì)算公式的總計(jì),該怎么辦 如果您想有選擇地顯示某些列的總計(jì)? 要完成所有這些操作,您需要禁用標(biāo)準(zhǔn)總計(jì)并創(chuàng)建自己的列,其中將計(jì)算總計(jì)。但是,如果您仍然使用標(biāo)準(zhǔn)總計(jì),則需要使用AfterTotals矩陣事件使其值也出現(xiàn)在用戶總計(jì)中。它將在構(gòu)建具有所有標(biāo)準(zhǔn)結(jié)果的矩陣之后發(fā)生,以便所有數(shù)據(jù)都可供我們使用。此事件不允許您向矩陣添加和修改數(shù)據(jù),即使用AddValue和SetValue方法。
那么,讓我們來看一個(gè)例子。 使用簡單模板創(chuàng)建矩陣:
要在矩陣中創(chuàng)建維度或指標(biāo),您需要將表達(dá)式插入相應(yīng)的單元格中。因?yàn)槲覀儚拇a填充矩陣,所以我們需要虛擬表達(dá)式來創(chuàng)建結(jié)構(gòu)。為此,請(qǐng)從單元格的“Data”面板中放置任何表達(dá)式,并使用表達(dá)式編輯器清除表達(dá)式的文本。 為矩陣創(chuàng)建AfterData事件處理程序。在其中,我們將添加數(shù)據(jù):
private void Matrix1_AfterData(object sender, EventArgs e) { Matrix1.AddValue(new Object[] { "January", "Salary" }, new Object[] { "1" }, new Object[] { 1000}); Matrix1.AddValue(new Object[] { "January", "Bonus" }, new Object[] { "1" }, new Object[] { 500}); Matrix1.AddValue(new Object[] { "January", "Penalty" }, new Object[] { "1" }, new Object[] { 200}); Matrix1.AddValue(new Object[] { "February", "Salary" }, new Object[] { "1" }, new Object[] { 1000}); Matrix1.AddValue(new Object[] { "February", "Bonus" }, new Object[] { "1" }, new Object[] { 500}); Matrix1.AddValue(new Object[] { "February", "Penalty" }, new Object[] { "1" }, new Object[] { 200}); Matrix1.AddValue(new Object[] { "February", "Total" }, new Object[] { "1" }, new Object[] { 0}); Matrix1.AddValue(new Object[] { "January", "Salary" }, new Object[] { "2" }, new Object[] { 500}); Matrix1.AddValue(new Object[] { "January", "Bonus" }, new Object[] { "2" }, new Object[] { 300}); Matrix1.AddValue(new Object[] { "January", "Penalty" }, new Object[] { "2" }, new Object[] { 250}); Matrix1.AddValue(new Object[] { "February", "Salary" }, new Object[] { "2" }, new Object[] { 500}); Matrix1.AddValue(new Object[] { "February", "Bonus" }, new Object[] { "2" }, new Object[] { 300}); Matrix1.AddValue(new Object[] { "February", "Penalty" }, new Object[] { "2" }, new Object[] { 250}); Matrix1.AddValue(new Object[] { "February", "Total" }, new Object[] { "2" }, new Object[] { 0});}
在這里,我們?yōu)榫仃囍械拿總€(gè)單元格添加值。在我們的例子中,這些是兩行數(shù)據(jù)。請(qǐng)注意,我們?cè)?月份僅添加了一項(xiàng)。雖然它的值為零,但很快我們將在AfterTotals事件中計(jì)算它。 接下來,我們需要一種獲取單元格值的方法:
private float GetValue(int columnIndex) { object value = Matrix1.Data.GetValue(columnIndex, rowIndex, 0); return new Variant(value); }
這很簡單 - 我們傳遞列索引,然后得到值。 我們還需要一個(gè)類變量 - rowIndex: private int rowIndex; 現(xiàn)在讓我們添加一個(gè)為單元格賦值的方法:
private void SetValue(string complexValue, float value) { int columnIndex = Matrix1.Data.Columns.Find(complexValue.Split(';')); Matrix1.Data.SetValue(columnIndex, rowIndex, value); }
現(xiàn)在,讓我們繼續(xù)計(jì)算結(jié)果。為矩陣添加AfterTotals事件處理程序:
private void Matrix1_AfterTotals(object sender, EventArgs e) { int[] rowIndices = Matrix1.Data.Rows.GetTerminalIndices(); for (int i = 0; i < rowIndices.Length; i++) { rowIndex = rowIndices[i]; int[] columnIndices = Matrix1.Data.Columns.GetTerminalIndices(new Object[] { "February" }); float oplataSum = 0; foreach (int columnIndex in columnIndices) { oplataSum += GetValue(columnIndex); } SetValue("February;Total", oplataSum); } }
在這里,我們得到矩陣行的索引數(shù)組。然后,我們循環(huán)遍歷這些行索引。對(duì)于每一行,我們得到一個(gè)列索引數(shù)組。在列索引的循環(huán)中,我們生成了增加的量。最后,我們將收到的金額分配給“二月;總計(jì)”單元格。 現(xiàn)在,運(yùn)行報(bào)表:
正如預(yù)期的那樣,結(jié)果是2月組的輸出。并且還處理來自“員工”總數(shù)的金額。 通過這種方式,我們可以為所需的列和行創(chuàng)建自己的總計(jì)。