wuxiren123

          #

          如何給FineReport設(shè)置自定義消息提醒工具

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

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

          FineReport如何部署Tomcat服務(wù)器集群

          環(huán)境準(zhǔn)備

          Tomcat服務(wù)器集群中需要進(jìn)行環(huán)境準(zhǔn)備:

          •  ApacheApachehttp服務(wù)器,利用其對Tomcat進(jìn)行負(fù)載均衡,這里使用的版本是Apache HTTP Server2.0.64;
          • TmocatTmocat7.0.6;
          •  JKJKTmocat提供給http服務(wù)器的插件,這里使用的版本是tmocat-connectors-1.2.37-windows-i386-httpd-2.0.x;
          •  系統(tǒng)win7。

          軟件安裝

          Apache

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


          Tomcat

          解壓下載好的tomcat縮包,復(fù)制三份解壓好的tomcat文件夾,分別重命名為tomcat1,tomcat2,tomcat3

          配置過程

          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文件,內(nèi)容如下:

          LoadModule jk_module modules/mod_jk.so

          JkWorkersFile conf/workers.properties

          JkMount /*.jsp controller

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

          #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,負(fù)載均衡控制器========

          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

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

          Tomcat配置

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

          tomcat1:

           


          Tomcat2:

           

          Tomcat3:

           


          結(jié)果測試

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

          <%@ 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 屬性設(shè)置

            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,結(jié)果如下圖:

           

          刷新頁面,如下圖:

           

          再次刷新,如下圖:

           

          多次刷新頁面的sessionID看是同一個ID,說明session是復(fù)制成功了。那么session中的存儲的東西呢,在輸入框中分別輸入1、12、2,33后,顯示結(jié)果如下圖:

           



          節(jié)點插拔測試

          關(guān)閉Tomcat

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

          啟動Tomcat

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

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

          如何將報表系統(tǒng)集成到微信中?

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

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

          如何利用報表工具FineReport實現(xiàn)報表列的動態(tài)展示

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

          那該如何解決呢?這里分享帆軟報表設(shè)計器FineReport的實現(xiàn)方案,結(jié)合實際工作中遇到的的相關(guān)內(nèi)容。

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

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

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

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

          information_schema數(shù)據(jù)庫表說明:

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

          擴展的應(yīng)用

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

          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='數(shù)據(jù)庫名';

          • 查看某個表所占空間

          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中有一個系統(tǒng)庫information_schema。這個庫中存放著mysql數(shù)據(jù)庫的數(shù)據(jù)庫實例名,表名稱,表注釋,字段名稱,字段注釋等等等等。而這個庫的存在為我們動態(tài)列的實現(xiàn)就提供了一個基礎(chǔ)。(其余的數(shù)據(jù)庫oracle、sqlserver、db2等也有類似的存在。)

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

          設(shè)計器創(chuàng)建數(shù)據(jù)連接test,填寫對應(yīng)的數(shù)據(jù)庫信息,測試成功即OK。

          此時,庫名稱為reporttest,表名稱為report,數(shù)據(jù)連接test。這時直接預(yù)覽動態(tài)列實現(xiàn)方案.cpt。

           

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

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

          用普通計算機假設(shè)基于liunx系統(tǒng)的NAS部署FineReport決策系統(tǒng)

          何為NAS?

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

          為何選擇群輝NAS

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

          仔細(xì)的小伙伴看到標(biāo)題應(yīng)該會有聯(lián)想到何為用普通計算機假設(shè)NAS?

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

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

          安裝篇

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


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

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

           


          其實到這里,F(xiàn)R已經(jīng)能用http://的IP地址:7070/ReportServer?op=fs訪問了。但是到這里就夠了么?NO,還不夠方便、tomcat的內(nèi)存還需要調(diào)整,我們還要進(jìn)行優(yōu)化!GO!GO!

          優(yōu)化篇:

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

          A、開啟DSM系統(tǒng)的Telnet功能:


          勾選后保存

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


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

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

          接下來打開編輯:

          viserver.xml


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

          C、tomcat下訪問ip直接進(jìn)入op=fs界面:

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

          需要補充說明的是:

          1、如果標(biāo)題出現(xiàn)亂碼,可以打開a.jsp將編碼改為GBK

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

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


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


          經(jīng)過以上的設(shè)置,基本已經(jīng)達(dá)到我們的要求了短URL訪問:只需輸入IP地址就能直接跳到登錄界面了、服務(wù)器內(nèi)存也修改到了我們需要的大小。

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

          關(guān)于報表自定義函數(shù)的應(yīng)用

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

          應(yīng)用一:生成UPC條形碼

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

          具體步驟怎么實現(xiàn)?

          1、 編寫自定義函數(shù)

          • 導(dǎo)入第三方包

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

          • 自定義函數(shù)類

          新建一個類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 "參數(shù)不對,必須有一個參數(shù)";
                  }

                  
          try {
                      
          // 創(chuàng)建一個UPC編碼生成器
                      UPCABean bean = new UPCABean();
                      
          // 設(shè)置條形碼高度,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);
                      
          // 創(chuàng)建條形碼
                      bean.generateBarcode(canvas,args[0].toString());
                      canvas.finish();
                      
          // 返回圖片顯示   
                      return canvas.getBufferedImage();
                  }
           catch (Exception e) {
                      e.printStackTrace();
                  }

                  
          return args[0];
              }

          }

          2、 編譯自定義函數(shù)

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

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

          3、 注冊自定義函數(shù)

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

          4、 Upc()函數(shù)的使用

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

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

          應(yīng)用二:Unicode編碼轉(zhuǎn)化為中文

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

          具體步驟如下:

          1、 編寫自定義函數(shù)

          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、 編譯自定義函數(shù)

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

          3、 注冊自定義函數(shù)

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

          4、 使用自定義函數(shù)

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

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


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

          關(guān)于Web報表FineReport打印的開發(fā)應(yīng)用案例

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

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

          如何利用FineReport制作動態(tài)樹報表

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

          思路:

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

          步驟:

          1、  初步建立模板

           建立模板就相當(dāng)于建立一個excel的sheet,只不過是cpt的形式。把相應(yīng)的字段拖到單元格內(nèi)。

          2、  增加樹節(jié)點按鈕

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

          1、  保存與預(yù)覽

          保存模板,點擊設(shè)計器中的數(shù)據(jù)分析,在網(wǎng)頁上的預(yù)覽效果即如上述所示。

          動態(tài)效果展示:

          用戶設(shè)置了折疊樹按鈕后,預(yù)覽報表時沒有動態(tài)樹效果,可能是預(yù)覽模式錯誤。

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

          因此需要在op=view狀態(tài)即數(shù)據(jù)分析下才能預(yù)覽顯示出效果。

          折疊樹延伸

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

          具體步驟如下所示:

          1、建立雙向折疊樹:

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

          2、設(shè)定節(jié)點點擊事件

          為了實現(xiàn)雙向折疊樹與圖標(biāo)的交互,需要設(shè)置樹節(jié)點的點擊事件,通過點擊事件將樹節(jié)點的值作為參數(shù)傳遞給圖表。

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

          食品節(jié)點事件效果圖如下所示

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

          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中還有個方法是關(guān)聯(lián)tree.cpttree_chart.cpt兩個文檔,內(nèi)容是:

          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、  圖表模板的引入

          圖表模板通過樹模板中的一個網(wǎng)頁框控件引入,屬性如下,關(guān)聯(lián)tree_chart.cpt


          上圖中,控件名為空,即默認(rèn)是iframe,如果設(shè)置控件名,則必須與最后一個方法中的名字對應(yīng)

          4、圖表模版的設(shè)置

          圖表模板中,需要設(shè)置根據(jù)樹節(jié)點傳參的條件設(shè)置。

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


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

          關(guān)于JS的編碼轉(zhuǎn)換問題

          在進(jìn)行JS開發(fā)過程中,尤其是在開發(fā)報表時,報表已集成到Web頁面中,通過在頁面?zhèn)鬟f參數(shù)至報表中時,會發(fā)現(xiàn)有時某些參數(shù)值,傳遞到報表中是顯示為問號或亂碼等等一系列不能正常顯示的情況。

          這是由于瀏覽器和報表服務(wù)器的編碼不同,字符多次進(jìn)行編碼轉(zhuǎn)換時出現(xiàn)錯誤導(dǎo)致字符的顯示出現(xiàn)亂碼,尤其是中日韓文和特殊字符更容易出現(xiàn)亂碼問題。

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

          javascript中FineReport字符轉(zhuǎn)換原理

          在給報表服務(wù)器發(fā)送請求之前,對URL或者只對URL里面的參數(shù)名字和參數(shù)值,進(jìn)行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;     
          }


           

          經(jīng)過編碼的URL或者Form表單,報表服務(wù)器智能的將這些字符正確的轉(zhuǎn)換過來。

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

          1、  對URL進(jìn)行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&地區(qū)=華東");       
          }
                 
          </Script>
          </head>
          <body>
          <input type="button" value="字符轉(zhuǎn)換1" onclick="frOpen()">
          </body>
          </html>


          如果只對參數(shù)值進(jìn)行編輯轉(zhuǎn)換,在參數(shù)后面調(diào)用FR.cjkEncode()方法,如:

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

          2、對Form表單進(jìn)行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');     //獲取到參數(shù)Region所在文本框
              Region1.value = FR.cjkEncode(Region.value);         //對值參數(shù)值進(jìn)行編碼轉(zhuǎn)化
              Region1.name = FR.cjkEncode("地區(qū)");               //對參數(shù)控件名編碼轉(zhuǎn)換,如果參數(shù)名字為英文,則不需要此操作
              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="地區(qū)" value="華東">
          <input type="button" name="show" value= "查看" onclick="autoSubmit()"/>
          </body>
          </html>


          3、特殊符號處理

          如果在需要進(jìn)行cjkEncode的URI的參數(shù)中包含特殊字符,比如%,#,$,=,&,/,?,+,@等字符時,需要在cjkEncode之后,再次調(diào)用javascript的encodeURIComponent對這些特殊字符進(jìn)行編碼。如參數(shù)值是”%華%“這樣的字符,就需要寫成encodeURIComponent(FR.cjkEncode("%華%")),一定要先進(jìn)行cjkEncode,然后再進(jìn)行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&地區(qū)="+encodeURIComponent(FR.cjkEncode("%華%"));      
              }
                 
          </Script>
          </head>
          <body>
          <input type="button" value="字符轉(zhuǎn)換1" onclick="frOpen()">
          </body>
          </html>

           

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

          Java連接程序數(shù)據(jù)源

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

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

          僅列出標(biāo)題
          共7頁: 上一頁 1 2 3 4 5 6 7 下一頁 
          主站蜘蛛池模板: 吉木萨尔县| 丰都县| 广饶县| 黄龙县| 湘乡市| 剑河县| 陇南市| 盘山县| 桐城市| 岱山县| 巫山县| 绵竹市| 株洲县| 资中县| 常德市| 祁门县| 长岭县| 贵南县| 灵台县| 普宁市| 梅河口市| 微博| 土默特右旗| 石嘴山市| 永登县| 渝北区| 长汀县| 锦屏县| 汾阳市| 竹山县| 屯门区| 延吉市| 郴州市| 商南县| 大城县| 石景山区| 宜都市| 和平县| 监利县| 惠东县| 江油市|