Aide recordset Access - Maj...

chocoboevil Messages postés 13 Date d'inscription mardi 16 septembre 2003 Statut Membre Dernière intervention 9 mai 2007 - 24 avril 2007 à 14:14
cs_Nicko11 Messages postés 1141 Date d'inscription mercredi 7 mars 2007 Statut Membre Dernière intervention 19 septembre 2007 - 25 avril 2007 à 08:29
Bonjour a tous !!

Je me présente rapidement, je suis un etudiant en Stat (donc rien a voir avec la programmation) mais je suis en Stage et je fais plein de truc sur Access, et je suis un peu perdu mais je souhaite apprendre =)

Alors, en gros :
Nous importons un fichier texte sur access.Ce fichier texte est généré automatiquement par un logiciel propre a l'entreprise.Ensuite nous supprimons les ligne vides de chaque table car le fichier texte est fourni ainsi.
Ensuite, nous voulons mettre un champs vide, a chaque fois que l'inscription Non renseigné ou "." est présent.

Enfin, on creée une table finale reprenant toute les informations : Pour cela
On crée une table identique a une autres et aprés on fait les mise a jour par rapport aux autre table...
Voila en gros un exemple simplifié du code du formulaire avec dse anotation pour mieu expliqé

'Transfer du texte depuis les fichiers extractions
DoCmd.TransferText acImportDelim, "table1", "table1", RepExtract & "EXEMPLE.txt", True, ""
DoCmd.TransferText acImportDelim, "table1", "table1", RepExtract & "EXEMPLE2.txt", True, ""
DoCmd.TransferText acImportDelim, "table2", "table2", RepExtract & "EXEMPLE.txt", True, ""
DoCmd.TransferText acImportDelim, "table2", "table2", RepExtract & "EXEMPLE2.txt", True, ""
(sachant que nous avons environ une vingtaine de fichier exemple.txt sur chaque table.
Et qu'il faut recommencer une vingtaine de fois car il y a 20 table egalement.

'Suppression de la 1er ligne qui est vide
DoCmd.RunSQL "DELETE * FROM table1 WHERE [table1].[id] is Null;"
DoCmd.RunSQL "DELETE * FROM table2 WHERE [table2].[id] is Null;"
(effectuer 20fois car 20table)

'Requete de mise à jour : On scanne la base pour voir quel champs sont "non renseigné"
DoCmd.RunSQL "UPDATE table1 SET table1.[id] = Null WHERE (((table1.[id]) Like 'Non Spé*')) OR (((table1.[id])='.'));"
DoCmd.RunSQL "UPDATE table1 SET table1.[champ1] = Null WHERE (((table1.[champ1]) Like 'Non Spé*')) OR (((table1.[champ1])='.'));"
Sachant que l'on a environ 10champ et apés on recommence pour chaque table...

'Remplissement de la table TABLE FINALE a l'aide de la table1
DoCmd.RunSQL "INSERT INTO tablefinale ( id, champ1, champ2,...,champ10)" 
"SELECT table1.id, table1.champ1,table1.champ2,....table1.champ10 "FROM table1;"

'Mise a jour depuis toutes les tables (donc table2 juske table 20)DoCmd.RunSQL "UPDATE talefinale INNER JOIN table2 ON tablefinale.champ1 table2.champ1 SET tablefinale.champ1 table2!champ1.

Sachant que l'on fait sa pour tout les champs de toute les table....
Cela prend un temps dingue a s'éxécuter.Et on doit le faire chaque matin sur plusieurs base de donnée differentes...
Mon tuteur me dit que cela serait plus rapide si l'on intégré un RECORDSET pour les update. Quand penser vous ?. D'autre idée pour améliorer tout cela?

Malheuresement je ne sais vrmt pas comment m'y prendre pour le recordset.J'ai cherche plen d'info sur comment faire mais je n'y arrive vraiment pas...

Pourriez vous m'aider please :)  Je ne demande absolument pas qu'on me balance un code tout fait, je veux comprendre pour savoir le refaire. Et pis c'est mon 1er stage soyez indulgent avec mon niveau ^^

Voila merci d'avance de vos reponses:)
Gregory

7 réponses

cs_Nicko11 Messages postés 1141 Date d'inscription mercredi 7 mars 2007 Statut Membre Dernière intervention 19 septembre 2007 3
24 avril 2007 à 15:16
Salut,

etant donné le nombre de reponse, je pense que tu devrais décomposer ton pb en plusieurs partie.

Quelle est ta premiere exigence?

Pour les recordset, je suis sur que si tu cherches un peu dans le forum, tu trouveras comment se connecter à une base et recuperer un jeu d'enregistrements (recordset), il y a des demandes plusieurs fois par jours.

 
0
chocoboevil Messages postés 13 Date d'inscription mardi 16 septembre 2003 Statut Membre Dernière intervention 9 mai 2007
24 avril 2007 à 16:53
Merci de ta reponse :)

En fait je n'ai pas vrmt d'exigence particulière.On désire juste trouver une maniere d'accélérer tous ces traitements.

Le fait de tout transposé en recordset serai t'il plus rapide que comment on procéde actuellement ?

Pour le recordset je doi procéder ainsi :

Dim MaTable As Recordset
Set MaTable= CurrentDB.OpenRecordset("CONTRAT")
Do Until MaTable.EOF = True

If MaTable("Champ1") = "Non renseigné" or "." Then
MaTable.Edit
MaTable("champ1") = ""
MaTable.UPDATE
End If

