<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    wuxiren123

    #

    如何給FineReport設置自定義消息提醒工具

         摘要: FineReport設計器有自動的消息推送功能,可設置報表定時推送和常規的日報周報推送。官方有自己的消息推送的接口,不過有些用戶旺旺希望自己開發,符合自己需求的推送界面。 下面這個方案就從邏輯層面簡單闡述一個通訊類應該怎么實現。 廢話不多說直接上代碼,為了保證新手能夠看懂,這個代碼基本上只需要了解JS和JQ的常規寫法就行。 Code highlighting produced by Ac...  閱讀全文

    posted @ 2016-12-22 14:17 喝水居然長肉 閱讀(162) | 評論 (0)編輯 收藏

    FineReport如何部署Tomcat服務器集群

    環境準備

    Tomcat服務器集群中需要進行環境準備:

    •  ApacheApachehttp服務器,利用其對Tomcat進行負載均衡,這里使用的版本是Apache HTTP Server2.0.64
    • TmocatTmocat7.0.6
    •  JKJKTmocat提供給http服務器的插件,這里使用的版本是tmocat-connectors-1.2.37-windows-i386-httpd-2.0.x
    •  系統win7

    軟件安裝

    Apache

    下載完成之后,直接安裝apache,安裝完成之后,在瀏覽器中輸入http://localhost/,能夠看到下圖則說明安裝成功:


    Tomcat

    解壓下載好的tomcat縮包,復制三份解壓好的tomcat文件夾,分別重命名為tomcat1tomcat2tomcat3

    配置過程

    Apache配置修改

    修改httpd.conf,找到conf目錄下的httpd.cof,在文件的最后一行添加:

    include "C:\Program Files (x86)\Apache Group\Apache2\conf\mod_jk.conf"

    新建mod_jk.conf文件,在conf目錄下新建mod_jk.conf文件,內容如下:

    LoadModule jk_module modules/mod_jk.so

    JkWorkersFile conf/workers.properties

    JkMount /*.jsp controller

    解壓下載的jk文件,將里面的so文件復制到Apache安裝目錄的modules目錄下,這里下載的jk文件名為mod-jk.so。新建并編輯workers.properties文件。在conf文件夾下新建worker.properties,內容如下:

    #server

    worker.list = controller

    #========tomcat1========

    worker.tomcat1.port=11009

    worker.tomcat1.host=localhost

    worker.tomcat1.type=ajp13

    worker.tomcat1.lbfactor = 1

    #========tomcat2========

    worker.tomcat2.port=12009

    worker.tomcat2.host=localhost

    worker.tomcat2.type=ajp13

    worker.tomcat2.lbfactor = 1

    #========tomcat3========

    worker.tomcat3.port=13009

    worker.tomcat3.host=localhost

    worker.tomcat3.type=ajp13

    worker.tomcat3.lbfactor = 1

     

    #========controller,負載均衡控制器========

    worker.controller.type=lb

    worker.controller.balanced_workers=tomcat1,tomcat2,tomcat3

    worker.controller.sticky_session=false

    worker.controller.sticky_session_force=1

    #worker.controller.sticky_session=1

    如果需要配置遠程的tomcat服務器的話,只需要將worker.tomcat3.host=localhost中的localhost改為遠程服務器的IP地址即可。本次配置都是本地的tomcat,并且在一臺機器上,所以端口號都不相同,如果在不同服務器上,端口號則不需要更改。

    Tomcat配置

    修改之前復制好的三份tmocat中的server.xml配置,打開conf/server.xml文件,修改如下圖:

    tomcat1:

     


    Tomcat2:

     

    Tomcat3:

     


    結果測試

    tomcat下面的項目文件夾中修改web.xml,如這里使用test項目,則修改三個tomcat下面的test項目中的web.xml,在每個web.xml<display-name>節點后添加新的節點<distributable/>。在每個test項目文件夾下新建test.jsp,內容如下:

    <%@ page contentType="text/html; charset=GBK" %>

    <%@ page import="Java.util.*" %>

    <html><head><title>Cluster App Test</title></head>

    <body>

    Server Info:

    <%

    out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>

    <%

      out.println("<br> ID " + session.getId()+"<br>");

      // 如果有新的 Session 屬性設置

      String dataName = request.getParameter("dataName");

      if (dataName != null && dataName.length() > 0) {

         String dataValue = request.getParameter("dataValue");

         session.setAttribute(dataName, dataValue);

      }

      out.println("<b>Session 列表</b><br>");

      System.out.println("============================");

      Enumeration e = session.getAttributeNames();

      while (e.hasMoreElements()) {

         String name = (String)e.nextElement();

         String value = session.getAttribute(name).toString();

         out.println( name + " = " + value+"<br>");

             System.out.println( name + " = " + value);

       }

    %>

      <form action="test.jsp" method="POST">

        名稱:<input type=text size=20 name="dataName">

         <br>

        :<input type=text size=20 name="dataValue">

         <br>

        <input type=submit>

       </form>

    </body>

    </html>

    Session測試

    項目部署好之后,啟動三個tomcat以及Apache,啟動順序隨意,然后再瀏覽器中輸入http://localhost/test/test.jsp,結果如下圖:

     

    刷新頁面,如下圖:

     

    再次刷新,如下圖:

     

    多次刷新頁面的sessionID看是同一個ID,說明session是復制成功了。那么session中的存儲的東西呢,在輸入框中分別輸入112233后,顯示結果如下圖:

     



    節點插拔測試

    關閉Tomcat

    關閉tomcat3,刷新頁面,可以不斷訪問tomcat1tomcat2,再關閉tomcat2,只能夠訪問tomcat1,說明節點關閉時運行正常。

    啟動Tomcat

    如果重啟Tomcat2,無論怎么刷新,始終訪問Tomcat3,無法訪問tomcat2,這時利用另外臺機器訪問頁面,發現Tomcat2正常,然后在刷本地頁面,又可以訪問Tomcat2了。對于每個新來的sessionApache按照節點配置中的lbfactor比重選擇訪問節點,如果某節點node1不能訪問,則尋找下一可訪問節點,并且將此node1就在該訪問session的訪問黑名單中,以后該session的訪問直接不考慮node1,即使node1又可以訪問了。而新來的session是無黑名單的,如果新的session能夠訪問到node1了,則會將node1在其他所有session訪問的黑名單刪除,這樣其他session就又能訪問node1節點了。經過以上測試,說明Tomcat集群和負載均衡已經實現了。

    posted @ 2016-11-30 16:01 喝水居然長肉 閱讀(119) | 評論 (0)編輯 收藏

    如何將報表系統集成到微信中?

         摘要: 如今,隨著信息技術的不斷發展,很多公司采用微信企業號來進行企業與員工之間的聯系。其實微信企業號中右很多獨立的應用。 那么如何可以將報表系統集成到微信中呢?這里分享一下在微信企業號中創建獨立的報表應用,并且將微信賬號單點登錄到帆軟報表軟件FineReport的權限對接。 報表服務器環境準備 1、報表服務器環境要求 報表服務器必須是能夠訪問外網,并且如果是http協議則訪問端口不限,如果是ht...  閱讀全文

    posted @ 2016-10-28 14:00 喝水居然長肉 閱讀(174) | 評論 (0)編輯 收藏

    如何利用報表工具FineReport實現報表列的動態展示

    相信動態列的實現困擾了很多人,大數據量,多字段的加載將會非常耗時,數據又做不到真正的動態靈活。現有的方式都是通過變向的隱藏等方式來實現。

    那該如何解決呢?這里分享帆軟報表設計器FineReport的實現方案,結合實際工作中遇到的的相關內容。

    我本地常用數據庫是MYSQL,所以比較了解一點,所以實現方式也是基于mysql的。首先了解一下MySQL自帶的information_schema數據庫使用。

    大家在安裝或使用MYSQL時,會發現除了自己安裝的數據庫以外,還有一個 information_schema數據庫。information_schema數據庫是做什么用的呢,使用WordPress博客的朋友可能會想,是不是安裝模板添加的數據庫呀?看完本片文章后,你就會對information_schema數據庫有所了解。

    information_schema數據庫是MySQL自帶的,它提供了訪問數據庫元數據的方式。什么是元數據呢?元數據是關于數據的數據,如數據庫名或表名,列的數據類型,或訪問權限等。有些時候用于表述該信息的其他術語包括“數據詞典”和“系統目錄”。

    在 MySQL中,把 information_schema 看作是一個數據庫,確切說是信息數據庫。其中保存著關于MySQL服務器所維護的所有其他數據庫的信息。如數據庫名,數據庫的表,表欄的數據類型與訪問權限等。在INFORMATION_SCHEMA中,有數個只讀表。它們實際上是視圖,而不是基本表,因此,你將無法看到與之相關的任何文件。

    information_schema數據庫表說明:

    •  SCHEMATA表:提供了當前mysql實例中所有數據庫的信息。是show databases的結果取之此表。
    •  TABLES表:提供了關于數據庫中的表的信息(包括視圖)。詳細表述了某個表屬于哪個schema,表類型,表引擎,創建時間等信息。是show tables from schemaname的結果取之此表。
    • COLUMNS表:提供了表中的列信息。詳細表述了某張表的所有列以及每個列的信息。是show columns from schemaname.tablename的結果取之此表。
    • STATISTICS表:提供了關于表索引的信息。是show index from schemaname.tablename的結果取之此表。
    •  USER_PRIVILEGES(用戶權限)表:給出了關于全程權限的信息。該信息源自mysql.user授權表。是非標準表。
    • SCHEMA_PRIVILEGES(方案權限)表:給出了關于方案(數據庫)權限的信息。該信息來自mysql.db授權表。是非標準表。
    • TABLE_PRIVILEGES(表權限)表:給出了關于表權限的信息。該信息源自mysql.tables_priv授權表。是非標準表。
    • COLUMN_PRIVILEGES(列權限)表:給出了關于列權限的信息。該信息源自mysql.columns_priv授權表。是非標準表。
    • CHARACTER_SETS(字符集)表:提供了mysql實例可用字符集的信息。是SHOW CHARACTER SET結果集取之此表。
    • COLLATIONS表:提供了關于各字符集的對照信息。
    • COLLATION_CHARACTER_SET_APPLICABILITY表:指明了可用于校對的字符集。這些列等效于SHOWCOLLATION的前兩個顯示字段。
    • TABLE_CONSTRAINTS表:描述了存在約束的表。以及表的約束類型。
    • KEY_COLUMN_USAGE表:描述了具有約束的鍵列。
    • ROUTINES表:提供了關于存儲子程序(存儲程序和函數)的信息。此時,ROUTINES表不包含自定義函數(UDF)。名為“mysql.proc name”的列指明了對應于INFORMATION_SCHEMA.ROUTINES表的mysql.proc表列。
    • VIEWS表:給出了關于數據庫中的視圖的信息。需要有show views權限,否則無法查看視圖信息。
    • TRIGGERS表:提供了關于觸發程序的信息。必須有super權限才能查看該表

    擴展的應用

    • 查看某個數據庫表的記錄數
    selecttable_schema,table_name,table_rows from tables where TABLE_SCHEMA = '數據庫名稱' order by table_rowsdesc;
    • 查看數據庫所占空間

    selectconcat(round(sum(data_length/1024/1024),2),'MB') as data_length_MB, 

    concat(round(sum(index_length/1024/1024),2),'MB')as index_length_MB 

    frominformation_schema.tables where 

    table_schema='數據庫名';

    • 查看某個表所占空間

    selectconcat(truncate(sum(data_length)/1024/1024,2),'MB') as data_size,

    concat(truncate(sum(max_data_length)/1024/1024,2),'MB')as max_data_size,

    concat(truncate(sum(data_free)/1024/1024,2),'MB')as data_free,

    concat(truncate(sum(index_length)/1024/1024,2),'MB')as index_size

    frominformation_schema.tables where TABLE_NAME = '表名';

    看完之后相信可能還是有點疑惑。就是說mysql中有一個系統庫information_schema。這個庫中存放著mysql數據庫的數據庫實例名,表名稱,表注釋,字段名稱,字段注釋等等等等。而這個庫的存在為我們動態列的實現就提供了一個基礎。(其余的數據庫oracle、sqlserver、db2等也有類似的存在。)

    然后我們繼續回到主題。我在本地建立了一個測試庫reporttest,測試表report。在mysql庫中新建一個庫reporttest(或者使用已經存在的庫,但是如果使用已經存在的,那么報表內部sql內容就需要更改。所以最好新建一個),然后用類似navicat的工具運行我提供的reporttest.sql文件,即可建表并且導入數據,然后刷新即可,此時數據準備完成。

    設計器創建數據連接test,填寫對應的數據庫信息,測試成功即OK。

    此時,庫名稱為reporttest,表名稱為report,數據連接test。這時直接預覽動態列實現方案.cpt。

     

    可以很清晰的看到效果,選擇哪個列,它就只查詢那個列,只展示哪個列的數據,這就是動態列的實現方案。大家可以依據我的邏輯,替換成自己的數據連接庫、表數據進行測試使用體驗!

    posted @ 2016-09-29 15:41 喝水居然長肉 閱讀(115) | 評論 (0)編輯 收藏

    用普通計算機假設基于liunx系統的NAS部署FineReport決策系統

    何為NAS?

    簡單說就是連接在網絡上,具備資料存儲功能的裝置因此也稱為“網絡存儲器”。它是一種專用數據存儲服務器。他以數據為中心,將存儲設備與服務器徹底分離,集中管理數據,從而釋放帶寬、提高性能、降低總擁有成本、保護投資。其成本遠遠低于使用服務器存儲,而效率卻遠遠高于后者。

    為何選擇群輝NAS

    我所看重的是群輝的DSM操作系統,基于linux內核簡單而且功能豐富的操作系統,群輝NAS就是一臺功能豐富的電腦設備,可以娛樂,可以辦公,可以視頻監控等等。

    仔細的小伙伴看到標題應該會有聯想到何為用普通計算機假設NAS?

    正是由于DSM系統的易用和高效性,決定了群輝的NAS是硬軟件一體機,硬件的選擇余地及可擴展性(CPU、內存)差也成為了它的硬傷。所以作為屌絲把它裝在普通電腦上是在是個絕妙的主意!

    好了,以上只是引言。下面我們言歸正傳,正式講解在NAS-DSM系統(為了表示方面一下簡稱DSM)上部署Finereport數據決策系統。

    安裝篇

    首先:我們需要在DSM系統上安裝JAVA和Tomcat7.0,點開DSM的套件中心選擇安裝JAVAmanager及Tomcat7插件。在安裝好這兩個插件后,DSM會自動生成一個Tomcat文件夾并且會自動設置成共享方式。我們通過windows連接共享的方式就能方便的訪問到這個文件,當然前提是你要以admin這個DSM管理員賬戶登錄,如下圖:


    接下來就是進入到Tomcat\ROOT目錄把里面的文件全部刪除,然后把FineReport工程目錄WebReport下的所有文件全部復制過來(注意:不包含WebReport目錄是它下面的所有目錄和文件)然后重啟Tomcat,啥?你不知道如何重啟?哈哈,你只是沒找到而已,在DSM里一切都顯得如此簡單!請看下圖:

    還是在套件中心里找到左側選擇欄<已安裝菜單>點擊,然后在右側窗口里找到安裝好的tomcat。

     


    其實到這里,FR已經能用http://的IP地址:7070/ReportServer?op=fs訪問了。但是到這里就夠了么?NO,還不夠方便、tomcat的內存還需要調整,我們還要進行優化!GO!GO!

    優化篇:

    1、URL訪問帶著端口不爽!后面還要輸入一堆E文字符不爽!但是DSM系統出于安全考慮,簡單的通過頁面訪問,你根本就找不到它的系統文件(哪怕是用管理員帳號)!而大家都知道要調整這些個屬性必須要找到并編輯Tomcat的server.xml。那么我們這里只能通過linux窗口命令來處理,為此我們要開啟DSM系統的Telnet功能,然后通過工具來修改。

    A、開啟DSM系統的Telnet功能:


    勾選后保存

    B、用SecureCRT連接DSM系統,賬戶名:root密碼就是你admin的密碼(root密碼初始是和admin密碼相同的)


    切換到server.xml文件所在的目錄,命令用小寫

    cd/var/packages/Tomcat7/target/src/conf

    接下來打開編輯:

    viserver.xml


    通過鍵盤方向鍵找到此處,按鍵盤上的i字母鍵進入編輯模式,修改為80端口(因為我80端口用掉了,所以用的是8080),修改好后按ESC鍵退出編輯模式,按:鍵進入命令行模式輸入W回車。至此端口修改完畢,重啟Tomcat就能不帶端口訪問了!

    C、tomcat下訪問ip直接進入op=fs界面:

    小伙伴們可以參考幫助文檔的那篇文章,自行設置http://help.finereport.com/doc-view-806.html

    需要補充說明的是:

    1、如果標題出現亂碼,可以打開a.jsp將編碼改為GBK

    2、給出DSM系統的web.xml的位置:/var/packages/Tomcat7/target/src/conf

    3、由于前面我讓大家把文件復制到ROOT目錄的所以幫助文檔的這部分就不用再做了


    2、修改Tomcat內存,提高系統運行效率。修改catalina.sh文件方法同上,限于篇幅我只給出DSM系統的位置:/var/packages/Tomcat7/target/src/bin/,添加代碼部位如下圖:


    經過以上的設置,基本已經達到我們的要求了短URL訪問:只需輸入IP地址就能直接跳到登錄界面了、服務器內存也修改到了我們需要的大小。

    posted @ 2016-09-20 09:20 喝水居然長肉 閱讀(81) | 評論 (0)編輯 收藏

    關于報表自定義函數的應用

    很多報表工具都自帶大量的函數,在正常情況下足夠滿足用戶的報表制作需求,但是在一些特殊領域,可能需要一些特殊的函數,在這種情況下,報表工具FineReport提供了自定義函數機制,可以由用戶根據業務需要自己來定義一些函數,滿足用戶的自定義需求。但這些函數必須FineReport函數定義規則。以下以兩個實際案例來仔細詳解。

    應用一:生成UPC條形碼

    FineReport中自帶有EAN型編碼,但卻沒有UPC條形碼,但是可以通過自定義函數引用第三方包來生成UPC編碼的條形碼并顯示出來。如輸入數值12345678912,將會得到以下UPC條形碼:

    具體步驟怎么實現?

    1、 編寫自定義函數

    • 導入第三方包

    在eclipse中導入第三方包barcode4j-light.jar,可在帆軟論壇上下載),barcode4j是一款開源的條形碼生成庫,能夠生成很多種編碼的條形碼,包括UPC碼。自定義函數中可以直接調用該包中現成的方法來生成UPC條形碼。

    • 自定義函數類

    新建一個類Upc,完整代碼如下:

    package com.fr.function;

    import java.awt.image.BufferedImage;
    import org.krysalis.barcode4j.impl.upcean.UPCABean;
    import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider;
    import org.krysalis.barcode4j.tools.UnitConv;
    import com.fr.script.AbstractFunction;

    public class Upc extends AbstractFunction 
    {
        public Object run(Object[] args) 
    {
            
    if (args == null || args.length < 1{
                
    return "參數不對,必須有一個參數";
            }

            
    try {
                
    // 創建一個UPC編碼生成器
                UPCABean bean = new UPCABean();
                
    // 設置條形碼高度,BufferedImage.TYPE_BYTE_BINARY代表常量值12,可直接使用常量值
                final int dpi = Integer.parseInt(args[1].toString());
                bean.setModuleWidth(UnitConv.in2mm(
    1.0f / dpi));
                bean.doQuietZone(
    false);
                BitmapCanvasProvider canvas 
    = new BitmapCanvasProvider(dpi,
                        BufferedImage.TYPE_BYTE_BINARY, 
    false0);
                
    // 創建條形碼
                bean.generateBarcode(canvas,args[0].toString());
                canvas.finish();
                
    // 返回圖片顯示   
                return canvas.getBufferedImage();
            }
     catch (Exception e) {
                e.printStackTrace();
            }

            
    return args[0];
        }

    }

    2、 編譯自定義函數

    編譯Upc.java生成Upc.class文件,拷貝至報表環境目/WebReport/WEB-INF/classes/com/fr/function下;

    將第三方包barcode4j-light.jar放在報表環境目錄/WebReport/WEB-INF/lib文件夾下。

    3、 注冊自定義函數

    啟動設計器,點擊服務器|函數管理器,新增函數取名為Upc,選擇Upc.class類,如下圖:

    4、 Upc()函數的使用

    重啟服務器,在報表中使用公式==Upc(num1, num2),num1為需要生成條形碼的數值,num2為生成的圖片的高度。

    如在單元格中輸入公式:=Upc(12345678912,100),預覽便可以看到條形碼了。

    應用二:Unicode編碼轉化為中文

    數據庫中保存的是如下形式的編碼:%u5357%u4EAC-%u57CE%u5317,希望最好展示出來的是對應的中文“南京-城北”。

    具體步驟如下:

    1、 編寫自定義函數

    package com.fr.function;  

    import com.fr.script.AbstractFunction;  
      
    public class Ubm extends AbstractFunction 
    {  
        public Object run(Object[] args) 
    {  
            String str 
    = args[0].toString();  
            String st 
    = "";  
            StringBuffer buffer 
    = new StringBuffer();  
            
    while (str.length() > 0{  
                
    if (str.startsWith("%u")) {  
                    st 
    = str.substring(26);  
                    
    char ch = (char) Integer.parseInt(String.valueOf(st), 16);  
                    buffer.append(
    new Character(ch).toString());  
                    str 
    = str.substring(6);  
                }
     else {  
                    st 
    = str.substring(0, str.indexOf("%u"));  
                    buffer.append(st);  
                    str 
    = str.substring(st.length());  
                }
      
            }
      
            
    return buffer.toString();  
        }
      
    }

    2、 編譯自定義函數

    將編譯后的Ubm.class放到FineReport的安裝目錄WEB-INF下面的classes目錄下,因為Ubm.java屬于包com.fr.function,所以Ubm.class需要放到classes\com\fr\function目錄下。

    3、 注冊自定義函數

    生成該函數的類后需要在設計器中進行注冊,才可以使用該函數。打開服務器|函數管理器選擇剛剛定義好了Ubm類,如下圖

    4、 使用自定義函數

    注冊號自定義函數后,制作報表時便可直接使用了,使用方法與內置的函數是相同的。輸入公式=Ubm("%u5357%u4EAC-%u57CE%u5317")運行如下:

    展示值為“南京-城北”。


    posted @ 2016-09-13 14:15 喝水居然長肉 閱讀(188) | 評論 (0)編輯 收藏

    關于Web報表FineReport打印的開發應用案例

         摘要: 報表打印是報表使用和開發過程中經常碰到的問題,這里匯總了關于Web報表開發打印功能的一些典型應用案例,以應用最廣泛的FineReport為例。 案例一:java直接調用報表打印 當java后臺定義定時打印的功能,同時又需要直接調用報表的打印的時候,由于打印機型號和紙張不同,需要指定打印機,從而打印是否成功并設置返回值。那么怎么樣可以實現這一過程呢? 實現過程 1、定義報表運行環境 C...  閱讀全文

    posted @ 2016-08-31 15:29 喝水居然長肉 閱讀(301) | 評論 (0)編輯 收藏

    如何利用FineReport制作動態樹報表

    在對數據字段進行分類管理時,利用動態樹折疊數據是一個很好的方法,也就是點擊數據前面的加號才展開對應下面的數據,如下圖。那這樣的效果在制作報表時該如何實現呢? 下面以報表工具FineReport為例介紹。

    思路:

    通過將模版設置為組織樹報表,然后通過設置樹節點按鈕,最好通過數據分析預覽或者form表單預覽即可查看效果。

    步驟:

    1、  初步建立模板

     建立模板就相當于建立一個excel的sheet,只不過是cpt的形式。把相應的字段拖到單元格內。

    2、  增加樹節點按鈕

     通過設置樹節點按鈕來實現折疊樹,分別右擊單元格A1、A2、A3,選擇空間設置>按鈕,按鈕類型選擇“樹節點按鈕”,設置如下:

    1、  保存與預覽

    保存模板,點擊設計器中的數據分析,在網頁上的預覽效果即如上述所示。

    動態效果展示:

    用戶設置了折疊樹按鈕后,預覽報表時沒有動態樹效果,可能是預覽模式錯誤。

    我們是通過按鈕控件實現該功能的,而普通的分頁預覽是不會將控件顯示出來,如下圖所示:

    因此需要在op=view狀態即數據分析下才能預覽顯示出效果。

    折疊樹延伸

    需要在雙向折疊樹中顯示對應的圖表,以便查看,如下圖所示:

    具體步驟如下所示:

    1、建立雙向折疊樹:

    首先建立一個雙向折疊樹,雙向折疊樹需要注意折疊樹數據列不可位于同一行或者同意列

    2、設定節點點擊事件

    為了實現雙向折疊樹與圖標的交互,需要設置樹節點的點擊事件,通過點擊事件將樹節點的值作為參數傳遞給圖表。

    下面以效果圖中食品節點為例來說明控件點擊事件的設置。

    食品節點事件效果圖如下所示

    treenode_lb1()方法作用是傳參,內容是:

    function treenode_lb1(treenode, cv) {
        
    if (treenode.selected()) {
        
    if (!window.fr_lb1_param){
              window.fr_lb1_param 
    = {};
           }

           window.fr_lb1_param[cv] 
    = cv;
        }
     else {
          window.fr_lb1_param[cv] 
    = null;
        }

        postParam();
    }

    demo.js中還有個方法是關聯tree.cpttree_chart.cpt兩個文檔,內容是:

    FR.doHyperlinkByPost('ReportServer?reportlet=demo/analytics/tree/tree_chart.cpt', {diqu:diqu_str,city:city_str,lb1:lb1_str,lb2:lb2_str,lx1:lx1_str,lx2:lx2_str},'iframe');
    }

    3、  圖表模板的引入

    圖表模板通過樹模板中的一個網頁框控件引入,屬性如下,關聯tree_chart.cpt


    上圖中,控件名為空,即默認是iframe,如果設置控件名,則必須與最后一個方法中的名字對應

    4、圖表模版的設置

    圖表模板中,需要設置根據樹節點傳參的條件設置。

    綜上可以看出,動態折疊樹的設計思路是點擊主格時,控制附屬于該組的子項內容展開與折疊,由此到達數據分析的效果。


    posted @ 2016-08-24 12:03 喝水居然長肉 閱讀(186) | 評論 (0)編輯 收藏

    關于JS的編碼轉換問題

    在進行JS開發過程中,尤其是在開發報表時,報表已集成到Web頁面中,通過在頁面傳遞參數至報表中時,會發現有時某些參數值,傳遞到報表中是顯示為問號或亂碼等等一系列不能正常顯示的情況。

    這是由于瀏覽器和報表服務器的編碼不同,字符多次進行編碼轉換時出現錯誤導致字符的顯示出現亂碼,尤其是中日韓文和特殊字符更容易出現亂碼問題。

    以開發報表軟件FineReport為例,在給報表服務器發送請求之前,對URL或者只對URL里面的參數名字和參數值,進行cjkEncode的編碼,該方式兼容了各種不同的字符集,如ISO8859-1、 UTF-8、 GBK、 ENU_JP,尤其對中日韓文的處理采取了統一的方案。

    javascript中FineReport字符轉換原理

    在給報表服務器發送請求之前,對URL或者只對URL里面的參數名字和參數值,進行cjkEncode的編碼。源碼如下:

    function cjkEncode(text) {     
        
    if (text == null{     
            
    return "";     
        }
         
        
    var newText = "";     
        
    for (var i = 0; i < text.length; i++{     
            
    var code = text.charCodeAt (i);      
            
    if (code >= 128 || code == 91 || code == 93{//91 is "[", 93 is "]".     
                newText += "[" + code.toString(16+ "]";     
            }
     else {     
                newText 
    += text.charAt(i);     
            }
         
        }
         
        
    return newText;     
    }


     

    經過編碼的URL或者Form表單,報表服務器智能的將這些字符正確的轉換過來。

    cjkEncode方法在FineReport的JS庫中已經預先提供了,用戶只要加載了FR的JS庫,就可以使用FR.cjkEncode對中日韓文字符進行encode,如下示例:

    1、  對URL進行cjkEncode

    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=GBK">
    <script type="text/javascript"    src="ReportServer?op=emb&resource=finereport.js"></script>
    <Script Language="JavaScript">             
    function frOpen() {   
        window.location
    =FR.cjkEncode("http://localhost:8075/WebReport/ReportServer?reportlet=doc/Primary/Parameter/Parameter.cpt&地區=華東");       
    }
           
    </Script>
    </head>
    <body>
    <input type="button" value="字符轉換1" onclick="frOpen()">
    </body>
    </html>


    如果只對參數值進行編輯轉換,在參數后面調用FR.cjkEncode()方法,如:

    window.location="http://localhost:8075/WebReport/ReportServer?reportlet=reportname.cpt¶name="+FR.cjkEncode("華東"); 

    2、對Form表單進行cjkEncode

    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=GBK"/>
    <script type="text/javascript" src="/WebReport/ReportServer?op=emb&resource=finereport.js"></script>
    <script>
    function autoSubmit() {
        
    var Region1 = document.getElementById('Region');     //獲取到參數Region所在文本框
        Region1.value = FR.cjkEncode(Region.value);         //對值參數值進行編碼轉化
        Region1.name = FR.cjkEncode("地區");               //對參數控件名編碼轉換,如果參數名字為英文,則不需要此操作
        document.FRform.submit();
    }

    </script>
    <body>
    <form name=FRform method=post action="/WebReport/ReportServer?reportlet=doc/Primary/Parameter/Parameter.cpt">
    <input type="text" id="Region" name="地區" value="華東">
    <input type="button" name="show" value= "查看" onclick="autoSubmit()"/>
    </body>
    </html>


    3、特殊符號處理

    如果在需要進行cjkEncode的URI的參數中包含特殊字符,比如%,#,$,=,&,/,?,+,@等字符時,需要在cjkEncode之后,再次調用javascript的encodeURIComponent對這些特殊字符進行編碼。如參數值是”%華%“這樣的字符,就需要寫成encodeURIComponent(FR.cjkEncode("%華%")),一定要先進行cjkEncode,然后再進行encodeURIComponent,完整代碼如下:

    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=GBK">
    <script type="text/javascript"    src="ReportServer?op=emb&resource=finereport.js"></script>
    <Script Language="JavaScript">             
    function frOpen() {   
    window.location
    =FR.cjkEncode("http://localhost:8075/WebReport/ReportServer?reportlet=doc/Primary/Parameter/Parameter.cpt&地區="+encodeURIComponent(FR.cjkEncode("%華%"));      
        }
           
    </Script>
    </head>
    <body>
    <input type="button" value="字符轉換1" onclick="frOpen()">
    </body>
    </html>

     

    posted @ 2016-08-11 15:26 喝水居然長肉 閱讀(92) | 評論 (0)編輯 收藏

    Java連接程序數據源

         摘要: 在實際應用中,可能需要根據表名動態地改變數據源,比如在程序數據集中,通過傳進的表名參數,到數據庫取出對應的表作為數據源。例如,FineReport是通過AbstractTableData抽象類來讀取數據源的,而上述所有的數據來源都繼承實現其抽象方法,因此用戶只要實現了AbstractTableData抽象類,也就可以用自定義類型的數據源了(程序數據集),這是帶參程序數據集連接的方法。 FineR...  閱讀全文

    posted @ 2016-08-01 11:16 喝水居然長肉 閱讀(99) | 評論 (0)編輯 收藏

    僅列出標題
    共7頁: 上一頁 1 2 3 4 5 6 7 下一頁 
    主站蜘蛛池模板: 三级网站在线免费观看| 国产成人精品日本亚洲11| 中文字幕亚洲一区二区三区| 国产成人无码a区在线观看视频免费| 思思re热免费精品视频66| 51视频精品全部免费最新| 日本xxxx色视频在线观看免费| 久章草在线精品视频免费观看| 免费91最新地址永久入口| 免费人成网站在线观看不卡| 久久大香伊焦在人线免费| 9420免费高清在线视频| 18国产精品白浆在线观看免费 | 亚洲婷婷综合色高清在线| 亚洲国产情侣一区二区三区| 亚洲日韩在线视频| 亚洲综合一区无码精品| 国产精品亚洲精品久久精品| 国产精品亚洲一区二区三区久久| 另类专区另类专区亚洲| 国产日韩在线视频免费播放| 波多野结衣免费一区视频| 99re视频精品全部免费| 成年在线观看网站免费| 国产精品久免费的黄网站| 亚洲国产精品无码久久久久久曰| 国内精品99亚洲免费高清| 亚洲免费在线视频| 最新亚洲精品国偷自产在线| 色天使色婷婷在线影院亚洲| 亚欧国产一级在线免费| 无码国产精品一区二区免费16| 国产又大又粗又长免费视频| 日韩免费观看视频| 色噜噜AV亚洲色一区二区| 精品亚洲aⅴ在线观看| 亚洲人成欧美中文字幕| 国产免费A∨在线播放| 4455永久在线观免费看| 国产精品久久免费视频| 国产精品亚洲片在线观看不卡|