1. 程式人生 > 實用技巧 >帆軟報表常用功能

帆軟報表常用功能

文章目錄

一、常用連結地址

1.複選框獲取選中的值
2.複選框全選
3.小寫金額轉換大寫金額
4.點選單元格空白處可實現超級連結


5.兩個日期控制元件校驗日期在一定範圍內
6.控制元件常用方法列表(隱藏/可見,可用/不可用)
7.動態列印
8.JS呼叫FR列印方法
9.JS實現自定義匯出檔名稱
10.控制元件實際值和顯示值獲取
11.單元格標識說明
12.特殊字元轉碼
13.excel匯入自由報表
14.excel匯入行式報表
15.填報預覽JS例項
16.清空(重置)查詢條件
17.判斷多項字串至少一項被包含
18.帆軟開發者文件
19.帆軟程式碼包地址
20.角標顏色設定註解
21.自定義陽曆轉陰曆函式

二、常用程式碼整理

1.檢驗所有控制元件條件必須輸入一個

 1 var a=_g().parameterE1.getWidgetByName('a').getValue();
2 var b=_g().parameterE1.getWidgetByName('b').getValue(); 3 if(a=="" && b==""){ 4 alert("至少輸入一個查詢條件!"); 5 return false; 6 } 7 //檢驗輸入值開始必須小於結束 8 if((b-a) >0 ){ 9 alert("開始值不可大於結束值!"); 10 return false; 11 } 12 //檢驗開始日期不可大於結束日期 13 if(a>b){ 14 alert("開始日期不可大於結束日期!"); 15 return false; 16 }

2.檢驗日期在某個輸入範圍內

 1 //控制元件輸入的日期格式為yyyyMMdd的不做日期校驗,需轉換成yyyy-MM-dd格式
 2 var start=this.options.form.getWidgetByName("startdate");
 3 var end=this.options.form.getWidgetByName("enddate");
 4 var a=start.substr(0,4);var b=start.substr(4,2);var c=start.substr(6,2);
 5 var start1=a+"-"+b+"-"+c;
 6 var d=end.substr(0,4);var e=end.substr(4,2);var f=end.substr(6,2);
 7 end1=d+"-"+e+"-"+f;
 8 var startdate1=new Date(start1);//將開始日期轉化成Date型
 9 var enddate1=new Date(end1);//將結束日期轉化成Date型
10 var subdate=(enddate1-startdate1)/(1000*60*60*24);//將兩個日期相減得到的毫秒數轉化成天
11 if(subdate>31){
12 alert("結束日期必須在開始日期31天之內!");
13 return false;
14 }

3.自定義彈出框跳轉其他模板

 1 var iframe=$("<iframe id='inp' name='inp' width='100%' height='100%' scrolling='yes' frameborder='0'>");//對話方塊內iframe引數的命名,預設寬高佔比是100% 可向下滾動
 2 var url='${servletURL}?reportlet=test.cpt&op=write&__cutpage__=v&no='+no+'&para='+para;//no,para為跳轉時傳遞進來的引數
 3 var title='***';
 4 iframe.attr("src",url);//給iframe新增src屬性
 5 var o = {
 6 width:1000,//對話方塊寬度
 7 height:550  //對話方塊高度
 8 };
 9 if(no != 0){
10 FR.showDialog(title,o.width,o.height,iframe,o);//彈出對話方塊
11 }

4.正則校驗輸入值

 1 var ch=this.getValue();
 2 var patrn=/^[0-9]*$/;//正則表示式只允許輸入0-9的數字
 3 if(ch==""){
 4     FR.Msg.alert(FR.i18n,Alert,"請輸入值!");
 5     return false;
 6 }
 7 if(!patrn.test(ch)){//做正則匹配
 8     FR.Msg.alert(FR.i18n,Alert,"請輸入正確值!");
 9     return false;
10 }

5.日期控制元件管控日期輸入範圍(控制元件編輯後事件)

 1 //寫於日期開始控制元件
 2 var datebegin=this.options.form.getWidgetByName("datebegin").getValue();
 3 var dateend=this.options.form.getWidgetByName("dateend").getValue();
 4 var date=FR.remoteEvaluate("format(MONTHDALTA(format('"+dateend+"','yyyy-MM-dd'),-1),'yyyyMMdd')");
 5 var date2=FR.remoteEvaluate("format(today(),'yyyyMMdd')");
 6 if(datebegin<date && dateend != ""){
 7     FR.Msg.alert("提示","日期差不得大於一個月");
 8     return false;
 9 }