If MaTable("Champ2") = "Non renseigné" or "." Then
MaTable.Edit
MaTable("champ2") = ""
MaTable.UPDATE
End If

...
je fais cela pour tout les champs de ma 1ere table
...
MaTable.MoveNext
Loop
MaTable.Close

Je re cré un nouveau recordset pour chaque nouvelle table
Et ensuite je recommence pour toutes mes tables?

Merci =)
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
24 avril 2007 à 17:51
Bonjour,
je ne pense pas qu' un recordset serait plus rapide qu' une transaction...


Voici ma proposition
Supposons que tu as 20 champ, et que tu veux tous les mettre à jour si ...


For i= 1 to 20
  CurrentDB.Execute "UPDATE talefinale SET Champ" & _
  i & "=' ' WHERE Champ" & i & "='non renseigné' OR Champ" & i & "='.' ;"
Next


Avec un recordset tu dois faire un test pour chaque champ + un Edit si...
De plus t' as omis un paramètre pour le recordset
Set MaTable= CurrentDB.OpenRecordset("CONTRAT",dbOpenDynaset)
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
24 avril 2007 à 18:43
Encore plus ...
Sachant qu' une BD est une collection de tables
Et qu' une table est une collection de champs




Dim tbl As TableDef 
Dim Fld As Field
Dim CountTbl As Integer
Dim CountFld As Integer
Dim i As integer , j As Integer




CountTbl =CurrentDB.TableDefs.Count   ' nombre de tables dans la BD


For i=0 To CountTbl-1
 Set tbl=CurrentDB.TableDefs(i)
 CountFld=tbl.Fields.Count    ' nombre de champs d' une table
 For j= 0 To CountField -1
   CurrentDB.Execute "UPDATE " & tbl & " SET " & tbl & ".Fields(" & _
   j & ")=Null WHERE " tbl & ".Fields(" & j & ")='non renseigné' OR " _
   & tbl & ".Fields(" & j & ")='.' ;"
 Next j
Next i
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
chocoboevil Messages postés 13 Date d'inscription mardi 16 septembre 2003 Statut Membre Dernière intervention 9 mai 2007
24 avril 2007 à 20:26
Wouha vraiment géant :)
Je suis chez moi mais j'essai dés demain votre solution.
Par contre en terme d'execution , c'est plus rapide d'executer une boucle ou tout les fichiers un par un ou cela revient strictement au même ?
Merci encore
Gregory
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
24 avril 2007 à 22:34
Je peux pas être catégorique en ce qui concerne
le temps d' éxécution,mais je pense qu' il n' y aura
pas une grande différence.
L' essentiel dans un premier temps est d' optimiser le code.
C' est vrai qu' on peux y aller table par table.Celà nous permetterait
peut être de choisir certaines tables et d' éxclure d' autres.

Par exemple: (et j' en profite pour corriger une erreur de synthaxe)


Set tbl= CurrentDB.TableDefs("table1")
 CountFld=tbl.Fields.Count    ' nombre de champs d' une table
 For j= 0 To CountField -1
   CurrentDB.Execute "UPDATE ' " & tbl & "' SET '" & tbl & "'.Fields(" & _
   j & ") =Null WHERE '" tbl & "'.Fields(" & j & ")= 'non renseigné' OR ' " _
   & tbl & "'.Fields(" & j & ") ='.' ;"
 Next j


Set tbl=CurrentDB.TableDefs("table2")
 CountFld=tbl.Fields.Count    ' nombre de champs d' une table
 For j= 0 To CountField -1
   CurrentDB.Execute "UPDATE '" & tbl & "' SET '" & tbl & "'.Fields(" & _
   j & ")=Null WHERE '" tbl & "'.Fields(" & j & ")='non renseigné' OR '" _
   & tbl & "'.Fields(" & j & ")='.' ;"
 Next j


Set tbl=CurrentDB.TableDefs("table3")
 CountFld=tbl.Fields.Count    ' nombre de champs d' une table
 For j= 0 To CountField -1
   CurrentDB.Execute "UPDATE '" & tbl & "' SET '" & tbl & "'.Fields(" & _
   j & ")=Null WHERE '" tbl & "'.Fields(" & j & ")='non renseigné' OR '" _
   & tbl & "'.Fields(" & j & ")='.' ;"
 Next j

a+
0
cs_Nicko11 Messages postés 1141 Date d'inscription mercredi 7 mars 2007 Statut Membre Dernière intervention 19 septembre 2007 3
25 avril 2007 à 08:29
"Sachant que l'on fait sa pour tout les champs de toute les table....
Cela prend un temps dingue a s'éxécuter.Et on doit le faire chaque matin sur plusieurs base de donnée differentes..."

Salut, ce qui serait bien, ce serait de référencer un dossier ou serait contenu toutes les BASES ou si elles ne sont pas ou meme endroits de référencer tous les chemins des bases pour tout automatiser. Bien sur, cela implique que les bases ne changes pas de places tous les jours.

C'est une proposition pour vraiment que tu puisses tous les matins faire tout ca en UN click.

Une dernière chose, si tu veux etre sur de ce que dis chaibat05, utilise un timer qui demarrage au debut du traitement et qui a la fin affiche dans un msgbox le temps mis pour effectuer le traitement. Au moins tu sauras si tu optimise ton code ou pas.

A+
0
Rejoignez-nous