第四章第三節 透視表組件術語
我們設計透視表組件的目的之一,就是使表列資料來源和多維資料來源的使用者介面和編程模型保持一致。雖然每種類型的資料來源都有特殊的要求,但我們希望這兩種資料來源相同的部分能夠在外觀和使用上保持一致。
同時,我們考慮到對於那些只是需要提取必須的資料,以便能夠完成他們的工作的商業人員來說,OLAP領域中使用的那些術語太不直觀了。幸運的是,Excel的透視表報表功能已經建立起一套標準的術語,而且很多使用者也對其很熟悉了。因此我們沿用了這些Excel建立的術語,僅僅改動了其中的幾個,因為這幾個術語能夠更好的表達表列資料和多維資料領域中的概念。
我會在本書剩下部分中使用本節所介紹的術語,透視表控制項的編程模型中使用的也是這些術語。我會解釋每一個術語代表控制項中的什麼內容,以及這個術語對應表列資料來源和多維資料來源中的什麼術語。
圖4-14顯示了一個典型的透視表報表,並反白了下面各節中定義的各元素。參考這個圖表可以得知透視表控制項中各元素的所在位置。
圖4-14。透視表報表中的各元素。
匯總值
對於一個表列資料來源來說,匯總值是欄位的各明細值的一個合計函數(求總和,求總數,求最小值,求最大值)。可以使用工具條上的AutoCalc按鈕或通過編程來建立匯總值,預設情況下,因為表列資料來源的來源資料只是一組行記錄,所以它沒有匯總值。您可以使用Sum,Count,Min,或Max這些合計函數來為任何欄位建立多個匯總值。(只有文字屬性的欄位可以被計算總數。)您也可以使用透視表欄位列表的操作功能表,或者通過程式來刪除任何一個匯總值。
對於OLAP資料來源來說,匯總值是代表超立方體中的一個尺寸的多個數值和合計值的集合。OLAP提供者暴露的所有尺寸在透視表控制項中都可用,您可以在匯總值中隨意使用這些尺寸。和使用表列資料來源不同,當串連到一個OLAP資料來源時,您不能建立額外的彙總欄位。如果您需要一個計算出的匯總值(例如商品淨利潤=商品價格-商品成本),您必須在超立方體中建立一個計算尺寸。透視表控制項會將這個尺寸以一個匯總值的形式暴露出來。
您只能將彙總欄位放在透視表控制項的資料區域(中央地區)中,它們一般用來產生透視表報表中的所有數值。可視的彙總欄位會逐一顯示在透視表欄位列表中,通過一個獨特的圖表來說明它們是彙總欄位。
Fieldsets和Fields
術語“field”常用來描述一個表列資料結果集中的列,它似乎是微軟各產品所使用的一個重要術語。雖然我更願意使用術語“column”,但是微軟Access和Excel曆史上一直在使用“field”。因此,Office Web組件使用field和fieldset來描述一個表列資料來源的結果列。對於一個OLAP資料來源來說,field被用來描述一個層級,fieldset被用來描述一個層。一個filedset是一個共同屬於一個層的一些相關聯的field的集合――例如,地理這個fieldset可能包括Country,State,City這些field。
表列資料來源返回一個包含一組完全不相關的欄位的結果集。換句話說,您完全無法知道哪個欄位與哪些其它欄位共同屬於一個層。例如,如果您在一個結果集中同時包含一個Country欄位和一個State欄位,則沒有說明這兩個欄位是一個層的層級的中繼資料。因此,當使用一個表列資料來源時,每一個結果集中的欄位在透視表控制項中都是獨立的,因而一個欄位集中只包含一個欄位。這個規則的例外情況是日期欄位和日期/時間欄位。當透視表控制項在結果集中發現一個日期欄位時,它自動為這個欄位產生兩個額外的fieldset,為這個欄位提供了基於日曆的時間層。一個fieldset包含欄位Year,Quarter,Month和Day,而另一個包含了欄位Year,Week和Day。透視表控制項為您的表列結果集中的每個日期,或日期/時間欄位建立這兩個額外的欄位集。很遺憾,在目前的版本的控制項中,您不能從一組結果集的欄位中建立您自己的欄位集層。
在使用OLAP資料來源時,透視表控制項為超立方體中的每個層建立一個欄位集。一些OLAP資料庫還允許您為一個維定義多個層。透視表控制項會將每一個層暴露為一個單獨的欄位集。每個欄位集為OLAP層中的每個層級包含一個欄位,如果存在ALL層級,控制項將跳過這個層級。
成員
透視表控制項中的欄位集包含一群組成員,一個成員對應欄位集中某個欄位中的一個獨特類別。成員在交叉報表中顯示為行標題或列標題,並不會滾動,這樣就總是能夠看到它們。
在使用表列資料來源時,透視表組件為每個結果集欄位中每個獨特的值建立一個成員。如果發現了給定欄位中包含NULL或空白值時,它也會建立一個Blank成員。
在使用OLAP資料來源時,透視表控制項在每個層中為每個元素建立一個成員,包括可能存在的All成員。
行,列,過濾,和資料區(軸)
透視表控制項包含一些您可用來構建您的報表的地區。在編程模型中地區常被稱為軸。OLAP資料庫也使用術語“軸”來描述查詢結果的一個部分。列區域是位於控制項左邊的地區,行標題在其中顯示,您可以將一個欄位拖放到這個地區,來實現將您的資料按行來分組。欄區域是橫穿控制項頂部的地區,列表頭在其中顯示,您可以將一個欄位拖放到這個地區,來實現按列來分組資料。您可以在這兩個地區中任意數量的欄位,當然,這是受您系統的可用資源限制的。
過濾區是橫穿控制項頂部的條。您可以將需要過濾的欄位放置在這裡,一次選擇一個值。例如,您可能需要查看一個產品系列、或一個國家、或一個銷售人員的銷售資訊。報表中的資料需要被過濾,以顯示僅屬於被選中的成員的匯總值。在過濾去中您可以放置任意多的欄位,如果您需要所有成員的匯總,可以選擇“(ALL)”成員。在使用表列資料來源時,您在一個過濾欄位中所作的選擇是在用戶端上的一個本地過濾,這就意味著透視表控制項在用戶端上仍然儲存了所有的細目資料,只是在本地對資料進行了過濾。如果您需要在伺服器端對資料進行過濾,您必須在用來填充透視表報表的命令文本中使用WHERE子句。
資料區是位於報表中央的地區,透視表控制項在這裡顯示匯總值。將匯總值放置在這個地區中會導致透視表控制項顯示行成員和列成員的交叉點的數值。您可以在這個地區中防止任意多的報表匯總值。預設情況下,數字值被顯示在單獨的列中(???)。
資料區也能夠顯示屬於一個指定匯總值的任何細目行,當然,只有當資料來源是表列資料時才具有這個功能。因此OLE DB for OLAP資料來源只返回合計值,而不返回這些合計值後面的細目來源資料。在動作表列資料來源時,透視表控制項能夠通過展開一個合計單元,並立刻顯示相關的細目行的方式來顯示隱藏的細目資料。這使得使用者可以僅僅雙擊一個需要查看細目資訊的數字,就能使透視表展開這個數字所在的儲存格,並顯示屬於這個合計值的細目資料。
唯一名稱,名稱和標題
在您使用透視表組件的編程模型來書寫代碼時,您會發現許多個物件都包含與它們的身份相關的三個屬性,而每個屬性也確實代表了一些不同的資訊。
一個對象的UniqueName屬性返回了資料來源提供的唯一名稱。許多OLAP資料來源都包含一個建立成員,層級,維等等的唯一名稱的方法,而這些名稱幾乎是不可讀的。唯一名稱一般是一個不透明的字串,您只需讀取和使用它,而不必瞭解它們的內部格式;不過,它們能夠保證對對象進行唯一標識。這裡有一個OLAP服務返回的唯一名稱的例子:“[Time].[All].[1997].[Q1]”。當在一個集合中尋找一個對象,或在設定一個過濾條件時,您可以使用一個對象的唯一名稱。對於這些任務,使用唯一名稱是最安全的,因為它防止了在在某個層的兩個不同的層級中包含相同的成員名,或在同一個層級中包含相同的成員名,例如Portland,Maine和Portland,Oregon。這兩個成員都包含相同的名稱(“Portland”),但是它們的唯一名稱是不一樣的(("[USA].[Maine].[Portland]" vs. "[USA].[Oregon].[Portland]")。
一個對象的Name屬性比UniqueName屬性要友好一些,但是它仍然要能標識一個集合中的一個對象。Name屬性的初始值是對象的Caption屬性中的值,但如果您為了顯示的需要改變了Caption屬性的值, Name屬性值並不會發生變化。Name屬性也可以被用於在集合中尋找一個對象,或用於設定一個過濾條件,但您應該只在確信同一層中沒有相同名稱的多個成員的情況下使用它。
當顯示報表中的對象時使用對象的Caption屬性。您不應使用它來在集合中尋找一個對象,或設定一個過濾條件。例如,如果您的報表中包含一個名為Sum of ExtendedPrice的彙總欄位,可能為了使名稱易讀,您需要將這個名稱改為Sales。改變Caption屬性不會影響對象的內部名稱,但它會改變顯示在報表上的文本。