Base de données Access

Base de données Access - Logiciels - Windows & Software

Marsh Posté le 26-01-2006 à 16:32:40    

Bonjour,
 
Je débute avec l'utilisation de Access. J'ai une base (1seule table) importante de données à traiter (1million de lignes, 15champs).
Je souhaite faire la différence entre deux lignes de ma base et, suivant le résultat, fusionner les lignes.
Exemple :  
Ligne     Début    Fin      Nb jours
1           15/01   18/01     3
2           19/01    24/01    6
 
Si 19/01-18/01=1 alors je souhaite obtenir une seule ligne :
Ligne     Début    Fin      Nb jours
1          15/01    24/01     9
 
Je n'ai trouvé dans aucun bouquin ce genre de requêtes. Est-il possible de le faire sous Access, si oui par quel moyen?
 
Je vous remercie par avance de vos réponses

Reply

Marsh Posté le 26-01-2006 à 16:32:40   

Reply

Marsh Posté le 26-01-2006 à 16:58:34    

Salut,
 
Directement avec une requête Access, je ne vois pas de possibilité.
En revanche, avec un code VBA, ça doit être possible :
 

  • Lecture de la table,
  • si l'enregistrement remplit la condition,
  • fusionner l'enregistrement avec le précédent,
  • Ecrire le nouvel enregistrement dans une nouvelle table,
  • sinon
  • Ecrire l'enregistrement dans la nouvelle table,
  • Passer à l'enregistrement suivant.


As-tu une expérience VBA ?
 
A+
Horatio
 
 
 

Reply

Marsh Posté le 26-01-2006 à 17:02:53    

Oui, j'ai fait du VBA mais que pour Excel.
J'avais fait la programmation sous Excel mais je n'ai pas pu continuer en raison la taille de ma base.
La programmation est-elle identique entre Excel et Access?

Reply

Marsh Posté le 26-01-2006 à 17:15:19    

Re,
 
Fondamentalement, c'est le même langage VB mais pour chaque logiciel de la suite Office, VBA propose des objets spécifiques.
Par exemple Range est l'objet VBA-Excel qui correspond à une cellule ou une plage de cellule.
L'équivalent VBA-Access serait l'objet Recordset, représentatif d'un ou plusieurs enregistrements.
 
J'espère que cet indice pourra t'aider.
A+
Horatio

Reply

Marsh Posté le 28-01-2006 à 16:18:08    

Je n'arrive pas à trouver l'équivalent dans VBA-Access de la formulation VBA-Excel:
 
If Cells (i+1,2)-Cells(i,1)=1 Then
Cells(i,2)=Cells(i+1,2)
Cells(i+1,2).EntireRow.Delete
End If

 
Savez-vous s'il est possible d'écrire ce genre de subroutine en Access?
 
Merci pour votre aide!

Reply

Marsh Posté le 29-01-2006 à 21:05:22    

Salut,
 
Oui, c'est possible. Mais pour un début en Access-VBA, tu places la barre très haut !
 
Voici à quoi ressemblerait le code correspondant à ta moulinette :
 


Public Sub test_Lecture()
'Cocher la référence "Microsoft DAO 3.51 Object Library"
'Avant de lancer cette procédure, il faut disposer d'une
'table "DonnéesBrutes" et d'une table "DonnéesCorrigées",
'copie de la précédente mais sans aucun enregistrement.
'Pour ces 2 tables, la structure est la suivante :
'Ligne - Entier long
'Début - Date/heure
'Fin - Date/heure
'Jours - Entier long
'*******************************************************
Dim Db As DAO.Database
Dim tbl1 As DAO.TableDef
Dim tbl2 As DAO.TableDef
Dim DateD As Date, DateF As Date
Dim nbJours As Long, NumLigne As Long
Dim RS1 As DAO.Recordset
Dim RS2 As DAO.Recordset
 
Set Db = CurrentDb
'Ouverture des tables
Set tbl1 = Db.TableDefs("DonnéesBrutes" )
Set tbl2 = Db.TableDefs("DonnéesCorrigées" )
Set RS1 = tbl1.OpenRecordset(dbOpenTable)
Set RS2 = tbl2.OpenRecordset(dbOpenTable)
RS1.MoveFirst
NumLigne = RS1!Ligne
DateD = RS1!Début
DateF = RS1!Fin
nbJours = RS1!Jours
'Boucle principale
Do
  RS1.MoveNext
  If RS1.EOF Then
    'Fin de fichier, enregistrer la dernière ligne
    'et sortie de boucle
    RS2.AddNew
    RS2!Ligne = NumLigne
    RS2!Début = DateD
    RS2!Fin = DateF
    RS2!Jours = nbJours
    RS2.Update
    Exit Do
  End If
  If RS1!Début - DateF = 1 Then
    'Cumuler les champs Fin et Jours
    DateF = RS1!Fin
    nbJours = nbJours + RS1!Jours
  Else
    'Enregistrer dans la table
    'DonnéesCorrigées
    RS2.AddNew
    RS2!Ligne = NumLigne
    RS2!Début = DateD
    RS2!Fin = DateF
    RS2!Jours = nbJours
    RS2.Update
    NumLigne = RS1!Ligne
    DateD = RS1!Début
    DateF = RS1!Fin
    nbJours = RS1!Jours
  End If
Loop
MsgBox "Traitement terminé"
Set RS2 = Nothing
Set RS1 = Nothing
Set tbl1 = Nothing
Set tbl2 = Nothing
Set Db = Nothing
 
End Sub


 
Je n'ai pas retenu ton idée de suppression d'enregistrement mais préféré copier dans une nouvelle table les données retraitées.
 
A toi de jouer !
 
A+
Horatio
 
 
 
 

Reply

Marsh Posté le 02-02-2006 à 13:47:01    

Merci Horatio pour ton aide!
 
J'ai utilisé ton code. Je n'ai pas d'erreurs lors de la compilation. Par contre, le programme ne fait qu'inverser les lignes...
 
Peut-être sauras-tu d'où vient ce problème?!
 
Merci encore!

Reply

Marsh Posté le 02-02-2006 à 20:02:54    

Salut,
 :pfff:  
Je ne vois pas ce qui pourrait inverser les lignes. Copies le code que tu as fait tourner pour que je l'examine.
A+
Horatio

Reply

Marsh Posté le 15-02-2006 à 16:46:27    

J'ai réussi à faire tourner le programme pour en finir.
 
Merci pour ton aide!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed