1. 程式人生 > 其它 >常見的函式--帆軟

常見的函式--帆軟

函式

陣列的加減乘除運算

  定義:

    所謂陣列,是相同資料型別的元素按一定順序排列的集合。

    若將有限個型別相同的變數的集合命名,那麼這個名稱為陣列名。

    組成陣列的各個變數稱為陣列的分量,也稱為陣列的元素,有時也稱為下標變數。

    用於區分陣列的各個元素的數字編號稱為下標。

    陣列是在程式設計中,為了處理方便,把具有相同型別的若干變數按有序的形式組織起來的一種形式。這些按序排列的同類資料元素的集合稱為陣列。

  分類:

    陣列就是元素的集合,按行、列進行排列。 陣列分為一維陣列和多維陣列。

    單行或多列的陣列,我們稱為一維陣列。

    多行多列(含2行2列)的陣列是多維陣列或二維陣列。

  陣列的運算

    一維陣列和二維陣列的運算規律

      1)單行x與陣列arry運算 執行x與arry中每一個元素分別運算並返回結果,也就是與arry本身行列、尺寸一樣的結果。

      比如:2*{1,2;3,4;5,6},執行2*1、2*2、2*3、2*4、2*5、2*6運算,並返回3行2列的二維陣列結果{2,4;6,8;10,12},如下圖所示:

      陣列中行和列分別用逗號、分號來間隔。逗號表示行,行之間的關係比較緊密,用逗號分割;列之間,關係相對比較疏遠一點,用分號分割。

      又比如:"A"&{"B","C"}返回{"AB","AC"}。"A"={"B","A","C"}返回{FALSE,TRUE,FALSE}

      也就是說,陣列是可以與單獨字元或數值進行比較、合併、運算等處理的。

      2)同向一維陣列運算 執行arry1與arry2對應位置的元素分別運算並返回結果。要求arry1與arry2尺寸必須相同,否則多餘部分返回#N/A錯誤。

      比如: {1;2;3}*{4;5;6}返回{4;10;18}; {1,2,3,4}*{4,5,6}返回{4,10,18,#N/A},如下圖所示:

      3)異向一維陣列運算 arry1的每一元素與arry2的每一元素分別運算並返回結果,得到兩個陣列的行數*列數個元素,也就是M行陣列與N列陣列運算結果為M*N的矩陣陣列。

      比如:{1;2;3}*{4,5,6,7,8},執行1*4、1*5、1*6、1*7、1*8、2*4、2*5、2*6、2*7、2*8、3*4、3*5、3*6、3*7、3*8,返回{4,5,6,7,8;8,10,12,14,16;12,15,18,21,24}

      4)一維陣列與二維陣列運算 二維陣列其中一個方向與一維陣列同向同尺寸,比如M*N的二維陣列與M行或者N列的陣列運算,

      在同向的運算類似同向一維陣列之間的位置對應,在異向的運算則 類似單值與陣列之間的一一運算。超出尺寸範圍都返回錯誤值。

      例:{1,2,3,4}*{1,2,3,4,5;6,7,8,9,10}即4列一維陣列與2行5列二維陣列運算,列方向上兩個陣列運算按位置一一對應的,不足部分用#N/A補齊,行方向上則是一對多的運算。

      即:1*1,2*2,3*3,4*4,#N/A *5;1*6,2*7,3*8,4*9,#N/A *10;返回{1,4,9,16,#N/A;6,14,24,36,#N/A}。

      5)二維陣列之間運算 要求尺寸相同,並執行相同位置元素一一對應的運算,超出尺寸部分返回錯誤。

      例:{1,2;3,4}*{1,2,3;4,5,6;7,8,9}執行1*1,2*2,3*4,4*5,其餘部分用#N/A補齊,返回={1,4,#N/A;12,20,#N/A;#N/A,#N/A,#N/A}

增強公式編輯器

  解決方案:

    1.1 安裝外掛

      設計器外掛管理

      伺服器外掛管理

      注:該外掛推薦用於2017年12月20日之後的9.0版本,之前的版本雖然也能用,但是存在一些介面操作和設計器新增行列是公式不能自動變化的BUG,另外不能使用內建的int、number和array函式。

      注:安裝了該外掛的並且使用了指令碼公式的模板,在沒有安裝該外掛的伺服器上依然可以執行,只是在沒有安裝該外掛的設計器上無法進行編輯。

    1.2 增強公式編輯器檢視

      先來看一看安裝了增強公式編輯器後的公式編輯介面檢視,如下圖所示:

      除了可以支援常規公式和指令碼公式外,還能提供實時計算功能,免去了每次寫公式之後要知道計算結果,還得預覽一次報表的煩惱。

  使用教程:

    3.1 邏輯判斷函式的使用

      隨意的新建一張報表,在A1格子中寫入公式:=RAND() * 60,該公式的含義是返回一個0到60之間的隨機數。我們需要A2格子的值根據A1格子的值的不同而不同——當A1格子的值為0到10之間的時候,A2格子的值為1,在10到20之間的時候,A2格子的值為2,如此類推,在50到60之間的時候,A2格子的值為6。

      為了實現這個功能,我們可以採用條件屬性中的新值、也可以採用常規公式中的SWITCH函式,這兩種實現我們不再多說,新增條件屬性肯定是很麻煩的,用SWITCH函式要稍微好些。

      下面我們用指令碼公式可以比較簡潔的方式來實現,在A2格子中增加一個公式,切換為指令碼公式,並輸入內容:

  1. vara1=number('${A1}');if(a1>=0&&a1<10){return1;}elseif(a1>=10&&a1<20){return2;}elseif(a1>=20&&a1<30){return3;}elseif(a1>=30&&a1<40){return4;}elseif(a1>=40&&a1<50){return5;}elseif(a1>=50&&a1<=60){return6;}

      當然,這個示例只是為了體現使用多個if的場景,實際上這個完全是可以簡化成

  1. vara1=number('${A1}');returnint(a1/10)+1;

      效果如下圖:

    3.2 迴圈函式的使用

除了可以使用邏輯判斷函式以外,指令碼公式最大的優勢就在於可以使用迴圈函式,比如遍歷一個數組,過濾出需要的值。

考慮下面一種場景:

A1格子是一個隨機的從1到20的陣列,用公式:=range(1, rand()*20, rand() * 3)可以大致模擬,希望A2的值是A1中值大於5的數減一形成的新陣列,這種情況用現有的常規公式實現就會比較麻煩,但是用指令碼公式則很輕鬆:

  1. vara1=array('${A1}');varr=[];a1.forEach(function(value,index){if(value>5){r.push(value-1);}});returnr;
效果如下圖:
3.3 巢狀常規函式 在指令碼函式中,可以出了可以使用單元格和引數外,也可以正常的呼叫常規的公式,比如要求和,可以採用如下的方式:
  1. varr=number('${sum(A1:D1)}');if(r<5){return"彙總值小於5";}else{return"彙總值不小於5";}
這樣就可以求出A1到D1的所有格子的的和,並且當和大於5的時候,A2格子的值為:彙總值小於5,當和大於等於5的時候,A2格子的值為:彙總時不小於5。 效果如下圖:

4. 輔助函式編輯

在指令碼公式中,內建了3個函式,用於處理不同的數值型別:

函式名作用呼叫方式
int 將引數轉換為整數 var x = int('${A2}');
number 將引數轉換為浮點數 var y = number('${A3}');
array 將引數轉換為陣列 var z = array('${A4}');

5. 實時計算編輯

在編輯公式的過程中,比較痛苦的就是雖然實際變數不多,但是公式的邏輯比較複雜,每次修改了公式,都得點選報表的預覽,才能知道修改正確了沒有。增強公式編輯器外掛就為了解決這個問題而提供了實時計算的功能。

我們就以上面的迴圈函式使用為例子,直接點選實時計算:

輸入變數值之後直接點選確定,可以看得到計算結果:

6. 語法規則編輯

公式中的指令碼完全遵循ECMAScript3語法規則,支援大部分ES5語法規則,具體使用文件可以參考:http://wiki.jikexueyuan.com/project/javascript/syntax.html

友情連結:  

數知鳥文件連結:https://help.fanruan.com/shuzhiniao/

數知鳥是帆軟推出的一款企業級的資料需求管理平臺

帆軟考試認證:http://bbs.fanruan.com/thread-108404-1-1.html

      

擁有自信,努力奮鬥,保持樂觀積極地情緒,逆著陽光,成功就在前方。自己選擇的路,放棄者絕不會成功,成功者絕不放棄。