-2

我只有一个 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;
4

1 回答 1

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) as IntForSort,CDBL(Textfield) as FloatForSort for Access)。
如果无法转换字段的内容,这可能会导致转换错误,因此我建议在表格设计时使用预期的字段类型。

于 2013-11-05T08:17:58.213 回答