分析報(bào)表開(kāi)發(fā)_第1頁(yè)
分析報(bào)表開(kāi)發(fā)_第2頁(yè)
分析報(bào)表開(kāi)發(fā)_第3頁(yè)
分析報(bào)表開(kāi)發(fā)_第4頁(yè)
分析報(bào)表開(kāi)發(fā)_第5頁(yè)
已閱讀5頁(yè),還剩121頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、目錄第一章總體介紹21.開(kāi)發(fā)概述技術(shù)型報(bào)表與業(yè)務(wù)型報(bào)表2一般報(bào)表開(kāi)發(fā)存在的問(wèn)題2模式化報(bào)表開(kāi)發(fā)思路22.應(yīng)用模型第二章數(shù)據(jù)模型與展現(xiàn)模型3數(shù)據(jù)字典4業(yè)務(wù)系統(tǒng)集成5低開(kāi)發(fā)難度報(bào)表61.2.概述6類(lèi)報(bào)表明細(xì)報(bào)表8匯總報(bào)表17列結(jié)構(gòu)依賴于條件的報(bào)表(動(dòng)態(tài)SQL)233.交叉類(lèi)報(bào)表30列向拼接型報(bào)表(復(fù)合) .31列向分支統(tǒng)計(jì)型報(bào)表(CASE-WHEN)36動(dòng)態(tài)行列交叉型報(bào)表(旋轉(zhuǎn)交叉)404.投影類(lèi)報(bào)表45單元格依賴于行列條件的報(bào)表(投影交叉)454.14.2半錄入半嵌入型報(bào)表(合并) .515.算法類(lèi)報(bào)表555.15.2

2、5.35.4數(shù)據(jù)預(yù)備知識(shí)55非投影類(lèi)報(bào)表(普通)60投影類(lèi)報(bào)表(投影) .65程序送數(shù)型報(bào)表696.高級(jí)應(yīng)用76.4第三章支持穿透的非投影交叉類(lèi)報(bào)表(普通穿透)73支持穿透的投影交叉類(lèi)報(bào)表(投影穿透)79支持主從連動(dòng)的報(bào)表84支持統(tǒng)計(jì)圖表的報(bào)表88發(fā)難度報(bào)表921.基于行業(yè)報(bào)表工具開(kāi)發(fā)的報(bào)表921.11.2標(biāo)準(zhǔn)報(bào)表92分塊填充報(bào)表1042.基于CELL REPORT工具開(kāi)發(fā)的報(bào)表1112.12.2CELL REPORT工具介紹111CELL REPORT報(bào)表113附錄1241模式一覽表1242引擎FAQ之參數(shù)篇125第一章總體介紹1.開(kāi)發(fā)概述1.1技術(shù)型報(bào)表與業(yè)務(wù)型報(bào)表報(bào)表

