2011-11-25 66 views
2

我有一個「項目」,它被分配到多個「類別」的數據庫。分類可以有多個項目,反之亦然。數據庫結構的相關部分如下:AutoID字段在多對多,插入使用TDataSet /查詢(Delphi/MSAccess)

[tblItem]
的ItemID(自動編號)
的mainText(文本)

[tblCategory] ​​
類別ID(自動編號)
名稱(Text)

[tblItemCategory] ​​
項目ID(長整型)
類別ID(長整型)

我想建立一個面板組件,它顯示了一個類別名稱在頂部,與屬於低於電網項目的數據綁定網格。這個面板組件會有很多實例,最終用戶應該能夠創建一個新的項目,並同時將它分配給任何一個有問題的類別。

在MS Access中,可以創建一個嵌套表單,用「子」一個數據綁定到一個查詢,該查詢是鏈接到「父」表單上的數據綁定「類別」字段的「MasterFields」,例如網格項目更改爲類別字段更改。此項目網格還可以輕鬆地添加新記錄,同時自動填充ItemID(在tblItem和表tblItemCategory中)和鏈接的CategoryID字段(在tbIItemCategory中)。

對於訪問形式的網格中的查詢是:
SELECT tblItemCategory.CategoryID,tblItem *
FROM tblItemCategory LEFT JOIN tblItem ON tblItemCategory.ItemID = tblItem.ItemID
ORDER BY tblItemCategory.CategoryID。

如果我嘗試在德爾福同樣的事情,該項目ID自動編號字段沒有得到填充,導致出現以下錯誤:

..exception類EOleException與消息「字段‘tblItemCategory.ItemID’不能包含一個Null值,因爲該字段的Required屬性設置爲True。在此字段中輸入一個值'。

..並且ItemID字段在網格中相應爲空白。

有沒有辦法讓Delphi/ADO像Access一樣輕鬆/整潔地處理幕後兩張ItemID羣體,而無需手動處理它?如果不是,以編程方式處理它的最好/最優雅的方式是什麼?

我想盡可能保留與傳統TDataSet/TDataSource方法緊密結合的任何解決方案,因爲我使用多種不同類型的數據綁定控件,所有這些控件都必須處理此問題相同的數據結構。

(注:我使用的是2007年德爾福和MSACCESS 2000格式MDB文件)

+0

表格之間的關係對我而言並不明確,您是否可以添加一些信息(模式...) – philnext

+0

我熟悉您所描述的Access功能,但我不太明白您想要實現的功能。你是否想要自動填充tblItemCategory中的兩個關鍵列?如果表中沒有其他字段,那麼目的是什麼? Plus:在哪裏以及如何選擇第二個關鍵列的值?如果你只是試圖自動填充類別ID列(因爲你已經加入了項目),@託尼的答案完全符合要點,我不理解你對他的回答的評論。 –

回答

0

幾乎相同的方式。 Theres的主要來源和主域屬性,因此您只需將詳細信息鏈接至主。

因此,mastersource將是CustomerID,Detail Source,訂單由CustomerID鏈接。

死容易表現這一點,但很難解釋。

其他一些傢伙寫了它雖然。

Master Detail Forms And Delphi

+0

感謝您的回覆。 這很多我明白,可以做。我遇到問題的地方是三張表格(多對多),而不是兩張表格「標準版本」(一對多)。兩個表格需要添加到,而不僅僅是一個。 – Jamo

+0

啊查找通常是最好的方式來做到這一點。如果這兩個id在鏈接表中都不是空的外鍵。您選擇(或添加並選擇)每一個,然後在鏈接表中插入一個插入。按照您當前的想法,蜿蜒用戶界面的唯一方法將是您的鏈接表中的代理鍵,並且允許CategoryID和ItemID爲空。一個wince製造商的位,或者通過一個連接來更新。 –

0

如果要添加新的記錄通過電網的表,那麼你將不得不使用底層查詢BeforePost方法,以獲得新的密鑰,然後您可以手動插入鏈接表以及類別標識。我承認我從來沒有用可編輯(和可插入)網格編寫代碼,所以我的答案可能需要稍微調整一下。