Insert dans ACCESS trop lent! URGENT!!!

slayeraix Messages postés 31 Date d'inscription vendredi 19 juillet 2002 Statut Membre Dernière intervention 25 novembre 2003 - 18 oct. 2002 à 11:05
cs_6Po Messages postés 105 Date d'inscription jeudi 16 mai 2002 Statut Membre Dernière intervention 22 janvier 2009 - 5 nov. 2002 à 20:41
J ai un problème,

j ai une procédure (remplir_liste) qui doit me remplir une table (TEMPORAIRE dans ma base ACCESS) en faisant un INSERT avec des requetes imbirqués.

J ai une autre procédure (transac_ click) qui elle, doit tout d abord appelé la précédente procédure (remplir_liste) et doit m afficher ensuite à l aide d un recordset (rs8) les champs que j ai rempli dans la table (TEMPORAIRE dans ma base ACCESS).

Mais à chaque fois ça me fait une erreur car il veut m afficher le contenu de ma table alors qu il n y a rien dans celle ci du fait que l INSERT sous ACCESS met un certain temps, trop long.

Quelqu un serait t il comment faire dans ma procédure (transac_click) pour dire que tant que ma procédure (remplir_liste) n est pas finie ou plutot tant que mon INSERT sous ACCESS n est pas fini (c plutot ca le probleme) il doit attendre pour executer mon recordset (rs8) afin d afficher le contenu de la table (TEMPORAIRE sous ACCESS), et à quel niveau le mettre dans mon code de la procédure transac_click??????????????

Ou une autre solution serait de mettre un timer mais vu que l INSERT varie en temps selon le traitement qu il effectue le timer risque d etre trop court ou trop long selon le traitement.

Je met mon code pour que ce soit plus compréhensible :

Public Sub remplir_liste()
Dim requete, requete1, requete_insertion As String
Dim liste As Variant
Dim MaBase As Database
Dim rs As Recordset

'Ouverture et definition de la base.
Set MaBase = DBEngine.Workspaces(0).OpenDatabase(nom_base)

MaBase.Execute "DELETE * FROM TEMPORAIRE"

requete = "SELECT NEXT_PROG_NAME FROM NEXT WHERE PROG_NAME='" & progname.Text & "'"

Set rs = MaBase.OpenRecordset(requete)

If Not rs.EOF Then
MaBase.Execute "INSERT INTO TEMPORAIRE SELECT PROG_NAME, NEXT_PROG_NAME FROM NEXT WHERE PROG_NAME='" & progname.Text & "'"
requete1 = "SELECT NEXT_PROG_NAME FROM NEXT WHERE PROG_NAME IN (" & requete & ")"

Set rs = MaBase.OpenRecordset(requete)

Do Until rs.EOF
requete_insertion = "INSERT INTO TEMPORAIRE SELECT PROG_NAME, NEXT_PROG_NAME FROM NEXT WHERE PROG_NAME IN (" & requete & ") AND PROG_NAME NOT IN (SELECT PROG_NAME FROM TEMPORAIRE)"

MaBase.Execute requete_insertion

requete = "SELECT NEXT_PROG_NAME FROM NEXT WHERE PROG_NAME IN (" & requete & ")"

requete1 = "SELECT NEXT_PROG_NAME FROM NEXT WHERE PROG_NAME IN (" & requete & ") AND PROG_NAME NOT IN (SELECT PROG_NAME FROM TEMPORAIRE)"

Set rs = MaBase.OpenRecordset(requete1)

Loop

End If

End Sub

__________________________________________

Private Sub transacname_click()

Dim rs1 As Recordset, rs2 As Recordset, rs3 As Recordset, rs4 As Recordset, rs5 As Recordset, rs6 As Recordset, rs7 As Recordset 'recordset servant a recuperer les informations de la bdd.
Dim MaBase As Database 'variable de type base de donnees.
Dim s1 As String, s2 As String, s3 As String, s4 As String, s5 As String, s6 As String, s7 As String 'variables de mise en forme des requetes.
Dim sNomTransaction As String, sNomProgram As String 'variable de recuperation de la valeur de transacname.
Dim i As Integer
Dim b2 As Boolean
Dim nom As String
Dim Proglist_txt As String
Dim rs8 As Recordset
Dim s8 As String

libdescrip.Text = ""
libcusto = 0

'Recuperation du nom de la transaction.
sNomTransaction = transacname.Text

'Recuperation du nom du programme.
sNomProgram = progname.Text

'Connection a la base.
Set MaBase = DBEngine.Workspaces(0).OpenDatabase(nom_base)

'Preparation de la requete qui sert a remplir la ListBox TransacDescrip.
s1 = "SELECT TRANSACTION.TRANSAC_DESCRIP FROM TRANSACTION WHERE TRANSAC_NAME='" & sNomTransaction & "'"

'Preparation de la requete qui sert a remplir la ListBox ScreenName.
s2 = "SELECT SCREENS.LIB_NAME FROM SCREENS WHERE SCREENS.TRANSAC_NAME='" & sNomTransaction & "'"

'Preparation de la requete qui sert a remplir la ListBox ModuleName.
s3 = "SELECT TO_BE_PART.MODULE_NAME FROM TO_BE_PART WHERE TO_BE_PART.TRANSAC_NAME='" & sNomTransaction & "'"