3、應(yīng)用劃分為兩種類(lèi)型,一類(lèi)應(yīng)用的側(cè)重點(diǎn)在于出報(bào)表所蘊(yùn)涵的技術(shù),開(kāi)發(fā)者(程序員或?qū)嵤┩ǔ{借一定的數(shù)據(jù)庫(kù)和編程知識(shí),基于的業(yè)務(wù)數(shù)據(jù),做出符合用戶需求的報(bào)表展現(xiàn)和輸出,此類(lèi)應(yīng)用稱為技術(shù)型報(bào)表;另一類(lèi)應(yīng)用則著眼于整個(gè)報(bào)表生命周期中各環(huán)節(jié)的管理(包括出表、上報(bào)、審核、匯總、發(fā)布等流程),即把做報(bào)表的行為當(dāng)項(xiàng)業(yè)務(wù),對(duì)直接開(kāi)發(fā)者的主要要求在于業(yè)務(wù)熟悉程度而非技術(shù),此類(lèi)應(yīng)用稱為業(yè)務(wù)型報(bào)表。前者通常由專業(yè)程序員、二次開(kāi)發(fā)或技術(shù)型實(shí)施顧問(wèn)承擔(dān)開(kāi)發(fā)工作,早期工具如報(bào)表模板、自定義等均面向此類(lèi)應(yīng)用,IUFO 則是后者的代表性。本文檔作為平臺(tái)技術(shù)部對(duì)外發(fā)布的開(kāi)發(fā)手冊(cè),主要對(duì)象為技術(shù)型報(bào)表。1.2一般報(bào)表開(kāi)發(fā)存在的問(wèn)題

4、報(bào)表屬于 ERP 項(xiàng)目中的關(guān)鍵應(yīng)用,通常被用戶的用于企業(yè)業(yè)績(jī)?cè)u(píng)估、輔助決策或?qū)ν獍l(fā)布。據(jù)統(tǒng)計(jì),在很多交付較大的項(xiàng)目當(dāng)中,報(bào)表開(kāi)發(fā)占有相當(dāng)?shù)谋戎亍>湍壳伴_(kāi)發(fā)現(xiàn)狀而言,影響報(bào)表快速交付的主要問(wèn)題有以下幾點(diǎn):1、 報(bào)表開(kāi)發(fā)本身的復(fù)雜性高。中國(guó)式報(bào)表由于政策以及長(zhǎng)期人工填報(bào)的具有極強(qiáng)的個(gè)性化特點(diǎn),根據(jù)業(yè)務(wù)邏輯進(jìn)行數(shù)據(jù)耗費(fèi)了很高的開(kāi)發(fā)代價(jià);、數(shù)據(jù)組織、展現(xiàn)和界面處理的每個(gè)步驟都2、 報(bào)表開(kāi)發(fā)的復(fù)用性低。開(kāi)發(fā)投入巨大努力完成第一批報(bào)表后,發(fā)現(xiàn)第二批報(bào)表依然要從頭做起,或者另一名開(kāi)發(fā)不知道)前人的開(kāi)發(fā)成果;遇到類(lèi)似于第一批報(bào)表的需求,無(wú)法借鑒(甚至根本3、 報(bào)表開(kāi)發(fā)對(duì)專業(yè)技能要求偏高。很多二次開(kāi)發(fā)雖然不是專

5、門(mén)搞技術(shù)的,但通常具有一定的開(kāi)發(fā)基礎(chǔ),而目前的二次開(kāi)發(fā)平臺(tái)限制了他們發(fā)揮應(yīng)有的作用。1.3模式化報(bào)表開(kāi)發(fā)思路所謂模式化開(kāi)發(fā),包含兩方面的工作:專職將有代表性的應(yīng)用進(jìn)行歸納抽象,提取出共性的部分形成代碼框架和方案,并以手冊(cè)的形式對(duì)外發(fā)布;報(bào)表開(kāi)發(fā)拿到項(xiàng)目需求后,從手冊(cè)上找到匹配的模式,通過(guò)編寫(xiě)一些低技術(shù)含量的子類(lèi)代碼或進(jìn)行一些機(jī)械性的工具操作,就能夠快速地完成開(kāi)發(fā)工作。以往大部分的重復(fù)性勞動(dòng)已經(jīng)在模式的基類(lèi)或者缺省實(shí)現(xiàn)第 2 頁(yè)中處理,當(dāng)開(kāi)發(fā)需要體現(xiàn)個(gè)性化的時(shí)候,則可以通過(guò)對(duì)接口的特殊實(shí)現(xiàn)完成。隨著模式的逐步豐富,開(kāi)發(fā)開(kāi)發(fā)各類(lèi)模式報(bào)表的工作量都會(huì)明顯降低,同時(shí)也實(shí)現(xiàn)了代碼復(fù)用和知識(shí)共享,另一方面

6、,由于開(kāi)發(fā)者的工作趨于簡(jiǎn)單和機(jī)械,他們的就可以由低專業(yè)技能所取代。從這個(gè)角度上說(shuō),模式化是解決上節(jié)所述三個(gè)問(wèn)題從而真正實(shí)現(xiàn)報(bào)表快速開(kāi)發(fā)的有效方案。本手冊(cè)介紹了兩大類(lèi) NC 報(bào)表開(kāi)發(fā)模式,一類(lèi)是基于引擎的低開(kāi)發(fā)難度報(bào)表,其編碼量小,操作簡(jiǎn)單,適合于開(kāi)發(fā)數(shù)據(jù)和格式比較規(guī)律的報(bào)表;另一類(lèi)是基于行業(yè)報(bào)表工具的發(fā)難度報(bào)表,主要工作是編寫(xiě)子類(lèi)代碼,自由度高,適合于開(kāi)發(fā)復(fù)雜報(bào)表。2.應(yīng)用模型2.1數(shù)據(jù)模型與展現(xiàn)模型一般來(lái)說(shuō),報(bào)表是由數(shù)據(jù)和格式組成的整體。報(bào)表的數(shù)據(jù)模型通常包含以下信息:1、 數(shù)據(jù)結(jié)構(gòu);2、 待定參數(shù)描述;3、 取數(shù)規(guī)則描述;4、 數(shù)據(jù)算法描述;5、 多個(gè)數(shù)據(jù)集合之間的數(shù)據(jù)關(guān)聯(lián)描述;可作為數(shù)據(jù)

7、載體的常用 NC 數(shù)據(jù)結(jié)構(gòu)包括:1、 nc.vo.pub.CircularlyAccessibleValueObject循環(huán)VO,是由屬性和取值成對(duì)組成的集合,提供了根據(jù)屬性獲得/設(shè)置值的方法,是單據(jù)和報(bào)表模板采用的主;2、 nc.vo.pub.ValueObject普通 VO,包含多個(gè)屬性及每個(gè)屬性的 getter 和 setter 方法,是業(yè)務(wù)組主要數(shù)據(jù)結(jié)構(gòu)的父類(lèi);3、 com.borland.dx.dataset.StorageDataSet數(shù)據(jù)集,由元數(shù)據(jù)和內(nèi)容數(shù)據(jù)兩部分組成,元數(shù)據(jù)(Column)描述了各列的信息,內(nèi)容數(shù)據(jù)描述了一個(gè)二維的數(shù)據(jù)集合,當(dāng)游標(biāo)指向內(nèi)容數(shù)據(jù)的某行時(shí),可以獲得

8、該行指定列的數(shù)據(jù),用于引擎;4、 nc.vo.pub.rs.MemoryResultSet內(nèi)存結(jié)果集,同樣由元數(shù)據(jù)和內(nèi)容數(shù)據(jù)組成,其中元數(shù)據(jù)(MemoryResultSetMetaData)描述各列信息,內(nèi)容數(shù)據(jù)(ArrayList)描述了一個(gè)二維數(shù)據(jù)集合,可以直接其任何元素,目前被一些業(yè)務(wù)算法使用;5、 Object,Vector,ArrayList這些都是 JDK 的常用結(jié)構(gòu),均可二維數(shù)據(jù)。報(bào)表的展現(xiàn)模型通常包含以下信息:1、 控件(控件是表格)屬性和布局;2、 控件顯示內(nèi)容與顯示規(guī)則(綁定數(shù)據(jù)、參數(shù)、行列格式、界面3、 控件連動(dòng)規(guī)則;等);4、 數(shù)據(jù)處理規(guī)則(5、 動(dòng)態(tài)擴(kuò)展規(guī)則;、排序、

9、過(guò)濾、統(tǒng)計(jì)、公式、交叉、鉆取等);6、 輸入輸出(待定參數(shù)設(shè)置,打印,導(dǎo)出等)第 3 頁(yè)2.2數(shù)據(jù)字典N(xiāo)C 數(shù)據(jù)字典提供了統(tǒng)一的數(shù)據(jù)建模平臺(tái),支持對(duì)各種數(shù)據(jù)庫(kù)對(duì)象進(jìn)行管理,維護(hù)這些物理對(duì)象的邏輯屬性,并向外系統(tǒng)提供數(shù)據(jù)庫(kù)邏輯信息的接口。以引擎為例,對(duì)象的定義是基于數(shù)據(jù)字典進(jìn)行的,而這份數(shù)據(jù)字典來(lái)自對(duì)象所指定的數(shù)據(jù)源。由于多數(shù)報(bào)表的列與業(yè)務(wù)數(shù)據(jù)庫(kù)的字段存在某種對(duì)應(yīng)關(guān)系,因此數(shù)據(jù)字典的存在有助于提高直觀性和易用性。定義的NC 數(shù)據(jù)字典通常在安裝時(shí)候由系統(tǒng)生成,如果想為某些數(shù)據(jù)庫(kù)對(duì)象生成字典,可以采用數(shù)據(jù)字典管理界面提供的導(dǎo)入方法。導(dǎo)入方式包括三種(詳細(xì)操作可參見(jiàn)數(shù)據(jù)字典導(dǎo)入說(shuō)明):1、2、PDM

10、文件(xml 格式);NC 標(biāo)準(zhǔn)建庫(kù);3、 提取數(shù)據(jù)庫(kù)元數(shù)據(jù);如果需要給非 NC 數(shù)據(jù)庫(kù)(比如用戶采用的第數(shù)據(jù)庫(kù))生成數(shù)據(jù)字典,可以利用PowerDesigner 提供的逆向工程功能將的物理表生成 PDM 文件,修改其中表和字段的中文名稱,然后以 xml 文件格式,再使用上述第法導(dǎo)入。第 4 頁(yè)2.3業(yè)務(wù)系統(tǒng)集成對(duì)于直接使用引擎開(kāi)發(fā)出的報(bào)表,可以使用以下兩種方式掛接到業(yè)務(wù)組的功能節(jié)點(diǎn)。強(qiáng)烈建議把準(zhǔn)備掛接節(jié)點(diǎn)的對(duì)象和格式對(duì)象的編碼設(shè)為與業(yè)務(wù)系統(tǒng)相關(guān)的有意義字符串,以避免不同業(yè)務(wù)系統(tǒng)預(yù)置對(duì)象互相覆蓋的性。報(bào)表管理節(jié)點(diǎn)掛接法:1、功能節(jié)點(diǎn),類(lèi)名為 nc.ui.pub.querym.QueryMain

11、UI_N;2、 下掛一個(gè)參數(shù),參數(shù)名為 folderId,參數(shù)值為客戶化下引擎管理中相關(guān)報(bào)表目錄的 ID(可從數(shù)據(jù)庫(kù)表 pub_formatmdef 的 id 字段查出)。報(bào)表節(jié)點(diǎn)掛接法:1、功能節(jié)點(diǎn),類(lèi)名為:nc.ui.pub.querym.QueryNodeUI:2、 下掛兩個(gè)參數(shù):pkQryNode界面模型對(duì)應(yīng)的編碼(可從引擎管理界面),dsName定義所在數(shù)據(jù)源。對(duì)于發(fā)難度模式的報(bào)表,則與普通功能節(jié)點(diǎn)一樣掛接 ToftPanel 的子類(lèi)即可。第 5 頁(yè)第二章 低開(kāi)發(fā)難度報(bào)表1.概述引擎(V3 版本)提供解決方案。引擎是本手冊(cè)列舉的低開(kāi)發(fā)難度報(bào)表模式統(tǒng)一由一個(gè)面向高級(jí)實(shí)施和普通開(kāi)發(fā)的建模

12、,延續(xù)并完善了自定義體系的技術(shù)路線,在全面支持復(fù)雜的設(shè)計(jì)和個(gè)性化的報(bào)表展現(xiàn)的同時(shí),大幅度降低了報(bào)表開(kāi)發(fā)人員的編碼工作量和專業(yè)技能要求。我們?cè)賮?lái)看一下引擎的適用性和不適用性。引擎長(zhǎng)期作為一個(gè)工具發(fā)展,因此尤其適用于與數(shù)據(jù)庫(kù)分析或數(shù)據(jù)挖掘關(guān)系密切的報(bào)表開(kāi)發(fā),同時(shí)也支持程序員調(diào)用服務(wù)器端代碼對(duì)數(shù)據(jù)進(jìn)行業(yè)務(wù)處理。另一方面,自定義體系與模板體系存在一個(gè)很大的不同,模板體系在發(fā)布之前已經(jīng)由程序員錄入了大量初始化數(shù)據(jù),因此不同用戶能夠分配到不同的模板、報(bào)表模板和打印模板,而自定義體系是完全自定義的實(shí)時(shí)開(kāi)發(fā),沒(méi)有模樣式、一種報(bào)表界面樣式和一種打印樣板的預(yù)制數(shù)據(jù),因此在一個(gè)時(shí)刻只支持一種參數(shù)式(或直接打?。?,但

13、這些樣式均可在設(shè)計(jì)態(tài)修改。在展現(xiàn)上,由于引擎使用的是 SWING的表格控件,因此對(duì)一些 EXCEL 風(fēng)格的需求支持不夠,這個(gè)薄弱環(huán)節(jié)將在 V31 得到加強(qiáng)。總體來(lái)說(shuō),V3 版本的引擎暫不適用于以下兩類(lèi)報(bào)表開(kāi)發(fā):1、 有多模板分配需求的報(bào)表,或?qū)Υ蛴∮懈叨纫蟮膱?bào)表;2、 存在表體合并單元格的報(bào)表。引擎的模型(數(shù)據(jù)模型)設(shè)計(jì)如下:模型流程如下所示(設(shè)計(jì)態(tài)/運(yùn)行態(tài)):第 6 頁(yè)界面模型(展現(xiàn)模型)設(shè)計(jì)如下:第 7 頁(yè)界面模型流程如下所示:本章共介紹了五大類(lèi)報(bào)表的十五種開(kāi)發(fā)模式。盡管這些模式之間存在相當(dāng)差異,但是以前我們發(fā)現(xiàn)的一些用例雜亂導(dǎo)致的培訓(xùn)效果問(wèn)題,本章的所有范例集中面向兩個(gè)業(yè)務(wù)應(yīng)用(費(fèi)用統(tǒng)

14、計(jì)和部門(mén)人事統(tǒng)計(jì)),即用不同方案解決相似問(wèn)題,以便于讀者從中領(lǐng)會(huì)和比較這些模式的原理、特點(diǎn)和適用性。希望這種做法解決這兩類(lèi)報(bào)表的應(yīng)用。給讀者造個(gè)誤導(dǎo):引擎只能2.類(lèi)報(bào)表類(lèi)報(bào)表指通過(guò)一個(gè)或多個(gè) SQL結(jié)果形成的二維數(shù)據(jù)展現(xiàn)出來(lái)的報(bào)表,由于 SQL 的語(yǔ)法特點(diǎn),此類(lèi)報(bào)表通常具有固定的列結(jié)構(gòu)和動(dòng)態(tài)的行結(jié)構(gòu),但模式 2.3 也探討了一種根據(jù)參數(shù)動(dòng)態(tài)改變列結(jié)構(gòu)的方案。2.1明細(xì)報(bào)表【概述】明細(xì)報(bào)表用于展現(xiàn)最基本維度上的數(shù)據(jù),即最細(xì)粒度的數(shù)據(jù)。通常明細(xì)總是相對(duì)于匯總而言的,如果我們把某商品每的總銷(xiāo)售額列表視為匯總數(shù)據(jù),那么該商品每天的詳細(xì)銷(xiāo)售情可視為明細(xì)數(shù)據(jù);如果我們把某部門(mén)當(dāng)年的總薪資情況做成匯總表,那

