列表框从数据库添加项目并排序+删除重复项

时间:2013-12-22 20:15:32

标签: database delphi ms-access listbox delphi-xe3

我需要一些帮助,因为在做了一些搜索之后我没有看到任何解决方案......

我有一个数据库Database.mdb,它有几个表,我正在读特定的表Fixtures,它有字段ID,ChNo,Default和Manufacturer;

然后我有一个表格,我希望用户能够从每个灯具中进行选择,但首先要由制造商对其进行排序。 因此,我在表单上添加了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;

这样可以解决问题,但我首先想要它:合并所有重复项,以便具有相同Manufacturer字段值的灯具仅在单击列表框项目后显示(我相信我能够将SQL文本更改为“WHERE Manufacturer = something”),但如果我有来自同一制造商的90个灯具,则列表框中没有100个项目; 最后,在填充列表框之前,我希望它按字母顺序排序,从A到Z. 我应该首先阅读所有制造商的记录或数组,然后找到重复并删除它们,然后排序,最后填写列表框项目,还是有其他方法吗? 这就是方法,怎么做?这一整天后我放弃了.. :(

感谢。

干杯

1 个答案:

答案 0 :(得分: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;

用qFixtures做     开始      params [0] .asinteger:= manu;      打开;      ....     端;

qFixtures类似于

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