
關於關係
關係是建立對象類之間的數據關聯。它們定義了一個源對象類和關聯對象類。它可以這樣描述:
這裏Relationship1把ItemType1和ItemType2聯繫在一起。每個關係都可以由兩個獨立的對象組成,關係類型(Relationship Type)和關係對象類(Relationship ItemType)。關係對象類可能和其他對象或是其他關係有關聯。這種表現形式允許複雜數據模型的最大程度的靈活性要求。如果你的業務流程要求複雜的數據模型,你想要使用嵌套關係。請聯繫Aras解決方案的顧問尋求幫助。在本手冊裏面,我們將會實現一般的源對象綁定關聯對象的簡單的關係結構。
源對象類可以使用關聯對象類的所有屬性。例如:如果我們定義一個關係類型叫做文檔(Documents),源對象是零部件(Part),關聯對象是文檔(Document),對於一個特有的零部件實例,它可以訪問關聯的文檔實例的所有屬性值。
源對象類可以有多個關係,在對象實例中,每個定義好的關係對應一個頁簽。例如:零部件定義了9個關係類型。如下圖,它們顯示在對象類定義介面的“關係類” 頁簽下。
所以這個對象類定義完後,零部件的實例就有九個頁簽-每一個對應一個關係
打開源對象實例的一個關係頁簽,可以通過選擇或是創建(採用哪種方式依賴於關係的定義)方式添加關聯對象。所有關聯對象將會列在對應關係頁簽下的關係網格內。下圖為關係網格樣例:
在後續部分我們將學習怎麼創建一個關係,怎麼設置它的屬性和定義它的操作,步驟如下:
1. 創建源對象類和關聯對象類;
2. 從源對象類創建和命名關係;
3. 修改關係類型對象---修改關係自身行為;
4. 修改關係對象類----添加或編輯關係自身屬性(例如:數量屬性)。
創建相關對象類
在創建關係之前,你需要預先定義希望關聯的對象類。下例中我們將會定義兩個對象類:Housekeeping Planner和Contractor。下圖為HousePlanner的定義介面,它基本定義了名稱,需要服務的房屋地址和需要的服務類型等基本屬性。
注意這 五個屬性是最基本的定義。將要關聯到HousePlanner對象類是Contractor。下圖是它的定義介面:
注意Contractor同樣只有五個屬性,像類型,由可選列表控制,地址,名稱,電話號碼和可靠性評估。現在我們定義兩個對象類之間的關聯,請看下節“定義關係”。
定義關係
一個關係綁定兩個對象-源對象和關聯對象,它實現了通過源對象直接獲取關聯對象資訊。關係從源對象上開始,創建一個鏈接到關聯對象。另一種方法為直接創建一個關係類型對象。第二種方式在某些特殊情況下是非常必需的,比如為所有的對象創建一個關係而不是一個特定的源對象。更多相關資訊請參考“關係類型”。
創建一個關係
1. 打開並編輯源對象類定義介面,此例中,源對象為HousePlanner;
2. 點擊源對象的“關係類”頁簽,介面如下:
3. 在執行旁邊的下拉框中,有兩個選項:選擇對象和無對象。這些選項與關聯對象有關。如果關聯對象已存在,可以選擇“選擇對象”。如果關聯對象不存在,同樣可以創建關係,但是這個時候要選擇“無對象” 選項。本章稍後將詳細介紹“無對象”。現在,確認下拉框中 “選擇對象”已選定,然後點擊新建圖示 ,一個關聯對象的查詢對話框將顯示。
在我們的例子中,選擇“Contractor”對象然後點擊綠色的選擇標記按鈕 。
4. 一個新的關係行將自動創建,關聯Item也已經填寫。下一個步驟是填寫餘下的必需屬性。下圖為新關係:
填寫下列屬性的值
a. 頁簽序號
b. 關係名稱—填寫關係名稱。一個關係類型和一個關係對象類將會根據名稱自動創建。我們將會在下面繼續討論這兩個對象。
c. 頁簽標題—源對象實例的頁簽標題用來標識關係並包含到關聯對象的引用。參考“頁簽示例”。
d. 名稱—關聯對象類的名稱。
e. 描述—關聯對象的描述,如果關聯對象有描述屬性字段並且已經填寫,那麼系統將自動填寫。下圖為填寫了屬性值的關係頁簽。
6. 保存,解鎖並關閉或者保存HousePlanner對象。
源對象一保存,另外兩個對象馬上自動創建-關係類型和關係對象類。它們的名稱都與上面關係類名稱列顯示的名稱一樣,在本例中為“Contractor Rel”。
關係類型對象控制關係本身的行為,關係對象類是控制關係本身的屬性。我們將在以下章節詳細討論這兩個對象。
1. 關係類型對象
2. 關係對象類
創建一個沒有關聯的關係
現在我們來實驗一下從源對象創建沒有關聯的關係的時候將會發生什麼。因為將創建一個關係,仍然需要打開源對象類的關係頁簽,但是將會沒有關聯對象鏈接到它,如下例。
1. 打開HousePlanner ItemType ,再添加一個關係,如下圖:
注意:沒有關聯的關係會被標注上 圖示。
2. “保存 解鎖並關閉”HousePlanner 對象類。關係類型CommentRel和CommentRel 對象類立即在系統中自動創建。我們編輯CommentRel對象類,為它添加一些屬性。
3. 點擊TOC中的系統管理->對象類 ,找到CommentRel 對象類並打開編輯
4. 添加一個屬性叫做Comments ,取消Created_by_id和created_on的“在關係中隱藏”;
1. 保存,解鎖並關閉CommentRel 對象類。
2. 現在我們創建一個HousePlanner實例。點擊Comments標籤頁,填寫comment然後保存Item。這就像這樣(created_on和created_by_id被系統自動填寫和保存)
以上部分中我們探索了當一個源對象的關係被創建時,沒有關聯對象會發生什麼。
根據你的數據建模需要這可以成為一種有效的方法。
修改關係類型對象
當源對象的關係被創建之後,關係類對象立即自動創建。關係類位於TOC的系統管理檔夾下。但是,我們不能創建關係類本身(一個例外情況,參考創建一個獨立的關係類型)只能通過源對象類來創建。
在本例中,我們創建了一個從源對象類HousePlanner到相關對象類Contractor的關係,它叫做ContractorRel。現在,我們測試一下ContractorRel。
編輯關係類型的屬性
1. 點擊TOC 的“系統管理”檔夾, 選擇關係類,搜索ContractorRel對象,然後打開並編輯。
2. 讓我們先看上面的屬性,它們控制關係本身的行為。
屬性名 | 描述 |
名稱 | 關係名稱,在源對象類的關係類中給定。 |
標籤 |
源對象對象實例的頁簽標籤顯示.
在該頁簽下,所有的相關對象實例(此例中為Contractors)將顯示在關係網格中。 |
描述 | 關係的描述 |
自動搜索 | 當選中時,自動以關係對象實例填充關係網格(即自動查找關係頁簽下的實例對象). 注意:關係網格位於源對象類實例的關係頁簽下。 |
序號 | 決定源對象類中,頁簽的顯示位置。 |
默認頁面大小 | 設置源對象的關係頁簽中關係網格顯示的頁面數據條數。 |
源對象類 | 關係的"父對象"對象類的唯一標識名稱。每個關係類只能定義一個源對象類, 它在關係創建時自動設定。 |
在所有頁面隱藏 | 該選項只有當源對象未指定時適用。因此,關係把所有的對象類做為源對象,並創建一個所有對象類和相關對象類之間的關係.用戶可以選中此選項,隱藏所有對象下的該關係頁簽。 |
相關對象類 | 相關對象.根據源對象類的關係定義自動填充。 |
最小出現 |
設置關係網格包含的最小對象數。
以上網格有4行記錄. 如果最小出現設置為5,保存時將提示錯誤資訊. |
最大出現 | 設置關係網格所包含的最大對象數. 參考最小出現. 它有4行. 如果此處設置為 3,保存時也將提示錯誤資訊。 |
行為 |
只有當相關對象可換版時適用, 參考如下規則,決定哪個版本的相關對象綁定至源對象: |
網格顯示 |
關係網格顯示兩類屬性- 相關對象的屬性,和關係自身的屬性. 網格顯示的可選值如下: 網格顯示一般與對象類中屬性的序號共同決定屬性在行中的顯示次序. 在關係中, 相關對象的屬性可以設置序號,關係對象類自身的屬性也可以設置序號。 考慮下麵的示例. 零部件對象通過BOM關係與其他零部件關聯. 零部件對象類的名稱屬性的序號為10,零部件編號的序號為20。 BOM關係也有一些屬性,其中一個叫做數量,序號為15。 下麵為網格顯示設置為Left時的BOM頁簽視圖。 注意:關聯對象的屬性列出現在左邊。 並且,相關零部件先按照Name排序,其次根據Part Number。
下麵為網格顯示設置為Right時的BOM頁簽視圖. 注意:關聯對象的屬性列出現在右邊,在關係屬性列之後。並且, 零部件按數量排序, 因為在關係對象類的屬性中該屬性的序號優先順序較高。
下麵為網格顯示設置為Intermix時的BOM頁簽視圖。列完全按照每個屬性定義的序號的順序來排列。行的顯示順序完全由"排序"屬性決定。行先根據Name排序,因為它的排序值為10,然後是Quantity,它的排序值為15 ,最後是Part Number, 它的排序值為2。
|
僅選取 | 在關係網格中創建相關對象時,只能從已有相關對象實例中選擇。 |
僅創建 | 在關係網格中創建相關對象時,只能創建相關對象的新實例。 |
選取& 創建 | 在關係網格中創建相關對象時, 既可以從已有相關對象的實例中選擇, 也可創建相關對象的新實例。 |
必需 |
選中時,源對象的關係頁簽下拉框中,無對象選項不顯示。因此,當從源對象實例中創建關係時,只有兩個選擇:選擇對象或新建對象,每種選擇都要求必須輸入相關對象。
|
打開相關窗體 | 如果選中,當從關係網格創建關聯對象時,如果是創建關聯對象的新實例,則將自動打開關聯對象的編輯窗體。若不選中,則只能從屬性列中輸入數據,或者手動從右鍵彈出菜單中打開窗體。 |
拷貝許可權 |
當創建關聯對象選中時,此選項適用。它管理以下情況:一個Part的實例叫做Part1,它的BOM中存在一個Bracket實例,叫做Bracket1。用戶複製並粘貼Bracket1到Part的另一個實例,Part2時,如果BOM關係類的創建關聯對象設置為true,於是,根據Bracket1複製Bracket的一個實例,Bracket1副本。
如果原Bracket1實例設置了私有許可權,用戶根據該選項決定是否複製指定許可權: |
創建關聯對象 |
此選項當複製或粘貼關係時適用。我們用一個包含名為Bracket的BOM資訊的Part組件舉例說明。如果複製Bracket並粘貼至另一個Part的BOM中,下列選項將生效: |
3. 屬性值填寫完畢,下一步就是在頁簽中添加資訊:
a. 網格事件-如果希望觸發網格事件運行客戶端方法,例如:選擇行,插入行,刪除行,可以在此處設置方法。如果你希望第一次創建關係(OnInsertRow)的時候,自動把一些數據的填充到關係中,你就可能需要考慮使用這種方法。關於如何書寫客戶端方法和如何在頁簽中設置屬性,請參考Aras高級編程培訓。
b. 關係查看-有時候當在源對象或是父對象中點擊關係頁簽時,可能不希望看到基本的關係網格。你可能希望看到一個web頁面,或是配置型的網格。你可以這個頁簽下進行設置,並且,這些設置基於身份的,所以不同的用戶可能被指向不同的頁面或是網格。下麵為進程計畫PFD中使用頁面代替基礎關係單元格的示例:
讓我們看一個這個頁簽的列屬性:
i. 名稱—視圖的有效身份名稱
ii. 起始頁面—http://web路徑將會顯示在這裏(the http:// path to the web page to be displayed)
iii. 參數—希望傳遞給網頁輸入值
iv. 網格—為視圖設計的可配置網格的引用(從選擇對話框中選擇)
c. 排斥:有些時候關係可能互相排斥。例如:你可能有一個零部件關係叫做BOM,和另一個零部件關係叫做供應商。但是,某個零部件也可以在室內製造,在這種情況下可能需要一個BOM頁簽,或者從供應商處購買(這種情況下只需要供應商頁簽)。所以,在排斥頁簽可以指定一系列相互排斥的關係列表。在此例中,關係類型BOMRel,可在排斥頁簽下指定VendorsRel。
d. 隱藏-當選中時,這個選項將會在所有源對象實例中隱藏該關係頁簽。例如,如果我們編輯BOM關係,在隱藏頁簽下選擇隱藏,BOM頁簽將會在所有的零部件實例中被隱藏。
注意下麵的圖片,這是BOM標籤頁。
修改關係對象類
先前章節已提到過,當源對象保存時,一個對象會被自動創建,它就是關係對象類。它是一個標準的對象類,除了這些關係類屬性會被設置為True。就像一個標準的對象類一樣,它可以創建屬性,事件和其他關係。這些都屬於複雜數據模型部分,但是不屬於本手冊的範疇。
在本例中,我們創建一個從源對象類 HousePlanner到關聯對象類 Contractor的關係,命名為ContractorRel.。下麵,我們詳細瞭解ContractorRel對象類。
編輯關係對象類的屬性:
1. 點擊TOC的系統管理檔夾,選擇對象類,搜索ContractorRel。然後打開編輯,介面如下:
注意上半部分屬性為系統默認設置。
a. Use Src Access -這意思是關係本身,而不是關聯對象,繼承父項或是源對象的許可權和canAdd行為
b. 關係類 –當前對象是否為是關係結構,如果這個屬性設置為ture,則表示是關係類。
c. Allow Private Permissions -允許私有許可權
2. 通常,對每個關係,我們需要為關係本身添加一些屬性。例如,對於零部件,在它的BOM關係中有一個屬性叫做數量。這個屬性是設置在關係上的,因為它只在源對象和關聯對象之間的關係中才有意義。在我們的例子ContractorRel中,同樣增加一些關係屬性,如下:
a. 添加一個每週工時屬性:這個屬性值標示特定的承包商每週工作多少工時。
b. 增加一個屬性叫做支付比例:這個值隨每個承包商和任務而變化。換句話說,相同的承包商對於兩樣不同的任務可能給予不同的支付比例,因為不同的水準。
c. 確認新增屬性的Hidden2的關係中隱藏屬性沒有被勾選。我們希望這兩個屬性在關係網格中顯示。同樣,不要點選任何系統屬性的關係中隱藏屬性,如果你想在關係單元格中顯示這些屬性。
3. 點擊工具欄“保存 解鎖並關閉”圖示。
4. 創建一個HouseKeeper的實例,添加一些contractors,如下:
注意關聯對象屬性都在左邊顯示,這是在關係類中的默認設置,其次是關係屬性。
創建一個標準的獨立的關係類型
另一個創建關係的方法是在關係類中直接創建。當把所有對象類做為源對象創建關係時,這種方法是必需的。也就是說,當你想要在系統中給所有的對象類添加某些數據,例如,歷史記錄。這個已經在Innovator中配置好了,但是在這裏它可以做為一個很好的範例。給所有對象添加歷史記錄,你需要創建一個沒有源對象的關係類型,因為它將所有的對象類做為源對象。
創建一個關係類型
1. 點擊TOC中的系統管理檔夾,選擇關係類, 創建一個新的關係類;
2. 不設置源對象類,但是設置相關對象類為 History;
3. 按照自己的需求設置其他屬性;
4. “保存”關係類對象;
5. 創建任意對象的一個實例你將會看到History頁簽。但是,如果選中“在所有頁面隱藏”複選框, History要求將不會出現在任何對象中,但是關係依然存在。
如果你創建了一個關係類並選擇了一個源對象類和關聯對象類。它與“定義關係”章節描述的創建關係的過程完全一致。當保存關係類時,關係對象類會被系統自動創建,所有指定的源實例都會獲得一個新頁簽。
關係VS屬性
在數據建模一樣的情況下,有很多方法去做同一件事情。有一些可能比其他的更有效率,有些可能更靈活。例如你想要通過對象1訪問對象2的一個屬性。一個方式是創建對象類1和對象類2之間的關係,然後設置所有必須的屬性訪問許可權。另外一種方式是在對象類1定義中創建一個Foreign屬性,引用對象2的需要的屬性(參考Foreign數據類型)。這裏有關於創建關係和使用Foreign 屬性的比較:
1. 關係有更大的靈活性,允許訪問超過多個屬性值
2. 關係能夠讓一個對象1的實例關聯多個對象2的實例
3. Foreign屬性比關係更加有效,因為不需要在資料庫增加2張附加表單
關係類型對象行為
在關係類型中,有一個定義的屬性是行為。雖然只有兩個選項:Float和Fixed,但是很多變化都取決於這個設置。讓我們探討一下其中的一些變化。在下圖中我們將會使用父項和子項關聯到對象。另一種理解這些對象的方法是:父項=源對象, 子項=關聯對象。數字1和2是版本號,所以Parent1是源對象的第一個版本。
第一個實例就是Parent1連接到Child1, 然後 Parent1衍生出新版本Parent2。然後 Child1版本更新變成Child2。下麵過程顯示了關係的連接結果。
第二個Float案例可能產生這樣一個疑問:如果行為是“Float”,為什麼在Child2創建後,Paren1沒有指定到Child2?根據“Float”行為定義,難道不是父項指向子項的最新版本嗎?這些問題需要根據父項的版本規則來回答。為了保護配置資訊,當父項換版時,它的先前版本仍將設置為“固定的”行為。換句話說:當父項換版時,它的先前版本將永遠停留於配置。在上面這個案例中,Parent的第一個版本連接到Child1。當Parent先換版時,Parent1立即”凍結”指向Child1的當前配置。當然,Parent2將指向Child1,因為它是Child的最新版本。但是,由於定義了“浮動”行為,一旦Child換版,Child2被創建,Parent2將打破與Child1的綁定指向Child2。
下一個案例與前面相似, Child1在創建時已經關聯到Parent1。如果是Child先換版,產生Child2。之後,Parent換版變成Parent2。下麵是關係行為表:
在這個案例中,大家可能對“Fixed”行為存在疑問。為什麼行為是“Fixed”,Parent2卻關聯到Child2?這是因為另外一個規則。當父項的一個新版本被創建,它自動與子項的最新版本關聯。因此,如果一個更新的子項已經存在,即使行為被定義為“Fixed”,父項仍將自動關聯到最新版本上。
另外兩個行為---嚴格固定(Hard Fixed)和嚴格浮動(Hard Float)只在與生命週期設置結合時發揮作用。所以,我們將探討在生命週期下的這些對象的行為。關於生命週期是怎樣深入的影響可換版關聯對象行為,請參閱“對象行為”介紹,