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 :

tranfert de données d'une table T1 vers une autre table T2


Sujet :

Requêtes et SQL.

  1. #1
    Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 8
    Points : 4
    Points
    4
    Par défaut tranfert de données d'une table T1 vers une autre table T2
    Bonsoir à tous,

    Je ne sais pas comment m'y prendre pour résoudre ce problème qui me taraude depuis un certain bout de temps. Voilà le problème:
    J'ai une table T1 qui contient les champs IdProduit, DesignProduit, PhotoProduit. J'aimerais transférer les données de la T1 dans une autre table temporaire T2 qui contient les les champs IdProd, DesignProd, PhotoP, IdProd2, DesignProd2, photoP2 en procédant comme suite:
    - insérer le 1er enregistrement de T1 dans les 3 premières colonnes de T2
    - insérer le 2ème enregistrement de T1 dans les 3 dernières colonnes de T2
    - insérer le 3ème enregistrement de T1 dans les 3 premières colonnes de T2
    - insérer le 4ème enregistrement de T1 dans les 3 dernières colonnes de T2
    ainsi de suite jusqu'à ce que tous les enregistrements de T1 soient transférés dans T2.

    Mon objectif est de pouvoir afficher les données de T2 dans un formulaire tabulaire (mode continu). Vue la taille des données de T1 si je les utilise pour le formulaire continu j'aurai un long défilement vertical, Par contre avec T2 je réduis ce défilement.

    Merci d'avance à tous ceux qui sacrifieront leurs temps pour me guider.

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    981
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 981
    Points : 1 028
    Points
    1 028
    Billets dans le blog
    36
    Par défaut
    Bonjour Nodak,

    Une solution simple est une routine vba dans laquelle tu :
    • crées un objet recordset qui sélectionne les enregistrements de ta table T1
    • Balayes ton recordset dans une boucle
    • Dans ta boucle tu ajoutes un incrément
    • Quand ton incrément est
      • pair tu ajoutes les champs de ton recordset dans les 3 premiers champs de T2 et récupère l’identifiant de cet enregistrement ajouté dans T2
      • Impair tu renseignes les 3 derniers champs du dernier enregistrement ajouté à T2 ayant l’identifiant récupéré


    Cela présuppose que là requête Sql de ton recordset n’apporte aucune modification à l’ordre d’enregistrement de ta table donc un Select basic et bien sûr que tes enregistrements dans ta table respecte bien l’ordre implicitement décrit
    Mal nommer un objet, c'est ajouter au malheur de ce monde, car le mensonge est justement la grande misère humaine, c'est pourquoi la grande tâche humaine correspondante sera de ne pas servir le mensonge
    Poésie 44, n° 17 - Albert Camus

    Mes réponses vous ont aidés, un clic sur leur pouce vert
    Bonjour chez vous

  3. #3
    Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 8
    Points : 4
    Points
    4
    Par défaut solution routine vba
    Merci informer pour l'algorithme que tu me proposes. Je saisi que c'est cela que je cherche mais je sais que j'aurai du mal à implanter le code vba y correspondant. J'avoue que je suis un peu débutant en vba. Je vous proposerai très bientot pour correction la traduction vba de cet algo. Merci, c'est très sympa.

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    981
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 981
    Points : 1 028
    Points
    1 028
    Billets dans le blog
    36
    Par défaut
    Nodak,

    J’ai pensé à une autre méthode mais là faudrait tester.

    En deux bandes via deux requêtes SQL mais cela implique qu’il y est un nombre pair d'enregistrements

    Il faut identifier si l’identifiant du 1er enregistrement est pair ou impair.

    Considérons que l’identifiant du premier enregistrement est pair.
    La première requête sélectionne que les enregistrements dont l’idenfiant sont pairs

    J’ai rien testé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT champ1, ... FROM table WHERE id MOD (2)
    Puis c’est là que c’est plus touchy, mettre à jour les enregistrements pairs avec les impairs.

    Je vois de mon côté

    Bon courge
    Mal nommer un objet, c'est ajouter au malheur de ce monde, car le mensonge est justement la grande misère humaine, c'est pourquoi la grande tâche humaine correspondante sera de ne pas servir le mensonge
    Poésie 44, n° 17 - Albert Camus

    Mes réponses vous ont aidés, un clic sur leur pouce vert
    Bonjour chez vous

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    981
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 981
    Points : 1 028
    Points
    1 028
    Billets dans le blog
    36
    Par défaut
    Solution pure SQL à adapter

    Soit table Civilite
    idCivilite : incrément
    Civilite : String
    Civilite2 : String

    Données saisies
    1 ; Mlle
    2; Mme
    3; Mr
    4; Ste
    5; SARL
    6;SA


    2 requêtes de sélection

    qryCivilite_impair
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT tblCivilite2.*
    FROM tblCivilite2
    WHERE ((([idCivilite] Mod (2))<>False));
    qryCivilite_Pair
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT tblCivilite2.*
    FROM tblCivCiilite2
    WHERE ((([idCivilite] Mod (2))<>True));
    1 requête qui met à jour chaque Civilit2 impair avec Civilite pair dont l'identifiant est décrémenté de 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE qryCivilite_impair AS I INNER JOIN qryCivilite_pair  AS P ON I.idCivilite = P.idCivilite -1
    SET I.Civilite2 = P.Civilite
    Tu obtiens


    idCivilite civilite civilite2
    1 Mme Mlle
    2 Mlle
    3 Mr Société
    4 Société
    5 SA SARL
    6 SARL

    Ensuite tu sélectionnes les enregistrements avec Civilite2 non vide et tu les balances dans ta table2
    Mal nommer un objet, c'est ajouter au malheur de ce monde, car le mensonge est justement la grande misère humaine, c'est pourquoi la grande tâche humaine correspondante sera de ne pas servir le mensonge
    Poésie 44, n° 17 - Albert Camus

    Mes réponses vous ont aidés, un clic sur leur pouce vert
    Bonjour chez vous

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    981
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 981
    Points : 1 028
    Points
    1 028
    Billets dans le blog
    36
    Par défaut
    Question:
    Le chargement de T2 est cumulatif c'est a dire qu'à chaque chargement tu conserves ce qui a été précédemment chargé ou vides tu la table avant de charger T1 dans T2 car si tu vides T2, tu n'as pas besoin de T2
    Mal nommer un objet, c'est ajouter au malheur de ce monde, car le mensonge est justement la grande misère humaine, c'est pourquoi la grande tâche humaine correspondante sera de ne pas servir le mensonge
    Poésie 44, n° 17 - Albert Camus

    Mes réponses vous ont aidés, un clic sur leur pouce vert
    Bonjour chez vous

  7. #7
    Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Bonsoir Mr informer;

    Excusez-moi de n'avoir pas repondu tôt à votre message. En fait, j'essayais le code suivant:

    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
    Dim dbs As Database
    Dim qdf As QueryDef
    Dim rst As Recordset
    Dim n As Integer
    Dim resultat As Integer
    Dim varId As Integer
    Dim strSQL As String
     
    n = 2
    Set dbs = CurrentDb
    'Set qdf = dbs.CreateQueryDef
     
    strSQL = "SELECT * FROM T1"
    Set rst = dbs.OpenRecordset(strSQL)
     
    Do While Not rst.EOF
     
        resultat = n Mod 2
        If resultat = 0 Then
            dbs.Execute " INSERT INTO T2 (IdProd1, DesignProd1, PhotoProd1,IdProd2, DesignProd2, PhotoProd2) VALUES" _
                        & "(" & rst.Fields(0) & ", '" & rst.Fields(1) & "', '" & rst.Fields(2) & "', null, null, null);"
             varId = rst.Fields(0)
     
        ElseIf resultat = 1 Then
            dbs.Execute " UPDATE T2 SET IdProd2= " & rst.Fields(0) & ", DesignProd2 = '" & rst.Fields(1) & "', PhotoProd2 = '" & rst.Fields(2) & "' " _
                & " WHERE IdProd = varId;"
        End If
     
    n = n + 1
    rst.MoveNext
     
    Loop
    rst.Close
    mais à la ligne du UPDATE de la table T2 je recevais le message " trop peu de paramètres, 2 attendus", j'ai beau cherché je ne vois pas l'erreur.

    Quant à ta question, oui je crois qu'il faut vider T2 pour la recréer puisque de nouvels enregistrements peu figurer en T1.

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    981
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 981
    Points : 1 028
    Points
    1 028
    Billets dans le blog
    36
    Par défaut
    Tu écris

    Attention varId est une variable donc on la sort des doubles quotes et c'est idprod1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "WHERE idprod1 = " & varId
    Bravo pour le code.

    Tiens moi au courant si tu essais la solution pure SQL.
    Comme tu travailles sur un nouveau jeu de données il suffit ensuite de donner comme recordsource de ton formulaire une requête SQL qui ne prend que les enregistrements avec idprod2 non vide
    Mal nommer un objet, c'est ajouter au malheur de ce monde, car le mensonge est justement la grande misère humaine, c'est pourquoi la grande tâche humaine correspondante sera de ne pas servir le mensonge
    Poésie 44, n° 17 - Albert Camus

    Mes réponses vous ont aidés, un clic sur leur pouce vert
    Bonjour chez vous

  9. #9
    Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 8
    Points : 4
    Points
    4
    Par défaut Merci Professeur!
    Salut,

    voici le code final qui a marché:

    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
    Dim dbs As Database
    Dim rst As Recordset
    Dim n As Integer
    Dim resultat As Integer
    Dim varId As Integer
    Dim strSQL As String
     
    n = 2
    Set dbs = CurrentDb
     
    strSQL = "SELECT * FROM T1"
    Set rst = dbs.OpenRecordset(strSQL)
     
    Do While Not rst.EOF
     
        resultat = n Mod 2
        If resultat = 0 Then
            dbs.Execute " INSERT INTO T2 (IdProd1, DesignProd1, PhotoProd1,IdProd2, DesignProd2, PhotoProd2) VALUES" _
                        & "(" & rst.Fields(0) & ", '" & rst.Fields(1) & "', '" & rst.Fields(2) & "', null, null, null);"
             varId = rst.Fields(0)
     
        ElseIf resultat = 1 Then
            dbs.Execute " UPDATE T2 SET IdProd2= " & rst.Fields(0) & ", DesignProd2 = '" & rst.Fields(1) & "', PhotoProd2 = '" & rst.Fields(2) & "' " _
                & " WHERE IdProd1 = " & varId & ";"
     
        End If
     
    n = n + 1
    rst.MoveNext
    Loop
    rst.Close
    Votre deuxième solution me semble plus compliqué pour moi; néanmoins je vais tenter question de me cultiver plus. Une fois de plus merci Informer. C'est super d'avoir gratuitement des professeurs à sa dispo. Longue vie à développez.com

  10. #10
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    981
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 981
    Points : 1 028
    Points
    1 028
    Billets dans le blog
    36
    Par défaut
    Merci de cliquer sur le pouce vert de mes réponses

    Bon devs
    Mal nommer un objet, c'est ajouter au malheur de ce monde, car le mensonge est justement la grande misère humaine, c'est pourquoi la grande tâche humaine correspondante sera de ne pas servir le mensonge
    Poésie 44, n° 17 - Albert Camus

    Mes réponses vous ont aidés, un clic sur leur pouce vert
    Bonjour chez vous

Discussions similaires

  1. Réponses: 0
    Dernier message: 04/08/2010, 14h02
  2. Réponses: 0
    Dernier message: 07/06/2009, 12h31
  3. Réponses: 5
    Dernier message: 22/05/2008, 14h42
  4. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 21h24

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