Pouvez-vous m'aider sur le point suivant :
- sous Access 2.0
- est-il important qu'un recordset soit ouvert hors ou=20
sous la transaction dans laquelle il est utilis=E9 ?
- est-il important d'ouvrir la transaction hors ou =E0=20
l'int=E9rieur d'une boucle (max 100 it=E9rations)
- en conclusion, dans l'exemple ci-dessous, quel est=20
l'ordre pr=E9f=E9rable 1, 2 ou 3 ?
- la dur=E9e d'ex=E9cution est approximativement identique
Merci d'avance pour votre aide
Sub ATestBasic_Click ()
Dim l0 As Long
Dim DB As Database
Dim WS As WorkSpace
Dim RS1 As Recordset
Set WS =3D dbengine.workspaces(0)
Set DB =3D WS.databases(0)
'---------------------------------------------------------
'Ordre 1 : begin/set/for
WS.BeginTrans
Set RS1 =3D DB.OpenRecordset("T_RBalOuvC", DB_OPEN_DYNASET)
For l0 =3D 1 To 2000
=20
RS1.AddNew
RS1.test =3D l0
RS1.Update
=20
Next
RS1.Close
WS.CommitTrans
'---------------------------------------------------------
'Ordre 2 : set/begin/for
Set RS1 =3D DB.OpenRecordset("T_RBalOuvC", DB_OPEN_DYNASET)
WS.BeginTrans
For l0 =3D 1 To 2000
=20
RS1.AddNew
RS1.test =3D l0
RS1.Update
=20
Next
WS.CommitTrans
RS1.Close
'---------------------------------------------------------
'Ordre 3 : set/for/begin
Set RS1 =3D DB.OpenRecordset("T_RBalOuvC", DB_OPEN_DYNASET)
For l0 =3D 1 To 2000
WS.BeginTrans
=20
RS1.AddNew
RS1.test =3D l0
RS1.Update
=20
WS.CommitTrans
Next
RS1.Close
'---------------------------------------------------------
-
MsgBox "TERMINE"
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Michel Walsh
Salut,
Je préfèrerais, comme premier choix, procéder sans l'internédiaire d'aucun recordset (code non testé, seulement pour illustration):
Sub ....
...
WS.BeginTrans OnError GoTo RollBack
For i0= ... to ... BD.Execute "INSERT INTO T_RBalOuvC(test) VALUES(" & i0 & ")" , dbFailOnError Next i0 WS.CommitTrans Goto Finir
RollBack: WS.RollBack
Finir: OnError Goto 0
End Sub
De plus, je ne suis pas certain que l'utilisation de transaction soit souhaitable, mais cela peut l'être, sous Access 2.0, en milieu de plusieurs utilisateurs effectuant simultanément des insertions, pour fins de rapidité d'exécution... je ne saurais dire, donc, encore moins suggérer. Il se peut aussi que la version de JET qui vient avec Access 2.0 ne supporte pas l' énoncé SQL:
INSERT INTO nomDeTable(listeDeChamps) VALUES(listeDeValeurs)
Espérant être utile, Vanderghast, Access MVP
"Gérard" wrote in message news:1a3e301c44e33$0b2e9f80$ Bonjour à tous,
Pouvez-vous m'aider sur le point suivant : - sous Access 2.0 - est-il important qu'un recordset soit ouvert hors ou sous la transaction dans laquelle il est utilisé ? - est-il important d'ouvrir la transaction hors ou à l'intérieur d'une boucle (max 100 itérations) - en conclusion, dans l'exemple ci-dessous, quel est l'ordre préférable 1, 2 ou 3 ? - la durée d'exécution est approximativement identique
Merci d'avance pour votre aide
Sub ATestBasic_Click ()
Dim l0 As Long
Dim DB As Database Dim WS As WorkSpace Dim RS1 As Recordset
Set WS = dbengine.workspaces(0) Set DB = WS.databases(0) '--------------------------------------------------------- 'Ordre 1 : begin/set/for
WS.BeginTrans Set RS1 = DB.OpenRecordset("T_RBalOuvC", DB_OPEN_DYNASET) For l0 = 1 To 2000
RS1.AddNew RS1.test = l0 RS1.Update
Next RS1.Close WS.CommitTrans '--------------------------------------------------------- 'Ordre 2 : set/begin/for
Set RS1 = DB.OpenRecordset("T_RBalOuvC", DB_OPEN_DYNASET) WS.BeginTrans For l0 = 1 To 2000
RS1.AddNew RS1.test = l0 RS1.Update
Next WS.CommitTrans RS1.Close '--------------------------------------------------------- 'Ordre 3 : set/for/begin
Set RS1 = DB.OpenRecordset("T_RBalOuvC", DB_OPEN_DYNASET) For l0 = 1 To 2000 WS.BeginTrans
RS1.AddNew RS1.test = l0 RS1.Update
WS.CommitTrans Next RS1.Close '--------------------------------------------------------- - MsgBox "TERMINE"
End Sub
Salut,
Je préfèrerais, comme premier choix, procéder sans l'internédiaire
d'aucun recordset (code non testé, seulement pour illustration):
Sub ....
...
WS.BeginTrans
OnError GoTo RollBack
For i0= ... to ...
BD.Execute "INSERT INTO T_RBalOuvC(test) VALUES(" & i0 & ")" ,
dbFailOnError
Next i0
WS.CommitTrans
Goto Finir
RollBack:
WS.RollBack
Finir:
OnError Goto 0
End Sub
De plus, je ne suis pas certain que l'utilisation de transaction soit
souhaitable, mais cela peut l'être, sous Access 2.0, en milieu de plusieurs
utilisateurs effectuant simultanément des insertions, pour fins de rapidité
d'exécution... je ne saurais dire, donc, encore moins suggérer. Il se peut
aussi que la version de JET qui vient avec Access 2.0 ne supporte pas l'
énoncé SQL:
INSERT INTO nomDeTable(listeDeChamps) VALUES(listeDeValeurs)
Espérant être utile,
Vanderghast, Access MVP
"Gérard" <anonymous@discussions.microsoft.com> wrote in message
news:1a3e301c44e33$0b2e9f80$a401280a@phx.gbl...
Bonjour à tous,
Pouvez-vous m'aider sur le point suivant :
- sous Access 2.0
- est-il important qu'un recordset soit ouvert hors ou
sous la transaction dans laquelle il est utilisé ?
- est-il important d'ouvrir la transaction hors ou à
l'intérieur d'une boucle (max 100 itérations)
- en conclusion, dans l'exemple ci-dessous, quel est
l'ordre préférable 1, 2 ou 3 ?
- la durée d'exécution est approximativement identique
Merci d'avance pour votre aide
Sub ATestBasic_Click ()
Dim l0 As Long
Dim DB As Database
Dim WS As WorkSpace
Dim RS1 As Recordset
Set WS = dbengine.workspaces(0)
Set DB = WS.databases(0)
'---------------------------------------------------------
'Ordre 1 : begin/set/for
WS.BeginTrans
Set RS1 = DB.OpenRecordset("T_RBalOuvC", DB_OPEN_DYNASET)
For l0 = 1 To 2000
RS1.AddNew
RS1.test = l0
RS1.Update
Next
RS1.Close
WS.CommitTrans
'---------------------------------------------------------
'Ordre 2 : set/begin/for
Set RS1 = DB.OpenRecordset("T_RBalOuvC", DB_OPEN_DYNASET)
WS.BeginTrans
For l0 = 1 To 2000
RS1.AddNew
RS1.test = l0
RS1.Update
Next
WS.CommitTrans
RS1.Close
'---------------------------------------------------------
'Ordre 3 : set/for/begin
Set RS1 = DB.OpenRecordset("T_RBalOuvC", DB_OPEN_DYNASET)
For l0 = 1 To 2000
WS.BeginTrans
RS1.AddNew
RS1.test = l0
RS1.Update
WS.CommitTrans
Next
RS1.Close
'---------------------------------------------------------
-
MsgBox "TERMINE"
Je préfèrerais, comme premier choix, procéder sans l'internédiaire d'aucun recordset (code non testé, seulement pour illustration):
Sub ....
...
WS.BeginTrans OnError GoTo RollBack
For i0= ... to ... BD.Execute "INSERT INTO T_RBalOuvC(test) VALUES(" & i0 & ")" , dbFailOnError Next i0 WS.CommitTrans Goto Finir
RollBack: WS.RollBack
Finir: OnError Goto 0
End Sub
De plus, je ne suis pas certain que l'utilisation de transaction soit souhaitable, mais cela peut l'être, sous Access 2.0, en milieu de plusieurs utilisateurs effectuant simultanément des insertions, pour fins de rapidité d'exécution... je ne saurais dire, donc, encore moins suggérer. Il se peut aussi que la version de JET qui vient avec Access 2.0 ne supporte pas l' énoncé SQL:
INSERT INTO nomDeTable(listeDeChamps) VALUES(listeDeValeurs)
Espérant être utile, Vanderghast, Access MVP
"Gérard" wrote in message news:1a3e301c44e33$0b2e9f80$ Bonjour à tous,
Pouvez-vous m'aider sur le point suivant : - sous Access 2.0 - est-il important qu'un recordset soit ouvert hors ou sous la transaction dans laquelle il est utilisé ? - est-il important d'ouvrir la transaction hors ou à l'intérieur d'une boucle (max 100 itérations) - en conclusion, dans l'exemple ci-dessous, quel est l'ordre préférable 1, 2 ou 3 ? - la durée d'exécution est approximativement identique
Merci d'avance pour votre aide
Sub ATestBasic_Click ()
Dim l0 As Long
Dim DB As Database Dim WS As WorkSpace Dim RS1 As Recordset
Set WS = dbengine.workspaces(0) Set DB = WS.databases(0) '--------------------------------------------------------- 'Ordre 1 : begin/set/for
WS.BeginTrans Set RS1 = DB.OpenRecordset("T_RBalOuvC", DB_OPEN_DYNASET) For l0 = 1 To 2000
RS1.AddNew RS1.test = l0 RS1.Update
Next RS1.Close WS.CommitTrans '--------------------------------------------------------- 'Ordre 2 : set/begin/for
Set RS1 = DB.OpenRecordset("T_RBalOuvC", DB_OPEN_DYNASET) WS.BeginTrans For l0 = 1 To 2000
RS1.AddNew RS1.test = l0 RS1.Update
Next WS.CommitTrans RS1.Close '--------------------------------------------------------- 'Ordre 3 : set/for/begin
Set RS1 = DB.OpenRecordset("T_RBalOuvC", DB_OPEN_DYNASET) For l0 = 1 To 2000 WS.BeginTrans
RS1.AddNew RS1.test = l0 RS1.Update
WS.CommitTrans Next RS1.Close '--------------------------------------------------------- - MsgBox "TERMINE"