15、么該部門(mén)每位員工當(dāng)年的薪資情可以做成明細(xì)表類(lèi)報(bào)表中的明細(xì)表通常是指一些不含聚合函數(shù)的SQL 語(yǔ)句直接能夠出的數(shù)據(jù)形成的報(bào)表?!緫?yīng)用場(chǎng)景】第 8 頁(yè)開(kāi)發(fā)需要通過(guò)多表聯(lián)查 SQL 或者復(fù)合獲得表體數(shù)據(jù),同時(shí)為報(bào)表展現(xiàn)提供待定條件設(shè)置、欄位設(shè)置、排序、過(guò)濾、合計(jì)及輸出等功能。當(dāng)明細(xì)表與匯總表一起出現(xiàn)時(shí),用戶通常還會(huì)有從匯總數(shù)據(jù)聯(lián)查明細(xì)數(shù)據(jù)的需求(又稱穿透或鉆取),此類(lèi)應(yīng)用將在模式 6.1 中介紹。【適用性和不適用性】適用于:¾明細(xì)數(shù)據(jù)的取數(shù)規(guī)則可用 SQL 描述;不適用于:¾¾通過(guò)行列條件統(tǒng)計(jì)單元取值的明細(xì)表。此類(lèi)報(bào)表應(yīng)遵循模式 4.1 解決;通過(guò)程序算法構(gòu)造明細(xì)數(shù)據(jù)的

16、報(bào)表。此類(lèi)報(bào)表應(yīng)遵循算法類(lèi)報(bào)表模式解決;【解決方案】取數(shù)由式 SQL 設(shè)計(jì)描述,條件由參數(shù)機(jī)制解決,欄目在格式設(shè)計(jì)態(tài)設(shè)定,排序、過(guò)濾、合計(jì)、輸出等功能均內(nèi)置于報(bào)表瀏覽態(tài)?!鹃_(kāi)發(fā)步驟】第一步:在引擎管理中建立對(duì)象 Q1,做式 SQL 設(shè)計(jì)(通常不含聚合函數(shù) sum、avg、count、max、min)。對(duì)于一個(gè) SQL 無(wú)法描述的,比如指定在指定期間內(nèi)不同科目的發(fā)生額,可以利用復(fù)合(基于對(duì)象的,可參考模式 3.1)進(jìn)行描述。Q1中待定的信息由參數(shù)定義描述,普通參數(shù)可以在式設(shè)計(jì)的篩選條件處,替換型參數(shù)可以在式和手工式設(shè)計(jì)的任意位置(參見(jiàn) FAQ 文檔);第二步:創(chuàng)建格式對(duì)象 F1,對(duì)象 Q1 并嵌

17、入表格,做相關(guān)的欄位、列格式和列表頭設(shè)計(jì)。表頭表尾可放置綁定參數(shù)的控件;第三步:瀏覽 F1(或掛功能節(jié)點(diǎn)),設(shè)置參數(shù),檢據(jù)與格式是否正確;【FAQ】1、如何充分發(fā)揮模型中參數(shù)的功能?答:參見(jiàn)附錄提供的引擎 FAQ 之參數(shù)篇。2、格式設(shè)計(jì)中的 16 種控件各有何種用途?答:表格、圖表是控件,用于綁定數(shù)據(jù)集;面板、拆分窗格(分割面板)、多頁(yè)簽作為界面容器;、文本框、下拉框(組合框)、參照、文本域、復(fù)選框、單選框是表頭表尾控件,需要放在容器上面,用于綁定參數(shù);下拉框、列表綁定枚舉型參數(shù),參照綁定參照型參數(shù);主子表是已經(jīng)不推薦使用的連動(dòng)展現(xiàn)控件;按鈕、樹(shù)暫無(wú)實(shí)際用處。3、如何報(bào)表的輸出格式?答:打印輸