10 //寫於日期結束控制元件
11 var datebegin=this.options.form.getWidgetByName("datebegin").getValue();
12 var dateend=this.options.form.getWidgetByName("dateend").getValue();
13 var date=FR.remoteEvaluate("format(MONTHDALTA(format('"+datebegin+"','yyyy-MM-dd'),1),'yyyyMMdd')");
14 var date2=FR.remoteEvaluate("format(today(),'yyyyMMdd')");
15 if(dateend<datebegin){
16     FR.Msg.alert("提示","結束日期不可小於開始日期");
17     this.options.form.getWidgetByName("datebegin").reset();
18 }
19 else if(dateend>date){
20     FR.Msg.alert("提示","日期差不得大於一個月");
21     this.options.form.getWidgetByName("dateend").reset();
22 }

6.起始日期編輯後結束日期增加若干天

1 //寫於起始日期編輯結束事件
2 var date=new Date(this.getValue());
3 var date2=new Date();
4 date2.setTime(date1.getTime()+(7*24*60*60*1000));//在date1的基礎上加7天
5 this.options.form.getWidgetByName("endtime").setValue(date2);//將新增後的日期賦值給結束日期控制元件

7.複選框批量列印

 1 //--**1.全選按鈕狀態改變事件
 2 var flag=this.getValue();  
 3 //獲取當前複選框控制元件的狀態,true /false
 4 for(var i=0;i<window.lineboxes.length;i++){            //迴圈遍歷每個複選控制元件
 5 var cr=FR.cellStr2ColumnRow(window.lineboxes[i].options.location);
 6                                          //由每個控制元件位置獲取行號列號
 7 _g().setCellValue(cr.col, cr.row, flag);            //逐一賦值當前狀態
 8 }
 9 //--**2.單選按鈕初始化事件
10 if (!window.lineboxes) {  
11     window.lineboxes = [];  
12 }  
13 lineboxes[lineboxes.length] = this;
14 //狀態改變事件
15 //當前複選框未選擇時,設定全選不選中  
16 if(this.getValue()==false){  
17     _g().setCellValue('D3',null,false);  
18 } else {  
19 var allChecked=true;  
20 //迴圈判斷所有複選框都選中時,將全選複選框選中  
21 for(var i=0;i<lineboxes.length;i++){  
22     if(lineboxes[i].getValue()==false){  
23         allChecked=false;  
24     }  
25 }  
26 //如果全選中時,自動讓A1全選複選框選中  
27 _g().setCellValue('D3',null,allChecked);  //D3為全選按鈕所在位置
28 }  
29 //--**3.列印按鈕點選事件
30 var currno=_g().parameterEl.getWidgetByName('currno').getValue();
31 var branch=_g().parameterEl.getWidgetByName('branch').getValue();
32 var hand=_g().parameterEl.getWidgetByName('hand').getValue();
33 var cells=[];            
34 for(var i=0;i<window.lineboxes.length;i++){            
35   if(window.lineboxes[i].getValue()==true){ 
36 var cr=FR.cellStr2ColumnRow(window.lineboxes[i].options.location);  
37   var co=cr.col;
38    var ro=cr.row;  
39   var a='test.cpt';   //呼叫的列印模板
40   var itemno=contentPane.getCellValue(co+1, ro);//所取數所在列
41   var trdate=contentPane.getCellValue(co+6, ro); 
42   var f="{reportlet:'"+a+"',itemnum:'"+itemno+"',branch:'"+branch+"',currno:'"+currno+"',trdate:'"+trdate+"',hand:'"+hand+"',&__cutpage__=v}";
43     cells.push(f);
44   //alert(cells);
45   }   }                 
46 
47 var printurl="${servletURL}";
48 var k=cells.join(",");
49 if(k.length==0)
50 {
51     alert("請勾選要列印的內容");
52     return false;
53     }
54 var reportlets="["+k+"]";
55                var config = {      
56                 url : printurl,      
57                 isPopUp : false,    
58                  data : {      
59                     reportlets: reportlets      
60                 }      
61         };   
62 
63         FR.doURLPDFPrint(config);
64 //若不需列印,傳數呼叫也可以(k中放入所需傳遞值的列表)
65 var REPORT_URL='/WebReport/ReportServer?reportlet='+a+'&P_STATDATE='+P_STATDATE+'&op=write&__cutpage__=v&k='+k;
66 window.open(FR.cjkEncode(REPORT_URL)); 
67 //  /WebReport/ReportServer = ${servletURL}
68 //呼叫模板資料集中接收k
69 ${if(len(k)=0,"and 1=0","and aa in('"+SUBSTITUTE(k,",","','")+"')")}

8.JS中執行SQL語句