'Preparation de la requete qui sert a remplir la ListBox ProgName.
s4 = "SELECT TRANSACTION.PROG_NAME FROM TRANSACTION WHERE TRANSACTION.TRANSAC_NAME='" & sNomTransaction & "'"

'Preparation de la requete qui sert a remplir la ListBox ProgType.
s5 = "SELECT PROGRAM.PROG_TYPE FROM PROGRAM WHERE PROGRAM.PROG_NAME='" & sNomProgram & "'"

'Preparation de la requete qui sert a remplir le TextBox ProgDescrip.
s6 = "SELECT PROGRAM.PROG_DESCRIP FROM PROGRAM WHERE PROGRAM.PROG_NAME='" & sNomProgram & "'"

'Preparation de la requete qui sert a remplir le CheckBox ProgCusto.
s7 = "SELECT PROGRAM.PROG_CUSTO FROM PROGRAM WHERE PROGRAM.PROG_NAME='" & sNomProgram & "'"

s8 = "SELECT TEMPORAIRE.PROG_NAME, TEMPORAIRE.NEXT_PROG_NAME FROM TEMPORAIRE"

'Ouverture et definition des recordsets.
Set rs1 = MaBase.OpenRecordset(s1)
Set rs2 = MaBase.OpenRecordset(s2)
Set rs3 = MaBase.OpenRecordset(s3)
Set rs4 = MaBase.OpenRecordset(s4)
Set rs5 = MaBase.OpenRecordset(s5)
Set rs6 = MaBase.OpenRecordset(s6)
Set rs7 = MaBase.OpenRecordset(s7)
Set rs8 = MaBase.OpenRecordset(s8)

'Vidage des listboxs.
transaccorresp.Clear
transacdescrip.Clear
screenname.Clear
modulename.Clear
progtype.Clear
progcusto = 0
moduledescrip.Clear
libname.Clear
libtype.Clear
proglist.Clear

'Remplissage des listboxs.
While Not rs1.EOF
transacdescrip.AddItem rs1.Fields("TRANSAC_DESCRIP").Value
rs1.MoveNext
Wend

While Not rs2.EOF
screenname.AddItem rs2.Fields("LIB_NAME").Value
rs2.MoveNext
Wend

While Not rs3.EOF
modulename.AddItem rs3.Fields("MODULE_NAME").Value
rs3.MoveNext
Wend

'Remplissage du TextBox progname
Set rs4 = MaBase.OpenRecordset(s4)
If rs4.RecordCount <> 0 Then
progname.Text = NullToVide(rs4.Fields("PROG_NAME").Value)
progname.Refresh
Else
progname.Text = ""
progname.Refresh
End If

While Not rs5.EOF
'nom = progname.Container

'nom.AddItem rs5.Fields("PROG_TYPE").Value
rs5.MoveNext
Wend

'Appel de la procédure remplir_liste permettant de remplir la table TEMPORAIRE sous ACCESS

remplir_liste

'Remplissage du TextBox progdescrip
If rs6.RecordCount <> 0 Then
progdescrip.Text = NullToVide(rs6.Fields("PROG_DESCRIP").Value)
progdescrip.Refresh
Else
progdescrip.Text = ""
progdescrip.Refresh
End If

'Remplissage du CheckBox progcusto
With rs7
If .RecordCount > 0 Then
For i = 1 To .RecordCount
b2 = NullToVide(.Fields("PROG_CUSTO").Value)
If b2 = True Then
progcusto = 1
Else
progcusto = 0
End If

.MoveNext
Next i
End If
End With

'-------------------------------------------------------------------------------
'Permet de remplir le listbox proglist en 2 colonnes avec les 2 champs de la table TEMPORAIRE
While Not rs8.EOF
Proglist_txt = rs8.Fields("PROG_NAME").Value & " | " & rs8.Fields("NEXT_PROG_NAME").Value
proglist.AddItem Proglist_txt
rs8.MoveNext
Wend
'-----------------------------------------------------------

'Fermeture des recordsets.
rs1.Close
rs2.Close
rs3.Close
rs4.Close
rs5.Close
rs6.Close
rs7.Close
rs8.Close

'Liberation des recordsets.
Set rs1 = Nothing
Set rs2 = Nothing
Set rs3 = Nothing
Set rs4 = Nothing
Set rs5 = Nothing
Set rs6 = Nothing
Set rs7 = Nothing
Set rs8 = Nothing

'Liberation de la base de donnees.
Set MaBase = Nothing

End Sub

Quelqu un pourrait t il donc me dire comment faire et où le mettre dans mon code de la procédure transac_click?

merci d avance!!

Laurent
A voir également:

1 réponse

cs_6Po Messages postés 105 Date d'inscription jeudi 16 mai 2002 Statut Membre Dernière intervention 22 janvier 2009
5 nov. 2002 à 20:41
T'as essayer de mettre un DOEVENT ?
Pour laisse respirer le system ?

par contre il doit y avoir un autre moyen pour faire ta cuisine... et des variable stile B2 donne pas vraiement de visiblité au code :D

==============
6Po

DreamersTeam HomePage
[mailto:6po@dreamersteam.org Email]
0
Rejoignez-nous