18、出利用格式設(shè)計(jì)中的打印設(shè)置功能,EXCEL 輸出由界面表格的樣式?!痉独抠M(fèi)用明細(xì)表各在指定期間范圍內(nèi)的費(fèi)用明細(xì)情況。報(bào)表中要求包括公司、期間、制單日期、科目、分錄摘要、發(fā)生額等信息,用戶可以根據(jù)年度和期間范圍進(jìn)行。第 9 頁(yè)1、引擎管理主界面創(chuàng)建對(duì)象,編碼為 gldetail,名稱為費(fèi)用明細(xì);2、進(jìn)行參數(shù)定義,增加三個(gè)字符型參數(shù):年,起始期間,終止期間;3、進(jìn)行 SQL設(shè)計(jì):從數(shù)據(jù)字典添加憑證表(gl_voucher)、憑證分錄(gl_detail)、科目表(bd_accsubj)和公司目錄(bd_corp),指定表間連接關(guān)系、義確定條件)和排序字段;字段、篩選條件(先定第 10 頁(yè)公司期間

19、制單日期科目摘要借發(fā)生額貸發(fā)生額第 11 頁(yè)4、在篩選條件頁(yè)簽增加待定條件,在右操作數(shù)框中按 F12參數(shù);5、創(chuàng)建格式對(duì)象,編碼為 gldetail,名稱為“費(fèi)用明細(xì)表”;第 12 頁(yè)6、“費(fèi)用明細(xì)”;7、進(jìn)行格式設(shè)計(jì):添加表格和面板控件,表格??坑谥胁?,雙擊控件設(shè)置屬性,綁定數(shù)據(jù)集費(fèi)用明細(xì),面板??坑诒辈浚ㄗ鳛楸眍^容器),采用流式布局(FlowLayout),在面板上放三個(gè)文本框控件,分別綁定費(fèi)用明細(xì)的三個(gè)參數(shù);第 13 頁(yè)第 14 頁(yè)8、(可選)定義一種列格式,用于顯示兩位小數(shù),在表格屬性框的列格式分欄中由兩個(gè)金額列此列格式;第 15 頁(yè)9、瀏覽費(fèi)用明細(xì)表(先設(shè)置參數(shù));第 16 頁(yè)2.2

20、匯總報(bào)表【概述】匯總數(shù)據(jù)通常與明細(xì)數(shù)據(jù)相對(duì),是指在明細(xì)數(shù)據(jù)基礎(chǔ)上指定若干個(gè)有分類(lèi)意義的字符型列進(jìn)行分組,并對(duì)另外若干個(gè)有統(tǒng)計(jì)意義的數(shù)值型列進(jìn)行求和(或求平均、最值、計(jì)數(shù)等)獲得的數(shù)據(jù)。展現(xiàn)匯總數(shù)據(jù)的報(bào)表稱為匯總報(bào)表。【應(yīng)用場(chǎng)景】我們?cè)偌?xì)分為兩種應(yīng)用:1 靜態(tài)匯總設(shè)置:數(shù)據(jù)的 SQL 中指定了分組列和匯總列,此設(shè)置在報(bào)表瀏覽狀態(tài)不再改變。要求提供待定條件設(shè)置、欄位設(shè)置、排序、過(guò)濾、2 動(dòng)態(tài)匯總設(shè)置:、合計(jì)及輸出等功能。事先對(duì)數(shù)據(jù)設(shè)定某種缺省的匯總設(shè)置,此設(shè)置在瀏覽態(tài)可做更改,并重新計(jì)算匯總數(shù)據(jù)。同時(shí)具備上述功能需求。【適用性和不適用性】適用于:¾匯總數(shù)據(jù)的取數(shù)規(guī)則可用 SQL 描述;不

21、適用于:¾¾通過(guò)行列條件統(tǒng)計(jì)單元取值的匯總表。此類(lèi)報(bào)表應(yīng)遵循模式 4.1 解決;通過(guò)程序算法構(gòu)造匯總數(shù)據(jù)的報(bào)表。此類(lèi)報(bào)表應(yīng)遵循算法類(lèi)報(bào)表模式解決;【解決方案】取數(shù)由式 SQL 設(shè)計(jì)描述,條件由參數(shù)機(jī)制解決,欄目在格式設(shè)計(jì)態(tài)設(shè)定,動(dòng)、輸出等功能均內(nèi)置于報(bào)表瀏覽態(tài)。態(tài)匯總由旋轉(zhuǎn)交叉機(jī)制解決,排序、過(guò)濾、【開(kāi)發(fā)步驟】1、靜態(tài)匯總設(shè)置對(duì)象 Q2,做利用復(fù)合式 SQL 設(shè)計(jì),定義帶有聚合函數(shù)的第一步:在引擎管理中建立SQL 語(yǔ)句。單個(gè) SQL 無(wú)法描述的描述。在 Q2 的模型中創(chuàng)建參數(shù)和參數(shù),待定的信息;第二步:創(chuàng)建格式對(duì)象 F2,對(duì)象 Q2 并嵌入表格,做相關(guān)的欄位、列格式和列表頭

22、設(shè)計(jì)。表頭表尾可放置綁定參數(shù)的控件;第三步:瀏覽 F2(或掛功能節(jié)點(diǎn)),設(shè)置參數(shù),檢據(jù)與格式是否正確;2、動(dòng)態(tài)匯總設(shè)置第一步:同上述第一步(但也可以不設(shè)置聚合函數(shù),而是在旋轉(zhuǎn)交叉設(shè)置中把缺省的分組列放到行列表中,把缺省的匯總列放到值列表中);第二步:同上述第二步,因交叉表的列結(jié)構(gòu)不能在設(shè)計(jì)態(tài)確定,因此只能指定非匯總列的列格式等信息;第 17 頁(yè)第三步:同上述第三步,需要改變匯總設(shè)置的時(shí)候,利用表頭右鍵菜單的交叉功能把新的匯總列移到交叉行列表,確定即可;(關(guān)于交叉的詳細(xì)說(shuō)明參見(jiàn))【FAQ】1、 行 SQL設(shè)計(jì)指定 group by 字段?答:無(wú)需指定,系統(tǒng)自動(dòng)把不含聚合函數(shù)的字段作為 group

23、 by 字段。2、 行 SQL 手工設(shè)計(jì)時(shí)為何 order by 字段無(wú)效?答:需要顯式指定排序字段的排序方式(升序asc,降序desc)?!痉独抠M(fèi)用匯總表各在指定期間范圍內(nèi)的費(fèi)用匯總情況。報(bào)表中要求包括公司、期間、科目、匯總發(fā)生額等信息,用戶可以根據(jù)年度和期間范圍進(jìn)行。1、 創(chuàng)建對(duì)象,編碼為 glsum,名稱為費(fèi)用匯總;2、進(jìn)行參數(shù)定義,增加三個(gè)字符型參數(shù):年,起始期間,終止期間;3、進(jìn)行 SQL連接關(guān)系、設(shè)計(jì):從數(shù)據(jù)字典添加憑證表、憑證分錄、科目表和公司目錄,指定表間字段、篩選條件和排序字段(除字段外均與模式 2.1 的范例相同);第 18 頁(yè)公司期間科目借發(fā)生額貸發(fā)生額4、在篩選條件頁(yè)