1 /*
2 fanruan:對應使用的資料連線
3 con:對應使用的引數
4 loan_org:獲得sql執行結果
5 */
6 var sql = "SQL(\"fanruan\",\"SELECT a from test where 1=1  and test.b='"+con+"'\",1,1)"
7 var loan_org = FR.remoteEvaluate(sql);

9.單元格按鈕控制元件獲取單元格的值

1 var location = this.options.location;  
2 var cr = FR.cellStr2ColumnRow(location);//獲取當前控制元件的位置
3 var ro = cr.row;  //行號(點選了的按鈕所在的行號)
4 var applyid = $("tr[tridx="+ro+"]","div.content-container").children().eq(0).html();//第一列(A)ro 行對應的值
5 var contractnum = $("tr[tridx="+ro+"]","div.content-container").children().eq(1).html();//第二列(B)ro 行對應的值
6 var cert_no = $("tr[tridx="+ro+"]","div.content-container").children().eq(7).html();//第六列(H)ro 行對應的值

10.按鈕控制元件結合文字控制元件跳轉新模板並回傳選中值

 1 /*main.cpt中文字控制元件中嵌入的按鈕點選事件*/
 2 
 3 var branchs=_g().parameterEl.getWidgetByName('branch').getValue();
 4 var datebeg=_g().parameterEl.getWidgetByName('datebegin').getValue();
 5 var dateends=_g().parameterEl.getWidgetByName('dateend').getValue();
 6 var count=_g().parameterEl.getWidgetByName('count').getValue();
 7 var currnos=_g().parameterEl.getWidgetByName('currno').getValue();
 8 /*以上是事件中想要拿到的引數*/
 9 var $iframe = $("<iframe id='inp' name='inp' width='100%' height='100%' scrolling='no' frameborder='0'>"); // iframe引數的命名及寬高等
10 $iframe.attr("src", "${servletURL}?reportlet=test.cpt&op=write&branch="+branchs+"&datebegin="+datebeg+"&dateend="+dateends+"&count="+count+"&currno="+currnos); //對話方塊中顯示的子報表test.cpt
11 var o = {
12 title : "賬號提示",
13 width : 800,
14 height: 700
15 };//設定對話方塊寬高以及標題
16 FR.showDialog(o.title, o.width, o.height, $iframe,o);
17 
18 /*test.cpt需要選中的單元格中寫JavaScript指令碼*/ 
19 
20 //window.parent.location.reload(); //重新整理
21 url='${servletURL}?reportlet=main.cpt&op=write&__cutpage__=v'
22 window.parent.location.replace(url+"&count="+count+"&branch="+branchs+"&datebegin="+datebeg+"&dateend="+dateends+"&currno="+currnos); //回傳引數(引數為新模板獲得的引數,引數名需要跟main.cpt中的控制元件名一致,可以回顯)

11.根據條件選用不同模板列印

 1 /*列印按鈕點選事件(複選框控制元件設定為A列)*/
 2 var g=[];            
 3 for(var i=0;i<window.lineboxes.length;i++){ //行迴圈      
 4   if(window.lineboxes[i].getValue()==true){ //當複選框勾上時要走的邏輯
 5 var cr=FR.cellStr2ColumnRow(window.lineboxes[i].options.location);  
 6   var co=cr.col;
 7   var ro=cr.row;    
 8   var a='test.cpt';
 9   var a1='test1.cpt';
10   var a2='test2.cpt';
11   var a3='test3.cpt';
12   var d=contentPane.getCellValue(co+4,ro);//獲取當前行第5列的值
13   var f=contentPane.getCellValue(co+5,ro);//獲取當前行第6列的值
14   var loan_org=contentPane.getCellValue(co+6,ro);//獲取當前行第7列的值
15   var tiexi=contentPane.getCellValue(co+7,ro);//獲取當前行第8列的值
16   if(loan_org=='###') //判斷條件 :不同條件使用不同的模板     
17   {
18       if(tiexi==0){var u="{reportlet:'"+a2+"',ar:'"+f+"',cnum:'"+d+"'}";}       else
19       var u="{reportlet:'"+a3+"',ar:'"+f+"',cnum:'"+d+"'}";}
20        else if(f==0)
21   {var u="{reportlet:'"+a+"',cnum:'"+d+"'}";}
22   else
23   {var u="{reportlet:'"+a1+"',ar:'"+f+"',cnum:'"+d+"'}";}
24  g.push(u);
25 // alert(u);
26  } 
27 }  
28 var printurl="${servletURL}";
29 var rp=g.join(",");
30 var reportlets="["+rp+"]";
31                var config = {      
32                 url : printurl,      
33                 isPopUp : false, 
34                 data : {      
35                     reportlets: reportlets      
36                 }      
37         };   
38 FR.doURLPDFPrint(config); 

