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

Access Discussion :

Regrouper 2 tables


Sujet :

Access

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Octobre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Octobre 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Regrouper 2 tables
    Bonjour à tous,

    J'ai besoin de regrouper 2 tables en une nouvelle.
    (Non, ce n'est pas une requête union que je veux faire )

    J'ai une table avec des écritures comptables et j'ai une tables avec des écritures analytiques.
    Pour une écriture comptable je peux avoir 0 écriture ana, ou n écritures ana.

    J'ai fait un module sous VBA où je lis la première table et j'écris l'enregistrement dans la nouvelle table, puis je lis la seconde table en faisant des findfirst et findnext et j'écris dans la nouvelle talbe si je trouve des enregistrements.

    Ca fonctionne bien mais c'est très très très long. En 8 heures, je n'ai généré que 50 000 lignes environs.

    J'ai 300 000 lignes dans la premières tables et 200 000 lignes dans la seconde.

    Voici mon code :
    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
    77
    78
    79
    80
    81
    82
    83
     
    Sub Gen_Ecritures_old()
     
        Dim JCPTBASE As Recordset
        Dim JCPTBASA As Recordset
        Dim JEcritures As Recordset
        Set JCPTBASE = CurrentDb.OpenRecordset("Compta_Base1")
        Set JCPTBASA = CurrentDb.OpenRecordset("Compta_Ana1")
        Set JEcritures = CurrentDb.OpenRecordset("Ecritures")
     
        'Remplissage de la table CPTBASE
        Do While Not JCPTBASE.EOF
     
            'Ecriture des lignes de base
            JEcritures.AddNew
            JEcritures!CE1 = JCPTBASE!CE1
            JEcritures!DOS = JCPTBASE!DOS
            JEcritures!CE2 = JCPTBASE!CE2
            JEcritures!ETB = JCPTBASE!ETB
            JEcritures!CPT = JCPTBASE!CPT
            JEcritures!ECRDT = JCPTBASE!ECRDT
            JEcritures!Lib = JCPTBASE!Lib
            JEcritures!JNL = JCPTBASE!JNL
            JEcritures!ECRNO = JCPTBASE!ECRNO
            JEcritures!ECRLG = JCPTBASE!ECRLG
            JEcritures!AXE1 = JCPTBASE!AXE1
            JEcritures!AXE2 = JCPTBASE!AXE2
            JEcritures!AXE3 = JCPTBASE!AXE3
            JEcritures!AXE4 = JCPTBASE!AXE4
            JEcritures!CP = JCPTBASE!CP
            JEcritures!REG = JCPTBASE!REG
            JEcritures!LETT = JCPTBASE!LETT
            JEcritures!POINT = JCPTBASE!POINT
            JEcritures!LOT = JCPTBASE!LOT
            JEcritures!PIECE = JCPTBASE!PIECE
            JEcritures!ECHDT = JCPTBASE!ECHDT
            JEcritures!CHQNO = JCPTBASE!CHQNO
            JEcritures!DEV = JCPTBASE!DEV
            JEcritures!REGTYP = JCPTBASE!REGTYP
            JEcritures!PINOTIERS = JCPTBASE!PINOTIERS
            JEcritures!MT = JCPTBASE!MT
            JEcritures!MTDEV = JCPTBASE!MTDEV
            JEcritures!MTBIS = JCPTBASE!MTBIS
            JEcritures!SENS = JCPTBASE!SENS
            JEcritures!LETTDT = JCPTBASE!LETTDT
            JEcritures!POINTDT = JCPTBASE!POINTDT
            JEcritures!DEVP = JCPTBASE!DEVP
            JEcritures!ECRVALNO = JCPTBASE!ECRVALNO
            JEcritures!CPTCOL = JCPTBASE!CPTCOL
            JEcritures!NATPAI = JCPTBASE!NATPAI
            JEcritures.Update
     
     
            'Recherche des écritures analytiques
            JCPTBASA.MoveFirst
            JCPTBASA.FindFirst "[ECRNO] = " & JCPTBASE!ECRNO & " and [ECRLG] = " & JCPTBASE!ECRLG
     
            Do While Not JCPTBASA.NoMatch
                    'Ecriture des lignes analytiques
                                    JEcritures.AddNew
                    JEcritures!CE1 = JCPTBASA!CE1
                    JEcritures!DOS = JCPTBASA!DOS
                    JEcritures!CE2 = JCPTBASA!ETB
                    JEcritures!ETB = JCPTBASA!ECRNO
                    JEcritures!CPT = JCPTBASA!ECRLG
                    JEcritures!ECRDT = JCPTBASA!MASKLG
                    JEcritures!Lib = JCPTBASA!AXE1
                    JEcritures!JNL = JCPTBASA!AXE2
                    JEcritures!ECRNO = JCPTBASA!AXE3
                    JEcritures!ECRLG = JCPTBASA!AXE4
                    JEcritures!AXE2 = JCPTBASA!JNL
                    JEcritures!CP = JCPTBASA!DEV
                    JEcritures!REG = JCPTBASA!MT
                    JEcritures!LETT = JCPTBASA!SENS
                    JEcritures.Update
     
                JCPTBASA.FindNext "[ECRNO] = " & JCPTBASE!ECRNO & " and [ECRLG] = " & JCPTBASE!ECRLG
            Loop
     
            JCPTBASE.MoveNext
        Loop
     
    End Sub
    Questions :
    - Est ce que l'utilisation de VBA est la bonne solution ?
    - Si oui, il y a t'il moyen d'optimiser ?

    Merci d'avance pour votre aide

  2. #2
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 600
    Points
    24 600
    Par défaut
    Bonjour,

    A ce que je comprend tu souhaites créer une nouvelle table "Ecritures" à partir de l'intégralité de ta "Compta_Base1" puis ajouter les enregistrements de ta table "Compta_Ana1" qui correspondent par les 2 colonnes [ECRNO] et [ECRLG].

    Ce genre de traitement se fait avec SQL et non VBA.

    1) tu crée un requete select avec Compta_Base1
    2) tu la transforme en requête Ajout sur la table Ecritures
    3) tu crées une requête Select avec Compta_Ana lié à Compta_Base1 par les colonnes [ECRNO] et [ECRLG]
    4) tu la transforme en requête Ajout sur la table Ecritures

    Tu devrais avoir rempli ta nouvelle table en quelques minutes.

    Cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Octobre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Octobre 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci Loufab pour ta répônse.

    En appliquant cette proposition, j'intègre très rapidement les écriture, mais dans un premier temps, toutes les eciture de Compta_Base et ensuite toutes les écritures de Compta_Ana.

    Ce que j'ai besoin, c'est d'avoir :
    1 ecriture compta_base
    n exriture Compta_ana

    et ainsi de suite.

    Je mets un exemple des fichiers (3 feuilles dans le fichier Excel)
    ImportCsvEcritures.xlsx

    Merci d'avance pour vos réflexions

  4. #4
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 600
    Points
    24 600
    Par défaut
    Bonjour,

    Si ton code VBA fonction (lentement) il n'y a pas de raison pour que la solution en SQL ne fonctionne pas.

    Lorsque tu a intégré tes lignes de compta avec ta requête Insert Select

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO ecriture
    SELECT * FROM compta_base;
    tu fais un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO ecriture
    SELECT compta_ana.* FROM compta_ana, compta_base
    WHERE compta_ana.ECRNO = compta_base.ECRNO and compta_ana.ECRLG = compta_base.ECRLG;
    Pour ajouter les enregistrements ana qui correspondent à un enregistrement base. Exactement ce que tu souhaites faire mais en une seule fois.

    NB : Je t'ai fait un Where à l'ancienne pour que tu comprennes la liaison. Mais on devrait plutôt le faire avec un JOIN. C'est d'ailleurs ce qui serait fait si tu utilisais le QBE d'Access.

    Cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Octobre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Octobre 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Désolé, je ne dois pas bien comprendre.

    Les requêtes étant lancé l'une après l'autre, on écrit d'abord les données de la requête "Base" et ensuite les donnés de la requête "Ana".
    J'ai besoin que les écritures Ana correspondant à la pièce suivent les lignes des écritures de base.

    j'ai mis quelques ligne de chaque table, ainsi que les requêtes que j'ai réalisé dans une base Access.
    Ecritures.zip


    PS : Dans mon fichier, les tables liées Compta_Base1 et Compta_Ana1 sont lié sur la base Access elle-même, sinon les find ne fonctionne pas dans le code VBA

    Merci de votre aide

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Octobre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Octobre 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    J'ai trouvé une solution, qui vaut ce qu'elle vaut.

    J'ajoute un champ tri dans la table écriture et après avoir ajouté les écriture Base et ensuite les écritures Ana, je tri pour les regroupé ensemble pour créer une nouvelle table sans le champ Tri.

  7. #7
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 600
    Points
    24 600
    Par défaut
    Une base de données ce n'est pas un tableur.

    Si c'est juste un problème de tri qui te gène il faut le faire à la consultation, via une requête.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM ecriture ORDER BY colonneAtrier1, colonneAtrier2;
    Éventuellement inverser le tri avec DESC

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM ecriture ORDER BY colonneAtrier1 DESC, colonneAtrier2 DESC;
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

Discussions similaires

  1. [Requête] [03] Regrouper 2 tables
    Par NiKoTiNe dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 27/04/2007, 10h50
  2. regroupement des tables
    Par azde7015 dans le forum Access
    Réponses: 5
    Dernier message: 31/01/2007, 10h54
  3. requete avec regroupement multi tables
    Par Fxg dans le forum Requêtes et SQL.
    Réponses: 21
    Dernier message: 26/07/2006, 21h53
  4. [débutant] Comment regrouper deux tables ?
    Par maysa dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 27/10/2004, 18h50
  5. regrouper deux tables
    Par Shabata dans le forum Langage SQL
    Réponses: 4
    Dernier message: 19/05/2003, 15h02

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