24、簽增加待定條件,在右操作數(shù)框中按 F12參數(shù);5、創(chuàng)建格式對(duì)象,編碼為 glsum,名稱為“費(fèi)用匯總表”。“費(fèi)用匯總”;6、進(jìn)行格式設(shè)計(jì):添加表格和面板控件,表格停靠于中部,綁定數(shù)據(jù)集費(fèi)用匯總,面板??坑诒辈浚ㄗ鳛楸眍^容器),采用流式布局,在面板上放三個(gè)文本框控件,分別綁定費(fèi)用匯總的三個(gè)參數(shù);第 19 頁(yè)7、瀏覽費(fèi)用匯總表(先設(shè)置參數(shù));第 20 頁(yè)8、當(dāng)前匯總設(shè)置是對(duì)公司、期間、科目分組統(tǒng)計(jì)發(fā)生額,如果需要?jiǎng)討B(tài)改變匯總依據(jù),則可以使用表頭右鍵菜單中的交叉功能。比如我們需要按照公司、期間重新匯總,則把公司和期間移至交叉行列表,發(fā)生額移至交叉值列表,確定即可;第 21 頁(yè)9、如果我們把科目移至交

25、叉行,期間移至交叉列,發(fā)生額移至交叉值,那么就實(shí)現(xiàn)了帶有數(shù)據(jù)旋轉(zhuǎn)的動(dòng)態(tài)匯總,即展現(xiàn)各科目在不同期間下匯總出來(lái)的發(fā)生額。關(guān)于旋轉(zhuǎn)交叉的詳細(xì)應(yīng)用可參看模式 3.3;第 22 頁(yè)2.3列結(jié)構(gòu)依賴于條件的報(bào)表(動(dòng)態(tài)SQL)【概述】我們前邊提到過(guò),SQL的結(jié)果具有固定的列結(jié)構(gòu)和動(dòng)態(tài)的行結(jié)構(gòu),前兩個(gè)模式中雖然都引入了參數(shù)來(lái)動(dòng)態(tài)信息,但也只用于待定的篩選條件,即影響報(bào)表的行結(jié)構(gòu)。然而有一類(lèi)報(bào)表因條件的不同而同時(shí)具有動(dòng)態(tài)的列結(jié)構(gòu)和行結(jié)構(gòu),比如在供應(yīng)鏈的一些單據(jù)查詢報(bào)表中,如果用戶在條件中勾選了聯(lián)查訂單或到貨單,那么報(bào)表會(huì)在靜態(tài)的列結(jié)構(gòu)(可能有 10 列)后面追加一些動(dòng)態(tài)的列或列分組,用于顯示聯(lián)查單據(jù)的明細(xì)信息

26、(此能就變成了 20 列)。【應(yīng)用場(chǎng)景】表可開(kāi)發(fā)需要把靜態(tài)的SQL 同用戶對(duì)條件設(shè)置的取值結(jié)合起來(lái),構(gòu)造出幾種不同的 SQL,分別對(duì)應(yīng)于用戶希望看到的各種報(bào)表展現(xiàn)結(jié)果。這些 SQL 不僅僅存在篩選條件的差異,也可能存在字段、表、分組字段、排序字段的差異。由于本模式采用的技術(shù)SQL 究竟被如何矯正,因此本模式僅建議熟悉 JAVA 編方案需要通過(guò)代碼片段來(lái)描述程的報(bào)表開(kāi)發(fā)使用。【適用性和不適用性】適用于:第 23 頁(yè)¾結(jié)果可由規(guī)范的靜態(tài) SQL 和動(dòng)態(tài)參數(shù)取值決定;不適用于:¾¾的復(fù)雜手工 SQL 才能描述;必須通過(guò)難以要求對(duì)動(dòng)態(tài)增加出來(lái)的列結(jié)構(gòu)進(jìn)行列格式設(shè)計(jì)的報(bào)表(

27、因?yàn)檫@些列在設(shè)計(jì)態(tài)是未知的);【解決方案】取數(shù)由式 SQL 設(shè)計(jì)描述,條件由參數(shù)機(jī)制解決,如何根據(jù)參數(shù)取值調(diào)整靜態(tài)SQL 則由 SQL 整理中的代碼片段來(lái)描述。SQL 整理中的常用數(shù)據(jù)結(jié)構(gòu)和接口方法如下所述:1、基本定義類(lèi) QueryBaseDef,所提供方法包括:FromTableVO getFromTables(); /獲得字段定義SelectFldVO getSelectFlds(); /獲得字段定義JoinCondVO getJoinConds(); /獲得連接條件定義WhereCondVO getWhereConds(); /獲得篩選條件定義GroupbyFldVO getGroup

28、byFlds(); /獲得分組字段定義OrderbyFldVO getOrderbyFlds(); /獲得排序字段定義以及相應(yīng) setter(設(shè)置)方法。表定義類(lèi) FromTableVO,所提供方法包括:String getTablecode(); /獲得表物理名String getTabledisname(); /獲得表顯示名String getTablealias(); /獲得表別名void setTablecode(String); /設(shè)置表物理名void setTabledisname(String); /設(shè)置表顯示名void setTablealias(String); /設(shè)置表別名

29、字段定義類(lèi) SelectFldVO,所提供方法包括:String getExpression(); /獲得字段表String getFldname(); /獲得字段顯示名String getFldalias(); /獲得字段別名void setExpression (String); /設(shè)置字段表void setFldname (String); /設(shè)置字段顯示名void setFldalias (String); /設(shè)置字段別名2、3、4、 連接條件定義類(lèi) JoinCondVO,所提供方法包括:String getExpression0(); /獲得篩選條件表void setExpressi

30、on0(String); /設(shè)置篩選條件表5、 篩選條件定義類(lèi) WhereCondVO,所提供方法包括:String getExpression0(); /獲得篩選條件表void setExpression0(String); /設(shè)置篩選條件表6、 分組字段定義類(lèi) GroupbyFldVO,所提供方法包括:String getExpression(); /獲得分組字段void setExpression(String); /設(shè)置分組字段7、 排序字段定義類(lèi) OrderbyFldVO,所提供方法包括: String getExpression(); /獲得排序字段UFBoolean getAsc

31、(); /獲得升序標(biāo)志void setExpression(String); /設(shè)置排序字段第 24 頁(yè)void setAsc(UFBoolean); /設(shè)置升序標(biāo)志8、 SQL 整理中獲得靜態(tài)基本定義的方法為QueryBaseDef getQueryBaseDef();整理代碼的目標(biāo)就是根據(jù)參數(shù)取值來(lái)調(diào)整這個(gè) QueryBaseDef 的內(nèi)部結(jié)構(gòu)?!鹃_(kāi)發(fā)步驟】第一步:在在 Q3 的引擎管理中建立模型中創(chuàng)建參數(shù)和對(duì)象 Q3,做參數(shù),式 SQL 設(shè)計(jì),描述靜態(tài)的 SQL 語(yǔ)句。待定的信息;第二步:在模型中編寫(xiě) SQL 整理代碼,這段代碼采用純 JAVA 語(yǔ)法,目的是根據(jù)用戶的參數(shù)設(shè)置取值調(diào)整靜態(tài)

