Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Requêtes et SQL.
Requêtes et SQL. Tout ce qui concerne vos questions sur les requêtes et le SQL sous Access se trouve ici.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/12/2010, 20h50   #1
Invité de passage
 
benjamin vallet
Inscription : avril 2010
Messages : 10
Détails du profil
Informations personnelles :
Nom : benjamin vallet

Informations forums :
Inscription : avril 2010
Messages : 10
Points : 1
Points : 1
Par défaut Récupérer chaîne de caractères séparées par virgules

Bonjour à tous,

J'ai une table contenant un champ N° Série, dans ce champ, je peux avoir plusieurs numéros séparés par des virgules.
Je voudrais récupérer chaque numéro et le réintégrer dans le champ N° Série.
Après je supprimerai les doublons (ce n'est pas le plus compliqué).
Voici un extract du champ.

N° Série
6581,6586,6613,6643
6581,6586,6613,6643
6581,6586,6613,6643
6581,6586,6613,6643
6581,6586,6613,6643
6581,6586,6613,6643
6581,6586,6613,6643
6563,6575,6591,6594,6600,6602,6607,6608,6610,6611,6620,6623,6627,6630,6632,6633,6634,6635,6637,6638,6639,6641,6645,6647
6563,6575,6591,6594,6600,6602,6607,6608,6610,6611,6623,6630,6633,6634,6637,6639,6641,6645,6647
6544,6545,6546,6547,6558,6559,6562,6569,6576,6577,6581,6586,6595,6599,

Merci d'avance et bonnes fêtes.
benziz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2010, 10h12   #2
Membre éclairé
 
Homme Pierre-Jean
Développeur informatique
Inscription : février 2010
Messages : 306
Détails du profil
Informations personnelles :
Nom : Homme Pierre-Jean
Âge : 31
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : février 2010
Messages : 306
Points : 330
Points : 330
Envoyer un message via MSN à paidge
Bonjour,

Ce n'est pas très clair J'ai bien compris que tu veilles récupérer chaque nombre. Par exemple :

AAAA,BBBB,CCCC,DDDD

Tu récupères AAAA puis BBBB puis CCCC puis DDDD. ça c'est facile. Mais je n'ai pas compris ce que tu veux en faire...."Les réintégrer dans le champ N° de série" ?? Qu'est-ce que tu entends par là ?
paidge est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2010, 12h07   #3
Invité de passage
 
benjamin vallet
Inscription : avril 2010
Messages : 10
Détails du profil
Informations personnelles :
Nom : benjamin vallet

Informations forums :
Inscription : avril 2010
Messages : 10
Points : 1
Points : 1
Bonjour Paidge,

je comprends que tu aies du mal à comprendre ma question.
je veux me servir de la totalité des nombres pour qu'ils apparaissent dans une liste déroulante (un item=un nombre).
Est-ce plus clair?
benziz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2010, 12h34   #4
Membre éclairé
 
Homme Pierre-Jean
Développeur informatique
Inscription : février 2010
Messages : 306
Détails du profil
Informations personnelles :
Nom : Homme Pierre-Jean
Âge : 31
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : février 2010
Messages : 306
Points : 330
Points : 330
Envoyer un message via MSN à paidge
Donc tu veux récupérer les nombres pour créer une nouvelle table ou les insérer dans une existante alors ? De manière à baser ta liste déroulante sur cette table si je comprends bien.
paidge est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2010, 12h41   #5
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 176
Points : 2 805
Points : 2 805
Bonjour Benziz et Paidge,

Je me permets de m'immisser dans ce fil.

Il me semble comprendre, mais je peux me tromper, que la table à traiter ("en entrée") est composée comme suit :

Table T1 :
- N° Série (champ texte ou mémo)
Contenu :
"6581,6586,6613,6643"
...

Il semble falloir générer une table ("en sortie") comme suit :
Table T2 :
- numero_serie (champ de x caractères, 4 visiblement)
Contenu :
"6581"
"6586"
"6613"
"6643"
...

Un petit bout de code qui va bien devrait le faire (je ne connais pas VBA) :
  1. lire T1 ;
  2. spliter N° Série en X chaînes de caractères (séparateur ",") ;
  3. pour chaque élément après "splitage" : INSERT dans T2 ;
  4. retour à 1.

Peut-être, tester l'existence avant le INSERT, pour faire propre... bien que
Citation:
Après je supprimerai les doublons (ce n'est pas le plus compliqué).
__________________
Dis-nous et à bientôt,
Richard.
----------------------------------------------------------------------------------------------
En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2010, 15h42   #6
Membre éclairé
 
Homme Pierre-Jean
Développeur informatique
Inscription : février 2010
Messages : 306
Détails du profil
Informations personnelles :
Nom : Homme Pierre-Jean
Âge : 31
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : février 2010
Messages : 306
Points : 330
Points : 330
Envoyer un message via MSN à paidge
Tout à fait ça Richard Enfin si on a bien compris le besoin de benziz.
Même si je ne suis qu'un amateur en VBA, voilà une fonction que je viens d'écrire (et qui fonctionne !). Les spécialistes corrigeront ou amélioreront :

Code :
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
Public Function Splitter(MaTable1 As String)
 
    ' ===== Déclaration =====
    Dim rstTable1 As Recordset, rstTable2 As Recordset
    Dim strSerial As String, strChaine As String
    Dim X As Integer
    Dim doublon As Boolean
 
    Set rstTable1 = CurrentDb.OpenRecordset(MaTable1)
    rstTable1.MoveFirst
 
' ===== Parcours de la table =====
    While Not rstTable1.EOF
        strSerial = rstTable1("N° de série")
        X = 1
 
        Do Until X = 0
            doublon = False
            X = InStr(1, strSerial, ",", vbTextCompare) ' Longueur de la chaîne jusqu'à la virgule
            If X = 0 Then ' Si on se trouve sur le dernier numéro
                strChaine = strSerial
            Else
                strChaine = Mid(strSerial, 1, X - 1)
            End If
 
            strSerial = Mid(strSerial, Len(strChaine) + 2)  ' On enlève le numéro en cours avec la virgule qui le suit
 
            Set rstTable2 = CurrentDb.OpenRecordset("MaTable2") ' Table de destination
' ===== Parcours de la table de destination à la recherche de doublons =====
            If Not rstTable2.EOF Then
                rstTable2.MoveFirst
                Do While Not rstTable2.EOF
                    If rstTable2("MonChamp") = strChaine Then
                        doublon = True
                        Exit Do
                    End If
                    rstTable2.MoveNext
                Loop
            End If
            Set rstTable2 = Nothing
 
            If Not doublon Then
                '===== On insère strChaine dans Table2 =====
                DoCmd.SetWarnings False
                DoCmd.RunSQL "INSERT INTO MaTable2 (MonChamp) SELECT " & strChaine & " AS Expr1;"
                DoCmd.SetWarnings True
            End If
        Loop
        rstTable1.MoveNext
    Wend
 
    Set rstTable1 = Nothing
 
End Function
Tu appelles la fonction en écrivant :
Code :
1
2
 
Splitter("NomDeTaTable")
paidge est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2010, 17h15   #7
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 176
Points : 2 805
Points : 2 805
Bonsoir Paidge,

Il me semblait que la fonction Split() existe dans Access, non ?

Fonction Split()

Juste pour un fun de codeur...
__________________
Dis-nous et à bientôt,
Richard.
----------------------------------------------------------------------------------------------
En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/12/2010, 09h26   #8
Membre éclairé
 
Homme Pierre-Jean
Développeur informatique
Inscription : février 2010
Messages : 306
Détails du profil
Informations personnelles :
Nom : Homme Pierre-Jean
Âge : 31
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : février 2010
Messages : 306
Points : 330
Points : 330
Envoyer un message via MSN à paidge
Ah oui effectivement ça fait plus propre :
Code :
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
 
Public Function Splitter(MaTable1 As String)
 
    ' ===== Déclaration =====
    Dim rstTable1 As Recordset, rstTable2 As Recordset
    Dim tabChaine() As String
    Dim i As Integer
    Dim doublon As Boolean
 
    Set rstTable1 = CurrentDb.OpenRecordset(MaTable1)
    rstTable1.MoveFirst
 
' ===== Parcours de la table =====
    While Not rstTable1.EOF
        tabChaine = Split(rstTable1("N° de série"), ",", -1, vbTextCompare)
        For i = 0 To UBound(tabChaine)
            doublon = False
            Set rstTable2 = CurrentDb.OpenRecordset("MaTable2") ' Table de destination
' ===== Parcours de la table de destination à la recherche de doublons =====
            If Not rstTable2.EOF Then
                rstTable2.MoveFirst
                Do While Not rstTable2.EOF
                    If rstTable2("MonChamp") = tabChaine(i) Then
                        doublon = True
                        Exit Do
                    End If
                    rstTable2.MoveNext
                Loop
            End If
            Set rstTable2 = Nothing
 
            If Not doublon Then
                '===== On insère tabChaine(i) dans Table2 =====
                DoCmd.SetWarnings False
                DoCmd.RunSQL "INSERT INTO MaTable2 (MonChamp) SELECT " & tabChaine(i) & " AS Expr1;"
                DoCmd.SetWarnings True
            End If
        Next i
        rstTable1.MoveNext
    Wend
 
    Set rstTable1 = Nothing
 
End Function
paidge est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/12/2010, 10h06   #9
Rédacteur

 
Avatar de ClaudeLELOUP
 
Homme Claude LELOUP
Chercheur de loisirs (ayant trouvé !)
Inscription : novembre 2006
Messages : 5 242
Détails du profil
Informations personnelles :
Nom : Homme Claude LELOUP
Âge : 66
Localisation : Belgique

Informations professionnelles :
Activité : Chercheur de loisirs (ayant trouvé !)
Secteur : Finance

Informations forums :
Inscription : novembre 2006
Messages : 5 242
Points : 11 037
Points : 11 037
Bonjour,

Si les exemples donnés sont représentatifs (Ordre croissant et pas de doublon),
une solution plus simple :

Dans ta zone de liste :
la propriété origine source : Liste valeurs. Exemple :
(Me.TaZdl.RowSourceType="Liste valeurs")
la propriété Contenu : Replace(laListeExemple ; ".";";"). Exemple :
( Me.TaZdl.RowSource = Replace(laListeExemple, ".",";") )
__________________
Amoureuse/amoureux de la langue française ? Vous pouvez nous aider à corriger nos ressources !
ClaudeLELOUP est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h31.


 
 
 
 
Partenaires

Hébergement Web