一、常用鏈接地址
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;//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)