我只是一个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;
答案 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)。
如果字段的内容无法转换,这可能会导致转换错误,因此我建议在表的设计中使用预期的字段类型。