我想一次从数据库中取出若干条随机记录,该怎么办呀?
每次取出的值不能重复,不能位空值!(ACCESS数据库,ID位递增)
我的想法如下:
var j:integer;
temp:string;
begin
jg.Clear;
jg.Items.Add('以下是三等奖的获奖名单!(10个)');
zhjg.Items.Add('以下是三等奖的获奖名单!(10个)');
try
for j :=0 to 9 do
begin
i:=adoquery2.RecordCount;
randomize;
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('select * from a where id=:id');
adoquery1.Parameters.ParamValues['id']:=random(i);
adoquery1.Open;
temp:=adoquery1.FieldValues['a'];
jg.Items.Add(temp);
zhjg.Items.Add(temp);
end;
except
end;
end;
每次取出的值不能重复,不能位空值!(ACCESS数据库,ID位递增)
我的想法如下:
var j:integer;
temp:string;
begin
jg.Clear;
jg.Items.Add('以下是三等奖的获奖名单!(10个)');
zhjg.Items.Add('以下是三等奖的获奖名单!(10个)');
try
for j :=0 to 9 do
begin
i:=adoquery2.RecordCount;
randomize;
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('select * from a where id=:id');
adoquery1.Parameters.ParamValues['id']:=random(i);
adoquery1.Open;
temp:=adoquery1.FieldValues['a'];
jg.Items.Add(temp);
zhjg.Items.Add(temp);
end;
except
end;
end;
temp:string;
SL: TStringList;
begin
jg.Clear;
jg.Items.Add('以下是三等奖的获奖名单!(10个)');
zhjg.Items.Add('以下是三等奖的获奖名单!(10个)');
Sl := TStringList.Create;
try
i:=adoquery2.RecordCount;
randomize;
j := 0;
while j < 10 do
begin
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('select * from a where id=:id');
adoquery1.Parameters.ParamValues['id']:=random(i);
adoquery1.Open;
if adoquery1.IsEmpty then
Continue;
temp:=adoquery1.FieldValues['a'];
if SL.IndexOf(temp) >= 0 then
Continue;
jg.Items.Add(temp);
zhjg.Items.Add(temp);
SL.Add(temp);
Inc(j);
end;
SL.Free;
except
end;
end;
用for循环取随即数的确会遇到重复的地方,所以你要加上一个判断以下是代码,楼主自己测试一下var j:integer;
temp:string;
flag:boolean;//判断是否到10个
begin
jg.Clear;
jg.Items.Add('以下是三等奖的获奖名单!(10个)');
zhjg.Items.Add('以下是三等奖的获奖名单!(10个)');
try
flag:=false;
while not flag do
begin
i:=adoquery2.RecordCount;
randomize;
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('select * from a where id=:id');
adoquery1.Parameters.ParamValues['id']:=random(i);
adoquery1.Open;
temp:=adoquery1.FieldValues['a'];
if temp in jg then //如果已经存在的号码
Begin
showmessage('已经有了');
continue;//跳出本次循环
End;
jg.Items.Add(temp);
zhjg.Items.Add(temp);
if jg.count=10 then
flag:=true;//已经有十个了
end;
except
end;
end;
重复问题麻烦一点,要么取到后删除该纪录,要么建临时表,对那个表进行操作。
我就是这么做的,效果好着呢。
我就是这么做的,效果好着呢。
方法同上。
var
Form1: TForm1;
iRound :integer = 0;
iRoundMax :integer =4;//三等奖
implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
i,iCount:integer;
sEmp,sOperid,sRound:string;
label summer;
begin
if iRound =iRoundMax then
begin
case iRoundMax of
4:sRound := '三等奖';
2:sRound := '二等奖';
1:sRound := '一等奖';
end;
Application.MessageBox(pchar(sRound+'获奖者已经产生'),pchar('提示'),0);
Exit;
end;
Adoquery1.Close;
Adoquery1.Open;
iCount := Adoquery1.RecordCount;
summer:Randomize;
Adoquery2.Close;
Adoquery2.SQL.Clear;
sOperId := inttostr(Random(iCount));
if sOperId ='0' then
goto summer
else
begin
for i :=0 to (6-length(sOperId)-1) do
begin
sOperId := '0'+sOperId;
end;
Adoquery2.SQL.Add('select * from #aaa where IsWin=0 and operid='+sOperId);
Adoquery2.Open;
if Adoquery2.RecordCount =0 then
goto summer;
sEmp := Adoquery2.Fieldbyname('Name').AsString;
Application.MessageBox(pchar('获奖者是:'+sEmp),pchar('提示'),0);
Adoquery2.Edit;
Adoquery2.FieldByName('IsWin').Value := '1';
Adoquery2.Post;
Memo1.Lines.Add(sEmp+#13#10);
inc(iRound);
end;
end;procedure TForm1.FormActivate(Sender: TObject);
begin
Adoquery2.Close;
Adoquery2.SQL.Clear;
Adoquery2.SQL.Add('select Operid,Name into #aaa from Operinfo');
Adoquery2.SQL.Add('alter table #aaa add IsWin bit null default 0 with values');
Adoquery2.ExecSQL;
Memo1.Clear;
Memo1.Lines.Add('------------------------三等奖获得者名单---------------------');
end;procedure TForm1.RadioButton1Click(Sender: TObject);
begin
iRoundMax := 4;
iRound := 0;
Memo1.Lines.Add('------------------------三等奖获得者名单---------------------');
end;procedure TForm1.RadioButton2Click(Sender: TObject);
begin
iRoundMax := 2;
iRound := 0;
Memo1.Lines.Add('------------------------二等奖获得者名单---------------------');
end;procedure TForm1.RadioButton3Click(Sender: TObject);
begin
iRoundMax := 1;
iRound := 0;
Memo1.Lines.Add('------------------------一等奖获得者名单---------------------');
end;
where id not in(select id from table2)
order by newid()