集團(tuán)公司(嵌入ETL工具)財(cái)務(wù)報(bào)表系統(tǒng)解決方案
一、項(xiàng)目背景:
某集團(tuán)公司是一家擁有100多家子公司的大型集團(tuán)公司,旗下子公司涉及各行各業(yè),包括:金礦、銅礦、房產(chǎn)、化纖等。由于子公司在業(yè)務(wù)上的差異,子公司的財(cái)務(wù)報(bào)表也存在很多不同之處。因此,各個(gè)子公司需要根據(jù)自己的情況,制作符合自己個(gè)性化需求的報(bào)表模版,然后再部署到集團(tuán)服務(wù)器進(jìn)行統(tǒng)一管理。
集團(tuán)使用的是SAP,所有子公司正是因這個(gè)系統(tǒng)而產(chǎn)生大量數(shù)據(jù)且這些數(shù)據(jù)保存在一起。此外,各子公司也有一些自己的系統(tǒng),所以各自也會(huì)產(chǎn)生一些數(shù)據(jù)。
出于數(shù)據(jù)安全等因素的考慮,各個(gè)子公司的數(shù)據(jù)統(tǒng)一集中在集團(tuán)總部的數(shù)據(jù)庫(kù)。子公司的報(bào)表開(kāi)發(fā)人員使用FineReport連接到總部數(shù)據(jù)庫(kù)時(shí),只能看到自己權(quán)限內(nèi)的數(shù)據(jù)
二、項(xiàng)目建設(shè)目標(biāo):
定期的將總數(shù)據(jù)源中數(shù)據(jù)導(dǎo)入到各子公司內(nèi)的數(shù)據(jù)庫(kù)表中,此時(shí)各子公司在開(kāi)發(fā)報(bào)表時(shí)就只需連自己的數(shù)據(jù)庫(kù)表即可,這樣就實(shí)現(xiàn)了數(shù)據(jù)權(quán)限的控制,同時(shí)也較好的將各子公司的數(shù)據(jù)放在各子公司的數(shù)據(jù)庫(kù)表內(nèi)。
三、項(xiàng)目建設(shè)方案:
1. 所用工具Kettle簡(jiǎn)介
Kettle是一款國(guó)外開(kāi)源的ETL工具,純java編寫(xiě),可以在Window、Linux、Unix上運(yùn)行,綠色無(wú)需安裝,數(shù)據(jù)抽取高效穩(wěn)定。
ETL即數(shù)據(jù)抽取、轉(zhuǎn)換、裝載的過(guò)程。它是構(gòu)建數(shù)據(jù)倉(cāng)庫(kù)的重要環(huán)節(jié)。數(shù)據(jù)倉(cāng)庫(kù)是面向主題的、集成的、穩(wěn)定的且隨時(shí)間不斷變化的數(shù)據(jù)集合用以支持經(jīng)營(yíng)管理中的決策制定過(guò)程。Kettle 的中文名稱叫水壺,含義就是希望把各種數(shù)據(jù)放到一個(gè)壺里,然后以一種指定的格式流出。
Kettle這個(gè)ETL工具集,它允許你管理來(lái)自不同數(shù)據(jù)庫(kù)的數(shù)據(jù),通過(guò)提供一個(gè)圖形化的用戶環(huán)境來(lái)描述你想做什么,而不是你想怎么做。
Kettle中有兩種腳本文件,transformation和job,transformation完成針對(duì)數(shù)據(jù)的基礎(chǔ)轉(zhuǎn)換,job則完成整個(gè)工作流的控制。
作為Pentaho的一個(gè)重要組成部分,現(xiàn)在在國(guó)內(nèi)項(xiàng)目應(yīng)用上逐漸增多。FineReport報(bào)表軟件可以實(shí)現(xiàn)和Kettle工具的完美集成應(yīng)用。
2. Kettle工具的優(yōu)勢(shì):
(1)kettle開(kāi)源、高效
(2)kettle 非常強(qiáng)大而且易于使用的設(shè)計(jì)界面
(3)有非常強(qiáng)大而且眾多的使用群體,應(yīng)用廣泛
(4)可用java進(jìn)行集成開(kāi)發(fā):
提供了基于JAVA的腳步編寫(xiě)功能,可以靈活地自定義ETL過(guò)程,使自行定制、批量處理等成為可能,這才是一個(gè)程序員需要做的工作,而不僅是象使用Word一樣操作kettle用戶界面。
3. Kettle工具工作原理:
(1)Kettle的四大模塊:

Spoon 是一個(gè)圖形用戶界面,它允許你運(yùn)行轉(zhuǎn)換或者任務(wù),其中轉(zhuǎn)換是用Pan工具來(lái)運(yùn)行,任務(wù)是用Kitchen來(lái)運(yùn)行。Pan是一個(gè)數(shù)據(jù)轉(zhuǎn)換引擎,它可以執(zhí)行很多功能,例如:從不同的數(shù)據(jù)源讀取、操作和寫(xiě)入數(shù)據(jù)。Kitchen 是一個(gè)可以運(yùn)行利用XML 或數(shù)據(jù)資源庫(kù)描述的任務(wù)。通常任務(wù)是在規(guī)定的時(shí)間間隔內(nèi)用批處理的模式自動(dòng)運(yùn)行。
以下是一個(gè)簡(jiǎn)單的ETL過(guò)程:

(2)原理總結(jié):
Kettle實(shí)現(xiàn)數(shù)據(jù)轉(zhuǎn)換,主要是通過(guò)JDBC驅(qū)動(dòng),建立連接,加載數(shù)據(jù),轉(zhuǎn)化數(shù)據(jù)并儲(chǔ)存數(shù)據(jù)。
4. 利用kettle實(shí)現(xiàn)定時(shí)導(dǎo)出數(shù)據(jù)方案
實(shí)現(xiàn)定時(shí)導(dǎo)出數(shù)據(jù),主要實(shí)現(xiàn)二個(gè)關(guān)建點(diǎn):
1.定時(shí)功能
2.從源數(shù)據(jù)庫(kù)中提取數(shù)據(jù)插入目標(biāo)數(shù)據(jù)庫(kù)
利用 kettle工具可以輕松實(shí)現(xiàn)以上二點(diǎn)。
1.定時(shí)功能:
Kettle是成熟專業(yè)的ETL工具,實(shí)現(xiàn)定時(shí)功能只需對(duì)作業(yè)進(jìn)行相應(yīng)的設(shè)置即可,如下所示,表示每天的12點(diǎn)整執(zhí)行同步任務(wù)。

2.從源數(shù)據(jù)庫(kù)中提取數(shù)據(jù)插入目標(biāo)數(shù)據(jù)庫(kù)
Kettle只需簡(jiǎn)單配置即可從數(shù)據(jù)庫(kù)中取出數(shù)據(jù),如下圖所示。

其中${company}為公司變量名稱,存入目標(biāo)數(shù)據(jù)庫(kù)也類似,只需要簡(jiǎn)單配置即可
詳細(xì)使用配置見(jiàn)下面的實(shí)例。
5. Kettle工具的定時(shí)數(shù)據(jù)提取應(yīng)用實(shí)例:
(1)實(shí)例功能:
定期對(duì)各個(gè)子公司的數(shù)據(jù)庫(kù)表進(jìn)行查詢并且通過(guò)數(shù)據(jù)抽取和比較實(shí)現(xiàn)數(shù)據(jù)插入更新。
(2)實(shí)例分析:
實(shí)現(xiàn)整項(xiàng)作業(yè)共需要3個(gè)文件,名稱和對(duì)應(yīng)功能如下表所示:
文件名稱 | 實(shí)現(xiàn)功能 |
main.kjb | 作業(yè)文件,用來(lái)定時(shí)執(zhí)行mainTrans.ktr |
mainTrans.ktr | 用來(lái)批量執(zhí)行trans1.ktr,并提供trans1.ktr的變量 |
trans1.ktr | 根據(jù)mainTrans.ktr提供的變量具體執(zhí)行導(dǎo)出的轉(zhuǎn)化 |
(1)文件詳細(xì)說(shuō)明:
mainTrans.ktr:
在mainTrans.ktr中生成不同的數(shù)據(jù)庫(kù)連接信息和其他變量信息。
示例中為手動(dòng)輸入數(shù)據(jù),也可以把信息保存在文本中或者數(shù)據(jù)庫(kù)中,設(shè)置對(duì)應(yīng)的輸入即可。如下所示,table為子公司數(shù)據(jù)庫(kù)中的表名,company對(duì)應(yīng)公司,后面的值為子公司數(shù)據(jù)庫(kù)的連接信息。

mainTrans.ktr中有個(gè)java腳本,具體行為為獲取trans1.ktr文件,設(shè)置變量并執(zhí)行。
上面有幾條記錄就會(huì)執(zhí)行幾次trans1.ktr。
trans1.ktr:
具體執(zhí)行導(dǎo)出的文件,示例中為mysql數(shù)據(jù)庫(kù),表名和字段也是特別設(shè)置的,請(qǐng)根據(jù)自己的環(huán)境進(jìn)行相應(yīng)的修改。
表輸入:
表輸入按照需要導(dǎo)出的總數(shù)據(jù)庫(kù)信息配置好,sql示例語(yǔ)句為:
SELECT * FROM kettletb WHERE company='${company}'
表示為只選出對(duì)應(yīng)子公司的數(shù)據(jù),其中${company}為傳入進(jìn)來(lái)的公司名。
具體配置頁(yè)面如下圖:

表輸出:
這里的配置需要根據(jù)變量來(lái)設(shè)置,目標(biāo)表為${table}來(lái)獲取要導(dǎo)出的表名。其他配置如下所示,其中的值對(duì)應(yīng)mainTrans.ktr中生成的數(shù)據(jù)(其中Password為${password}):

插入更新:
示例中對(duì)數(shù)據(jù)庫(kù)表中的id和name字段進(jìn)行查詢,通過(guò)對(duì)id的比較來(lái)篩選掉原本數(shù)據(jù)庫(kù)表里就用的數(shù)據(jù),這樣的話只需要插入最新更改的數(shù)據(jù)即可,大大提高了數(shù)據(jù)轉(zhuǎn)換的效率。

設(shè)置main.kjb的定時(shí)時(shí)間,運(yùn)行即可。設(shè)置頁(yè)面參考如下圖:

售后服務(wù)體系:
