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

Langage SQL Discussion :

[Access] INSERT complexe


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 59
    Points : 23
    Points
    23
    Par défaut [Access] INSERT complexe
    Bonsoir,

    J'ai un problème lors d'une restructuration d'une base de donnée ACCESS. En effet, je dispose actuellement d'une table, qui contient toutes les informations. Il s'agit en fait de clients, mais dont toutes les informations sont stockées sur une table. Un des champs (en mémo) contient en fait les différentes visites, séparées par des retours à la ligne.
    Je souhaite donc mettre ces différentes informations dans une autre table, appelée Visites, avec en primary key le numéro de la visite, pour les classer, ensuite en clé étrangère (avec intégrité référentielle) le numéro associé au client (en auto-incrément et primary key sur la première table).

    Il faut donc faire un INSERT SELECT, avec une fonction pour découper la chaîne et qu'à chaque bout de chaine, ça crée une ligne dans la nouvelle table, avec le nom du client et une date, présente dans un autre champ (qui comporte les dates des différentes visites, séparées par des virgules) et d'autres infos, qui seront copiées comme telle dans la nouvelle table.

    Voila, si quelqu'un pouvait m'aider... ça m'éviterais un copier / coller fastidieux.

    Bonne journée

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 277
    Points : 11 733
    Points
    11 733
    Par défaut
    si tu
    connais le VBA, il faut que tu fasses une Sub qui lise ta table, effectue un Split() de ton Mémo à chaque ligne et pilote les insertions.

    Sinon, tu exportes dans un fichier texte, où tu remplace les retours à la ligne (carac 10) par des retours chariot. tu n'a plus ensuite qu'à ré-importer ce fichier dans ta base.
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 59
    Points : 23
    Points
    23
    Par défaut
    Bonjour,

    Oui, j'avais entendu de cette fonction split qu'on peut utiliser sous VBA, et j'aimerais effectivement faire ce transfert avec l'aide de VBA, mais j'aimerais avoir quelques pistes pour me lancer. En fait, je trouverais aisément les paramètres nécessaires à cette fonction, mais ce que je ne saurais pas faire, c'est l'insertion dans la table qui sera dans la boucle.
    Est-ce du SQL bête et méchant ?

    Bonne journée

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 277
    Points : 11 733
    Points
    11 733
    Par défaut
    mais ce que je ne saurais pas faire, c'est l'insertion dans la table qui sera dans la boucle.
    Est-ce du SQL bête et méchant ?
    yep... si tu sais accéder aux données avec VBA, tu n'as plus qu'à faire du .Execute "INSERT INTO...".
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 59
    Points : 23
    Points
    23
    Par défaut
    Bonjour,

    Malgré tout, je veux bien si cela est possible, un exemple, avec des noms de champs fictifs, pour ce type d'insertion... parce que ça ne me semble pas simple du tout.

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 277
    Points : 11 733
    Points
    11 733
    Par défaut
    Peux-tu me donner un exemple de tes données à splitter ?

    Connais-tu l'accès aux données en VB (avec l'ADO ou le DAO) ?
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 778
    Points
    30 778
    Par défaut
    En SQL pur, voilà comment je ferais pour extraire les lignes :
    D'abord une vue pour repérer les sauts de ligne (+ début et fin de la chaîne)
    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
    create view
        SAUTLIGNES  (ID, SAUT)
    as
    (    select  T.ID
            ,   I.VALEUR    as SAUT
        from    
                MATABLE as T
            inner join
                ENTIERS as I
                on  substring(T.MEMO from I.VALEUR for 1) = '\x0D'
    union
        select  D.ID
            ,   0   as SAUT
        from    
                MATABLE as D
    union
        select  F.ID
            ,   character_length(F.MEMO) + 1    as SAUT
        from    
                MATABLE as F
    )
    ;
    Je dois préciser que j'ai à ma disposition une table d'entiers... c'est quelquefois bien pratique

    Ensuite, ça devient facile d'extraire chaque ligne...
    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
    select  T.ID
        ,   substring(T.MEMO from D.SAUT + 1 for F.SAUT - D.SAUT + 1) as LIGNE
    from
            MATABLE as T
        inner join
            SAUTLIGNES  as F
            on  T.ID    = F.ID 
        inner join
            SAUTLIGNES  as D
            on  F.ID    = D.ID 
            and F.SAUT > D. SAUT
    where   exists  (   select  1
                        from    SAUTLIGNES as L
                        where   F.ID    = L.ID
                        and     F.SAUT > L.SAUT
                        having  max(L.SAUT)   = D.SAUT   
                    )
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  8. #8
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 59
    Points : 23
    Points
    23
    Par défaut
    Bonsoir,

    Donc si je comprends bien, la deuxième partie, il faut que je la transforme en INSERT ... SELECT et ça marche (je ne connaissais pas les différentes fonctions utilisées).
    Je fais le test, et j'édite ce message dans la soirée.

    EDIT : je ne vois pas la table désignée dans la première union... et encore moins dans la deuxième union... pouvez-vous m'éclairer ?
    Ma table principale se nomme Fiches Clients, et la table de destination se nomme Visites.

    Merci

  9. #9
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 277
    Points : 11 733
    Points
    11 733
    Par défaut
    Al, ta solution est très belle, mais je crains qu'Harold n'ait bcp de mal à l'adapter à Access...

    Harold, si c'est du one-shot, je te recommande vivement la méthode sale du fichier texte.

    Quelques pistes quand même :

    - CREATE VIEW n'existe pas sous Access. Ceci dit, il suffit de créer une requête et de l'enregistrer sous le nom SAUTLIGNES

    - c'est à toi de créer la table ENTIERS ; elle contient les nombres de 1 jusqu'à la longueur maximale de ton texte à splitter (Al, c'est bien ça ?) ; tu peux aller plus loin sans pb. Tu peux générer cette table avec Excel (recopie incrémentée ou en série) ; une solution plus jolie consiste à créer une table contenant les chiffres de 0 à 9 et à faire des produits cartésiens entre plusieurs instances de cette table, l'une pour les unités, une autre pour les dizaines, etc.

    - il faut remplacer les fonctions standard SQL par leurs équivalents VB : substring(... FROM... FOR...) devient Mid(..., ..., ...) et character_length() devient len()

    Enfin, à te relire, j'ai l'impression que chaque ligne de ton mémo contient les infos pour plusieurs colonnes, et qu'il faudra à nouveau la splitter... d'où ma demande de voir un exemple de données.
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  10. #10
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 277
    Points : 11 733
    Points
    11 733
    Par défaut
    Citation Envoyé par Harold_le_Rouge
    Bonsoir,
    Ma table principale se nomme Fiches Clients
    A écrire donc entre crochets [Fiches Clients], à cause de l'espace.
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  11. #11
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 59
    Points : 23
    Points
    23
    Par défaut
    Voici l'architecture de ma BDD :

    Table actuelle : [Fiches Clients]
    N° d'ordre - Numéro Auto
    Statut - Texte
    Nom - Texte
    Effectif - Numérique
    Adresse_1 - Texte
    Adresse_2 - Texte
    Code Postal - Numérique
    Ville - Texte
    Activité - Texte
    Contact - Mémo
    E-mail - Lien Hypertexte
    Téléphone_1 - Numérique
    Téléphone_02 - Numérique
    Fax - Numérique
    Mobile - Numérique
    Site Web - Lien Hypertexte
    Commentaires_1 - Mémo // contient les informations complémentaires pour se rendre sur place
    Commentaires - Mémo // champ à diviser, visites séparées par un retour à la ligne
    Date prospection - Date/heure // première visite
    Besoins - Texte // besoins produits
    Date relance - Date / Heure // date de la future relance
    Type relance - Texte // Visite ou par téléphone
    Suite - Mémo // champ à diviser, date de visites séparées par des virgules et un espace
    Commandes - Mémo // différentes commandes passées
    Montant des commandes - Monétaire // montant total des commandes

    Nouvelle table : [Visites]
    NumVisite - Numéro Auto
    N° d'ordre - Numérique // relié au champ N° d'ordre de la Table Fiches Clients
    DateVisite - Date / Heure // résultat du split du champ Suites
    CommVisite - Mémo // résultat du split du champ commentaires
    Commande - Texte // on ne divise pas ce champ
    MontantCommande - Monétaire // on ne divise pas ce champ

    Voici donc pour la structure. Je vais essayer de voir pour les différentes requêtes.

    Bonne soirée

  12. #12
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 277
    Points : 11 733
    Points
    11 733
    Par défaut
    Commentaires - Mémo // champ à diviser, visites séparées par un retour à la ligne
    Suite - Mémo // champ à diviser, date de visites séparées par des virgules et un espace
    Cela complique un peu la solution d'Al, même si le même principe reste applicable...
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  13. #13
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 277
    Points : 11 733
    Points
    11 733
    Par défaut
    Pour ma solution VBA (qui équivaut à un curseur, le genre de chose que je déconseille habituellement, mais comme c'est du one-shot et qu'on est sous Access...), voici une maquette :

    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
    Sub toto()
    Dim Conn As ADODB.Connection
    Dim RS As New ADODB.Recordset
    Dim TabComm As Variant, TabVisites As Variant, i As Integer
    Dim NumOrdre As Integer, Visite As Date, Comm As String
    Dim SQL As String
     
    Set Conn = CurrentProject.Connection
    RS.Open "SELECT [N° d'ordre], Commentaires, Suite FROM [Fiches Clients]", Conn, adOpenForwardOnly, adLockReadOnly
    While Not RS.EOF
        NumOrdre = RS("N° d'ordre").Value
        TabVisites = Split(RS("Suite").Value, ", ")
        TabComm = Split(RS("Commentaires").Value, vbLf)
        ' Nota : vbLf = saut de ligne, vbCr = retour chariot
        ' vbCrLf = vbCr suivi de vbLf, souvent utilisé par Windows
     
        ' je suppose qu'il y a tj autant de visites que de commentaires
        For i = LBound(TabVisites) To UBound(TabVisites)
            Visite = TabVisites(i) ' attention aux formats de date
            Comm = TabComm(i) ' attention aux guillemets dans tes commentaires
            SQL = "INSERT INTO Visites ([N° d'ordre], DateVisite, CommVisite) "
            SQL = SQL & "VALUES (" & NumOrdre & ", " & Visite & ", " & Comm & ") "
            Conn.Execute SQL
        Next
        RS.MoveNext
    Wend
     
    End Sub
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  14. #14
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 59
    Points : 23
    Points
    23
    Par défaut
    Ok, je vois

    Je prends la solution VB, je suis moins perdu dans VB que dans la grosse requête SQL, que je ne savais pas aussi puissant.
    Je teste, et je vous dit le résultat demain.

    Bonne soirée, et merci

  15. #15
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 277
    Points : 11 733
    Points
    11 733
    Par défaut
    Citation Envoyé par Harold_le_Rouge
    Je prends la solution VB, je suis moins perdu dans VB que dans la grosse requête SQL, que je ne savais pas aussi puissant.
    Les meilleurs outils sont ceux dont on sait se servir !
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  16. #16
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 778
    Points
    30 778
    Par défaut
    Citation Envoyé par Harold_le_Rouge
    Je prends la solution VB, je suis moins perdu dans VB que dans la grosse requête SQL, que je ne savais pas aussi puissant.
    SQL est un langage puissant... bridé par les SGBD .
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  17. #17
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 277
    Points : 11 733
    Points
    11 733
    Par défaut
    Citation Envoyé par antoun
    Visite = TabVisites(i) ' attention aux formats de date
    Comm = TabComm(i) ' attention aux guillemets dans tes commentaires
    Je reprends mes deux points flous. Je ne sais pas à quel format sont tes dates, mais Visite doit être formaté en #mm/jj/aaaa# (du coup, tu as plutôt intérêt à le déclarer en String qu'en Date).

    Pour le commentaire, ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Comm = """" & Replace(TabComm(i), """", """""" ) & """"
    ou encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Comm = "'" & Replace(TabComm(i), "'", "''" ) & "'"
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  18. #18
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 59
    Points : 23
    Points
    23
    Par défaut
    Bonjour,

    J'ai corrigé deux ou trois choses, mais il y a un soucis : la date de la première visite est dans le champ [Date Prospection], et les suivantes sont dans le champ suites... (vraiment mal faite cette base ^^'). Du coup, il me dit que la première valeur de suites est null, et ce null n'est pas pris en charge.
    Je vais essayer de voir ça tout à l'heure.

    Bonne journée

  19. #19
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 277
    Points : 11 733
    Points
    11 733
    Par défaut
    (vraiment mal faite cette base ^^')
    Alors, corrige-la :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE [Fiches Clients]
    SET Suite = [Date Prospection] & Char(10) & Suite
    Char(10) étant le saut de ligne, à remplacer éventuellement par Char(13) pour le retour chariot ou Char(13) & Char(10) pour la combinaison des deux.
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  20. #20
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 59
    Points : 23
    Points
    23
    Par défaut
    Si ce n'était que cela ^^

    La deuxième personne qui a repris la base a inscrit dans suites la première date de prospection, donc il y aurait des doubles vers les derniers enregistrements.
    Il n'y a que 100 enregistrement concernés sur 1400, je vais donc faire ça à la main, je n'ai pas le courage de faire un Split pour collecter la première valeur et la comparer ^^

    Je vous donne le résultat vers la fin d'après-midi.

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

Discussions similaires

  1. PB requete access : insertion de données et somme
    Par pierrickbe dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 18/07/2008, 15h18
  2. ACCESS Insert et select
    Par Spanish_ dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 02/01/2008, 17h00
  3. [ODBC] [Access] Insertion avec NumeroAuto
    Par Aillyzeux dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 30/08/2007, 12h25
  4. [ACCESS] Insert - Select
    Par diaboloche dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/02/2007, 17h30
  5. [vb][access] Insert
    Par Alex35 dans le forum VBA Access
    Réponses: 1
    Dernier message: 12/12/2005, 12h41

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