【问题标题】:Selecting Random Record and Marking Record As Being Used选择随机记录并将记录标记为正在使用
【发布时间】:2015-01-20 14:18:44
【问题描述】:

因此,以下选择要使用的随机团队。选择后,我会在“已使用”字段中将此团队标记为“已使用”,稍后再进行更新查询。大多数情况下它都有效,但是在运行了几次之后,我开始得到重复的团队,即使它们被标记为 X。

我还缺少什么来完成这项工作?

SQL 语句如下:

SELECT TOP 1 RandomTeams.[Team Name], RandomTeams.Used
FROM RandomTeams
WHERE (((RandomTeams.Used) Is Null))
ORDER BY Rnd(TeamID);

这是我处理更新以将团队标记为已使用的方式,它按预期工作,用 X 标记时我没有问题:

Text214.Text 包含正在使用的团队名称

strTeam = (Chr(34) + Text214.Text + (Chr(34)))

strSQLUpdateTeams = "UPDATE RandomTeams SET Used = 'X' WHERE [Team Name] = " & strTeam

DoCmd.SetWarnings (WarningsOff)
DoCmd.RunSQL strSQLUpdateTeams

【问题讨论】:

  • RandomTeams 表中有重复项吗?如果您在同一个表中将Used 设置为'X',则此查询将不会返回这些值。
  • 您的程序是单线程/进程,还是可以有多个这样的查询并行运行?
  • @GordonLinoff 没有重复的团队,检查了几次,都是唯一的
  • @Mureinik 单线程,我通过 VBA 单独运行每个查询,一个用于选择随机团队,一个用于将团队标记为正在使用。一旦我弄清楚为什么重复团队不断出现,我最终会一起运行。
  • 我刚刚使用您的 SQL 进行了尝试,它运行良好 - 最终没有返回任何记录。这让我问您如何/何时设置“已使用”标志?在我的例子中,我有 10 个团队,每次运行查询时,我都会在 Used 字段中手动放置一个 X。

标签: sql ms-access random vba ms-access-2007


【解决方案1】:

作为测试,将以下代码放入模块中,然后执行它,看看会发生什么。顺便说一句,你如何重置[二手]?

    Sub Test_Teams()
    Dim strSQL      As String
    Dim strTeam     As String
    Dim strSQLUpdateTeams   As String
    Dim dbs         As DAO.Database
    Dim rs          As DAO.recordSet

    Set dbs = CurrentDb
    If MsgBox("Do you want to reset all 'Used' flags?", vbYesNo, "Reset?") = vbYes Then
        strSQL = "update RandomTeams set [Used] = null;"
        dbs.Execute strSQL

    End If
MyLoop:
    strSQL = "SELECT TOP 1 RandomTeams.[Team Name], RandomTeams.Used " & _
            "FROM RandomTeams " & _
            "WHERE (((RandomTeams.Used) Is Null)) " & _
            "ORDER BY Rnd(TeamID);"

    Set rs = dbs.OpenRecordset(strSQL)
    If Not rs.EOF Then
        strTeam = rs![Team Name]
        Debug.Print "Found Team: " & strTeam
    Else
        MsgBox "EOF! No more teams."
        rs.Close
        Set rs = Nothing
        dbs.Close
        Set dbs = Nothing
        Exit Sub
    End If
    strTeam = (Chr(34) + rs![Team Name] + (Chr(34)))
    rs.Close
    Set rs = Nothing

    strSQLUpdateTeams = "UPDATE RandomTeams SET [Used] = 'X' WHERE [Team Name] = " & strTeam
    Debug.Print strSQLUpdateTeams
    'DoCmd.SetWarnings (WarningsOff)
    'DoCmd.RunSQL strSQLUpdateTeams
    dbs.Execute strSQLUpdateTeams
    If dbs.RecordsAffected <> 1 Then
        MsgBox "Whoa! Not good! Update failed!"
    End If
    GoTo MyLoop


End Sub

【讨论】:

  • 我有一个查询来计算 X 的数量。如果等于团队总数,在这种情况下,团队总数为 30,则运行更新查询以使用空值填充该字段。
  • 好的,我试过了,它在整个表格中循环,并将每个团队标记为与 X 一起使用。
  • 由于我的代码是通过选择一个随机团队来工作的,然后标记为已使用,因此必须有一些其他代码或接口阻止你的工作。单用户? “使用”定义为“文本”类型?如果您的代码在表单中,您可以在表单打开时对团队进行计数,然后在每次选择或设置“已使用”后,再次计算记录,如果有差异,请停止代码,以便检查两次选择之间发生的情况.表中是否确实存在“重复的团队”,或者它们只是从您的查询中返回的?
  • 是的,单个用户,所有查询等都通过命令按钮在表单上控制。所以你的代码的结果是你所期望的吧?好吧,我猜它回到了第一格。
  • 我的代码所做的只是随机选择一条记录作为第 1 步,然后将该标志设置为“已使用”作为第 2 部分。我已经运行了很多次,它还没有失败,所以您的代码或处理流程中一定存在导致重复的内容。
猜你喜欢
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-31
相关资源
最近更新 更多