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 :

Decompose champ en plusieurs champs [AC-2003]


Sujet :

Requêtes et SQL.

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 745
    Points : 202
    Points
    202
    Par défaut Decompose champ en plusieurs champs
    bonjour,

    j'ai des donnée sous 3 format possible
    exemple : 3.100.5 ou 3,100,5 ou 3:100:5 en gros avec un point ou une virgule ou deux point je peux choisir lequel je garde des trois

    3 = galaxy
    100 = secteur
    5 = sous secteur

    voila ma requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT regroup_planete_ok.NOM_JOUEUR, regroup_planete_ok.P1
    FROM regroup_planete_ok;
    je souhaiterai avoir un résultat sous ce format la
    nom_joueur ; galaxy ; secteur ; sous secteur

    comment faire pour avec un seul champ faire donc 3champ dans une requete?
    merci pour vos réponses

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Une discussion à voir : http://www.developpez.net/forums/d12...hamp-3-champs/

    Avec une fonction utilisant la fonction Split, c'est possible.

    Philippe

  3. #3
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 840
    Points : 7 974
    Points
    7 974
    Par défaut
    Bonsoir,

    En supposant que le nombre de caracteres que tu veux extraire soit fixe pour chaque champ resultat, je te proposerai d'utiliser les fonctions de concatenation de texte LEFT, RIGHT, MID dans tes champs resultats.
    Pour le 1er par exemple: left (champ1;1).
    Apres tu as : MID (champ1;3;3)
    Pour le troisieme : RIGHT(champ1;1)

    Bonne continuation
    Mandresy
    "Je ne sais qu'une chose, c'est que je ne sais rien" Socrate

    N'oublions pas de mettre quand on a trouvé notre bonheur. Soyons sympa pour les futurs heureux.

    Merci, c'est toujours sympa de recevoir des de votre part

  4. #4
    Débutant  
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 745
    Points : 202
    Points
    202
    Par défaut
    merci pour vos réponse j'ai plus bien avance sur mon travail

    par contre j'ai un probléme dans mon formulaire "consultation" quand je clique sur "secteur" j'ai un probleme
    deplus je viens de voir que je peux avoir deux type différent avec 1 2 ou 3 chiffre apres le point
    exemple : 3.1.2 ou 3.12.3 ou .3.123.3

    du coup j'ai dans le resultat ce resulat qui apparait 1.2 ou 12. comment faire pour enleve .2 et le point au 12??

    merci encore
    Fichiers attachés Fichiers attachés

  5. #5
    Invité
    Invité(e)
    Par défaut
    Re

    Pourquoi ne pas tester ma méthode ? Les points disparaîtront.

    Il suffit de remplacer - par un . dans la fonction.


    Philippe

  6. #6
    Débutant  
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 745
    Points : 202
    Points
    202
    Par défaut
    j'ai essayé cette fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Public Function Eclatage(strDonnees As String, bytPos As Byte)
        ' déclaration
        Dim Eclat() As String
     
        ' éclatage
        Eclat = Split(strDonnees, ".")
     
        ' récupération en fonction de la position
        Eclatage = Eclat(bytPos)
    End Function
    avec cette ligne dans ma requete :
    mais quand je lance ma requete j'ai le code suivant
    erreur d'excution 9 l'indice n'appartient pas à la sélection et me souligne en jaune cette ligne Eclatage = Eclat(bytPos)

    je ne comprend pas pk?
    de plus peux t'on prendre en compte les . ou les , ou : dans la meme fonction?
    merci

  7. #7
    Invité
    Invité(e)
    Par défaut
    Re

    Tu devrais lire toute la discussion, il y a des informations pour gérer des erreurs éventuelles.

    Pour le . ou autre, c'est possible en faisant des tests, sur ce séparateur, il faudra que je regarde si je peux ce soir.

    De toute façon comme tes longueurs et tes séparateurs sont variables, il va falloir passer par une fonction, les Right, etc.. ne serviront à rien.

    Un dernier détail, est-ce que ce n'est que des chiffres ou il peut y avoir des lettres ?

    Philippe

  8. #8
    Débutant  
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 745
    Points : 202
    Points
    202
    Par défaut
    Alors il n'y pas pas de lettre dans ce champ que des chiffre et , ou . ou : rien d'autre

    j'ai pu avance ci-joint ma derniere version

    par contre j'ai un autre probléme dans mon formulaire "consultation" quand je clique sur "secteur" j'ai un probleme erreur d'excecution 3464 type de données incompatible dans l'expression du critère

    je souhaite avoir la possibilité de faire un filtre pour les secteur de 50 a 100 par exemple
    Je pense avoir un problème de type de donnée mais je ne sais comment me sortir de ce problème la
    Fichiers attachés Fichiers attachés

  9. #9
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Salut Popofpopof,

    Est-ce que tu n'aurais pas intérêt à modéliser un peu mieux ?
    La table 'Donnée' fait penser à un tableau Excel.
    Je suppose que P1,P2,... c'est Planète 1, Planète 2, ...
    Moi, je ferai au minimum une table 'donnée' avec ces champs :
    (a) NOM_JOUEUR, ATTACABLE, Classement, Alliance, Planete
    ou
    (b) NOM_JOUEUR, ATTACABLE, Classement, Alliance, Planete, galaxy, secteur, sous secteur
    C'est à dire un enregistrement par Joueur/Planète, avec dans l'option (b) la possibilité d'alimenter des champs galaxy, secteur, sous secteur, à partir du champ Planete.

    A+

  10. #10
    Débutant  
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 745
    Points : 202
    Points
    202
    Par défaut
    salut

    ma table donnée est comme sa que je fait une importation régulière des donnes a partir d'un fichier excel sur gdoc que je partage avec plusieurs membre.

    Mon but a juste de ne plus travaillé sur le fichie excel mais d'avoir une mini base de donnée pour me facilité les recherche

    tu peux m'aide sur mon probléme avec l erreur que j'ai sur le secteur?

  11. #11
    Invité
    Invité(e)
    Par défaut
    Re

    Voici une nouvelle version de la fonction entièrement commentée :

    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
    Public Function Eclatage(strDonnees As String, bytPos As Byte) As String
        ' déclaration
        Dim Eclat() As String
        Dim strSep As String        ' récupération du séparateur
        Dim i As Integer
     
        ' on détecte d'abord le séparateur
        For i = 1 To Len(strDonnees)                    ' on parcourt les chiffres un à un dans une boucle
            If IsNumeric(Mid(strDonnees, i, 1)) Then    ' on test s'il s'agit d'un numérique
            Else
                strSep = Mid(strDonnees, i, 1)          ' on stocke le séparateur
                Exit For                                ' on sort de la boucle
            End If
        Next i
     
        ' éclatage de la chaine en fonction du séparateur trouvé
        Eclat = Split(strDonnees, strSep)
     
        ' on test bytpos s'il correspond à la plus grande valeur de la table pour éviter les erreurs de limites
        ' rappel que bytpos commence à 0
        If bytPos <= UBound(Eclat()) Then
            Eclatage = Eclat(bytPos)
        Else
            Eclatage = ""
        End If
    End Function
    Elle détecte le séparateur (il faut que celui-ci soit toujours le même dans la chaîne) et devrait gérer les erreurs de limites.

    Philippe

  12. #12
    Débutant  
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 745
    Points : 202
    Points
    202
    Par défaut
    MERCI ton code est royal

    il me reste encore un bug dans le formulaire "consultation" quand je clique sur secteur j'ai un erreur je ne n'arrive pas a trouve de solution. de plus dans je fait dans ce meme formulaire un trie par "secteur" par ordre croissant cela ne marche pas!

  13. #13
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    Citation Envoyé par popofpopof Voir le message
    il me reste encore un bug dans le formulaire "consultation" quand je clique sur secteur j'ai un erreur je ne n'arrive pas a trouve de solution. de plus dans je fait dans ce meme formulaire un trie par "secteur" par ordre croissant cela ne marche pas!
    J'ai passé du temps sur ce problème d'incompatibilité de type de données, et je n'en trouve pas la cause exacte.
    C'est pour ça que je conseille de ne pas garder le modèle de la feuille excel.
    Au mieux je contourne le problème en réduisant le nombre de requêtes imbriquées.
    Par exemple pour la requête union regroup_planete
    Code sql : 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
    SELECT NOM_JOUEUR, Alliance, P1, ATTACABLE
    FROM donnée  where (([P1]) Is Not Null)
    union
    SELECT NOM_JOUEUR, Alliance, P2, ATTACABLE
    FROM donnée where (([P2]) Is Not Null)
    union
    SELECT NOM_JOUEUR, Alliance, P3, ATTACABLE
    FROM donnée where (([P3]) Is Not Null)
    union
    SELECT NOM_JOUEUR, Alliance, P4, ATTACABLE
    FROM donnée where (([P4]) Is Not Null)
    union
    SELECT NOM_JOUEUR, Alliance, P5, ATTACABLE
    FROM donnée where (([P5]) Is Not Null)
    union
    SELECT NOM_JOUEUR, Alliance, P6, ATTACABLE
    FROM donnée where (([P6]) Is Not Null)
    union
    SELECT NOM_JOUEUR, Alliance, P7, ATTACABLE
    FROM donnée where (([P7]) Is Not Null)
    union
    SELECT NOM_JOUEUR, Alliance, P8, ATTACABLE
    FROM donnée where (([P8]) Is Not Null)
    UNION SELECT NOM_JOUEUR, Alliance, P9, ATTACABLE
    FROM donnée where (([P9]) Is Not Null);
    De ce fait, je me passe de la requête regroup_planete_ok et la requête moteur_planete devient simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT regroup_planete.NOM_JOUEUR AS [Nom joueur], regroup_planete.Alliance, regroup_planete.P1 AS Planete, regroup_planete.ATTACABLE AS Attaquable, IIf([NAP]=Yes,"Oui","") AS NAP0, Left([P1],1) AS galaxy, eclatage([p1],1) AS secteur
    FROM ALLIANCE_NAP RIGHT JOIN regroup_planete ON ALLIANCE_NAP.NOM_ALLIANCE = regroup_planete.Alliance
    WHERE (((regroup_planete.NOM_JOUEUR)<>'0'))
    ORDER BY Left([P1],1), eclatage([p1],1);
    Enfin, dernier problème, la fonction Eclatage renvoie des strings alors que tu veux des nombres (pour trier et filtrer sur des intervalles).
    Voici une modification de la fonction de Philippe :
    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
    Public Function Eclatage(strDonnees As String, bytPos As Byte) As Long
        ' déclaration
        Dim Eclat() As String
        Dim strSep As String        ' récupération du séparateur
        Dim i As Integer
     
        ' on détecte d'abord le séparateur
        For i = 1 To Len(strDonnees)                    ' on parcourt les chiffres un à un dans une boucle
            If IsNumeric(Mid(strDonnees, i, 1)) Then    ' on test s'il s'agit d'un numérique
            Else
                strSep = Mid(strDonnees, i, 1)          ' on stocke le séparateur
                Exit For                                ' on sort de la boucle
            End If
        Next i
     
        ' éclatage de la chaine en fonction du séparateur trouvé
        Eclat = Split(strDonnees, strSep)
     
        ' on test bytpos s'il correspond à la plus grande valeur de la table pour éviter les erreurs de limites
        ' rappel que bytpos commence à 0
        If bytPos <= UBound(Eclat()) Then
            Eclatage = CLng(Eclat(bytPos))
        Else
            Eclatage = -1
        End If
    End Function
    Je persiste à penser qu'il serait plus simple de modifier la structure des données et à travailler sur un module d'importation qui transforme les données Excel en données ... base de données.

    A+

  14. #14
    Débutant  
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 745
    Points : 202
    Points
    202
    Par défaut
    je viens de faire tes modif LedZeppII mais j'ai une erreur avec le code de Philippe que tu as modifier "incompatibilite de type" dans j ouvre le formulaire.
    Fichiers attachés Fichiers attachés

  15. #15
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Le contenu du champ P5 pour le joueur bartabas n'est pas conforme à la syntaxe attendue : 2;356.9

    Voici une nouvelle adaptation qui prend en compte des séparateurs différents dans la même chaîne,
    ainsi que l'absence de données (ex: 1..3 ou 1.2.) :
    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
    Public Function Eclatage(strDonnees As String, bytPos As Byte) As Long
        ' déclarations
        Const C_STRVALERR = "-1"
        Dim Eclat() As String, sExtrait As String
        Dim i As Integer
     
        ' on remplace tout caractère non "0"-"9" par "." qui servira de séparateur
        For i = 1 To Len(strDonnees)
            If Not (Mid(strDonnees, i, 1) Like "[0-9]") Then
               If Mid(strDonnees, i, 1) <> "." Then Mid(strDonnees, i, 1) = "."
            End If
        Next i
     
        ' éclatage de la chaine
        Eclat = Split(strDonnees, ".")
     
        ' on test bytpos s'il correspond à la plus grande valeur de la table pour éviter les erreurs de limites
        ' rappel que bytpos commence à 0
        If bytPos <= UBound(Eclat()) Then
            sExtrait = Eclat(bytPos)
            If Len(sExtrait) = 0 Then sExtrait = C_STRVALERR  ' si chaîne vide on affecte la chaîne erreur C_STRVALERR
        Else
            sExtrait = C_STRVALERR ' on affecte la chaîne erreur C_STRVALERR
        End If
        Eclatage = CLng(sExtrait)
    End Function
    A+

  16. #16
    Invité
    Invité(e)
    Par défaut
    Re

    Citation Envoyé par LedZeppII Voir le message
    Je persiste à penser qu'il serait plus simple de modifier la structure des données et à travailler sur un module d'importation qui transforme les données Excel en données ... base de données.
    Tout à fait d'accord avec toi, la fonction n'est qu'un palliatif.

    Philippe

  17. #17
    Débutant  
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 745
    Points : 202
    Points
    202
    Par défaut
    SUPER SUPER avec ton nouveau code le filtre sur secteur marche nickel donc tout est bon plus erreur
    merci a vous deux pour vos divers solutions

    merci les chefs

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2002] Pb pour update un champ par plusieurs champs d'autre table
    Par babycoca dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 03/09/2009, 17h09
  2. Réponses: 2
    Dernier message: 21/08/2008, 12h46
  3. Réponses: 6
    Dernier message: 01/08/2008, 10h05
  4. Sum de plusieurs champs dans plusieurs tables
    Par Cylc dans le forum Requêtes
    Réponses: 1
    Dernier message: 06/10/2006, 10h13

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