2013-12-22 58 views
0

我需要一些幫助,因爲我看不出做一些搜索之後的任何解決方案...列表框從數據庫中添加項目和排序+刪除重複

我有一個數據庫Database.mdb,其中有幾個表,我正在閱讀具體的表夾具,其中有字段ID,通道號,默認和製造商;

然後我有一個表單,我希望用戶能夠從每個燈具中進行選擇,但希望先由製造商對其進行分類。 所以,我說ListBox組件在窗體上,並開始使用所提供的代碼,它填充:

procedure TPatchNew1.FormShow(Sender: TObject); 
var No, No2: integer; 
begin 
No2:=0; 
AdoQuerySearchFixtures.SQL.Text:='SELECT Manufacturer FROM Fixtures'; 
AdoQuerySearchFixtures.Open; 
ManuNo:=AdoQuerySearchFixtures.RecordCount; 
While No2 < No do 
    begin 
    ManufacturerListbox.Items.Add; 
    AdoQuerySearchFixtures.Close; 
    AdoQuerySearchFixtures.SQL.Clear; 
    AdoQuerySearchFixtures.SQL.Text:='SELECT Manufacturer FROM Fixtures WHERE ID='+IntToStr(No2+1); 
    AdoQuerySearchFixtures.Open; 
    ManufacturerListbox.Items[No2].Caption:=AdoQuerySearchFixtures.Fields[0].AsString; 
    No2:=No2+1; 
    end; 

end; 

這是卓有成效的,但我想它想先:合併所有重複,使燈具與相同的製造商字段值都顯示只有單擊列表框項目後(我相信我可以做到這一點,將SQL文本更改爲「WHERE製造商=東西」),但沒有100個項目在列表框中,如果我有90個來自同一製造商的固定裝置; 最後,在列表框填充之前,我希望按字母順序排序,從A到Z. 我應該首先閱讀所有制造商以對記錄或數組進行排序,然後查找重複項並將其刪除,然後對其進行排序它,最後填寫列表框項目,還是有任何其他方式? 就是這樣,怎麼做?我放棄了這個整天之後.. :(

感謝。

乾杯

+0

打開查詢統計記錄,然後分別查詢每一個項目?排序和分組可以很容易地由數據庫查詢本身完成。所以開始在數據庫教程上工作第一個 –

+0

你沒有任何具體的問題,你是在徵求建議,所以我認爲這是一個糟糕的問題。正如Rufo提到的那樣,你可以用SQL來完成它(但你至少需要學習SQL的基本知識),或者預先加載所有數據並在內存中執行你想要的操作(例如在數組中)。 –

+0

對不起,遲到了,因爲假期... [聖誕快樂到所有bdw]。 恩,我確實檢查了很多關於數據庫查詢的內容,但是從來沒有想過在查詢本身中看到任何類似的內容。但是,這不會使查詢變得非常繁忙和緩慢嗎?我的意思是,我將擁有一個包含多個表格的數據庫,我基本上都在閱讀和寫作。一個表每0.5秒寫入一次,每0.5秒讀出2個表,所有行值,所以我想把排序和其他工作掛到程序本身上......這不是一個好主意嗎? –

回答

1

如果我理解正確的話,要在列表框中顯示的誰供應燈具廠商的名字。目前尚不清楚從你的問題,但我假設你至少有兩個表:製造商和夾具之一。製造商將在夾具表中的外鍵

如果你想加載與製造商列表框,那麼最好從製造商表格中拿出(幾乎)保證的數據沒有重複的地方。您的SQL查詢將

select id, name 
from manufacturers 
order by name 

如果您只希望誰出現在燈具表生產廠家,然後更改查詢從而

select id, name 
from manufacturers 
where exists (select 1 from fixtures 
where fixtures.manufacturer = manufacturers.id) 
order by name 

負載以下方式

manulist.items.clear; 
with qManufacturers do 
begin 
    open; 
    while not eof do 
    begin 
    manulist.items.addobject (fieldbyname ('name').asstring, 
           tobject (fieldbyname ('id').asinteger)); 
    next 
    end; 
    close 
end; 

列表框然後,當從列表框中選擇名稱時,可以顯示夾具

with manulist do 
begin 
    manu:= longint (Items.Objects[itemindex]); // manufacturer key 
    mname:= items[itemindex];     // manufacturer name 
end; 

with qFixtures do begin params [0] .asinteger:= manu; 開放; .... end;

qFixtures會像

select id, name, ... 
from fixtures 
where manufacturer = :p1 
+0

我讚揚你的努力來幫助那個No'am,但是我恐怕從他的SQL語句中可以清楚地知道他沒有製造商和固定裝置有兩個獨立的表格。我同意一些數據庫正常化可能會有利於他的情況。 [+1] – Sam

+0

對不起,你也遲到了。無論如何,正如Sam已經提到的那樣 - 從我的問題來看,我不清楚我是否有一個或兩個表格:我寫到我有一個數據庫,裏面有幾張表格,但我正在閱讀*一個特定的 - Fixtures * ,其中*具有字段ID,通道號,默認值和製造商*。所以,這一切都在一張桌子上。每個夾具(目前爲止僅由ID標識,因爲該名稱對於問題不重要)具有製造商,這不是唯一的。然而,我也鼓掌你的努力來幫助我,而且我認爲我已經從你的示例中得到了一些想法,所以我將嘗試 –

+0

他們,看看我是否能夠做出正確的SQL語句,我需要因爲它... 但是,你也給了我一些想法,擴大數據庫與製造商的獨立表,所以夾具表中的每個燈具有一個表中的製造商ID,其他表有所有的製造商列出,所以沒有重複,因此我加載到製造商表格中,並從那裏搜索基於選定製造商的夾具。不知道我以前怎麼沒有提出這個想法...... @Sam,這就是你要做「數據庫規範化」的意思嗎? –