Business Objects 以及reporting service報表點滴--學習筆記
2024-07-21 02:45:04
供稿:網友
看來圖片顯示不出來,可從此處下載Word文檔。
http://download.csdn.net/source/1902006
Ver20091111
BO
BO入門及筆記
主要包括用designer構建universe,在webi ( Web Intelligence Rich Client )中使用universe構建報表。
目前使用的版本是BusinessObjects XI 3.1 -- BusinessObjects Edge Series 。
主要與Universe相關
關于measure
在object的屬性定義中有個qualification屬性的設置,可以設置為 dimension , measure , detail 中的某一項。這里需要對measure提一點的是,緊跟著會有一個”choose how this measure will be PRojected when aggregated”的設置,這個設置的用途目前發現是在webi的報表中,如果對query取出來的數據再進行聚集計算,這個設置是默認的聚集計算方式。
對于measure的再認識,是可以用來且一般是用來作計算的,而不必非要去做聚集計算……
對于measure的再再認識,主要是BO中比如webi的圖表中的一些字段指定要用measure類型,其它諸如dimension的還不能拖到指定measure的位置使用。其實這個分類的設計挺蹩腳的,因為有時一個列可以具有多個BO中的類別,比如像日期類型即可做維度又可作計量?!?
Measure的建議用法,(A)一般是數值類型的列或普通計算列應該設置為measure類型并且不要默認聚集函數,(B)而那種已經調用聚集計算函數得到的列默認就是measure類型但不要默認聚集函數。(C)要進一步做聚集計算可以在webi中調相應函數來做。(A)是由于webi中的圖表等處必須要measure類型,(B)是防止使用隱藏列(由于BO在顯示的維度少于取出的維度時會找默認聚集函數做計算),目前BO的隱藏列的做法很不正規。
這里會費點事的地方是會改Universe對object的默認設置。省事的是不必設置隱藏列,而且如果有無默認聚集計算函數的measure類型的object和有默認聚集計算函數的的object在同一個表格里時,BO也就不會做聚集計算了,從而有一定的容錯性,可以防止部分列的默認聚集計算函數被誤改之后還能保持報表顯示正確。
原則是,盡量顯式去實現計算,防止對BO工具不熟看不到一些隱式信息而看不懂報表是如何實現的或做了什么樣的默認計算。
(另外,想利用measure的默認計算函數省點事的,還不太可能,比如在圖表中需要顯示measure列的標題時,基本還得定義一個variable以利用其名稱作為標題,此時再給此variable顯式定義計算方式并不多費時間。)
由于BO中一些特殊性。從本義上看,Measure是表示維度的度量特性,而一般是數值類型的列都是用于度量的,這些列從理論上來說應該設置為measure類型。在實際使用中,在Universe中把數值列拖為對象時,默認是dimension類型,雖然用于表格不出什么問題,但圖表上及其它某些地方一定要求是measure類型,從而必須改默認類型。另一方面,為了避免BO在顯示的維度少于取出的維度時默認做聚集計算,而不能直接顯示明細行,雖然可以加隱藏列避免,但是還是把默認的聚集函數設置為無比較好,要想進一步做任何聚集計算可以在webi上調用聚集計算函數實現。
關于lov ( list of values )
看來每個(dimension和detail類型的)object都有自己默認的lov,在object的位于properties選項卡的屬性頁上,點擊 associate a list of values 框中的edit按鈕,可以從彈出的query panel右上的result objects框中的內容可以看到。也可以在這里編輯。
使用object的lov目前知道是在@prompt (不管是在Universe中定義還是在webi中定義)函數中使用,使用寫代碼的方式可以參考@prompt函數的定義,在webi中可以有界面編輯的方式。在webi中run query時可以在彈出的prompts界面上看到最終使用界面。
一個應用是從id與name的列表清單中根據name選擇,再使用相應的id的值。這時需要:先在Universe設計中對這個id object的lov進行設置,找到lov的編輯界面,默認只在右上的result objects框中有本id object,然后拖一個name object過去(必要時還可設置下面的條件過濾),注意需要拖到id object的右邊,保存并export這個Universe。然后在webi報表中對這個id object作prompt過濾即可看到。下面有兩個截圖可以參考。
關于cascade lov
創建與使用:在(designer編輯)Universe中,從ToolsàList of Values…àcreate cascading lists of values菜單項進去。然后把左邊的一些有層次結構的object弄到右邊來,最后點Generate LOVs的按鈕生成。而點擊完按鈕也就生成好了,點擊菜單項“Edit a list of values…”進入編輯界面其實很難看到已經生成的有層次結構的cascade lov,很不直觀,選中編輯界面中某個曾設置過cascade lov的object,點Edit按鈕,可以在彈出的query panel界面的右下部看到多了一個條件。這個編輯界面也可以從object屬性的編輯lov的界面進入。使用時像普通lov那樣在webi報表中對層次結構中的某object作prompt過濾,在run query時即可看到有層次結構的數據供選擇。
幾點說明:如果選擇的有層次結構的objects中有已定義的lov的話,則這些lov會被cascade lov覆蓋。然后可以在普通編輯lov的界面上再補上定義。
還要注意一點,生成cascade lov后在下層object的lov的編輯界面上能夠看到在conditions中有一個條件,但是如果不做生成cascade lov而直接添加條件,是不能被當作cascade lov處理的。
如果選擇的有層次結構的objects都只是id的話,沒作特殊處理只能看到一些id,要顯示name需要在普通編輯lov的界面上把name object拖上去。這樣可以避免name的objects來作層次結構而導致可能的重名問題。
一些相關截圖如下:
Lov與Prompt
在prompt小節介紹。
Lov的相關問題
如果一個object,刪掉了select中的東西,默認的lov也有問題,需要重新拖拉一下。
Derived Tables
Derived Tables是自寫select sql的方式,應該是最靈活的了。不過還有一些問題,比如里面不能有order by語句,不能預排序。從而對多列先排序,再取top行的效果目前沒法支持。
另外,一個Derived Table還可以被另一個Derived Table使用。
在Universe中復制粘貼要注意的
注意有些不能完全復制,比如object的lov的定義就不能被復制。
對于Universe文件的復制的注意事項
由于在文件系統的Universe文件與在cms系統里的Universe數據有某種對應關系,單純復制文件系統的Universe文件,還是對應同一個cms系統里的Universe數據。要想復制得到完全獨立的另一份Universe文件,還需要用designer打開Universe并在FileàParameters界面上改Name屬性,而且最好與文件名同名。
另外,復制不等于備份,簡單復制到另一臺機器是用不了的,見后面備份的說明。
Universe中的object定義parse出錯也可能照常使用
universe中的object的定義,如果使用parse校驗正確性出錯,但使用也可能沒問題。不過要注意定義這個object一定不要出錯,比如類型要設置正確,不然會在運行時報錯難以明白。
與Universe和webi都很相關
Webi如何使用Universe
必須把Universe在designer中進行Export的動作,放到CMS中,webi才能使用。
@variable與@prompt
可以使用 @variable(‘Name1’)來引用@Prompt(‘Name1’,……)中的輸入值。這樣可以避免重復使用完全相同的Prompt。這與在Universe或webi的位置沒有關系,也沒有先后順序,即不要求先有@Prompt再有@Variable。另外,調用方式完全相同的prompt會在webi中被當作一個prompt處理。
但是,在universe中使用optional Prompt的variable會有問題,不通過。
另外,在webi中取@Prompt的數據還可以用UserResponse的函數。
關于Prompt
Universe與webi中的prompt有區別,一個是universe中的不能為optional,另一個是webi中的不能用純文本實現(除非是用custom sql)。
調用@Prompt時的一些參數說明:
關于參數lov,如果使用'ClassName1/ObjectName1',則是使用'ClassName1/ObjectName1'在Universe中定義的lov。當寫sql語句對某列進行過濾時,對@Prompt函數的lov參數傳遞本身列對應的object是一點問題沒有,而且一般都是這樣做,比如在webi中。
級聯參數或級聯Prompt,可以在定義lov的時候使用另一個帶Prompt的derived table或使用普通table但是帶where條件且其中使用了Prompt,從而達到級聯效果。但是一點缺陷是只能傳回一個值,深層次的那些prompt的值傳不回來。
Prompt使用依賴性的或級聯性的Prompt來縮小可用值清單的范圍的例子。其思路是在一個Prompt中作為lov的object會關聯到其他prompt。
比如對于例子club數據庫,
追加定義兩個derived table,以及相應的class。(給region_id和city_id對應的objects的lov加上name)。
DTCountryRegion :
select region_id, region from Region
where Region.country_id=@Prompt('countryid','N', 'Country/Country Id',Mono, )
DTRegionCity:(這里的object是引用的上一個derived table對應的class中的object)
select city_id, city from City
where region_id=@Prompt('regionid','N', 'DTCountryRegion/Region Id',Mono, )
再定義一個過濾器cascade prompt city filter,(這里的object是引用的上一個derived table對應的class中的object),另外注意City.city_id是直接引用City表的city_id列,從而可以達到一定的可重用性。
City.city_id In @Prompt('select city','N', 'DTRegionCity/City Id',Multi, ,)
然后就是在webi中使用了,如下圖。
Prompt可以使用id而顯示name,只需要設置lov,參考lov和cascade lov的說明。
ambiguous query
有時在webi的從edit query中打開的sql viewer中的customer sql中能夠看到多個sql,即在synchronization字樣的根節點下有幾個select節點,一般設置好context中的join可以解決。
另外,如果在customer sql中看到sql不對的,比如join了過多的table,也一般設置好context中的join可以解決。
還有,看到synchronization下有多個select節點的問題,不一定是由于join或context導致的,不小心把object引用的column寫成其他不相關的表也有可能出現這種情況(如下圖),所以有必要仔細檢查及比對一下每個問題sql語句。
在universe中對象名稱自動同步到webi報表
在universe中改一個對象的名稱,似乎webi能自動同步修改完全。
但似乎在universe中改了名,雖然能夠在webi中自動刷新,也許要多刷新幾次。
Prompt輸入在webi的顯示順序
輸入參數的顯示順序在webi的query panel中可以調整,但不太好用。沒出現的可以把用到prompt的條件刪掉重新加。但在universe里的沒法弄,似乎默認在最前。
主要與webi相關
Drill down的再試驗……
報表中有多表格時設置它們的間距
BO中表格與表格之間保持距離是靠設置 relative position。
文本框的下劃線
拖出文本框(Blank Cell)時看到的下劃線是border的下邊。
不分頁能看到處理report中的所有表格或圖表
按鈕 switch page/quick display 能切換到顯示大于一頁的高度的情況。
給數字做custom的format的入門
在custom數字的format時,給出幾個文本框,如positive、negative,equal to zero,用法是每個文本框中都需要一個完整的format串。
取日期部分的函數
Bo的webi中不能直接取時間的datepart,但是可以用其他方式得到,=ToDate(FormatDate([A DateTime Object];"dd/MM/yyyy");"dd/MM/yyyy")
關于distinct
除了完全自定義sql語句,在webi中有兩處地方設置。
一處在webi的edit query界面的properties選項卡中,是一個復選框屬性”retrieve duplicate rows”來控制。
一處是在webi的table block的屬性中有個復選框屬性”avoid duplicate row aggregation”,是用于去除重復行的,默認沒勾選,做了distinct的動作。注意一般需要勾選,防止distinct。
Top與rank
top可以用rank弄出來,效果看來更好.因為top 只是強行過濾,而當排名值有多條記錄相同時rank會把這些都取出來。
但(sql server 2005 的)Transact-SQL中也有rank函數。
Union all
在webi,似乎沒法達到union all的效果。
Hyperlink
webi中的hyperlink中引用的webi如果有重名會有問題。
關于webi中的hyperlink中的參數傳遞,看來直接用 URLEncode(UserResponse("..")) 好使,雖然不符合lsM的規定格式,另外對于optional的單值和多值參數也好使。另外不傳參數看來也相當于optional。
傳數字參數時注意可能默認方式轉為字符串會有逗號,傳過去出錯,需要格式化將其去掉。
在圖表中做hyperlink鏈接到其他報表目前不行或不知如何實現。
但是就算是能鏈接到其他報表,也是采用的url的方式而不是比較直接的方式。由于BO的InfoView有兩種頁面,jsp和aspx,同時支持挺費勁的,但是也找到了方法。
例如下面代碼:
= "<a href=/"javascript:var path='/OpenDocument/opendoc/openDocument.jsp';if(document.location.pathname.indexOf('.aspx')>0) path='/OpenDocument/opendoc/openDocument.aspx'; open(path+'?sDocName=Location+Availability+Detail&sType=wid&lsSBegin+Date:=" + URLEncode(""+UserResponse("Begin Date:")) + "&lsSEnd+Date:=" + URLEncode(""+UserResponse("End Date:")) + "&lsSLocation:=" + URLEncode([Location]) + "&lsSIP:=" + URLEncode([IP]) + "','_parent');/" title=/"/" target=/"_self/" nav=/"web/">"+FormatNumber([Availability - Location Availability];"#,#0.00")+"</a>"
隱藏列的做法
Webi中沒有屬性來設置是否隱藏列,只能采用一些非正規方式。
隱藏列用alert方式來做似乎也很好使,本質上是把這一列的顯示內容給變掉了,可以變成hyperlink的顯示,從而對這一列的原值進行操作沒有問題。另外,隱藏列也可以把某一列的內容隱藏,把這一列的右(左)border 去掉,把右(左)邊的列的左(右)border去掉,從而看起來兩列成一列而達到隱藏效果。
隱藏格子內容的做法
目前只能使用非正常方式,設置格子的Horizontal padding=2000px。
關于重復行
圖表或表格有一個屬性,叫做 avoid duplicate row aggregation ,在不同的狀態下會有不同的情況。
其一個作用如圖:
其中,數據表如圖:
在Universe中的主要定義如下圖,
在使用聚集函數時,有時也會遇到重復行的問題,如圖: ,其中,表格的“avoid duplicate row aggregation”屬性為選中狀態。而Variable“avg to Val-none exp in”= Average([Val - none]/[Val2 - none]) In ([Id]) 。如果不勾選“avoid duplicate row aggregation”又會出錯。
為什么呢,原來是Variable中的聚集計算函數的參數使用了表達式的問題,單純的聚集計算是不會出錯的。如圖所示, ,其中“avg to Val-none in id” =Average([Val - none]) In ([Id])。
就算再簡單的表達式,如“avg to Val-none exp const” =Average([Val - none]/1),也會出錯,如圖, 。
這時,解決的方式有一種,就是把表達式計算搬到Universe的object定義上。
Webi中選中一列卻沒法排序或rank的問題
目前發現的原因是這一列直接使用了表達式,如果定義一個Variable,把表達式放在Variable里,在列上使用Variable,則又能排序或rank了。
Break概念
BO中的break對應分組功能。
做break要在表格(目前已知的是垂直表格)的格子中選中某個object,再在toolbar上找到相應按鈕點擊進行設置或反設置。設置之后,點中這個格子,會在屬性頁上多一些關于break的屬性設置。Break有footer和header對應上下分組行。
其他報表產品(如Reporting Service)可以折疊分組行下的明細行,但webi的報表還不能在當前版本做折疊。
但是,webi中不用break看來也可以做n層分組計算。這可以通過顯式調用一些聚集函數,也可以使用measure并使用其默認的聚集計算方式。
注意webi中有break時的排序是只能在break內排序,而無法拉通排序。比如,對兩個列作groupby后進行聚集計算,對計算值排序,在reporting service中可以做到拉通排序,而BO只能做到在第一層內部排序。…………….
一些使用break達到的一些顯示效果
Webi中要想達到如下圖的效果,即被分組列在明細行上不顯示,目前只能是把被break的列在明細行的內容隱藏,且使用非正常方式,即設置其Horizontal padding=2000px,從而也就達到效果了。
Break上有個remove duplicate values的選項能夠控制break對應列是否在較明細行上顯示重復值,效果是是否有中空。如圖:
不顯示時的效果。
顯示時的效果。
一些比較奇怪的問題
custom sql少東西
有時在webi的從edit query中打開的sql viewer中取得的custom sql少東西,估計是由于上次輸入設置的一些optional的參數值導致的或別的問題。這時重新生成幾下custom sql就好了。
改數據庫的schema后運行webi報不正確錯誤信息
更改數據庫的schema后,相應改了universe后,運行webi出錯。報錯信息中一方面universe的名字不對,一方面報數據庫表格中view使用的一個表不對,后來發現原因是數據庫中view的問題,引用的表格還是舊的名字,更新之后錯誤就消失了。
Webi中改universe引用的一些問題
把一個Universe
要想在Webi中切換universe,不能直接更換Universe的內容,比如把以前的Universe文件刪掉,再把另一個Universe通過復制的注意事項后產生出一個獨立的同名的Universe文件,(或者說覆蓋所引用的Universe文件),然而,這樣做很有問題,一般情況下報表就出錯了。
用Import和Export的方式是很正確的方式,但這一般只適用版本升級。
一個可行的方式是使用webi中切換Universe的功能切換到另一個Universe上去,這是在query panel中的屬性頁上做的,這樣至少報表不會出錯。另外,在切換時會出現一些奇怪問題,比如切換完了,發現引用的Universe的名稱沒變。這似乎webi有bug,不能及時刷新universe的名稱,保存關掉后再打開發現已經改掉了。一次不行,再試一次。另外,有時還出現無論如何切換不到某個Universe上去,這時只有先把那個Universe通過復制的注意事項弄出一份獨立的Universe出來,先切換到那個備份上,以后再切換回去。
還有,就算webi中切換了Universe,也還在某些地方殘留以前Universe的痕跡。比如在Import webi報表和相關的Universe到*.biar時,還得必須把以前殘留的Universe導出。另外某些報錯信息也會提到以前的Universe,雖然實際上很可能與之無關。
換完licence出錯
換完licence登錄不進系統或運行已打開的designer或webi出錯。主要是由于先刪除以前的licence再添加,這樣導致許多server都被disabled了。解決問題是登錄進入central management console,到server的清單把它們都設置為enabled。必要時可以改日期再解決。
登錄不進CMS
沒有搞定,只能重裝,有時還得刪注冊表。
Hyperlink相關
有時候在單元格直接用hyperlink與在alert中用hyperlink但在格子中用直接的object的效果差別很大,比如直接用hyperlink會出一些空行,類似作了外連接的效果。
Universe保存時很慢
如果數據庫的服務或服務器關了,會使Universe保存時極慢。
其它
備份的方式特別,Import與Export
只能通過import成 *.biar文件才能自如保存,單純copy備份的方式在另一個CMS上(一般也是另一臺機器上)就打不開文件了。
而要import,先要export。即先要把designer中的Universe和webi中的報表export(相當于保存)到CMS中,才可能從CMS中import出來到普通文件系統上。
另外,如果要看BO自帶的例子,可以在designer中Export出例子Universe,在webi中Export出例子報表,然后打開文件。
功能項調用
很多功能不會從菜單或右鍵菜單出來,這時需要多看看工具欄以及屬性頁等,即多動手點點。
未整理
交叉表的過濾
交叉表可以設置過濾,只顯示部分列或行,但這必須在工具欄上的過濾按鈕對應的界面設置,而且在普通的屬性頁上沒法看到。
有關過濾
在工具欄上還有另一個過濾的按鈕,“Show / Hide Filter Pane ”,在那里可以對圖表的數據做某種過濾
BO的webi中圖表的legend的title的隱藏
沒辦法用常規方式,只能變白,字體最小
BO的webi中圖表的X軸上的內容沒有按比例
BO的圖表顯示數據,目前發現在X軸上顯示的不是按照比例顯示,而似乎把有內容的等間距顯示,比較奇特。
SSRS
Sql Server Reporting Service
入門點
(環境是Sql Server 2005 上的Reporting Service )
報表基本構成
一個.rdl文件和一個可共用的.rds文件。.rds文件簡單負責數據庫連接。.rdl文件是一個報表的最主要部分。.rdl文件又主要分兩部分,數據部分和顯示部分。
在數據部分添加一個最簡單的dataset,在顯示部分添加一個最簡單的table控件。執行一下dataset的sql語句,可以自動取得所有列。把dataset的一些列拖到表格控件中間行的格子中,便可得到一張通常意義上的報表。點擊“Preview”便可預覽了。
頁眉和頁腳
默認是不出現的,需要點擊菜單“Report”,在下拉菜單中可以看到“Page Header”和“Page Footer”,點擊即可。
表格控件基本及其分組
表格控件拖到報表上,默認顯示3行,代表3種不同類型。中間是明細行(Table Details),上面是表頭(Table Header),下面是表尾(Table Footer)。要控制表頭或表尾的顯示,先在layout界面上點中表格里的任意一處位置,此時會在表格的右方和上方顯示一些東西。在右方顯示的東西上點擊右鍵,在右鍵菜單中可以看到Table Details ,Table Header ,Table Footer 等的菜單項,這可以控制相應東西的顯示。
還是這個右鍵菜單,可以看到與分組相關的菜單項,如“Insert Group”,“Edit Group”等,點擊可以設置相應的分組信息。
需要說明一下的是,分組行與明細行與表格行,在屬性頁上是看不出來是什么類型的行的,只有看前面提到的表格右方顯示的圖標,這些圖標間有區別,才看得出來。
參數
參數往往可以在給出一點點定義后由Visual Studio的IDE環境自動生成,不過也有一些高級應用情況需要手工添加的。
這里有兩種不同位置的參數,一種是在dataset的sql語句上,一種是在報表上。
前一種的定義形式是 @參數名 ,例如select * from table1 where id = @id , 除了在dataset的sql語句上看到,還可以在dataset的一堆屬性頁中的Parameters屬性頁上可以看到。當寫好前面的sql語句并運行后,IDE會自動生成兩種類型的參數。
后一種在點擊菜單項“Report->Report Parameters”后而彈出的界面上可以看到及維護。
在報表上的參數負責從界面上得到輸入值,在dataset的sql語句上的參數影響實際執行的sql查詢語句的參數值。既然參數分了兩層,中間可以存在一個表達式轉換,從而兩層的參數不必一一對應。
另外,報表上參數也不一定全部在運行界面上的輸入部分顯示,因為還有Hidden以及Internal屬性來控制。從而又加入了一些靈活性。比如可以設置參數為Internal且默認值為另一個dataset中的列值,從而得到一個中間參數。
使用超鏈接連接或引用其他報表
比如對于表格中的格子,右鍵菜單中點Properties項,在彈出的對話框界面中選中Navigation頁,在Hyperlink action中設置即可,比如可以設置為Jump to report,再設置相應報表路徑及參數。跨project的報表也可以引用,估計路徑是與發布位置有關。
如果是圖表,則是在數據列的屬性頁中的Action屬性頁界面設置。
折疊或隱藏功能
可以折疊或隱藏表格中的行(如分組后的明細行)以及整個表格,推廣說可以折疊或隱藏控件里的部分以及整個控件。如下圖,
, , 。
其設置地方在于每個大大小小的控件一般都有一個Visibility的組合屬性,包括兩個具體屬性Hidden和ToggleItem。ToggleItem的值是一個控件名稱,作用是用另外一個控件來控制本控件所代表顯示的部分的可見性,即折疊效果。而Hidden則是控制初始顯示時的可見性,由于可使用表達式的原因,可以設置一個輸入參數在輸入時控制。
具體設置參考下圖:(效果可見前面的圖)
表達式的強大
SSRS的一個強大之處是幾乎所有屬性值的位置都可以使用表達式。從而可以實現很多特效。
比如,
用參數控制折疊隱藏的初始效果。
使表格中的單雙行的背景色不同??梢詫γ骷毿械谋尘吧珜傩栽O置表達式,如 the value of the Propery BackgroundColor = iif(RowNumber(Nothing) Mod 2, "White", "LightGrey") 。
以及dataset的sql語句也可以使用拼接的方式,從而可以實現很多參數化效果,比如根據參數動態排序,或者選擇性顯示某些列等。
擴展一點是根據表格中某個單元格的值的不同而把整個行(或部分格子)設置顏色,以達到分類或提醒的作用。
參數輸入值范圍控制及依賴關系
可以給一個輸入參數提供一個下拉列表,其列表值集合可以控制。并且可以達到在列表顯示名稱而實際輸入ID的效果。
列表值集合是由另外一個dataset給定,其實主要就是一條select語句。定義好dataset后,在參數設置的地方“Report->Report Parameters”就可設置,設置Available values的地方即可。
簡單情況下,這條select語句不帶任何參數或變量。而如果其使用了別的參數,則形成了參數依賴關系,這時可以達到的效果是讓這個輸入參數的可選值的范圍隨著其他相關參數的輸入值變化而變化。當然,現在sql語句不能直接寫,而需要用字符串拼接的方式了。
雜項
在表格的明細行對某列作一個分組后(比如把有時間的列按照日期來分組),其他列上顯示的看來是默認取了First的值。
一些問題
實際執行的sql語句中的參數類型問題
SSRS報表在取數據時,會執行exec sp_executesql形式的sql語句(至少用profiler抓到的sql語句是這樣),這sql語句存在問題,它經常會把原來的任何類型的參數改為使用nvarchar(n)的類型,而且n恰好是該參數在字符串形式時的長度,如果想基于此sql語句改改參數值進行查詢,而輸入了一個長度比上次的參數值長的參數值,往往會報錯,比如日期轉換出錯,就算沒報錯結果也是錯的,這時需要手工把n改得足夠大。
圖表不能很好解決維度中的重復值問題
如圖,id這個維度上有重復值,但圖表上只給顯示其所對應的一行記錄。
SSRS vs BO
SSRS可支持的組間排序的實例
如下圖,設計時
運行時
說明,這是在報表上再次對兩列分組,并進行Count的聚集計算,再拿count值來排序,這是組間數據的排序。而BO目前使用break只能支持組內(即內層break的數據)的排序,即某一組內的多行數據根據分組列以外的列來排序,據說最新補丁可以支持到上面截圖的效果。
Some Problem
在reporting service的圖表中,如果遇有維度值都相同的行,則會簡單顯示出來,而BO的webi報表中的圖表一般會作某種聚集計算(因為傳過去的一般都是measure)再顯示。
Tmp problem
用hyperlink傳空值,那邊接收到的值很奇怪
Javascript:var%20path='/OpenDocument/opendoc/openDocument.jsp';if(document.location.pathname.indexOf('.aspx')>0)%20path='/OpenDocument/opendoc/openDocument.aspx';%20open(path+'?sDocName=Availability_Detail+t1&sType=wid&lsSBegin+Date:=5/5/2009+12:00:00+AM&lsSEnd+Date:=9/4/2009+12:00:00+AM&lsSSAP+System:=R3E&lsSServer:=','_parent');
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/infinite/archive/2009/12/21/5049607.aspx