32、的基本定義 QueryBaseDef,并把調(diào)整后的 QueryBaseDef 所生成的 SQL 發(fā)到數(shù)據(jù)庫(kù)去執(zhí)行。整理界面的樹(shù)內(nèi)置了常用的整理代碼,可以輔助開(kāi)發(fā)快速完成編碼;第三步:創(chuàng)建格式對(duì)象 F3,對(duì)象 Q3 并嵌入表格,做相關(guān)的欄位、列格式和列表頭設(shè)計(jì)。表頭表尾可放置綁定參數(shù)的控件;第四步:瀏覽 F3(或掛功能節(jié)點(diǎn)),設(shè)置參數(shù),檢查不同參數(shù)設(shè)置下數(shù)據(jù)與格式是否正確;【FAQ】1、 進(jìn)行 SQL 整理對(duì)對(duì)象有什么要求?答:該對(duì)象必須具有 SQL 設(shè)計(jì),且強(qiáng)烈建議使用式 SQL 設(shè)計(jì)。2、SQL 整理在何時(shí)何地進(jìn)行?答:SQL 整理在服務(wù)器端進(jìn)行,整理行為發(fā)生在數(shù)據(jù)庫(kù)之前,多用于根據(jù)參數(shù)矯正

33、 SQL?!痉独抠M(fèi)用匯總或明細(xì)表各在指定期間范圍內(nèi)的費(fèi)用情況匯總結(jié)果還是明細(xì)結(jié)果由參數(shù)。如果用戶選擇匯總,則報(bào)表中要求包括公司、期間、科目、匯總發(fā)生額等信息;如果用戶選擇明細(xì),則報(bào)表中要求包括公司、期間、科目、明細(xì)發(fā)生額和分錄摘要等信息。用戶可以根據(jù)年度和期間范圍進(jìn)行。1、 創(chuàng)建對(duì)象,編碼為 glsumordetail,名稱為費(fèi)用匯總或明細(xì);2、進(jìn)行參數(shù)定義,增加三個(gè)字符型參數(shù)(年,起始期間,終止期間)和一個(gè)枚舉型參數(shù)(顯示類(lèi)型,可選值為“匯總”和“明細(xì)”);第 25 頁(yè)3、進(jìn)行 SQL設(shè)計(jì),內(nèi)容與模式 2.2 的范例完全相同(我們?cè)谙旅媪谐鲎侄蔚慕缑?,主要是方便讀者把字段表與 SQL 整理

34、中的代碼處理結(jié)合起來(lái)理解,因?yàn)檎泶a有很強(qiáng)的性);4、在篩選條件頁(yè)簽增加待定條件,內(nèi)容與模式 2.2 的范例完全相同;5、進(jìn)行 SQL 整理設(shè)計(jì)這段整理代碼的思路是:首先獲得用戶設(shè)置的顯示類(lèi)型是“匯總”定義的字段數(shù)組(SelectFldVO),找還是“明細(xì)”,如果是后者,則繼續(xù)獲得靜態(tài)出其中帶有匯總函數(shù)的字段表,將匯總函數(shù)以及分組字段去掉,然后再增加一個(gè)新的查詢字段,對(duì)應(yīng)憑證分錄表的摘要信息。第 26 頁(yè)這段代碼中一部分為左側(cè)的代碼,其余部分則為直接手工編寫(xiě)。比如第一行代碼就是由通用中的“獲得參數(shù)值”生成:而陰影部分(增加分錄字段的代碼片段)則由 SQL 整理中的“追加字段”生成:第 27

35、頁(yè)6、創(chuàng)建格式對(duì)象,編碼為 glsumordetail,名稱為“費(fèi)用匯總或明細(xì)表”??偦蛎骷?xì)”;“費(fèi)用匯7、進(jìn)行格式設(shè)計(jì):添加表格和面板控件,表格??坑谥胁?,綁定數(shù)據(jù)集費(fèi)用明細(xì)或匯總,面板停靠于北部,采用流式布局,在面板上放三個(gè)文本框控件,分別綁再放置一個(gè)下拉框控件,綁定枚舉型參數(shù)(顯示類(lèi)型);個(gè)字符型參數(shù),8、瀏覽報(bào)表(先設(shè)置參數(shù)“顯示方式”的取值為“匯總”);第 28 頁(yè)9、再設(shè)置參數(shù)“顯示方式”的取值為“明細(xì)”然后瀏覽報(bào)表,或者直接在瀏覽態(tài)切換表頭的下拉框控件為“明細(xì)”選項(xiàng);第 29 頁(yè)3.交叉類(lèi)報(bào)表數(shù)據(jù)庫(kù)當(dāng)中的表往往是象下面這樣的:第 30 頁(yè)月份銷(xiāo)售業(yè)績(jī)張三1 月2000張三3 月5

36、000李四2 月3000李四3 月4000但用戶要求的報(bào)表往往是象下面這樣的:類(lèi)似這樣,把原始數(shù)據(jù)中一列(或幾列,通常有分組意義)數(shù)據(jù)的不同取值維持在表的左側(cè)不動(dòng)(比如上表中的),把另外一列(或幾列,通常有分類(lèi)意義)數(shù)據(jù)的不同取值旋轉(zhuǎn)到行的方向成為列標(biāo)題(比如上表中的月份),再把另外一列(或幾列,通常有統(tǒng)計(jì)意義)數(shù)據(jù)對(duì)應(yīng)匯總到旋轉(zhuǎn)出來(lái)的列標(biāo)題下面(比如上表中的業(yè)績(jī)),就形成了交叉表。在上述過(guò)程中,我們根據(jù)交叉規(guī)則把原始數(shù)據(jù)中的列分成了三種,第一種稱為交叉行(其數(shù)據(jù)交叉后出現(xiàn)在行上),第二種稱為交叉列(其數(shù)據(jù)交叉后出現(xiàn)在列頭上),第三種稱為交叉值(交叉前行、列、值的數(shù)據(jù)出現(xiàn)在一行上,交叉后值的數(shù)

37、據(jù)出現(xiàn)在行、列的交叉點(diǎn)上)。交叉報(bào)表比普通報(bào)表提出了很多新的問(wèn)題,比如:數(shù)據(jù)交叉如何實(shí)現(xiàn),交叉后列數(shù)目的不確定性如何處理,列的順序如何等等。根據(jù)實(shí)現(xiàn)方法的不同,以及能否預(yù)先確定交叉后的列結(jié)構(gòu),本章節(jié)提供了以下三種交叉報(bào)表模式的解決方案。3.1列向拼接型報(bào)表(復(fù)合)【概述】報(bào)表在列向可以被劃分成幾個(gè)分組,每組由若干個(gè)列,每個(gè)列分組的數(shù)據(jù)能夠通過(guò) SQL一個(gè)行 ID。即報(bào)表數(shù)獲得,而不同列分組的數(shù)據(jù)出現(xiàn)在同一行的前提是它們對(duì)應(yīng)據(jù)可以通過(guò)多個(gè)結(jié)果集相互連接的方式獲得?!緫?yīng)用場(chǎng)景】開(kāi)發(fā)需要從某個(gè)具有分類(lèi)意義的列中提取若干不同的取值,將它們旋轉(zhuǎn)成為列標(biāo)題,再對(duì)另外一些有統(tǒng)計(jì)意義的數(shù)值列進(jìn)行匯總。用戶明確

