如何使adoquery排序正常工作

时间:2013-11-05 06:47:12

标签: delphi delphi-xe2

我只是一个adoquery,当我尝试 adoquery1.sort := 'Cost';

它不会对查询中的项目进行排序。

{Gets starting cards and put them into the correct rows}
//***************************************************************************
procedure TFGame.GetStartingCards;
//***************************************************************************
const
  ManaTypes : array [0..3] of string = ('Lava','Water','Dark','Nature');
var
   i: integer;
   z:integer;
   Cards: TObjectList<Tcard>;
begin
  Cards := TObjectList<TCard>.Create(false);
  z:=0;
  {add all tcards (Desgin ) to this list in order Lava,water,dark,nature }
  cards.Add(cardLava1);
  cards.Add(cardlava2);
  cards.Add(cardlava3);


  for i := 0 to Length(ManaTypes) - 1 do
  begin
    with adoquery1 do
    begin
      close;
      sql.Clear;
      sql.Add('SELECT TOP 4 * FROM Cards WHERE Color = "'+ManaTypes[i]+'" ORDER BY Rnd(-(1000*ID)*Time())');
      open;
    end;

      {return the result of everything for giving mana type.. }
     if adoquery1.RecordCount = 0 then
        Showmessage('Error no cards in db');
     adoquery1.Sort := 'Cost';
     adoquery1.First;

     while not adoquery1.Eof do
     begin
        cards[z].Ccost := adoquery1.Fieldbyname('Cost').AsInteger;
    //based on color change background
        cards[z].Background.LoadFromFile(format('%s\pics\%s.png',[maindir,cards[z].Ccolor]));
       adoquery1.Next;
       cards[z].repaint;
       z:=z+1;
     end;
  end;
 cards.Free;
end;

1 个答案:

答案 0 :(得分:3)

如果将CursorLocation设置为clUseClient,Adoquery.Sort应该可以工作 替代方案可能是将您的查询更改为:

Select * from
(
SELECT TOP 4 * FROM Cards WHERE Color = "'+ManaTypes[i]+'" ORDER BY Rnd(-(1000*ID)*Time())
) x
ORDER by Cost

将选择4个随机行并按成本对其进行排序。

修改
作为@kobik评论的后续行动:
如果您已经在使用clUseClient并且您的排序似乎不起作用,则必须确保可以在您的意图中解释排序。如果您使用的是Wide(String)字段,它将被排序为任何字符串(10,8,9)。您可以将字段类型更改为int或float,或者将查询字段添加到查询以进行排序(CINT(TextFiled)为IntForSort,CDBL(Textfield)为FloatForSort for Access)。
如果字段的内容无法转换,这可能会导致转换错误,因此我建议在表的设计中使用预期的字段类型。