wuxiren123

          2017年3月8日 #

          FineReport中樹數據集如何實現組織樹報表

          組織樹報表中由id與父id來實現組織樹報表,若層級數較多時,對每個單元格設置過濾條件和形態會比較繁瑣,因此FineReport提供了一種特殊的數據集——樹數據集,只需要簡單的設置就能自動遞歸出層級,方便的實現如下圖組織樹報表:

          圖一

          圖二


          構建樹

          • 新建報表,添加數據集

          新建工作薄,添加數據集ds1取出原始數據,SQL語句為SELECT * FROM 公司部門。

          • 定義樹數據集

          1)根據父字段構建樹

          使用情形:原始表結構中符合ID、parentID結構,我們可以通過父ID這個字段生成樹,添加樹數據集,如下圖:

           

          2)根據數據長度構建樹

          使用情形:原始表結構中所有ID都在一列中,且沒有父ID字段,但是ID是有規律的,每組的長度相同,且子級的前N位就是父級編號,添加樹數據集,如下圖:

           

           

          •  預覽數據

          預覽樹數據集,可看到已自動生成遞歸樹數據,FR_GEN_0為最高層,依次往下,如下:

          縱向組織樹編輯

          按照下圖所示將對應的數據列拖入到單元格中,并將A2單元格的左父格設置為A1,A3單元格的左父格設置為A2:

            

          • 條件屬性

          有上面預覽數據可以看到從二層FR_GEN_1開始,就會有空白數據,這是因為數據庫中存儲的數據有上一級部門本身的部門名稱和部門ID,其上一級部門的部門級數會低一級,比如說上述數據的第一行為總部,雖然總部下面有子部門,但是數據庫中還是要存儲總部這個部門的部門名稱和部門ID的,總部對應的級數為一級,那么其對應的數據記錄行里面就只有FR_GEN_0層,下面的FR_GEN_1和FR_GEN_2這兩層就會沒有數據,顯示為空白。

          在模板制作過程中,從第二層級開始就會有空白數據,需要將空白數據隱藏掉,選中A2和A3單元格,添加條件屬性,當數據為空時隱藏該行,如下圖: 

          如果組織結構的層級結構不確定,即有的層級有子層,有的層級沒有子層時,其組織樹報表的實現方式請查看不規范組織樹報表

          • 其它設置

          由于自動生成的字段是編碼,可以使用數據字典將其轉為對應的部門名稱,如下圖:

           

          • 保存與預覽

          保存模板,點擊分頁預覽,效果如圖一。

          橫向組織樹編輯

          按照下圖所示將對應的數據列拖入到單元格中,在右側單元格屬性表-擴展屬性中將B1、C1單元格的擴展方向設為橫向,

          并將B1單元格的左父格設置為A1,C1單元格的左父格設置為B1:

           

          • 條件屬性

          有上面預覽數據可以看到從二層FR_GEN_1開始,就會有空白數據,這是因為數據庫中存儲的數據有上一級部門本身的部門名稱和部門ID,其上一級部門的部門級數會低一級,比如說上述數據的第一列為總部,雖然總部下面有子部門,但是數據庫中還是要存儲總部這個部門的部門名稱和部門ID的,總部對應的級數為一級,那么其對應的數據記錄列里面就只有FR_GEN_0層,下面的FR_GEN_1和FR_GEN_2這兩層就會沒有數據,顯示為空白。

          在模板制作過程中,從第二層級開始就會有空白數據,需要將空白數據隱藏掉,選中B1和C1單元格,添加條件屬性,當數據為空時隱藏該列,如下圖:

          如果組織結構的層級結構不確定,即有的層級有子層,有的層級沒有子層時,其組織樹報表的實現方式請查看不規則組織樹報表

          • 其它設置

          由于自動生成的字段是編碼,可以使用數據字典將其轉為對應的部門名稱,如下圖:

           

          • 保存與預覽

          保存模板,點擊分頁預覽,效果如圖二。

          posted @ 2017-04-06 15:56 喝水居然長肉 閱讀(130) | 評論 (0)編輯 收藏

          FineReport中如何自定義登錄界面

          在登錄平臺時,不希望使用FR默認的內置登錄界面,想通過自定義登錄界面實現登錄操作,內置登錄界面如下圖:



           

          登錄界面,獲取到用戶名和密碼的值,發送到報表系統,報表服務帶著這兩個參數訪問認證地址進行認證。

          自定義登錄界面

          登錄界面設置

          自定義html登錄頁面:命名為login.html,并保存在%FR_HOME%\WebReport下,代碼如下:

          <html>  
          <head> 
          <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
          <script type="text/javascript" src="ReportServer?op=emb&resource=finereport.js"></script>  
          <script type="text/javascript">  
          function doSubmit() {  
              
          var username = FR.cjkEncode(document.getElementById("username").value); //獲取輸入的用戶名  
              var password = FR.cjkEncode(document.getElementById("password").value);  //獲取輸入的參數  
              jQuery.ajax({  
               url:
          "http://localhost:8075/WebReport/ReportServer?op=fs_load&cmd=sso",//單點登錄的管理平臺報表服務器  
               dataType:"jsonp",//跨域采用jsonp方式  
               data:{"fr_username":username,"fr_password":password},//獲取用戶名密碼  
               jsonp:"callback",  
               timeout:
          5000,//超時時間(單位:毫秒)  
               success:function(data) {  
                      
          if (data.status === "success"
              window.location
          =data.url;//認證成功跳轉頁面,因為ajax不支持重定向所有需要跳轉的設置 
                            //登錄成功     
                      }
           else if (data.status === "fail"){  
                           alert(
          "用戶名或密碼錯誤");//登錄失敗(用戶名或密碼錯誤)  
                      }
            
               }
          ,  
               error:
          function(){  
                     alert(
          "超時或服務器其他錯誤");// 登錄失敗(超時或服務器其他錯誤)  
               }
            
          }
          ); 
          }
            
          </script>  
          </head>  
          <body>  
          <p>請登錄</p>  
          <form name="login" method="POST">  
              
          <p>  
                  用戶名:  
                  
          <input id="username" type="text" />  
              
          </p>  
              
          <p>  
                  密 碼:  
                  
          <input id="password" type="password" />  
              
          </p>  
              
          <input type="button" value="登錄" onclick="doSubmit()"/>  
          </form>  
          </body>  
          </html>

           Dosubmit()是主要的邏輯判斷,實現的是將對應的值傳給報表服務的邏輯實現過程。

          調用登錄界面

          登錄系統,選擇管理系統>外觀配置,在登錄頁選項中選擇設置登錄網頁,并輸入自定義登錄頁面的路徑:login.html,如下圖所示:



           

          總結

          比如說若用戶有自己的系統,將FR繼承到自己已有系統中,該系統有自己的登錄界面,希望登錄自己系統的同時也登錄報表(即將輸入的用戶名密碼也發送到報表服務進行認證),從而訪問報表時不需要再次登錄即單點登錄,步驟如下:

          1、找到您系統登錄頁面如login.jsp;

          2、在login.jsp頁面head中引入finereport.js;

          3、在login.jsp頁面JavaScript中定義function如dosubmit,在dosubmit中獲取到輸入的用戶名密碼,并通過iframe方式或者ajax方式進行認證。

          4、在FineReport平臺系統中設置自定義登錄頁面地址為您系統的登錄地址。

          若是OA系統或者報表系統和項目系統不再同一個服務器上,可以進行ajax跨域異步單點登錄。

          Session傳值

          對于java系統來說,可將用戶名與密碼放在session中,把報表集成在同一環境下面,報表可自動獲取到用戶名和密碼的值進行驗證。

          還原默認登錄界面

          如果在決策系統修改了登錄界面后,希望還原成系統默認登錄界面,應該如何實現呢?

          1)打開安裝目錄%FR_HOME%\WebReport\WEB-INF\resources,找到fsconfig.xml



           

          2)刪除loginUrl屬性

          右擊fsconfig.xml文件,選擇編輯器打開,刪除文件中的loginUrl屬性,如下,刪除login.htm:



           

          此時請務必關閉設計器,重新開啟,再次進入數據決策系統,即可回到默認的登錄界面。

          還原到默認的登錄界面后,如果再需要設置登錄界面,可以用管理員賬戶登錄,進行設置即可。

          posted @ 2017-03-21 16:58 喝水居然長肉 閱讀(116) | 評論 (0)編輯 收藏

          Linux之FineBI集群部署

          在企業應用中,通常單個計算機的配置是有限的,而企業應用又是高并發的需求,這個時候會通過計算機集群的方式來提高并發數,從而提高整體應用服務的性能。集群是將多臺計算機作為一個整體來提供相關應用的服務。FineBI支持多計算機服務的集群部署,通過集群部署利用有限的計算機資源來有效提高整體應用的并發性能。本文主要介紹整體FineBI集群的思路。

          FineBI采用負載均衡集群的模式,將多臺服務器創建為一個集群服務器。這里碰到這幾個問題:1)web工程的存儲問題:FineBI在集群中,由于自身的問題需要多臺服務器讀取同一個web工程。因此要實現web工程分享。2)系統數據一致性:在FineBI的運行過程中,存在讀寫的操作,同時有部分的數據的配置文件要寫入數據庫。需要保證集群的情況下,系統數據的一致性。3)負載均衡:一方面通過負載均衡來處理session的問題,另一方面達成負載均衡的集群環境,使用代理服務器可以將請求轉發給集群內部的服務器,可以將負載均衡和代理服務器的高速緩存技術結合在一起,提供有益的性能。4)FS平臺集群:如FineBI使用FS平臺,則FS平臺的各種配置也需要進行集群配置。

          如下圖是一個FineBI進去的架構的案例示意圖,這種方式通過NFS文件共享來處理web工程。



           

          Web工程存儲問題

          Web工程的存儲,我們要解決的是多個服務器保證讀取同一個web工程。我們可以通過ceph做到多塊物理硬盤組件一塊邏輯硬盤,從而實現所有節點都是在訪問同一地址;也可以通過linux本身帶有的nfs共享文件服務來達成訪問同一web工程。無論使用哪一種方式,我們要保證:

          <!--[if !supportLists]-->1)<!--[endif]-->訪問同一web工程

          <!--[if !supportLists]-->2)<!--[endif]-->Cube存儲地址是一致的

          因為同一個web工程下,要求cube的存儲地址是一致的,因此要求cube存儲地址一定要一樣。

          而真正使用的時候,ceph的實現需要至少三臺計算機來實現,而實際企業應用中,比較少使用三臺;而nfs均可以且是linux本身的,因此使用“nfs”方案。

          系統數據配置

          單節點的情況下,利用緩存和通過操作系統的文件系統來保存數據的方式,在集群模式下不再合適。主要原因在于數據的一致性問題,多個節點可能進行同時讀寫,更改系統數據,最終勢必會造成整體數據不一致。最好的解決方案是系統配置數據全部交給MySQL等關系型數據庫來管理。但由于這樣工程量好大,更主要的原因為許多代碼缺少維護,貿然更改可能帶來意想不到的bug。于是我們采用一種折中的做法。在集群中選出一臺幾點作為主節點,簡稱M。其余節點擔當子節點,簡稱S。當S上所有與更改系統配置相關的操作,全部發送到M上進行處理。M負責來更改系統狀態,維護整個系統到底一致的狀態。S節點放棄全部的緩存數據,讀取狀態的時候,不再通過讀取自身數據,而是通過向M發送讀取請求,獲得M上的數據。M節點自身可以存在緩存數據。其他數據S節點與M節點時等同的,不存在從屬關系。



           

          因此按上述原由我們提供如下解決方案:

          <!--[if !supportLists]-->1)<!--[endif]-->mysql數據庫:原web工程中存在finedb的配置信息轉存到mysql數據庫中。因為finedb數據庫只能有一個連接,無法多節點同時讀取,而mysql數據庫則不存在。Logdb也需遷移;

          <!--[if !supportLists]-->2)<!--[endif]-->主子節點:我們使用主子節點的方式來配置集群,系統數據的更改均在主節點上進行,子節點只讀取主節點上的數據;

          <!--[if !supportLists]-->3)<!--[endif]-->Zookeeper:為了保證讀寫情況下,主子節點保證數據一致性,還需要zookeeper進行通信,充當文件鎖的功能。

          負載均衡

          在FineBI的集群環境中,我們可以使用任何支持負載均衡的服務器來完成輪發的任務,并保證session粘滯。此處我們使用的是nginx反向代理,使用IP標識輪發,保證同一個用戶在同一個session。(在一個服務器一個節點的情況下,同一個IP就保證session粘滯)。

          FS平臺集群

          使用FS平臺集群插件,將FS平臺配置能夠滿足集群需求。在FS平臺集群中,FS平臺的所有操作都是發到主節點上來操作;子節點只是作計算服務器。

          posted @ 2017-03-20 11:30 喝水居然長肉 閱讀(142) | 評論 (0)編輯 收藏

          如何將釘釘集成到FineReport插件中

          報表服務器

          安裝釘釘管理插件后,打開報表管理平臺,管理系統下會增加釘釘管理節點,釘釘相關的配置管理都將會放在這個節點中去配置:

           

          同時,設置定時任務的最后一步輸出設置中,會增加推送釘釘消息:

           

          釘釘企業應用

          管理員登錄釘釘企業號,進入微應用設置,需要關注的信息有:

          CorpID:是企業在釘釘中的標識,每個企業擁有一個唯一的CorpID;

          CorpSecret:是企業每個應用的憑證密鑰

           

          •  釘釘管理

          登錄FineReport管理平臺,點擊管理系統>釘釘管理節點:將釘釘中的CorpID和CorpSecret分別填到釘釘企業號ID和管理組憑證密碼中,設置Token獲取路徑,可以自定義獲取的url,如果不寫則采用內置的方式獲取,保存,如下圖:

           

          • 釘釘插件自定義token獲取

          釘釘提供的獲取token接口本身有缺陷:

          1)釘釘提供的接口,使用corpid和secret獲取token,默認不會緩存,但是釘釘提倡做token緩存,2小時內可以重復使用,這樣減少對釘釘服務器的訪問,以免出現問題;

          2)釘釘中集成多個應用的話,如果多個應用都會用到corpid和secret獲取token,如果某個應用緩存了token,就會沖突

          例如:應用a,做了緩存,第一次訪問后獲取到token1,應用b使用會重新取token2,此時應用a還是用的token就無法訪問了。

          針對這種情況,處理方式是所有應用統一到一個地方去取token,此時需要設置自定義token的獲取地址

          在釘釘插件中,釘釘管理>基本信息>設置Token獲取路徑,可以自定義獲取的url,如果不寫則采用內置的方式獲取

           

          Token獲取接口規則:返回json類型的數據,{access_token:"xxxxx", jsapi_ticket:"xxxxx"} 

          釘釘管理后臺創建FineReport報表微應用時,例如http://www.finereporthelp.com:8181/app2/ReportServer?op=fs&corpid=$CORPID$,后面要加上參數&corpid=$CORPID$,這樣后臺會獲取到cropid,然后取到釘釘userid,做單點登錄;

           

          • 釘釘用戶與報表用戶關聯

          按照釘釘提供的方法,讀取釘釘通訊錄的成員,需要的字段有uesrid,name,department進入FineReport報表管理平臺fs,點擊釘釘管理節點,除了基本信息外,增加了釘釘成員管理,點擊效果如下:

           

          表格中會自動讀取釘釘企業號通訊錄中的所有成員,并且在每次打開該頁面時刷新為最新的;默認釘釘成員與報表用戶相同,因為大部分情況下,釘釘成員名和報表用戶名是統一的;

          如果您的釘釘成員名與報表用戶名是不一樣的,此時,可以取消勾選釘釘成員與報表用戶相同設置,此時報表用戶名,可以將釘釘成員與報表用戶進行關聯,如下圖:

           

          • 單點登錄

          釘釘提供免登服務,與微信類似,通過code可以獲取當前取號的userid,獲取到userid后,通過關聯關系自動登錄報表后臺

          • 消息推送

          開發服務器可以主動的發送消息給企業成員,比如使用FineReport定時器生成報表后,發送消息給相應的人員進行查看。進入FineReport管理平臺,添加定時任務:

           

           

          到輸出設置這步,比如我們將定時生成的結果掛在其他這個目錄下面,并且命名為釘釘文檔測試:

           

          通知與存檔選擇推送釘釘消息,企業應用(AgentID)需要根據釘釘管理里的進行填寫,例如下設置,這樣定時任務結束后,這個釘釘成員可以收到消息

           

          定時生成結果的文件名:對應發送消息的標題名

          企業應用AgentID:發消息至哪個應用

          釘釘用戶:發消息給哪些成員,下拉框中會自動讀取釘釘通訊錄中的所有成員,多個成員之間用|分割,比如Jane|Saber

          部門ID:發消息給某個部門的所有成員,該屬性與釘釘用戶是并的關系,不同部門之間也用|分割

          消息內容:定義消息的正文內容

          定時結果訪問連接:勾選的話會在消息正文最后加上定時生成的結果連接,點擊后就可以直接打開定時結果;不選的話則只發送純文本消息。

          定時任務設置好后,比如任務每天都會執行,每次執行后就會推送消息給對應的成員,效果如下:

           

          點擊連接,就可以看到定時生成的結果。

          posted @ 2017-03-14 11:21 喝水居然長肉 閱讀(170) | 評論 (0)編輯 收藏

          JS實現點擊參數面板按鈕顯示或隱藏數據

          當報表中列出數據太多時,想通過顯示按鈕隱藏明細數據只顯示統計數據。如下圖示例,那么該如何實現呢?本文以FineReport為例,來講述JS如何實現點擊參數面板按鈕顯示或隱藏數據。


           

          打開報表

          在參數面板添加一個標簽控件,控件名為lable,設置標簽控件不可見,控件值為“顯示”。


           

          在參數面板添加一個按鈕控件,控件名為button,控件值為“只顯示合計數據”,并添加點擊事件。


           

          編輯點擊事件,添加下面的JavaScript代碼:

          /*獲取隱藏的標簽控件的值*/
          var label= this.options.form.getWidgetByName("label").getValue();

          /*判斷標簽控件的值*/
          if(label=='顯示')
          {
              /*當標簽控件的值為顯示時,則改為隱藏,并修改按鈕名稱為顯示所有數據*/
              this.options.form.getWidgetByName("label").setValue("隱藏");
              this.options.form.getWidgetByName("button").setValue("顯示所有數據");
          }
          else
          {
              /*當標簽控件的值不為顯示時,則改為顯示,并修改按鈕名稱為只顯示合計數據*/
              this.options.form.getWidgetByName("label").setValue("顯示");        
              this.options.form.getWidgetByName("button").setValue("只顯示合計數據");
          }

          /*執行查詢*/
          _g().parameterCommit();

          點擊參數面板空白處,將“點擊查詢前不顯示報表內容”屬性的勾去掉。


           

          回到報表設計界面,右鍵B3單元格,添加條件屬性,設置行高為0毫米,添加公式條件為$label = '隱藏'。


           

          保存模板,點擊分頁預覽即可看到上圖的效果。

          posted @ 2017-03-08 10:36 喝水居然長肉 閱讀(217) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 南溪县| 汕尾市| 仲巴县| 故城县| 东城区| 肃北| 舒城县| 英吉沙县| 连平县| 青川县| 高台县| 隆德县| 康保县| 志丹县| 吴堡县| 潼关县| 同德县| 宣威市| 陆川县| 平远县| 扎鲁特旗| 台前县| 北宁市| 正定县| 北碚区| 富川| 济源市| 四子王旗| 年辖:市辖区| 莲花县| 合山市| 凤翔县| 正蓝旗| 永新县| 惠来县| 宁远县| 吐鲁番市| 维西| 昭通市| 扶绥县| 云阳县|