38、規(guī)定了這些列標(biāo)題及其順序,因此交叉后的列結(jié)構(gòu)是事先能夠確定的,無(wú)論這些列是否包含有效的統(tǒng)計(jì)數(shù)據(jù),它們都將在報(bào)表中存在,因此我們稱之為動(dòng)態(tài)行固定列報(bào)表?!具m用性和不適用性】適用于:¾¾能夠預(yù)先確定交叉后列結(jié)構(gòu)的報(bào)表;報(bào)表的每行數(shù)據(jù)都具有一個(gè)唯一的行 ID,該 ID 可能是某個(gè)字段或某幾個(gè)字段的組合;不適用于:¾動(dòng)態(tài)列結(jié)構(gòu)的交叉報(bào)表;【解決方案】利用復(fù)合解決固定列結(jié)構(gòu)的交叉應(yīng)用,每個(gè)交叉列對(duì)應(yīng)一個(gè),而用于連接多個(gè)的行 ID 正是交叉行字段的組合?!鹃_(kāi)發(fā)步驟】第 31 頁(yè)1 月2 月3 月張三20005000李四30004000第一步:分析交叉報(bào)表的結(jié)構(gòu),找出交叉行字段

39、、交叉列字段和交叉值字段。假定交叉列字段有 n 個(gè)(因?yàn)槭枪潭薪Y(jié)構(gòu)交叉,所以 n 是定數(shù));第二步:創(chuàng)建 n 個(gè)與列標(biāo)題掛鉤;對(duì)象分別對(duì)應(yīng)于 n 個(gè)交叉列字段,通常這些對(duì)象會(huì)通過(guò)確定篩選條件第三步:創(chuàng)建復(fù)合對(duì)象 Q4,通過(guò)增加臨時(shí)表的方式把上述 n 個(gè)對(duì)象選為表,這些臨時(shí)表的連接條件就是交叉行字段的組合,而 Q4 的參數(shù)應(yīng)該是 n 個(gè)對(duì)象的參數(shù)的并集,這樣才能保證 Q4 的參數(shù)設(shè)置能夠分發(fā)給各個(gè)被;第四步:創(chuàng)建格式對(duì)象 F4,對(duì)象 Q4 并嵌入表格,做相關(guān)的欄位、列格式和列表頭設(shè)計(jì)。表頭表尾可放置綁定參數(shù)的控件;第五步:瀏覽 F4(或掛功能節(jié)點(diǎn)),設(shè)置參數(shù),檢據(jù)與格式是否正確;【FAQ】1、

40、 定義復(fù)合有什么注意事項(xiàng)?答:首先要保證復(fù)合和各個(gè)子都使用相同的執(zhí)行數(shù)據(jù)源(對(duì)數(shù)據(jù)源版引擎無(wú)此問(wèn)題),其次如果修改了子的定義要保證復(fù)合定義中的一致性。【范例】部門(mén)員工統(tǒng)計(jì)表要求統(tǒng)計(jì)指定公司下中不同的員工數(shù)預(yù)先指定為族人數(shù)。、和族,報(bào)表中包含部門(mén)編碼、部門(mén)名稱、人數(shù)、人數(shù)和請(qǐng)注意,這里作為交叉行并可以承擔(dān)行 ID的字段是部門(mén)信息,作為交叉列并可以承擔(dān)子過(guò)濾的字段是,作為交叉值的字段是人數(shù)。1、 創(chuàng)建用于對(duì)象,編碼為 han,名稱為,在篩選條件頁(yè)簽設(shè)置確定條件“=”,的員工人數(shù);第 32 頁(yè)部門(mén)編碼部門(mén)名稱人數(shù)族2、對(duì)象 han,修改編碼為 man,名稱為,修改確定條件為“=”,用于的員工人數(shù);第

41、 33 頁(yè)3、對(duì)象 han,修改編碼為 menggu,名稱為族,修改確定條件為“=族”,用于的族員工人數(shù);4、 創(chuàng)建對(duì)象,編碼為 nationalityA,名稱為部門(mén)員工統(tǒng)計(jì) A,選擇表為部門(mén)和上述三個(gè)稱信息,對(duì)象對(duì)應(yīng)的臨時(shí)表,利用部門(mén)主鍵字段連接。部門(mén)提供部門(mén)編碼和名分別提供三個(gè)的員工人數(shù)。我們之所以沒(méi)有在子中直接查出部門(mén)編碼和名稱再在復(fù)合中利用部門(mén)編碼進(jìn)行連接,是因?yàn)檫@樣做可能導(dǎo)致最終數(shù)據(jù)只列出擁有漢、滿、蒙族員工的部門(mén),而不列出全部的部門(mén);第 34 頁(yè)5、創(chuàng)建格式對(duì)象,編碼為 nationalityA,名稱為“部門(mén)員工統(tǒng)計(jì)表 A”;“部門(mén)員工統(tǒng)計(jì) A”;6、進(jìn)行格式設(shè)計(jì):添加表格控件,綁

42、定數(shù)據(jù)集部門(mén)員工計(jì)設(shè)置;統(tǒng)計(jì) A,進(jìn)行列表頭設(shè)計(jì)與合第 35 頁(yè)7、瀏覽報(bào)表;3.2列向分支統(tǒng)計(jì)型報(bào)表(CASE-WHEN)【概述】嚴(yán)格意義上來(lái)說(shuō),本模式與上一模式面向的是同一類(lèi)報(bào)表,即預(yù)先能夠確定交叉后列結(jié)構(gòu)的交叉報(bào)表,或稱動(dòng)態(tài)行固定列交叉表。但本模式采用了另一種解決方案結(jié)合 SQL 的分支函數(shù)和匯總函數(shù),把交叉列生成的各個(gè)列分組寫(xiě)到一個(gè)當(dāng)中,簡(jiǎn)化了復(fù)合方案需要寫(xiě)多個(gè)子對(duì)象的工作,但要求交叉值為可匯總的數(shù)值型字段?!緫?yīng)用場(chǎng)景】第 36 頁(yè)同上一模式。【適用性和不適用性】適用于:¾¾能夠預(yù)先確定交叉后列結(jié)構(gòu)的報(bào)表;報(bào)表的每行數(shù)據(jù)都具有一個(gè)唯一的行 ID,該 ID 可能是某個(gè)

43、字段或某幾個(gè)字段的組合;不適用于:¾¾動(dòng)態(tài)列結(jié)構(gòu)的交叉報(bào)表;交叉值不能用 SQL 匯總函數(shù)統(tǒng)計(jì)的報(bào)表;【解決方案】CASE-WHEN 函數(shù)具有以下兩種語(yǔ)法:1、 簡(jiǎn)單 CASE 函數(shù):CASE 輸入表WHEN 取值 1 THEN WHEN 取值 2 THEN12返回表返回表ELSE 返回表END2、 CASE 搜索函數(shù):CASEnWHENWHEN條件條件表表1 THEN2 THEN返回表返回表12ELSE 返回表ENDn假定某張表 T 的數(shù)據(jù)如下所示:那么執(zhí)行以下 SQL 語(yǔ)句SELECT corp, (CASE sex WHEN '男' THEN 1 EL

44、SE 0 END) AS male, (CASE sex WHEN '女' THEN 1 ELSE 0 END) AS femaleFROM T將獲得如下結(jié)果集:第 37 頁(yè)corpmalefemaleA 公司01A 公司10corpnamesexA 公司女A 公司智男A 公司金曉光女A 公司女B 公司金賢成男B 公司女如果我們關(guān)注的是交叉統(tǒng)計(jì)結(jié)果的話,只需將上述 SQL 改造為SELECT corp, SUM(CASE sex WHEN '男' THEN 1 ELSE 0 END) AS male, SUM(CASE sex WHEN '女'

45、THEN 1 ELSE 0 END) AS femaleFROM TEM_CASEGROUP BY corp則將查出以下結(jié)果:也就是說(shuō) SUM(CASE WHEN)函數(shù)能夠?qū)崿F(xiàn)交叉統(tǒng)計(jì)的效果,而且一個(gè) SQL 就能達(dá)到復(fù)合方案多個(gè) SQL 的作用。在復(fù)合方案中出現(xiàn)的確定篩選條件,就相當(dāng)于CASE-WHEN 方案中出現(xiàn)在 CASE 語(yǔ)句中的條件表?!鹃_(kāi)發(fā)步驟】第一步:分析交叉報(bào)表的結(jié)構(gòu),找出交叉行字段、交叉列字段和交叉值字段。假定交叉行字段有 m 個(gè),交叉列字段有 n 個(gè)(因?yàn)槭枪潭薪Y(jié)構(gòu)交叉,所以 n 是定數(shù));第二步:創(chuàng)建對(duì)象 Q5,定義 m 個(gè)字段表對(duì)應(yīng)交叉行字段,再定義 n 個(gè)帶有SUM

