请教大家一个关于随机的小问题。

cdsun 2004-11-21 01:47:55
我先把我要的结果给大家阐述一下
1、我先有一个sql语句
2、打开这个语句
3、取得记录机
4、判断是否有记录
5、在符合条件的id里面进行随机

我现在的问题是这样。

5、在符合条件的id里面进行随机
这里

比如我要查询一个是性别是男的学生的列表
假如满足它的条件的有10个
那么它的ID是这样
有可能是1、2、6、7、9、45、54、21、78、32
然后我想在这样的范围内进行我指定的随机次数之后(得到的不要重复)在进行用,连接起来
就是我要的目的了

不知道大家明白我的意思了没
明白了得大家给我点意见
我现在的代码是]
sql=.............(很长,我就省略了)
Set mrc = ExecuteSQL(txtSQL, MsgText)
Count1 = mrc.RecordCount
If Count1 = 0 Then
MsgBox "没有查找到符合条件的公司记录!", vbInformation, "提示..."
Call Command2_Click
Else

Do While Not mrc.EOF
For kk = 0 To Combono.Text - 1
Randomize


If i = Int((mrc.RecordCount * Rnd) + 1) Then
'ida = mrc.Fields("id")
ida = mrc.Fields("id") & "," & ida

'Exit Do
End If

Next
mrc.MoveNext
i = i + 1
Loop
end if

谁能帮我想个办法达到我要的功能

谢谢了
...全文
283 52 打赏 收藏 转发到动态 举报
写回复
用AI写文章
52 条回复
切换为时间正序
请发表友善的回复…
发表回复
cdsun 2004-11-21
  • 打赏
  • 举报
回复
vbman2003(家人)

我终于弄完了

不过还是用vbman2003(家人) 的方法进行修正而来的

谢谢两为了

我就结帖了

tztz520 2004-11-21
  • 打赏
  • 举报
回复
你先测试一下.

debug.print temparr1(i)'打印出来,看一下出错的时候这个值是什么
mrc.Move temparr1(i)
cdsun 2004-11-21
  • 打赏
  • 举报
回复
tztz520(午夜逛街) 老兄真是麻烦你了
我都不好意思了
不过还是有点问题
他提示说有一个记录不存在就是eof or bof的错误
我想可能还是没有在那个范围内的问题。也就是说还有可能是0
mrc.Move temparr1(i)
vbman2003 2004-11-21
  • 打赏
  • 举报
回复
试试:
Private Sub cmd_Click()

Dim strConnect As String
Dim rs As ADODB.Recordset
Dim Sql As String
Dim iColl As New Collection
Dim i, iTemp As Long

strConnect = "Provider=Microsoft.Jet.OLEDB.4.0; " _
& "Data Source=" & App.Path & "\db1.mdb;Persist " _
& "Security Info=False;Jet OLEDB:Database Password=abc"
Set Conn = New ADODB.Connection
Conn.Open strConnect

Sql = "select id from tb "   'id 为主键
Set rs = New ADODB.Recordset
rs.Open Sql, Conn, adOpenKeyset, adLockOptimistic

While Not rs.EOF
iColl.Add Val(rs!id) '将ID号加入到集合中
rs.MoveNext
Wend
Randomize
For i = 1 To 5
iTemp = Int(Rnd * iColl.Count) + 1
Debug.Print iColl(iTemp)
iColl.Remove iTemp
Next i
Set iColl = Nothing
End Sub
tztz520 2004-11-21
  • 打赏
  • 举报
回复
你试一下吧,应该没问题
tztz520 2004-11-21
  • 打赏
  • 举报
回复
Count1 = mrc.RecordCount
If Count1 = 0 Then
MsgBox "没有查找到符合条件的公司记录!", vbInformation, "提示..."
Call Command2_Click
Else
Dim temparr() As Integer
Dim temparr1() As Integer
ReDim temparr(Count1) As Integer
For i = 0 To Count1
temparr(i) = i
Next i
temparr1 = DisorderlyArray(temparr)
For i = 1 To Val(Combono.Text)
mrc.Move temparr1(i)
Debug.Print mrc.Fields("id")
Next i
End If



Private Function DisorderlyArray(arr() As Integer) As Integer()
Dim ArrLen As Long
Dim i As Long, ii As Long, iii As Long, iiii As Long
Dim tempArr() As Integer

iiii = 0
ArrLen = UBound(arr, 1)
ReDim tempArr(ArrLen) As Integer
For i = 0 To ArrLen
tempArr(i) = 0
Next i

