我使用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循环转换成一个查询?因为我又在循环这段代码。
多亏了你们
2条答案
按热度按时间amrnrhlw1#
与为循环的每次迭代重复执行sql语句不同,在单个记录集上进行迭代并更新遇到的每个记录的值(例如,使用dao:
不知道
varTabCandidats
上述功能显然未经测试。brvekthn2#
我就是这么做的:
真管用!多亏了你们。