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

Access Discussion :

Incrémenter un champs à chaque changement de Nom [AC-2007]


Sujet :

Access

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2011
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 32
    Points : 20
    Points
    20
    Par défaut Incrémenter un champs à chaque changement de Nom
    Bonjour,

    Tout est dans le titre et dans l'exemple ci-dessous:

    NOM |Jour |Champs Incrémenté

    Daniel |Lundi |1
    Daniel |Mercredi |2
    Daniel |Vendredi |3
    Antoine |Lundi |1
    Francis |Lundi |1
    Francis |Samedi |2
    Francis |Dimanche |3
    Thomas |Lundi |1
    Thomas |Mardi |2

    etc...

    Merci d'avance,

    JP

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

    Est-ce que c'est au fur et à mesure de l'entrée des données (dans ce cas, il faudrait donner des précisions).

    Ou est-ce que c'est une fois pour toute ?

    Philippe

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2011
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 32
    Points : 20
    Points
    20
    Par défaut
    Bonjour,

    C'est une table qui sera supprimée et recréer, avec le nombre d'enregistrement total pouvant varier.

    Peut être que la prochaine fois, on aura que deux enregistrements pour le nom "Francis".

    merci,

    JP

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    Une requête, ça irait ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT T.nom,
           T.jour,
           (SELECT Count(*)
            FROM   brasileiro
            WHERE  nom = T.nom
                   AND Switch(jour = "lundi", 1, jour = "mardi", 2, jour = "mercredi", 3, jour = "jeudi", 4, jour = "vendredi", 5, jour = "samedi", 6, jour = "dimanche", 7) <=
               Switch(T.jour = "lundi", 1, T.jour = "mardi", 2, T.jour = "mercredi", 3, T.jour = "jeudi", 4, T.jour = "vendredi", 5, T.jour = "samedi", 6, T.jour = "dimanche", 7)) AS Inc
    FROM   brasileiro AS T
    ORDER  BY T.nom,
    Switch(T.jour = "lundi", 1, T.jour = "mardi", 2, T.jour = "mercredi", 3, T.jour = "jeudi", 4, T.jour = "vendredi", 5, T.jour = "samedi", 6, T.jour = "dimanche", 7);
    Philippe

  5. #5
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    Salut PhilippeS ;P et bienvenu Brasileiro,

    Je suppose que pour un NOM il peut exister plusieurs Jour identique non? et que cela commence pas forcément par un lundi?
    il se peut qu'un NOM se trouve parsemé ailleurs dans la liste?
    l'ordre de l'exemple est un ordre de saisie? existe-t-il dans ce cas un champ définissant cet ordre de saisie: date, autoincrément...?


  6. #6
    Membre à l'essai
    Inscrit en
    Février 2011
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 32
    Points : 20
    Points
    20
    Par défaut
    Bonsoir Philben et Vodiem,

    Philben,
    merci de ton aide mais je pense que cela doit être encore plus simple, car je n'ai renseigner des jour de semaine qu à titre d exemple.
    En effet, la table est constituée de code produit à 6 chiffres, une position de taille et le champs qui recevra l'incrementation.

    Exemple

    Code produit | position taille | champ incrémenté
    111456 |4 |1
    111456 |6 |2
    111456 |7 |3
    222577 |6 |1
    222577 |7 |2
    454599 |3 |1
    454599 |5 |2
    454599 |6 |3

    À chaque changement de code, l incrementation repart de 1.

    Vodiem,

    1) en effet on peut avoir pour un même code, 2 position de taille identique.
    Pour ce cas je souhaite qu il incrémente la série comme l exemple ci-dessous:
    222577 |6 |1
    222577 |7 |2
    454599 |3 |1
    454599 |3 |2
    454599 |6 |3

    2) ça commencera toujours par 1

    3) en effet ils se trouve que le nom soit parsemé, cependant je me debrouillerait pour trier la table par ordre croissant d abord par les codes produits puis par la position de taille , pour ensuite faire l incrément.

    4) pas d'ordre de saisie,ni autoincrement.

    Merci d avance pour votre aide

    JP

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    Au début tu étais à la RH, maintenant Asset Manager....

    Bref, si l'énoncé du problème ne change pas et si on ne peut pas ajouter un autoincrément à la table, la seule solution que je vois dans ce cas est encore plus complexe que la requête précédente :

    1) Ajouter une table nommée tChiffre ayant une seule colonne Chiffre de type entier long

    2) Ajouter dans cette table les lignes suivantes : 0,1,2,3,4,5,6,7,8,9

    3) la requête :
    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
    34
    35
    36
    37
    38
    39
    40
     
    SELECT t1.codeproduit,
           t1.positiontaille,
           Count(*) AS Inc
    FROM   (SELECT codeproduit,
                   positiontaille,
                   codeproduit & "-" & positiontaille & "-" & nombre AS Id
            FROM   (SELECT codeproduit,
                           positiontaille,
                           Count(*) AS Num
                    FROM   brasileiro2
                    GROUP  BY codeproduit,
                              positiontaille) AS T,
                   (SELECT N1.chiffre * 100 + N2.chiffre * 10 + N3.chiffre AS Nombre
                    FROM   tchiffres AS N1,
                           tchiffres AS N2,
                           tchiffres AS N3) AS N
            WHERE  nombre < num) AS T1
           INNER JOIN (SELECT codeproduit,
                              positiontaille,
                              codeproduit & "-" & positiontaille & "-" & nombre AS
                              ID
                       FROM   (SELECT codeproduit,
                                      positiontaille,
                                      Count(*) AS Num
                               FROM   brasileiro2
                               GROUP  BY codeproduit,
                                         positiontaille) AS T,
                              (SELECT
                      N1.chiffre * 100 + N2.chiffre * 10 + N3.chiffre AS
                      Nombre
                               FROM   tchiffres AS N1,
                                      tchiffres AS N2,
                                      tchiffres AS N3) AS N
                       WHERE  nombre < num) AS T2
                   ON ( T1.codeproduit = t2.codeproduit )
                      AND ( T1.id >= T2.id )
    GROUP  BY t1.codeproduit,
              t1.positiontaille,
              t1.id;
    on peut simplifier la requête :
    1) si le nombre de doublon par produit est < à 1000
    2) en créant d'abord une requete que l'on appelle à la place des 2 sous-requêtes de la requete précédente.

    Le plus simple reste d'ajouter un colonne autoincrémentée dans la table...


    Philippe

  8. #8
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut
    Hello

    La question qui me vient à l'esprit est "comment sont insérées tes données ?"
    -> par création de table ?
    -> par insertion ?
    -> par entrée directe dans la table ?

    Pourquoi ne pas implémenter un pseudo-trigger lors de l'insertion d'une donnée ?
    Pour ça, il faudrait éviter d'insérer tes données directement dans la table, mais passer par une procédure VBA qui va calculer la valeur de ton champ incrémenté.

  9. #9
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    Salut guidav,

    @philben: he oui, c'est l'avantage d'être polyvalent... ^^

    @Brasileiro: tu veux en fait énumérer les produits par groupe de code produit?

  10. #10
    Membre à l'essai
    Inscrit en
    Février 2011
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 32
    Points : 20
    Points
    20
    Par défaut
    Vodiem,

    tu as tout compris. Quelle capacité de synthèse! lol

    Philben,

    J'adapterai ton code de la requête ce soir, quelques urgences sont apparues cette aprème.
    Je reviens vers toi pour dire si ça marche.

    Merci à vous!

    JP

  11. #11
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    Quelle capacité de synthèse!
    c'est vrai, il est pas mauvais... c'est pour ça que c'est un pote

    quelques urgences sont apparues cette aprème
    Un dépannage au service compta après un renfort du service commercial et un passage au service IT ?

    Je reviens vers toi pour dire si ça marche
    Ca marche c'est sûr, sauf qu'il ne faut pas que le nombre de lignes soit trop important (< 500 ?) et il faut que les colonnes soient indexées...

  12. #12
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    Citation Envoyé par Brasileiro
    Quelle capacité de synthèse!
    Citation Envoyé par philben
    c'est vrai, il est pas mauvais
    que de flatteries... si vous en avez d'autre : je suis preneur lol

    bon je me sens obligé de mettre du code alors?
    je vais pas batailler avec le maitre Philben sur le SQL donc je propose du VB:
    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 BImp()
    maTable = "Brasileiro"
    monChampEnum = "Code produit"
     
    Dim i As Long
    Dim v As Variant
    Dim rs As Recordset
     
    On Error Resume Next
    DoCmd.RunSQL "ALTER TABLE [" & maTable & "] DROP COLUMN indice"
    DoCmd.RunSQL "ALTER TABLE [" & maTable & "] ADD COLUMN indice INTEGER"
    On Error GoTo 0
     
    Set rs = CurrentDb.OpenRecordset("SELECT * FROM [" & maTable & "] ORDER BY [" & monChampEnum & "]")
    i = 1
    If Not rs.EOF Then v = rs.Fields(monChampEnum)
    While Not rs.EOF
        If rs.Fields(monChampEnum) <> v Then
            v = rs.Fields(monChampEnum)
            i = 1
        End If
        rs.Edit
        rs![indice] = i
        rs.Update
        i = i + 1
        rs.MoveNext
    Wend
    End Sub
    avantage: pas de contrainte.
    inconvénient: que des avantages.
    et si par malheur une erreur se produit: il suffit de retirer "On Error Goto 0"


  13. #13
    Membre à l'essai
    Inscrit en
    Février 2011
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 32
    Points : 20
    Points
    20
    Par défaut Et Voilà...
    hello à tous,

    D'abord je remercie à Philben et Vodiem de leur aide concernant ma demande

    J'étais un peu débordé ces dernier temps (et oui Philben, un petit passage à la RH après, contrôle de gestion etc...)

    Bon, les 2 méthodes fonctionnent à merveille!
    J'ai testé sur un échantillon de 36 enregistrements et ça marche comme je veux.

    Juste une pécision, le code en SQL proposé par Philben met considérablement plus de temps d'éxécution que celui de Vodiem, environ 2 minutes (pour 36 enregistrments dans la table).
    Philben, quel est le temps d'éxécution chez toi?

    Le code proposé par Vodiem est instantané sur cet échantillon de 36 enrgts.

    Compte tenant des délais qui me sont donnés et que je devrais agir sur 3000 enregistrements en moyenne, je partirai sur l'utilisation du recordset.

    Bien sûr, ne pas oublier d'activer la référence ADO.


    Bien à vous,

    JP

  14. #14
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    bonjour,

    Juste une pécision, le code en SQL proposé par Philben met considérablement plus de temps d'éxécution que celui de Vodiem, environ 2 minutes (pour 36 enregistrments dans la table).
    Philben, quel est le temps d'éxécution chez toi?
    Pour ma part, avec une base locale et indexation de la colonne "Code Produit", la requête est complétée en un peu plus de 10 secondes pour 1000 enregistrements...

    Plus de 2 mn pour 36 enr. , je ne peux pas me battre contre la solution de salon de coiffure de Diem !

    Bravo mon pote et bonne continuation au très sympathique Brasileiro

    Au plaisir,

    Philippe

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

Discussions similaires

  1. [AC-2007] Dans requetes, changement parasite nom de champ "PV" vers "VA"
    Par TaoDev dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 05/02/2010, 15h37
  2. [XL-2003] changement du nom d'un objet à chaque ouverture d'excel
    Par pastis.vi dans le forum Excel
    Réponses: 7
    Dernier message: 18/11/2009, 15h39
  3. Réponses: 6
    Dernier message: 04/05/2009, 14h59
  4. Réponses: 10
    Dernier message: 20/04/2007, 11h41
  5. [VBA-E] Excel transfert de cellules à chaque changement de nom
    Par zootman dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 09/06/2006, 10h29

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