46、(CASE WHEN)的字段表對(duì)應(yīng)交叉列字段,其中輸入表為交叉列字段,取值為預(yù)先確定的交叉列字段取值,返回表為交叉值字段或其統(tǒng)計(jì)表,ELSE 分支返回 0;第三步:創(chuàng)建格式對(duì)象 F5,對(duì)象 Q5 并嵌入表格,做相關(guān)的欄位、列格式和列表頭設(shè)計(jì)。表頭表尾可放置綁定參數(shù)的控件;第四步:瀏覽 F5(或掛功能節(jié)點(diǎn)),設(shè)置參數(shù),檢據(jù)與格式是否正確;【FAQ】1、 CASE WHEN 語(yǔ)法的條件表能否使用非等值的表?答:在 SQLSERVER 下沒(méi)有問(wèn)題,在 ORACLE 下應(yīng)利用大于等于或小于等于比較符取代大于或小于比較符。2、 是否有辦法提高 SUM(CASE WHEN)的執(zhí)行效率?答:可考慮在 CAS

47、E-WHEN 中選擇性高的字段上添加索引?!痉独坎块T(mén)員工統(tǒng)計(jì)表要求與模式 3.1 完全相同。1、 創(chuàng)建對(duì)象,編碼為 nationalityB,名稱為部門(mén)員工統(tǒng)計(jì) B,請(qǐng)注意字段表達(dá)式中三處 CASE-WHEN 函數(shù)的寫(xiě)法:第 38 頁(yè)corpmalefemaleA 公司13B 公司11A 公司01A 公司01B 公司10B 公司01sum(case bd_defdoc.docname when sum(case bd_defdoc.docname when sum(case bd_defdoc.docname when then 1 else 0 end) ( then 1 else 0 e

48、nd) (人數(shù)) 人數(shù))族人數(shù))族 then 1 else 0 end)(2、創(chuàng)建格式對(duì)象,編碼為 nationalityB,名稱為“部門(mén)員工統(tǒng)計(jì)表 B”。“部門(mén)員工統(tǒng)計(jì) B”;3、完全類(lèi)似于上一模式做格式設(shè)計(jì):添加表格控件,綁定數(shù)據(jù)集部門(mén)員工統(tǒng)計(jì) B,進(jìn)第 39 頁(yè)行列表頭設(shè)計(jì)與合計(jì)設(shè)置;4、瀏覽報(bào)表;3.3動(dòng)態(tài)行列交叉型報(bào)表(旋轉(zhuǎn)交叉)【概述】與前兩種交叉模式不同,本模式無(wú)法預(yù)先確定交叉后的列結(jié)構(gòu),而是根據(jù)數(shù)據(jù)完全真實(shí)地展現(xiàn)交叉結(jié)果,屬于動(dòng)態(tài)行動(dòng)態(tài)列應(yīng)用。這樣就存在一個(gè)設(shè)計(jì)態(tài)列格式與運(yùn)行態(tài)列結(jié)構(gòu)之間的,因?yàn)樵O(shè)計(jì)態(tài)還沒(méi)有數(shù)據(jù),不可能預(yù)知運(yùn)行態(tài)到底會(huì)生成哪些列,因此作為此類(lèi)模式動(dòng)態(tài)體現(xiàn)交叉結(jié)果

49、的代價(jià),開(kāi)發(fā)無(wú)法對(duì)交叉值字段對(duì)應(yīng)的列做精確的格式設(shè)計(jì)。【應(yīng)用場(chǎng)景】在描述清楚交叉規(guī)則(指定交叉行、交叉列、交叉值字段)之后,報(bào)表要求全動(dòng)態(tài)地實(shí)現(xiàn)數(shù)據(jù)交叉。多層列表頭常用于輔助體現(xiàn)交叉的維度,且交叉規(guī)則能夠在運(yùn)行態(tài)重新設(shè)定?!具m用性和不適用性】適用于:¾無(wú)法預(yù)先確定交叉后列結(jié)構(gòu)的報(bào)表;不適用于:¾對(duì)交叉值對(duì)應(yīng)列有顯示順序等要求的報(bào)表;第 40 頁(yè)¾對(duì)交叉值對(duì)應(yīng)列有界面統(tǒng)計(jì)功能(如、圖表等)預(yù)設(shè)置要求的報(bào)表;【解決方案】設(shè)計(jì)態(tài)使用模型 SQL設(shè)計(jì)中的旋轉(zhuǎn)交叉設(shè)置功能來(lái)描述初始交叉規(guī)則,運(yùn)行態(tài)使用表格表頭右鍵菜單中的交叉功能實(shí)現(xiàn)再次交叉。交叉設(shè)置界面中的交叉砝碼的作用是

50、,描述交叉值字段對(duì)應(yīng)的列出現(xiàn)在交叉列展開(kāi)后的哪個(gè)層次上。以我們前面做過(guò)的費(fèi)用匯總表為例,采用以下的交叉設(shè)置:將得到以下的交叉結(jié)果:如果更改交叉設(shè)置叉砝碼的位置:第 41 頁(yè)則將獲得以下交叉結(jié)果:【開(kāi)發(fā)步驟】第一步:分析交叉報(bào)表的結(jié)構(gòu),找出交叉行字段、交叉列字段和交叉值字段;第二步:創(chuàng)建對(duì)象 Q6,正常定義 SQL(以獲得交叉前結(jié)果集為準(zhǔn)),在交叉頁(yè)簽的旋轉(zhuǎn)交叉設(shè)置中指定交叉行、交叉列、交叉值以及交叉砝碼的位置;第三步:創(chuàng)建格式對(duì)象 F6,對(duì)象 Q6 并嵌入表格;第四步:瀏覽 F6(或掛功能節(jié)點(diǎn)),設(shè)置參數(shù),檢【FAQ】據(jù)與格式是否正確;1、對(duì)綁定旋轉(zhuǎn)交叉數(shù)據(jù)集的表格綁定列表頭是否有效?答:無(wú)效,系統(tǒng)將根據(jù)交叉設(shè)置自動(dòng)生成列表頭?!痉独坎块T(mén)員工統(tǒng)計(jì)表要求與模式 3.1 完全相同。第 42 頁(yè)1、 創(chuàng)建對(duì)象,編碼為 nationalityC,名稱為部門(mén)員工統(tǒng)計(jì) C,字段中按部門(mén)、為交叉列,人數(shù)對(duì)計(jì)數(shù),旋轉(zhuǎn)交叉設(shè)置中指定部門(mén)編碼、名稱為交叉行,為交叉值:第 43 頁(yè)部門(mén)編碼部門(mén)名稱人數(shù)12n2、創(chuàng)建格式對(duì)象,編碼為 nationalityC,名稱為“部門(mén)員工統(tǒng)計(jì)表

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論