Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Ouverture recordset / begintrans / for

1 réponse
Avatar
Gérard
Bonjour =E0 tous,

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"

End Sub

1 réponse

Avatar
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