在ms access vba发送的更新sql server查询中循环

nqwrtyyt  于 2021-08-13  发布在  Java
关注(0)|答案(2)|浏览(471)

我使用msaccessvba作为接口,sqlserver作为数据库服务器。
我想更新表中的一组行 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循环转换成一个查询?因为我又在循环这段代码。
多亏了你们

amrnrhlw

amrnrhlw1#

与为循环的每次迭代重复执行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 上述功能显然未经测试。

brvekthn

brvekthn2#

我就是这么做的:

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

真管用!多亏了你们。

相关问题