MS Access vba发送的更新SQL Server查询中的循环

问题描述 投票:0回答:1

我使用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 access-vba
1个回答
0
投票

而不是对循环的每次迭代重复执行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函数的情况下,显然没有经过测试。

© www.soinside.com 2019 - 2024. All rights reserved.