IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes et SQL. Discussion :

[SQL-VBA]fusionner des lignes


Sujet :

Requêtes et SQL.

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 55
    Points : 19
    Points
    19
    Par défaut [SQL-VBA]fusionner des lignes
    Bonjour,

    je dois fusionner des lignes sous access sans perte d information.ma table se presente de la maniere suivante:

    idpatient | secteur |anne |item01|item02|item03|item04|.....|item22|
    1 | 04 | 1996 | 1 | 2 |vid|vid|.....|13000|
    1 | 04 |1998 |vid|vid| 3 | 12 |.....|vide|
    1 | 04 |2000 | 1 | 1 | 5 | 25 |.....|13000|
    1 | 05 |1997 | 2 | 1 |vid| 33 |.....| vid|
    1 | 05 |2000 | 2 | 2 | 2 |vid|.....| 75000|
    les items correspondent la plupart du temps a des variables binaire tel que marié?(1)oui 2(non)
    moi ce que je veux faire c est garder l evolution au cour du temps par idpatient et secteur des differents item.Mais certaine ligne ne comporte qu une reponse ce qui lors de l exploitation donnera un trop fort taux de données manquantes.L idée serait donc de fusionner les lignes lorsqu il n'y a pas plusieurs reponses differentes pour un meme item et de garder l evolution lorsque les reponses sont differentes ce qui donnerai par exemple pour les deux premieres lignes:
    1 | 04 | 1998 | 1 | 2 | 3 |12 |.......|
    1 | 04 | 2000 | 1 | 1 | 5 | 25 |.......|

    mais comment faire?J ai bien tenté avec sql de faire
    SELECT idpatient, secteur, first(item1),first(Item2).....
    FROM matable
    GROUP BY idpatient, secteur;

    mais ca fusionne pas!!
    auriez vous une solution?
    merci d avance

  2. #2
    Membre confirmé Avatar de timoth
    Homme Profil pro
    Responsable Outils Digitaux
    Inscrit en
    Octobre 2005
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable Outils Digitaux

    Informations forums :
    Inscription : Octobre 2005
    Messages : 479
    Points : 474
    Points
    474
    Par défaut
    Bonjour Shagun,

    Quels sont exactement les criteres de fusion de deux lignes ? Je ne suis pas sur de bien bien saisir :
    • Meme idPatient
    • Meme secteur
    • Meme date ? (visiblemement, pas forcement)

    Les items vides récuperent la valeur de l'enregistrement du dessus? S'additionnent ?...

    Donne nous un peu plus de détail... Merci
    puis et puis et encore . Sinon sans oublier et

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 55
    Points : 19
    Points
    19
    Par défaut
    les lignes doivent etre fusionné pour un meme patient dans un meme secteur.la variable année est en fait l'année de mis a jour de l'item.le probleme c est que lorsque les mises a jour etaient faites la ligne n'était pas recopiée.Un item pouvait etre mis a jour independemment des autres items ce qui donne des lignes avec un trou par exemple

    idsecteur | secteur| anneemaj|item1|item2|item3|item4|.....|item22
    1 | 04 | 2000 |1 | 2 |vid| 4 |.....|item22|
    1 | 04 | 2002 |vid|vid|3|vid|.....|Item22|

    on voit bien que la valeur de l'item 3 sur la deuxieme ligne va sur la premiere ligne
    ca cest le premier probleme qui si il n est pas resolu me donnera un taux important de valeur manquante car sur la deuxieme ligne il n y a qu une reponse.

    Seulement ce cas de figure n 'est pas toujours vrai,parfois les lignes sont remplis et les item vont changer de valeur au cour du temps or je veux garder
    cette variation au cours du temps.
    exemple:
    idsecteur | secteur| anneemaj|item1|item2|item3|item4|.....|item22
    1 | 04 | 2000 |1 | 2 |2| 4 |.....|33000|
    1 | 04 | 2002 |1 |1 |3|5 |.....|30000|

    voila j espere que suis plus clair.
    merci

  4. #4
    Membre confirmé Avatar de timoth
    Homme Profil pro
    Responsable Outils Digitaux
    Inscrit en
    Octobre 2005
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable Outils Digitaux

    Informations forums :
    Inscription : Octobre 2005
    Messages : 479
    Points : 474
    Points
    474
    Par défaut
    si je comprends bien, pour ton premier exemple, il faut fusionner les deux lignes en une seule:
    1 | 04 | 2002 |1 | 2 | 3 | 4 |.....|item22|

    Par contre, sur le deuxieme exemple, il ne faut rien faire parce qu'un meme item a des valeurs différentes d'une année a l'autre..

    C'est bien ca??
    puis et puis et encore . Sinon sans oublier et

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 55
    Points : 19
    Points
    19
    Par défaut
    oui c est bien ca

  6. #6
    Membre confirmé Avatar de timoth
    Homme Profil pro
    Responsable Outils Digitaux
    Inscrit en
    Octobre 2005
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable Outils Digitaux

    Informations forums :
    Inscription : Octobre 2005
    Messages : 479
    Points : 474
    Points
    474
    Par défaut
    La liste de tes patients est dans une table différente ?

    IdPatient | NomPatient | Addresse
    01 Gerard 6 allée des roseaux
    02 Raymond .....

    De meme pour la liste des secteurs ?

    Comment s'appelle-t-elles ?
    puis et puis et encore . Sinon sans oublier et

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 55
    Points : 19
    Points
    19
    Par défaut
    la table identifiant les patient est dans une autre table, elle s appelle PATIENT et comprend les champs: numero du patient,nom,prenom,datenaissance,date deces si deces
    il y a 5 secteur mais pas de table pour les secteurs.le secteur frequenté par le patient est donné dans la table des items.

  8. #8
    Membre confirmé Avatar de timoth
    Homme Profil pro
    Responsable Outils Digitaux
    Inscrit en
    Octobre 2005
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable Outils Digitaux

    Informations forums :
    Inscription : Octobre 2005
    Messages : 479
    Points : 474
    Points
    474
    Par défaut
    Quand tu as des blancs dans tes items, ce sont des 0 ou des valeurs "Null"??
    puis et puis et encore . Sinon sans oublier et

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 55
    Points : 19
    Points
    19
    Par défaut
    des valeurs null

  10. #10
    Membre confirmé Avatar de timoth
    Homme Profil pro
    Responsable Outils Digitaux
    Inscrit en
    Octobre 2005
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable Outils Digitaux

    Informations forums :
    Inscription : Octobre 2005
    Messages : 479
    Points : 474
    Points
    474
    Par défaut
    Bon, ce n'est pas terminé mais j'esquisse la technique qui me semble falloir utiliser.

    Ca consiste a selectionner dans ta table les enregistrements qui ont les memes idpatient et les memes secteurs et comparer les lignes deux a deux. S'il y a lieu de fusionner, il faut importer les données d'un enregistrement a l'autre et supprimer le plus ancien.

    En supposant que la table qui contient tes enregistrements a fusionner s'appelle T:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    Sub fusion()
    Dim db As DAO.Database
    Dim recPatient As DAO.Recordset
    Dim rec As DAO.Recordset
    Dim i As Integer
    Dim j As Integer
    Dim strsql As String
    Dim fld As Field
    Dim curr As Variant
    Dim nxt As Variant
     
     
    Set db = CurrentDb
    Set recPatient = db.OpenRecordset("Select Patient.* FROM Patient")
     
    While Not recPatient.EOF 'parcourt la table patient
     For i = 1 To 5 'parcourt les secteurs
     
     'requete SQL qui selectionne tous les enregistrements pour le client en
     'cours et le secteur en cours
    strsql = "Select T.* FROM T " & _
             "WHERE T.idpatient=cint('" & recPatient.Fields("idpatient") & "') " & _
             "AND T.secteur=Cint('" & i & "') " & _
             "ORDER BY T.annee"
     
    'Ouvre le jeu d'enregistrement selectionnés dans la requete
    Set rec = db.OpenRecordset(strsql)
     
    'parcourt le jeu d'enregistrement rec
        While Not rec.EOF
            'parcourt chaque champ dont le nom commence par "item"
            For Each fld In rec.Fields
            If fld.Name Like "item*" Then
            'enregistre la valeur du champ de l'enregistrement courant
            curr = rec.Fields(fld.Name)
            rec.MoveNext
            'enregistre la valeur du champ de l'enregistrement suivant
            nxt = rec.Fields(fld.Name)
     
            'Ici une procedure qui compare les deux lignes, importe les
            'données de l'une a l'autre et supprime une des deux s'il faut
     
            End If
            Next fld 'passe au champ suivant
        rec.MoveNext 'passe a l'enregistrement suivant
        Wend
    rec.Close
     Next i 'secteur suivant
    recPatient.MoveNext 'patient suivant
    Wend
    End Sub
    J'ai du boulot de mon coté, regarde dans le tutorial qui concerne le DAO par Christophe Warin (Voir ICI) Ca pourra t'aider a terminer...

    Il y a peut etre une méthode plus simple, mais je ne vois pas.
    puis et puis et encore . Sinon sans oublier et

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 55
    Points : 19
    Points
    19
    Par défaut
    je te remercie !j ai jamais fait de vb j espere que ca ira .merci encore

  12. #12
    Membre confirmé Avatar de timoth
    Homme Profil pro
    Responsable Outils Digitaux
    Inscrit en
    Octobre 2005
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable Outils Digitaux

    Informations forums :
    Inscription : Octobre 2005
    Messages : 479
    Points : 474
    Points
    474
    Par défaut
    je reviens vers toi avec le code manquant (il y a qq erreurs dans celui que je t'ai donné et que je suis en train de tester)

    Rajoute un champ "del" dans ta table. On va écrire dedans "oui" s'il faut la supprimer ou pas. On s'occupera de la procédure de suppression des enregistrements apres...

    Tu comprends un peu mon code ??
    puis et puis et encore . Sinon sans oublier et

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 55
    Points : 19
    Points
    19
    Par défaut
    j essaie de le comprendre mais vu que je connais rien au vb je lis des tutoriels pour comprendre les differents objet fonction etc...

  14. #14
    Membre confirmé Avatar de timoth
    Homme Profil pro
    Responsable Outils Digitaux
    Inscrit en
    Octobre 2005
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable Outils Digitaux

    Informations forums :
    Inscription : Octobre 2005
    Messages : 479
    Points : 474
    Points
    474
    Par défaut
    Je te donne le code que j'ai:

    Ca écrit toutes les données manquantes d'une année plus récente en fonction des données des années précédentes et lorsqu'il n'y a aucune différence entre les données des différentes années, ca t'écrit "oui" dans le champ "del" pour toutes les plus vieilles années.
    On enlevera ensuite toutes les années qui ont un "oui"

    par exemple:
    1 | 04 | 2000 |1 | 2 |vid| 4 |.....|item22|
    1 | 04 | 2002 |vid|vid|3|vid|.....|Item22|

    va técrire
    1 | 04 | 2002 | 1|2 |3|4|.....|Item22|

    Voici le code. Copie le dans un module:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    Sub fusion()
    Dim db As DAO.Database
    Dim recPatient As DAO.Recordset
    Dim rec As DAO.Recordset
    Dim i As Integer
    Dim j As Integer
    Dim k As Integer
    Dim strsql As String
    Dim fld As Field
    Dim curr As Variant
    Dim prev As Variant
    Dim fusion As Boolean
     
    Set db = CurrentDb
    Set recPatient = db.OpenRecordset("Select Patient.* FROM Patient")
     
    While Not recPatient.EOF 'parcourt la table patient
     For i = 1 To 5 'parcourt les secteurs
     
     'requete SQL qui selectionne tous les enregistrements pour le client en
     'cours et le secteur en cours
    strsql = "Select T.* FROM T " & _
             "WHERE T.idpatient=cint('" & recPatient.Fields("idpatient") & "') " & _
             "AND T.secteur=Cint('" & i & "') " & _
             "ORDER BY T.annee"
     
    'Ouvre le jeu d'enregistrement selectionnés dans la requete
    Set rec = db.OpenRecordset(strsql)
    'MsgBox strsql
    If Not rec.EOF Then
    rec.MoveFirst
    rec.MoveLast
    End If
    If rec.RecordCount > 1 Then
        fusion = True
        rec.MoveFirst
        rec.MoveNext 'va au deuxieme enregistrement tout de suite
    'parcourt le jeu d'enregistrement rec
        While Not rec.EOF
     
            'parcourt chaque champ dont le nom commence par "item"
            For Each fld In rec.Fields
            If fld.Name Like "item*" Then
                'enregistre la valeur du champ de l'enregistrement courant
                curr = rec.Fields(fld.Name)
                rec.MovePrevious
                'enregistre la valeur du champ de l'enregistrement suivant
                prev = rec.Fields(fld.Name)
                rec.MoveNext
     
                If IsNull(curr) And Not IsNull(prev) Then
                rec.Edit
                rec.Fields(fld.Name) = prev
                rec.Update
                End If
     
                If Not IsNull(curr) And Not IsNull(prev) Then
                 If curr <> prev Then fusion = False
                End If
            End If
            Next fld 'passe au champ suivant
        If fusion = True Then
        rec.MovePrevious
        rec.Edit
        rec.Fields("del") = "oui"
        rec.Update
        rec.MoveNext
        End If
        rec.MoveNext 'passe a l'enregistrement suivant
        Wend
    rec.Close
    End If
     Next i 'secteur suivant
    recPatient.MoveNext 'patient suivant
    Wend
    End Sub
    Ce code necessite que ta table a traiter s'appelle T, ton champ avec l'année soit appellé annee, tes champs de valeurs commencent par item, ton numero de patient soit appellé idpatient et secteur secteur

    Pour l'executer, tu mets ton curseur dans le code et tu appuies sur lecture.

    Petite manip a ne pas oublier. Vas dans Tools/Reference de l'éditeur VB et coche Microsoft DAO 3.x Object Library

    je vais pas tarder a partir, laisse moi toutes tes questions, je t'y réponds demain matin.

    Bien a toi
    puis et puis et encore . Sinon sans oublier et

  15. #15
    Membre confirmé Avatar de timoth
    Homme Profil pro
    Responsable Outils Digitaux
    Inscrit en
    Octobre 2005
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable Outils Digitaux

    Informations forums :
    Inscription : Octobre 2005
    Messages : 479
    Points : 474
    Points
    474
    Par défaut
    tu dois etre un peu comme Alice dans le pays des merveilles, un peu perdu. Si tu arrives a t'y mettre, tu verras, le code VBA est une mine a possibilités !

    Bon courage
    puis et puis et encore . Sinon sans oublier et

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 55
    Points : 19
    Points
    19
    Par défaut
    ca c est sur!!!j suis perdu mais bon,quand tu sais l utiliser ca doit etre vraiment pratique!!je t remercie encore une fois pour ton aide .bonne soirée

  17. #17
    Membre confirmé Avatar de timoth
    Homme Profil pro
    Responsable Outils Digitaux
    Inscrit en
    Octobre 2005
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable Outils Digitaux

    Informations forums :
    Inscription : Octobre 2005
    Messages : 479
    Points : 474
    Points
    474
    Par défaut
    Alors, ca marche ?
    puis et puis et encore . Sinon sans oublier et

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 55
    Points : 19
    Points
    19
    Par défaut
    bonjour,

    j ai essayé de comprendre le programme mais il y a un truc que je comprend pas pourquoi a tu besoin de la table patient? pour avoir un identifiant unique?pourquoi ne pas utiliser l 'idpatient de la table T?

  19. #19
    Membre confirmé Avatar de timoth
    Homme Profil pro
    Responsable Outils Digitaux
    Inscrit en
    Octobre 2005
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable Outils Digitaux

    Informations forums :
    Inscription : Octobre 2005
    Messages : 479
    Points : 474
    Points
    474
    Par défaut
    j'ai besoin de la table patient simplement pour avoir la liste des patients.

    En fait, pour chaque patient et chaque secteur, je vais créer une requete de selection de ta table T pour avoir des enregistrements qui ont le meme idpatient et meme num de secteur.
    puis et puis et encore . Sinon sans oublier et

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 55
    Points : 19
    Points
    19
    Par défaut
    dans la table patient il n ya pas le secteur.Le secteur frequenté est contenu dans la table T.Est ce que tu a tenu compte de ca ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/09/2008, 10h43
  2. Fusionner des lignes en resultat
    Par kalagool dans le forum DB2
    Réponses: 3
    Dernier message: 30/04/2008, 15h31
  3. [Formulaire][VBA] Gestions des lignes du formulaire
    Par Oberown dans le forum VBA Access
    Réponses: 3
    Dernier message: 13/04/2007, 21h44
  4. [VBA] Supprimer des lignes dans une table
    Par shadockgreg dans le forum Access
    Réponses: 6
    Dernier message: 22/11/2006, 09h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo