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 :

Recherche de combinaisons


Sujet :

VBA Access

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    153
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 153
    Points : 75
    Points
    75
    Par défaut Recherche de combinaisons
    Voici une question que j'ai posée dans la section IHM

    J'ai conclut que SQL ne pouvait pas traiter mon problème.


    Voici mon exemple:

    J'ai un fournisseur: "Durandal"
    J'ai une facture de 100€ au nom de "Durandal"

    J'ai plusieurs livraisons d'articles:

    110€
    50€
    60€
    40€
    20€
    10€

    La question est de pouvoir me retourner toutes les combinaisons possibles dont la somme est égale à 100€
    La jointure est le Fournisseur.
    Si une requête existe elle devrait commencée par isoler tout les montants inférieurs à 100€

    Les combinaisons possibles sont à vu d'oeil
    (50€;40€;10€)
    (60€;40€)

    Intuitivement, je pense utiliser une ou des boucles, mias comment?
    je cherche toujours,


    Gentoo

  2. #2
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    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 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    J'ai du mal à comprendre pourquoi SQL ne peut répondre favorablement.
    Si tu isoles toutes tes livraisons dont le montant est inférieur à 100 € d'une part que que tu poses le critère "Durandal" d'autre part, je ne vois pas pourquoi il ne te retourne pa ce que tu veux.

    Peux tu détailler ?

    Argy

    P.S. Ce n'est pas VBA qui va résoudre la problématique...
    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
    *** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    153
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 153
    Points : 75
    Points
    75
    Par défaut
    Merci Argy de ton concours,

    En fait je voudrais avoir comme réponse les différentes combinaisons dont la somme est 100€ le rattachant bien entendu à Durandal.

    Mais c'est vrai qu'il me semble qu'une requête ne peut analyser tous les cas et proposer des combinaisons.


  4. #4
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    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 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    Effectivement...
    Euh et pour ma gouverne, à quoi cela va t-il servir ? Des stats ?

    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
    *** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***

  5. #5
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    153
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 153
    Points : 75
    Points
    75
    Par défaut
    Non pas des stats, mais repérer réellement les livraisons possibles pour ensuite faire le tri avec l'oeil humain

  6. #6
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    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 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    J'ai retrouvé un code dont j'ignore aujoud'hui la source et qui permettait cela et je te l'ai adapté pour ton besoin. Modifie la constante et le nom du champ :

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
     
    Option Compare Database
    Option Explicit
    Option Base 1
     
    Dim m_vntaAmounts                                      As Variant
    Dim m_intaBound()                                      As Integer
    Dim m_intaData()                                       As Integer
    Dim m_intDataIndex                                     As Integer
    Dim m_strComboResult                                   As String
    Dim m_intSubGroup                                      As Integer
    Dim m_intCountCombo                                    As Integer
     
    Public Sub GetCombinaisons()
    Const SQL                                              As String = "SELECT * FROM tblCombinaison WHERE Fournisseur ='Durandal'"
    Dim oRS                                                As DAO.Recordset
    Dim sngaAmounts()                                      As Integer
    Dim intMaxValue                                        As Integer
    Dim strMaxValue                                        As String
    Dim V                                                  As Integer
     
        m_strComboResult = vbNullString
        m_intCountCombo = 0
        m_intSubGroup = 0
     
        strMaxValue = InputBox("Quel montant pour la combinaison ?", "Amount", 100)
        intMaxValue = CInt(strMaxValue)
        If Len(strMaxValue) And IsNumeric(strMaxValue) Then
            Set oRS = CurrentDb.OpenRecordset(SQL, dbOpenDynaset)
            With oRS
                Do While Not .EOF
                    V = V + 1
                    ReDim Preserve sngaAmounts(1 To V)
                    sngaAmounts(V) = .Fields("Montant").Value
                    .MoveNext
                Loop
                .Close
            End With
            Set oRS = Nothing
        End If
        m_vntaAmounts = sngaAmounts
        Call CreateCombos(m_vntaAmounts, intMaxValue)
        MsgBox m_strComboResult, , m_intCountCombo & " combinaisons trouvées"
     
        Erase m_vntaAmounts
        Erase m_intaBound
        Erase m_intaData
     
    End Sub
     
    Private Sub CreateCombos(ByRef m_vntaAmounts, ByVal MaxAmount As Integer)
    Dim intIndex                                           As Integer
     
        m_intDataIndex = 0
        ReDim m_intaBound(UBound(m_vntaAmounts))
        ReDim m_intaData(CountCombos(UBound(m_vntaAmounts)), UBound(m_vntaAmounts) + 1)
        For intIndex = 1 To UBound(m_vntaAmounts)
            m_intSubGroup = intIndex
            CreateSingleCombo 1, 0
        Next intIndex
        FindSumAndPrint MaxAmount
    End Sub
     
    Private Sub StoreCombo()
    Dim I                                                  As Integer
    Dim intSum                                             As Integer
        m_intDataIndex = m_intDataIndex + 1
        For I = 1 To UBound(m_vntaAmounts)
            If m_intaBound(I) = 0 Then
                m_intaData(m_intDataIndex, I) = 0
            Else
                m_intaData(m_intDataIndex, I) = m_vntaAmounts(I)
                intSum = intSum + m_vntaAmounts(I)
            End If
        Next I
        m_intaData(m_intDataIndex, UBound(m_vntaAmounts) + 1) = intSum
    End Sub
     
    Private Sub CreateSingleCombo(ByVal J As Integer, ByVal M As Integer)
        If J > UBound(m_vntaAmounts) Then
            StoreCombo
        Else
            If m_intSubGroup - M < UBound(m_vntaAmounts) - J + 1 Then
                m_intaBound(J) = 0
                CreateSingleCombo J + 1, M
            End If
            If M < m_intSubGroup Then
                m_intaBound(J) = 1
                CreateSingleCombo J + 1, M + 1
            End If
        End If
    End Sub
     
    Private Function CountCombos(ByVal Num As Integer) As Long
    Dim I                                                  As Integer
        For I = 1 To Num
            CountCombos = CountCombos + Factorial(Num) / (Factorial(Num - I) * Factorial(I))
        Next I
    End Function
     
    Private Function Factorial(ByVal Num As Integer) As Long
    Dim I                                                  As Integer
        Factorial = 1
        For I = 1 To Num
            Factorial = Factorial * I
        Next I
    End Function
     
    Private Sub FindSumAndPrint(ByVal SearchValue As Integer)
    Dim I                                                  As Integer
    Dim J                                                  As Integer
     
        For I = 1 To UBound(m_intaData, 1)
            If m_intaData(I, UBound(m_intaData, 2)) = SearchValue Then
                For J = 1 To UBound(m_intaData, 2) - 1
                    If m_intaData(I, J) <> 0 Then
                        m_strComboResult = m_strComboResult & vbCrLf & "Montant : " & m_intaData(I, J)
                    End If
                Next J
                m_intCountCombo = m_intCountCombo + 1
                m_strComboResult = m_strComboResult & vbCrLf & String(15, "_") & vbCrLf & "Combinaison #" & m_intCountCombo & vbCrLf
            End If
        Next I
    End Sub
    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
    *** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***

  7. #7
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 626
    Points : 726
    Points
    726
    Par défaut le numéro de commande
    Bonjour,

    la méthode que j'applique :

    1 on établi une commande fournisseur avec un num. unique
    2 Le fournisseur envoi les produits puis sa facture ou son B.L en indiquant le num de cde
    3 on compare la facture ou le B.L avec la commande envoyée à ce fournisseur

    plus d'équivoque, de plus cela permet de contrôler les prix de vente avec les prix qui figurent sur la cde fournisseur et la quantité livrée avec celle commandée.

    C'est plus long à faire mais c'est blindé et c'est ce qui ce pratique habituellement.

    a+

  8. #8
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    153
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 153
    Points : 75
    Points
    75
    Par défaut
    merci naphta pour ton intervention, seulement les procédures réelles ne sont pas tout le temps logique (BL + Facture)


    Argy, c'est énorme!!!!!!!

    J'essaye d'adapter ton code à mon problème et je te tiens au courant!!!

Discussions similaires

  1. rechercher des combinaisons de mots
    Par angelique_93 dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 13/03/2009, 12h17
  2. Recherche de combinaisons uniques
    Par la_praline dans le forum Windows Forms
    Réponses: 1
    Dernier message: 09/03/2009, 16h03
  3. Recherche de toutes les combinaisons possibles
    Par Frog74 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 26/04/2008, 11h34
  4. Recherche de Combinaison
    Par LaPanic dans le forum Excel
    Réponses: 2
    Dernier message: 12/02/2008, 09h49
  5. [Requête]recherche avec combinaisons de 3 choix pour X champs
    Par marco361020 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 18/04/2007, 11h34

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