Comment faire une boucle dans un update (SQL Server) depuis Access VBA
Résolu
V1ck1ng
-
V1ck1ng -
V1ck1ng -
Bonjour à tous,
J'utilise MS Access comme interface utilisateur, j'accède au serveur de données Server SQL via VBA.
Je souhaite mettre à jour un ensemble de lignes dans une table CANDIDAT_TESTS. Ce que je fais actuellement est de mettre à jour une par une et je boucle avec un for; cela fonctionne, mais ça prend trop de temps. J'aimerais donc réduire le temps d'exécution en faisant une boucle dans ma requête.
Ci-dessous mon code VBA
varSession = "2020"
Set 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
J'utilise MS Access comme interface utilisateur, j'accède au serveur de données Server SQL via VBA.
Je souhaite mettre à jour un ensemble de lignes dans une table CANDIDAT_TESTS. Ce que je fais actuellement est de mettre à jour une par une et je boucle avec un for; cela fonctionne, mais ça prend trop de temps. J'aimerais donc réduire le temps d'exécution en faisant une boucle dans ma requête.
Ci-dessous mon code VBA
varSession = "2020"
Set 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
A voir également:
- Comment faire une boucle dans un update (SQL Server) depuis Access VBA
- Windows update bloqué - Guide
- Cybera server - Télécharger - Divers Réseau & Wi-Fi
- Winget update - Guide
- Asus live update - Télécharger - Utilitaires
- Ps3 media server - Télécharger - Divers Réseau & Wi-Fi
2 réponses
bonjour, peux-tu utiliser les balises de code quand tu partages du code?
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
V1ck1ng
Erreur de débutant, j'ai pris note, merci
je ne sais pas ce que tu penses en écrivant "en faisant une boucle dans ma requête".
ce que tu peux faire, par exemple, c'est ceci, à partir du recordset rsCandidats:
ce que tu peux faire, par exemple, c'est ceci, à partir du recordset rsCandidats:
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
Déjà merci pour ton intervention, j'entends par là la possibilité de faire un update de plusieurs candidats à la fois au lieu de faire une requête à la fois et la répéter tel que c'est fait dans mon code.
Plus concrètement, disons que
- De 1 à 250 : NUMERO_ORDRE de 1 à 250 et
- De 250 à 500 : NUMERO_ORDRE de 1 à 250 et
- De 501 à 600 : NUMERO_ORDRE de 1 à 100 et
J'aimerais donc ne pouvoir faire que 3 requêtes pour chacun de ces cas, ce de façon générique, étant donné que le nombre d'enregistrements de
Merci.
rsCandidatscontient n enregistrements, je dois faire un update de ces candidats mais en bloc de 250. Du 1er au 250ème enrégistrement, NUMERO_ORDRE va aller de 1 à 250 et c'est un numéro de jury; du 251ème au 500ème NUMERO_ORDRE va de 1 à 250 et le numéro de jury incrémente, ainsi de suite.
Plus concrètement, disons que
rsCandidatsa 600 lignes :
- De 1 à 250 : NUMERO_ORDRE de 1 à 250 et
JURY = JURY + 1;
- De 250 à 500 : NUMERO_ORDRE de 1 à 250 et
JURY = JURY + 1;
- De 501 à 600 : NUMERO_ORDRE de 1 à 100 et
JURY = JURY + 1.
J'aimerais donc ne pouvoir faire que 3 requêtes pour chacun de ces cas, ce de façon générique, étant donné que le nombre d'enregistrements de
rsCandidatsvarie.
Merci.