12.自定義函式執行儲存過程

 1 /*
 2 1.uuid函式用於生成UUID;
 3 2.函式ExcProc配置位置:WebReport\WEB-INF\classes\com\fr\function
 4            原始檔位置:見連結
 5            引數說明:入參形式只有String、Int型,出參有幾個就寫幾個'OutParameter','VARCHAR'
 6 3.該JS是呼叫儲存過程後臺執行,判斷是否執行成功
 7 */
 8 function uuid() {
 9     var s = [];
10     var hexDigits = "0123456789abcdef";
11     for (var i = 0; i < 36; i++) {
12         s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
13     }
14     s[14] = "4";  // bits 12-15 of the time_hi_and_version field to 0010
15     s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1);  // bits 6-7 of the clock_seq_hi_and_reserved to 01
16     s[8] = s[13] = s[18] = s[23] = "-";
17     var uuid = s.join("");
18     return uuid;
19 }
20 var i_uid = uuid();
21 var Widget1 = this.options.form.getWidgetByName("button0");
22 Widget1.setEnable(true);
23 var val = "ExcProc('RGRP','{call RGRP.prc_gj_chk_002(?,?,?,?,?,?)}','String','"+i_datadate+"','String','"+i_uid+"','Int','"+i_clearbad_num+"','Int','"+i_abs_num+"','Int','"+i_redrush_num+"','OutParameter','VARCHAR')";
24 var a = FR.remoteEvaluate(val);
25 var flag = a[0];
26 if(flag == "SUCCESS"){
27  _g().parameterCommit();
28   var iframe = $("<iframe id='inp' name='inp' width='100%' height='100%' scrolling='yes' frameborder='0'>"); // 對話方塊內 iframe 引數的命名,預設寬高佔比是 100%,可向下滾動 
29 var url = '${servletURL}?reportlet=VehicleRpt/VehicleRptMonitor/gj_chk_result002.cpt&op=write&__cutpage__=v&baldate=' +querydate+'&uid='+i_uid;
30 var title = '校驗資訊';
31 iframe.attr("src", url); // 給 iframe 新增 src 屬性
32 var o = {  
33 width : 1000,  //對話方塊寬度
34 height: 550  //對話方塊高度
35 }; 
36 FR.showDialog(title,o.width, o.height, iframe,o);//彈出對話方塊
37 
38 }else{
39  alert("校驗失敗,請檢查!");
40  return false;
41 };

三、常用公式整理

 1 //[日期和時間函式](https://help.finereport.com/doc-view-819.html)
 2 1.DATEINMONTH(today(),1) //獲取當月第一天日期
 3 2.DATEINMONTH(today(),-1) //獲取當月最後一天日期
 4 3.DATEINMONTH(today()-day(today()),1)//獲取上月第一天日期
 5 4.DATEINMONTH(today()-day(today()),-1)//獲取上月最後一天日期
 6 5.today()-day(today())//表示當前日期減去當前月已發生的天數,結果是上月最後日期
 7 6.DAYSOFMONTH(today())//獲取當月天數
 8 7.if(LEN(GREPARRAY(SPLIT("實際控制人", ";"), INARRAY(item, IF(FIND(";", ds1.select(ACCOUNT_POST_TYPE)) > 0, SPLIT(ds1.select(ACCOUNT_POST_TYPE), ";"), ARRAY(ds1.select(ACCOUNT_POST_TYPE)))) > 0)) > 0,"","")
 9 //在ds1.select(ACCOUNT_POST_TYPE)的結果中查詢"實際實際控制人",找到顯示■,否則顯示□;ds1.select(ACCOUNT_POST_TYPE)的結果可以是“實際控制人”,可以是“實際控制人;正式員工;中國人” 等字串
10 8.TRIM(RIGHT(SUBSTITUTE(A1," ",REPT(" ",99)),99)) //擷取最後一個空格後邊的字串
11 9."截至日期:"+if(len(rdate)==0,format(DATEINMONTH(today()-day(today()),-1),"yyyy年MM月dd日"),format(DATEINMONTH(format(CONCATENATE(rdate,"01"),"yyyy-MM-dd"),-1),"yyyy年MM月dd日")) //日期控制元件rdate若未輸入則使用上月最後一天日期,輸入則換算輸入月份最後日期(日期格式為yyyyMM)

https://blog.csdn.net/haidao_mumu/article/details/83586736?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~first_rank_v2~rank_v28-3-83586736.nonecase&utm_term=%E5%B8%86%E8%BD%AF%E6%8A%A5%E8%A1%A8%20%E8%8E%B7%E5%8F%96%E5%89%8D%E6%9C%88%E7%AC%AC%E4%B8%80%E5%A4%A9&spm=1000.2123.3001.4430