For i = 0 To ArrLen
Do
Randomize
If iiii > ArrLen Then Exit Do
iii = Int((Rnd * (ArrLen) + 1))
If tempArr(iii) = 0 Then
tempArr(iii) = arr(i)
iiii = iiii + 1
Exit Do
End If
Loop
Next i
DisorderlyArray = tempArr
End Function

tztz520 2004-11-21
  • 打赏
  • 举报
回复
'这样是不会有0的.

Private Sub Command1_Click()
Dim tempA(10) As Integer
Dim tempB() As Integer
List1.Clear
Dim i As Integer
For i = 1 To 10
tempA(i) = i '
Next i


tempB = DisorderlyArray(tempA)

For i = 1 To 10
List1.AddItem tempB(i)
Next i

End Sub



Private Function DisorderlyArray(arr() As Integer) As Integer()
Dim ArrLen As Long
Dim i As Long, ii As Long, iii As Long, iiii As Long
Dim tempArr() As Integer

iiii = 0
ArrLen = UBound(arr, 1)
ReDim tempArr(ArrLen) As Integer
For i = 0 To ArrLen
tempArr(i) = 0
Next i

For i = 0 To ArrLen
Do
Randomize
If iiii > ArrLen Then Exit Do
iii = Int((Rnd * (ArrLen) + 1))
If tempArr(iii) = 0 Then
tempArr(iii) = arr(i)
iiii = iiii + 1
Exit Do
End If
Loop
Next i
DisorderlyArray = tempArr
End Function
cdsun 2004-11-21
  • 打赏
  • 举报
回复
还在不再了啊?
几位老大
明明是很小的问题
竟然一天都没有解决

简直气死我了

几位老大帮帮忙阿
cdsun 2004-11-21
  • 打赏
  • 举报
回复
For i = 1 To Val(Combono.Text)
mrc.Move temparr1(i)
Debug.Print mrc.Fields("id")
Next


mrc.Move temparr1(i)这里下表越界


你能不能做一个简单的范例给我看看?
谢谢了老兄
可以吗?tztz520(午夜逛街)
cdsun 2004-11-21
  • 打赏
  • 举报
回复
难道这个问题就不能解决吗?
tztz520 2004-11-21
  • 打赏
  • 举报
回复
还有什么没有解决的?
cdsun 2004-11-21
  • 打赏
  • 举报
回复
iColl是什么东西?
vbman2003 2004-11-21
  • 打赏
  • 举报
回复
其它部份省略

......
Dim iColl As New Collection
Dim i, iTemp As Long
......查询记录集
  While Not rs.eof
iColl.Add rs!id '将ID号加入到集合中
rs,Movenaxt
Wend
Randomize
For i = 1 To 5
iTemp = Int(Rnd * iColl.Count) + 1
Debug.Print iColl(iTemp)
iColl.Remove iTemp
Next i
Set iColl = Nothing

你试试,就是这个思路
cdsun 2004-11-21
  • 打赏
  • 举报
回复
为什么阿
为什么在access的查询分析器里面就可以出现随机的效果

在vb+access里面就不行呢?

我晕哦
cdsun 2004-11-21
  • 打赏
  • 举报
回复
集合是什么?
能不能给一个代码范例?

谢谢了

我实在很着急阿

本来我快解决了

可是楼上那个2星的老兄给的第一个函数里面总要出现0
这样会出错

不知道那位老兄能不能帮我解决一下

如果不出现0那我的问题就解决了
vbman2003 2004-11-21
  • 打赏
  • 举报
回复
待会试试
那么你可以用集合来解决
cdsun 2004-11-21
  • 打赏
  • 举报
回复
你是通过vb执行的吗?

这个语句在access的查询分析器里面是可以运行的

但是vb+access就没有作用
不信你可以尝试一下
vbman2003 2004-11-21
  • 打赏
  • 举报
回复
不好意思,没有QQ。你就把:
SELECT TOP 10 *
FROM 当前产品列表
ORDER BY Rnd(IsNull(产品id)*0+1);
在Northwind中建立一个查询试试知道是可以的

好好检查一下你的数据库。


cdsun 2004-11-21
  • 打赏
  • 举报
回复
txtSQL = "SELECT TOP 5 * FROM test ORDER BY Rnd(IsNull(id)*0+1)"
Set mrc = ExecuteSQL(txtSQL, MsgText)

我这样不行啊

还是一直都是这样

test是我重新建立的一个表

也不行
cdsun 2004-11-21
  • 打赏
  • 举报
回复
我也是access阿
并且我把id设置成主键了还是不行啊
vbman2003(家人) 你的QQ能不能告诉我啊?

加载更多回复(32)

7,759

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