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

VBA Access Discussion :

Incrémenter une colonne en fonction d'une autre [Toutes versions]


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Par défaut Incrémenter une colonne en fonction d'une autre
    Bonjour à tous,
    Je suis plutôt novice en Access et encore plus en VBA appliqué à Access.
    Je ne sais pas trop si ce que je veux faire peut se faire directement par une requête ou si une macro VBA est plus adaptée.

    En effet, j'ai une table avec plusieurs champs :
    Num_fournisseur, ..., Type_Produit ...

    Bien entendu un même numéro de fournisseur est répeté autant de fois qu'il y a de Type de produit. De plus la table est ordonnée dans l'ordre croissant, par fournisseur puis par type de produit.
    Je souhaiterais donc crée un champs supplémentaire dans lequel il y aurai une incrémentation pour chaque nouveau fournisseur, pour avoir ainsi un tableau du type :

    Fournisseur1 Produit1 1
    Fournisseur1 Produit2 2
    Fournisseur1 Produit3 3
    Fournisseur2 Produit1 1
    Fournisseur2 Produit2 2
    Fournisseur3 Produit1 1
    Fournisseur3 Produit2 2
    Fournisseur3 Produit4 3
    Fournisseur3 Produit4 4

    Le but final est de pouvoir ne faire des selections que par le numéro de produit issu de l'incrémentation.

    Je n'ai rien trouver au niveau des requête et en ce qui concerne le VBA je ne connais pas.
    Si on peut le faire par une requête désolé de m'être trompé de forum. Sinon, merci de bien vouloir me donner un petit coup de pouce pour le VBA, si possible.

    Cordialement.

    Simon

  2. #2
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 133
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    Cela reste un problème de modélisation.
    Tu dois avoir une table Fournisseurs et une table Produits.

    Dans la table Fournisseurs, un IDFournisseur (No Auto) plus toutes ses infos le concernant...
    Dans la table Produits, un IDProduit (No Auto) comme clé primaire et un IDFournisseur (Numérique Long) plus toutes ses infos le concernant...

    Mais en aucun cas, les produits et fournnisseurs dans la même table... Sinon, bien utilise Excel.

    Après, effectivement, si tu veux pouvoir sélectionner un produit d'après une certaine syntaxe, il te faudra user d'un liste déroulante qui accepte la saisie semi automatique ou bien mettre en place un algorithme de recherche approchée de l'occurence en cours de frappe...

    Peux-tu donner des exemples réels d'identifiants produit sans altérer les clauses de confidentialité de ton entreprise.

    Argy
    Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

    Ils comptent sur vous...
    Web Site@Mail
    Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
    MDB Viewer : Visionneuse Access v4.0

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Par défaut
    En fait je me suis mal exprimé quant à la table que j'ai.
    Elle est du type :

    Fournisseur_1 Produit_1_1 1
    Fournisseur_1 Produit_1_2 2
    Fournisseur_1 Produit_1_3 3
    Fournisseur_2 Produit_2_1 1
    Fournisseur_2 Produit_2_2 2
    Fournisseur_3 Produit_3_1 1
    Fournisseur_3 Produit_3_2 2
    Fournisseur_3 Produit_3_4 3
    Fournisseur_3 Produit_3_4 4

    Aucun produit n'est identique. Il n'y a pas de doublons. Donc l'existance de deux tables distincts n'a pas lieu d'être. Par rapport à ce que tu me conseillais de faire on peut considérer qu'il s'agit déjà de la table "Produits".

    Je veux donc faire une selection que sur le 1er produit de chaque fournisseur par exemple.

  4. #4
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 133
    Billets dans le blog
    5
    Par défaut
    Dans ce cas, il faut qu'a chaque entrée de nouveaux produit, tu obtiennes la valeur Max du dernier produit entré avec la condition que si aucun produit n'existe sera 1 sinon Rang+1, soit par exemple pour ajouter un nouveau produit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim lngMaxRank As Long
    lngMaxRank = DMax("Rang", "Produits", "[NomProduit] = '" & ValeurSouhaitée &"'") +1
    SQL = "INSERT INTO Produits (NomProduit, Rang) VALUES ('Fournisseur X Produit X_X', " & lngMaxRank & ")"
    CurrentDB.Execute SQL, dbSeeChanges
    Dans ta table doit alors exister un champ Produit tel que tu l'as défini et un champ Rang qui classe chacun d'eux chronologiquement...
    Chose que tu as écrites en fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    NomProduit                   Rang
    ¯¯¯¯¯¯¯¯¯¯                   ¯¯¯¯
    Fournisseur_1 Produit_1_1    1
    Fournisseur_1 Produit_1_2    2
    Fournisseur_1 Produit_1_3    3
    Donc une requête pour faire une selection que sur le 1er produit de chaque fournisseur par exemple serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT NomProduit FROM Produits WHERE Rang = 1
    Argy
    Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

    Ils comptent sur vous...
    Web Site@Mail
    Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
    MDB Viewer : Visionneuse Access v4.0

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Par défaut
    J'ai saisie le principe de ton code. Mais certains détail m'échappe, si bien que je ne parviens pas à écrire correctement mon propre code.
    Ma table de départ se nomme "LISTE_PRODUITS" et est de la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Num_fournisseur    Type_Produit
    Fournisseur_1       Produit_1_1 
    Fournisseur_1       Produit_1_2 
    Fournisseur_1       Produit_1_3 
    Fournisseur_2       Produit_2_1 
    Fournisseur_2       Produit_2_2 
    Fournisseur_3       Produit_3_1 
    Fournisseur_3       Produit_3_2 
    Fournisseur_3       Produit_3_4 
    Fournisseur_3       Produit_3_4
    Si j'interprête bien ton code :
    Code :
    Dim lngMaxRank As Long
    lngMaxRank = DMax("Rang", "Produits", "[NomProduit] = '" & ValeurSouhaitée &"'") +1
    SQL = "INSERT INTO Produits (NomProduit, Rang) VALUES ('Fournisseur X Produit X_X', " & lngMaxRank & ")"
    CurrentDB.Execute SQL, dbSeeChanges
    "Rang" est le futur champs Rang que l'on ajoutera à la table LISTE_PRODUITS d'origine.
    "Produits" est le nom de la table.
    Mais je ne vois pas à quoi correspond le "[NomProduit]" ni ValeurSouhaitée".
    Ensuite, les "X" présent après fournisseur et produit, comment sont-ils remplis. Peut-on se passer de cette variable sachant que le rang est un champs venant se greffer à la suite de Num_Fournisseur et Type_Produit.

    Enfin, je n'est pas vraiement compris, mais là c'est d'ordre générale, comment l'exécution d'une macro VBA sous Access peut interagir directement sur les tables ou les requêtes. Cela n'ai pas aussi clair que sous Excel je trouve.
    Voila quelques interrogations.
    Merci encore pour les réponses.

    Simon

  6. #6
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 133
    Billets dans le blog
    5
    Par défaut
    Oui Rang est un nouveau champ de type Numérique Entier Long.

    En fait, j'ose supposer que ni tes fournisseurs ni tes produit ne s'appellent ainsi.
    Donc, l'algo a pour principe, sur les propos que tu m'as évoqué, de te sortir la liste des produits 1 de chaque fournisseur...
    Donc si les produits 1 sont respectivement Truc, Machin et Bidule, on se fiche de leur nom du fait que l'on ne cherche que ceux ayant pour rang 1.

    Après correction, le code exemple devient :
    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
    Sub AjouterProduit()
    Dim lngMaxRank                                         As Long
    Dim strQuelFournisseur                                 As String
    Dim strQuelProduit                                     As String
        ' Au choix par question ou par fonction, à toi de définir
        strQuelFournisseur = InputBox("A quel fournisseur appartient ce produit ?", "Nom du Fournisseur")
        ' On demande le nom du fournisseur (On vérifie si une valeur est saisie)
        If strQuelFournisseur <> "" Then
            ' On demande le nom du produit à ajouter
            strQuelProduit = InputBox("Quel est le nom du produit ?", "Nom du produit")
            ' On vérifie si une valeur est saisie
            If strQuelProduit <> "" Then
                ' On cherche le Max de Rang + 1
                lngMaxRank = DMax("Rang", "LISTE_PRODUITS", "[Num_fournisseur] = '" & strQuelFournisseur & "'") + 1
                ' On construit la clause SQL
                SQL = "INSERT INTO LISTE_PRODUITS (Num_fournisseur, Type_Produit, Rang) VALUES ('" & strQuelFournisseur & "', '" & strQuelProduit & "', " & lngMaxRank & ")"
                ' On exécute la requête...
                CurrentDb.Execute SQL, dbSeeChanges
            End If
        End If
    End Sub
    Pour ton apprentissage du VBA, il faut que tu fasses un tour du coté des cours de ce forum...

    Argy
    Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

    Ils comptent sur vous...
    Web Site@Mail
    Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
    MDB Viewer : Visionneuse Access v4.0

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/11/2012, 19h11
  2. Trier une colonne en fonction d'une autre colonne
    Par Joelatack dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 11/06/2012, 14h27
  3. [XL-2003] Compter valeurs d'une colonne en fonction d'une autre colonne
    Par greggy dans le forum Excel
    Réponses: 2
    Dernier message: 03/11/2009, 12h51
  4. Somme d'une colonne en fonction d'une autre
    Par j.mathieu dans le forum Excel
    Réponses: 6
    Dernier message: 16/08/2008, 14h55
  5. Contraite NULL sur une colonne en fonction d'une autre colon
    Par speedy1496 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/04/2004, 19h29

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