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 :

Découpage d'un champ en plusieurs


Sujet :

Requêtes et SQL.

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2012
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 37
    Points : 9
    Points
    9
    Par défaut Découpage d'un champ en plusieurs
    Bonjour,

    Je suis nouvel inscrit sur le site, mais je le consulte depuis qqes années, et vous m'apportez grand aide.

    Par contre, aujourd'hui, je suis tombé sur un os, et je n'arrive pas à trouver la réponse/solution à mon pb.

    Mon problème :
    J'aimerais découper un champ en plusieurs avec une requête :

    Par exemple, j'ai un champ avec dedans par exemple :
    Paris>>Lille>>Strasbourg
    Paris>>Orléans>>Clermont-Ferrand>>Aurillac
    Paris

    Je voudrais donc décomposer ce champ en :
    Champ1 : Paris>>Lille>>Strasbourg
    Champ2 : Paris
    Champ3 : Lille
    Champ4 : Strasbourg

    Les contraintes/difficultés sont :
    - je suis dans un table avec une liaison ODBC, je ne peux donc pas modifier la table.
    - Le nombre "d'étapes" de mon champ1 n'est pas tjs le même.
    - Le champ1 peut contenir une seule ville donc quand je cherche la position du 1er ">", et donc je ne peux pas extraire la ville pour mon champ2.

    J'ai réalisé qqes test avec les fonctions DansChaîne, ExtractChaîne, mais je galère un peu beaucoup.

    Merci de votre aide.

    Bonne journée.

  2. #2
    Rédacteur

    Avatar de zoom61
    Homme Profil pro
    ...
    Inscrit en
    Janvier 2005
    Messages
    9 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : ...
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 9 429
    Points : 58 222
    Points
    58 222
    Billets dans le blog
    11
    Par défaut
    Salut,

    En VBA, tu as la fonction split !
    Ici paragraphe 6.

    @+.

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2012
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 37
    Points : 9
    Points
    9
    Par défaut
    Merci d'avoir fait si vite, mais pourrais-tu me dire comment ça se concrétise stp !

    J'ai une requête avec mon Champ1.

    J'ai mon module avec ma Public Function.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public Function Test(ByVal Champ1 As String)
     
    Dim monTab() As String
    monTab = Split(Champ1, ">>")
     
    End Function
    Mais après comment je fais pour la création du tableau ?

    Merci.

  4. #4
    Rédacteur

    Avatar de zoom61
    Homme Profil pro
    ...
    Inscrit en
    Janvier 2005
    Messages
    9 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : ...
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 9 429
    Points : 58 222
    Points
    58 222
    Billets dans le blog
    11
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public Function Test(ByVal Champ1 As String)
    
    Dim monTab() As String
    monTab = Split(Champ1, ">>")
    For i = LBound(monTab) To UBound(monTabp)
        ici tu mets ton code pour insérer tes données dans la table avec monTab(i)
      Next i
    End Function

  5. #5
    Futur Membre du Club
    Inscrit en
    Juillet 2012
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 37
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par zoom61 Voir le message
    ici tu mets ton code pour insérer tes données dans la table avec monTab(i)
    C'est bien ça le pb, je sais le faire dans Excel, mais jamais fait dans Access !
    Dans la requête, j'ai seulement une colonne de créée.

    Par contre (monTabp) correspond à quoi ?
    Si j'ai qu'une ville (donc pas de séparateur) dans mon champ, ça fonctionne ?

  6. #6
    Rédacteur

    Avatar de zoom61
    Homme Profil pro
    ...
    Inscrit en
    Janvier 2005
    Messages
    9 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : ...
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 9 429
    Points : 58 222
    Points
    58 222
    Billets dans le blog
    11
    Par défaut
    Citation Envoyé par Damidou Voir le message
    C'est bien ça le pb, je sais le faire dans Excel, mais jamais fait dans Access !
    Dans la requête, j'ai seulement une colonne de créée.
    Il faut donner plus d'info, comme ta table de départ, ta table d'arrivée avec les champs qui composent les tables.

    Citation Envoyé par Damidou Voir le message
    Par contre monTabp correspond à quoi ?
    A un tableau qui contiendra toutes les données.

    Citation Envoyé par Damidou Voir le message
    Si j'ai qu'une ville (donc pas de séparateur) dans mon champ, ça fonctionne ?
    Normalement oui.

  7. #7
    Futur Membre du Club
    Inscrit en
    Juillet 2012
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 37
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par zoom61 Voir le message
    Il faut donner plus d'info, comme ta table de départ, ta table d'arrivée avec les champs qui composent les tables.
    J'ai une table de départ (DONNEES) qui est une liaison ODBC avec une table Oracle. Je ne peux donc pas la modifier.
    Dans une requête, j'ai donc récup mon champ avec ma chaîne de caractère. J'ai fait la création des nouveaux champs à partir de cette requête.

    Je ne sais pas si je suis assez clair ?

  8. #8
    Rédacteur

    Avatar de zoom61
    Homme Profil pro
    ...
    Inscrit en
    Janvier 2005
    Messages
    9 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : ...
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 9 429
    Points : 58 222
    Points
    58 222
    Billets dans le blog
    11
    Par défaut
    C'est moi que ne me suis pas fait bien comprendre, ce que je veux c'est la table d'où les données proviennent qui s'appelle "DONNEES" ce qu'il me faudrait c'est :
    - sur la table DONNEES le nom des champs
    - sur la table de destinations le nom et les champs

    @+.

  9. #9
    Futur Membre du Club
    Inscrit en
    Juillet 2012
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 37
    Points : 9
    Points
    9
    Par défaut
    Désolé de ne pas être revenu plus tôt, mais emploi du temps chargé !

    Bon je vais essayer d'expliquer clairement (et que c'est dur) le soucis.

    Dans ma base de données, j'ai une seule table, qui est une laison ODBC d'une table Oracle. Dans cette table liée (que je ne peux pas modifier : structure et données) j'ai une vingtaine de champs dont mon champs "Circuit" que je veux décomposer.

    A partir de ça, j'ai fait une requête pour solutionner mon pb. Le blocage est là.$

    Je n'ai pas de table de destinations.

    Merci de ta patience !

    @+

  10. #10
    Rédacteur

    Avatar de zoom61
    Homme Profil pro
    ...
    Inscrit en
    Janvier 2005
    Messages
    9 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : ...
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 9 429
    Points : 58 222
    Points
    58 222
    Billets dans le blog
    11
    Par défaut
    Tu peux bien te créer une table locale dans ta base Access pour faire ta décomposition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Public Function Test(ByVal Champ1 As String)
    Dim monTab() As String
    monTab = Split(Champ1, ">>")
    For i = LBound(monTab) To UBound(monTabp)
        CurrentDb.Execute "insert into table_temporaire value (""" & monTab(i) & """)"
    Next i
    End Function

  11. #11
    Futur Membre du Club
    Inscrit en
    Juillet 2012
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 37
    Points : 9
    Points
    9
    Par défaut
    Ok !
    Désolé mais je galère un peu (enfin beaucoup) là.

    Donc pour résumer, il faut que je fasse une table avec mon champs "circuit" dedans et après les autres champs pour la décomposition font se faire tout seul ou faut que je fasse aussi plusieurs champs vides ?

    Ensuite, je fais ma requête (Ajout ?) pour compléter ma table en utilisant ta macro ? Je la copie à l'identique ?

    Je fait la brasse coulée en ce moment !!!!

    Merci zoom61 !

  12. #12
    Rédacteur

    Avatar de zoom61
    Homme Profil pro
    ...
    Inscrit en
    Janvier 2005
    Messages
    9 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : ...
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 9 429
    Points : 58 222
    Points
    58 222
    Billets dans le blog
    11
    Par défaut
    Il faut en premier créer une table , par exemple la table T_TEMPORAIRE, avec le champs CIRCUIT.

    Ensuite, tu crées module ou tu copies 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
    Function Transfert()
    Dim monTab() As String, i as Integer
     
       SQL = "SELECT CIRCUIT FROM T_TABLE_ODBC"
       Set oSQL = CurrentDb.OpenRecordset(SQL)
       Do Until oSQL.EOF
          monTab = Split(oSQL("CIRCUIT"), ">>")
          For i = LBound(monTab) To UBound(monTabp)
             CurrentDb.Execute "insert into T_TEMPORAIRE values (""" & monTab(i) & """)"
          Next i
       oSQL.MoveNext
       Loop
     
    End Function

  13. #13
    Futur Membre du Club
    Inscrit en
    Juillet 2012
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 37
    Points : 9
    Points
    9
    Par défaut
    Ok cool. J'ai avancé un peu et commence à comprendre.

    J'ai fait une requête création de table, et je me retrouve donc avec ma T_TEMPORAIRE et mon champ "CIRCUIT".

    J'ai ensuite copié/collé le code que tu m'as donné, et lorsque je l'excécute, j'ai un message d'erreur qui s'affiche sur la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monTab = Split(oSQL("CIRCUIT"), ">>")
    avec une erreur d'excécution '94' : Utilisation incorrecte de Null.

  14. #14
    Rédacteur

    Avatar de zoom61
    Homme Profil pro
    ...
    Inscrit en
    Janvier 2005
    Messages
    9 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : ...
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 9 429
    Points : 58 222
    Points
    58 222
    Billets dans le blog
    11
    Par défaut
    Peux-tu envoyer le code complet de ton module ?

  15. #15
    Futur Membre du Club
    Inscrit en
    Juillet 2012
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 37
    Points : 9
    Points
    9
    Par défaut
    J'ai mis copié/collé ce que tu m'avais mis en adaptant :

    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
    Function Transfert()
     
    Dim monTab() As String, i As Integer
     
       SQL = "SELECT CIRCUIT FROM T_DONNEES"
       Set oSQL = CurrentDb.OpenRecordset(SQL)
       Do Until oSQL.EOF
          monTab = Split(oSQL("CIRCUIT"), ">>")
          For i = LBound(monTab) To UBound(monTabp)
             CurrentDb.Execute "insert into T_TEMPORAIRE values ('" & monTab(i) & "')"
          Next i
       oSQL.MoveNext
       Loop
     
    End Function

  16. #16
    Rédacteur

    Avatar de zoom61
    Homme Profil pro
    ...
    Inscrit en
    Janvier 2005
    Messages
    9 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : ...
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 9 429
    Points : 58 222
    Points
    58 222
    Billets dans le blog
    11
    Par défaut
    Peux-tu me dire que cela affiche ?

    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
    Function Transfert()
     
    Dim monTab() As String, i As Integer
     
       SQL = "SELECT CIRCUIT FROM T_DONNEES"
       Set oSQL = CurrentDb.OpenRecordset(SQL)
       Do Until oSQL.EOF
          Msgbox oSQL("CIRCUIT")
          monTab = Split(oSQL("CIRCUIT"), ">>")
          For i = LBound(monTab) To UBound(monTab)
             CurrentDb.Execute "insert into T_TEMPORAIRE values (""" & monTab(i) & """)"
          Next i
       oSQL.MoveNext
       Loop
     
    End Function

  17. #17
    Futur Membre du Club
    Inscrit en
    Juillet 2012
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 37
    Points : 9
    Points
    9
    Par défaut
    Je bloque sur : Erreur d'excécution '13'
    Incompatibilité de type.

    Je ne sais pas si ça vient de là, mais dans ma table temporaire, je n'ai pas mis les champs qui doivent recevoir le découpage. J'ai juste le champ CIRCUIT.

  18. #18
    Rédacteur

    Avatar de zoom61
    Homme Profil pro
    ...
    Inscrit en
    Janvier 2005
    Messages
    9 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : ...
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 9 429
    Points : 58 222
    Points
    58 222
    Billets dans le blog
    11
    Par défaut
    As-tu essayé de faire la requête SELECT CIRCUIT FROM T_DONNEES que donne t'elle ?

  19. #19
    Futur Membre du Club
    Inscrit en
    Juillet 2012
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 37
    Points : 9
    Points
    9
    Par défaut
    Oui, je l'ai essayé, elle me donne tous les circuits.

    Par contre parfois, il arrive que le champ soit vide.

  20. #20
    Rédacteur

    Avatar de zoom61
    Homme Profil pro
    ...
    Inscrit en
    Janvier 2005
    Messages
    9 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : ...
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 9 429
    Points : 58 222
    Points
    58 222
    Billets dans le blog
    11
    Par défaut
    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
    Function Transfert()
     
    Dim monTab() As String, i As Integer
     
       SQL = "SELECT CIRCUIT FROM T_DONNEES WHERE CIRCUIT IS NOT NULL"
       Set oSQL = CurrentDb.OpenRecordset(SQL)
       Do Until oSQL.EOF
          Msgbox oSQL("CIRCUIT")
          monTab = Split(oSQL("CIRCUIT"), ">>")
          For i = LBound(monTab) To UBound(monTab)
             CurrentDb.Execute "insert into T_TEMPORAIRE values (""" & monTab(i) & """)"
          Next i
       oSQL.MoveNext
       Loop
     
    End Function

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

Discussions similaires

  1. [Access] extraire des champs de plusieurs tables
    Par ddeee dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/04/2006, 16h45
  2. sous-formulaire : champs provenant plusieurs tables
    Par patbeautifulday1 dans le forum IHM
    Réponses: 13
    Dernier message: 21/12/2005, 11h17
  3. diff valeurs pr un champs, result plusieurs cols
    Par sampq dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/12/2005, 05h46
  4. compter champs de plusieurs bases
    Par sony351 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 13/09/2005, 08h19
  5. [CR][ASP.NET] Un champ avec plusieurs polices...
    Par David.V dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 08/04/2004, 14h19

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