【问题标题】:Loop in an update SQL Server query sent by MS Access vba在 MS Access vba 发送的更新 SQL Server 查询中循环
【发布时间】:2020-09-17 06:43:19
【问题描述】:

我使用 MS Access vba 作为接口,使用 SQL Server 作为数据库服务器。

我想更新表CANDIDAT_TESTS 中的一组行。我现在正在做的是一个一个更新,我用一个for循环循环;它有效,但需要太多时间。

我想通过循环一个查询来减少查询次数。

我的代码:

This is the entire code

´´´ varSession = "2020" 设置 cnx = getConnectionBD(varSession)

rsSCE.Open "SELECT DISTINCT LIBELLE_DEPARTEMENT, LIBELLE_SOUS_CENTRE, NUM_SOUS_CENTRE " _
    & " FROM VIEW_CANDIDATS_SCE " _
    & " WHERE NUM_REGION = " & Me.LIST_REGION & " AND NUM_EXAMEN = " & Me.LIST_EXAMEN _
    & " ORDER BY LIBELLE_DEPARTEMENT, LIBELLE_SOUS_CENTRE", cnx, adOpenStatic, adLockOptimistic
varTabSCE = rsSCE.GetRows
'On initialise les jurys parce que les jurys sont par région
jury = 0

'On parcourt les sous-centres par départements
For j = 1 To rsSCE.RecordCount
    rsSerie.Open "SELECT DISTINCT NUM_SERIE, ABREVIATION_SERIE " _
        & " FROM VIEW_CANDIDATS_SCE " _
        & " WHERE NUM_SOUS_CENTRE = " & varTabSCE(2, j - 1) & " AND NUM_EXAMEN = " & Me.LIST_EXAMEN _
        & " ORDER BY ABREVIATION_SERIE", cnx, adOpenStatic, adLockOptimistic
    varTabSerie = rsSerie.GetRows

    'On parcourt les séries du sce j
    For k = 1 To rsSerie.RecordCount
        'on initialise le curseur à 0 étant donné que les numéros d'ordre sont par série
        cursor = 0
        rsCandidats.Open "SELECT ID FROM CANDIDAT_TESTS " _
            & " WHERE NUM_SOUS_CENTRE = " & varTabSCE(2, j - 1) & " AND NUM_SERIE = " & varTabSerie(0, k - 1) _
            & " ORDER BY NOMS, DATE_DE_NAISSANCE", cnx, adOpenStatic, adLockOptimistic
        varTabCandidats = rsCandidats.GetRows

        nbCanddidats = rsCandidats.RecordCount
        nbJurys = RoundUp(nbCanddidats / 250)

        'On parcourt les jurys de la série k du sce j
        numJury = nbJurys
        For l = 1 To nbJurys
            jury = jury + 1

            If numJury > 1 Then
                'On parcourt les candidats du jury l pour leur attribuer le numéro d'ordre et le jury
                For m = 250 * (l - 1) + 1 To 250 * (l - 1) + 250
                    cursor = cursor + 1
                    rsUpdate.Open "UPDATE CANDIDAT_TESTS " _
                        & " SET NUMERO_ORDRE = " & cursor & ", JURY = " & jury _
                        & " WHERE ID = " & varTabCandidats(0, m - 1), cnx, adOpenStatic, adLockOptimistic

                    Set rsUpdate = Nothing
                Next m
            ElseIf numJury = 1 Then
                'On parcourt les candidats du dernier jury pour leur attribuer le numéro d'ordre et le jury
                For m = 250 * (l - 1) + 1 To nbCanddidats
                    cursor = cursor + 1
                    rsUpdate.Open "UPDATE CANDIDAT_TESTS " _
                        & " SET NUMERO_ORDRE = " & cursor & ", JURY = " & jury _
                        & " WHERE ID = " & varTabCandidats(0, m - 1), cnx, adOpenStatic, adLockOptimistic

                    Set rsUpdate = Nothing
                Next m
            End If
            numJury = numJury - 1

        Next l

        Set rsCandidats = Nothing
        Set rsSerie = Nothing
    Next k

    Set rsSCE = Nothing
Next j ´´´

有什么方法可以将 for m 循环转换为单个查询?因为我又在循环这段代码了。

谢谢大家

【问题讨论】:

    标签: sql sql-server vba ms-access


    【解决方案1】:

    比起为循环的每次迭代重复执行一条 SQL 语句,迭代单个记录集并更新遇到的每条记录的值可能更有效,例如,使用 DAO:

    With CurrentDb.OpenRecordset _
        ( _
            "select numero_ordre from candidat_tests " & _
            "where id >= " & varTabCandidats(0, 250 * (l - 1)) & " and " & _
            "id <= " & varTabCandidats(0, 250 * (l - 1) + 249) & " " &  _
            "order by id"
        )
        If Not .EOF Then
            .MoveFirst
            cursor = 1
            Do Until .EOF
                .Edit
                !numero_ordre = cursor
                .Update
                .MoveNext
                cursor = cursor + 1
            Loop
        End If
        .Close
    End With
    

    在不知道varTabCandidats函数的情况下,上面显然是未经测试的。

    【讨论】:

    • varTabCandidats 是一个数组,包含从表 CANDIDAT_TESTS 中选择的 ID 列表
    • 可以,但我不知道如何让 Where 子句循环数据集 varTabCandidats。
    【解决方案2】:

    这就是我所做的:

    dim popjury as integer, jurynum as integer
    
    popjury=0
    jurynum=1
    Do Until rsCandidats.EOF
        cursor = cursor  + 1 
        popjury=popjury+1
        if popjury > 250 then
              popjury=1
              jurynum=jurynum+1
        end if
        rsCandidats.Edit
        rsCandidats!NUMERO_ORDRE = cursor
        rsCandidats!JURY = jurynum
        rsCandidats.Update
        rsCandidats.MoveNext
    Loop
    

    有效!谢谢大家。

    【讨论】:

      猜你喜欢
      • 2018-06-14
      • 2020-12-04
      • 1970-01-01
      • 2010-12-01
      • 2011-05-08
      • 1970-01-01
      • 2016-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多