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 17/08/2011, 14h01   #1
Candidat au titre de Membre du Club
 
Inscription : août 2009
Messages : 39
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 39
Points : 10
Points : 10
Par défaut Requette séléction Access

Bonjour

J'ai une base de données access de gestion de stock de cables , chaque jour je reçois des commandes à préparer et à livrer à un client , actuellement j'ai créé un formulaire dans lequel je fais des saisies manuelles ( c'est cette saisie que je veux automatiser parcequelle prends beaucoup de temps , en moyenne 2 heures de saisie compte tenu de l'importance des commandes)

le cable est conditionné dans des bobines en plastique , il y a une centaine de référence de cable et pour chaque référence il y a une dizaine de bobines en stock , le stock est alimenté par des entrées journalières, exemple : référence de cable : 117212 00 , chaque bobine de cette référence a un N° de lot avec une quantité unitaire de 330 MTR de cable et se trouve dans un emplacement , si j'ai une commande de 1320 MTR de cette référence , je dois préparer et livrer 4 bobines au client ( 4 * 330 = 1320 MTR)

Dans l'exemple ci-joint , j 'ai deux tables :

- une table planning : il s 'agit des commandes à préparer et à livrer
- une table entrée EPP : qui réprésente le stock de cable

Quand je réçois une commande : je saisie manuellement dans les champ N° BL et destinataire : un N° de bon de livraison et un destinataire dans chaque ligne qui réprésente une bobine de cable , ceci via le fourmulaire "planning" , après je édite un bon de préparation qui contient la référence , le N° de lot et l'emplacement des bobines à prélever du stock

Ce que je veux c'est d'avoir une requette ou autre astuce qui me donne automatiquement pour une référence commandée , la désignation , le N° de lot , l'emplacement et ce qui est important (dont je n arrive pas à trouver une solution) uniquement les bobines dont la somme des quantité unitaires est égale ou inférieure à la quantité commandé par le client.

J ai créer une requette "liste des articles à préparer" mais elle me donne toutes les bobines en stock de la référence commandée , pour une commande de 1320 MTR elle me liste la totalité des bobines ne stock - voir requette.

Merci beaucoup de votre intéret et de votre aide

Totik
Totik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 14h23   #2
Membre Expert
 
Homme Robert JAMIN
Retraité
Inscription : juillet 2009
Messages : 1 223
Détails du profil
Informations personnelles :
Nom : Homme Robert JAMIN
Âge : 73
Localisation : Belgique

Informations professionnelles :
Activité : Retraité
Secteur : Enseignement

Informations forums :
Inscription : juillet 2009
Messages : 1 223
Points : 2 022
Points : 2 022
Bonjour,
Le fichier joint ne s'ouvre pas correctement, il y a une erreur lors du chargement du Form Planning.
J'ai essayé avec Acces 2003 et 2007 même message d'erreur.
Il faut corriger cela avant tout pour qu'on puisse voir ce qui est fait et ce que vous voulez faire.
__________________
Cordialement.

RJ
rjamin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 15h21   #3
Candidat au titre de Membre du Club
 
Inscription : août 2009
Messages : 39
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 39
Points : 10
Points : 10
Par défaut Requette sélection simple

Bonjour

je vous renvois la base exemple , je l'ai corrigé , je vous envois également une description de ce que je veux avec une requette ou autre astuce


Merci de votre aide précieuse

Slts
Totik
Fichiers attachés
Type de fichier : zip Base Exemple.zip (486,8 Ko, 17 affichages)
Totik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 10h08   #4
Membre régulier
 
Guillaume
Inscription : décembre 2007
Messages : 161
Détails du profil
Informations personnelles :
Nom : Guillaume
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations forums :
Inscription : décembre 2007
Messages : 161
Points : 91
Points : 91
Citation:
Ce que je veux c'est d'avoir une requette ou autre astuce qui me donne automatiquement pour une référence commandée , la désignation , le N° de lot , l'emplacement et ce qui est important (dont je n arrive pas à trouver une solution) uniquement les bobines dont la somme des quantité unitaires est égale ou inférieure à la quantité commandé par le client.
Désolé mais j'ai du mal à comprendre ton besoin car les chiffres s'emmellent.

- Dans ta base exemple la ligne de planning a une quantité commandée de 1320, une quantité livrée de 1320 et un solde de 0. Quelle est la valeur à considérer ?

- Dans la table EPP, il n'y a qu'une seule ref de bobine en stock pour un total de 3960 unités, répartie dans 3 emplacements contenant 1320 unités chacun (4*330 ou 2*330 + 280 + 380). T'intéresses-tu à la somme totale de la ref ou à la somme par n°UM ou à la somme par emplacement ?
dut-dut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 14h29   #5
Candidat au titre de Membre du Club
 
Inscription : août 2009
Messages : 39
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 39
Points : 10
Points : 10
Par défaut Requete séléction simple

Bonjour

- Dans la table planning il faut considérer la quantité commandée (1320 MTR)
- oui il y a une seule référence de bobine en stock répartie dans 3emplacement de 1320 chacun , et chaque emplacement contient 4 bobine de la meme référence , je m'intérésse à la somme de la quantité en MTR ( huitième champ dans la table EPP) pour chaque référence commandée
Totik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 17h25   #6
Membre régulier
 
Guillaume
Inscription : décembre 2007
Messages : 161
Détails du profil
Informations personnelles :
Nom : Guillaume
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations forums :
Inscription : décembre 2007
Messages : 161
Points : 91
Points : 91
OK, les champs sont bien identifiés. Par contre tu ne réponds pas à la question "T'intéresses-tu à la somme totale de la ref ou à la somme par n°UM ou à la somme par emplacement ?"

A première vue en considérant les valeurs de ta base exemple (qté commandée 1320) :
- si tu t'intéresses à la somme totale des quantités MTR (3960) alors ta requête ne doit renvoyer aucune ligne.
>> pas très logique
- si tu t'intéresses à la quantité MTR de chaque bobine (entre 280 et 380) alors ta requête doit renvoyer toutes les lignes.
>> intérêt ?
- si tu t'intéresses à la quantité MTR de chaque ref par emplacement (ici 1320 à chaque fois) alors ta requête doit renvoyer toutes les lignes.
>> intérêt : identifier s'il existe un emplacement où le magasinier trouvera suffisamment de cable pour servir intégralement le bon de préparation.
>> la somme par emplacement vaut toujours 1320... valeurs pertinentes pour l'exemple ?

La 3e option me paraissant la plus cohérente, voici une solution en plaçant une requête intermédiaire qui fait la somme totale de chaque référence par emplacement.
Si ce n'est pas ça que tu recherches, alors essaie d'être un peu plus précis sur le résultat souhaité et mets des valeurs plus variées dans ta base exemple.

Bon week-end.
@+


Requête "SommeParEmplacement"
Code sql :
1
2
3
SELECT [Réf Leoni], Emplacement, Sum([Quantité MTR]) AS [Somme Quantité MTR] 
FROM [Entrée EPP] 
GROUP BY [Réf Leoni], Emplacement;

Requête "Liste des articles à préparer"
Code sql :
1
2
3
4
5
SELECT Planning.[Réf Leoni], Planning.[Date de livraison], Planning.[SommeDeQté demandée], Planning.Désignation, Planning.Destinataire, Planning.[Qté Livrée], Planning.Solde, [Entrée EPP].[N° UM], [Entrée EPP].[N° Lot], [Entrée EPP].[Quantité MTR], [Entrée EPP].Emplacement, SommeParEmplacement.[Somme Quantité MTR]
FROM (Planning 
INNER JOIN [Entrée EPP] ON Planning.[Réf Leoni] = [Entrée EPP].[Réf Leoni]) 
INNER JOIN SommeParEmplacement ON ([Entrée EPP].[Réf Leoni] = SommeParEmplacement.[Réf Leoni]) AND ([Entrée EPP].Emplacement = SommeParEmplacement.Emplacement)
WHERE SommeParEmplacement.[Somme Quantité MTR] >= Planning.[SommeDeQté demandée];
Autre intérêt possible sur base de la solution 3 : indiquer au magasinier où aller chercher en priorité les "chutes" de cable pour libérer les emplacement avec de faibles quantités... dans ce cas il suffit de remplacer le ">=" par "<=" dans la requête finale !
dut-dut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2011, 00h38   #7
Candidat au titre de Membre du Club
 
Inscription : août 2009
Messages : 39
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 39
Points : 10
Points : 10
L'option N° 3 me convient parfaitement , ce qui reste à savoir : y a t il pas un moyen que cette requette ne renvoit pas toutes les lignes , mais uniquement les lignes dont la somme est égale à la quantité totale par emplacement ?

Ceci dans la mesure où je veux par exemple transformer cette requette sélection en une requette action ( requette création de table par exemple) pour sortir du stock les bobines qui ont livré au client.

Merci d'avance

Slts
Taoufik
Totik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/08/2011, 11h43   #8
Membre régulier
 
Guillaume
Inscription : décembre 2007
Messages : 161
Détails du profil
Informations personnelles :
Nom : Guillaume
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations forums :
Inscription : décembre 2007
Messages : 161
Points : 91
Points : 91
Tu veux tester toutes les combinaisons pour voir si l'une d'entre-elle te permet de tomber sur la quantité exacte commandée !? Ca peut vite devenir fastidieux ton truc... En tout cas je ne sais pas comment faire via une requête. Tu vas être obligé du passer par un recordset sous VBA.
Je peux te proposer la solution suivante adaptée d'un ancien post pour ta base exemple qui renvoie la liste des combinaisons possibles...

@+

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
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
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
Dim emplacement_list()                                 As String
Dim empl_index                                         As Integer
 
Sub test_fonction_GetCombinaisons()
    GetCombinaisons 1320
End Sub
 
Public Sub GetCombinaisons(intMaxValue As Long)
Const SQL                                              As String = "SELECT * FROM[Liste des articles à préparer];" ' WHERE Emplacement = 'A06-27-1';"
Const SQL2                                             As String = "SELECT DISTINCT Emplacement FROM[Liste des articles à préparer];"
Dim oRS                                                As DAO.Recordset
Dim sngaAmounts()                                      As Integer
Dim V                                                  As Integer
Dim i                                                  As Integer
 
    Set oRS = CurrentDb.OpenRecordset(SQL2, dbOpenDynaset)
    ReDim emplacement_list(oRS.RecordCount)
    Do While Not oRS.EOF
        i = i + 1
        emplacement_list(i) = oRS.Fields("Emplacement").Value   'on stocke la liste des différents emplacements
        oRS.MoveNext
    Loop
    oRS.Close
 
    m_strComboResult = vbNullString
    m_intCountCombo = 0
    m_intSubGroup = 0
 
    For empl_index = 1 To i
        Set oRS = CurrentDb.OpenRecordset("SELECT * FROM[Liste des articles à préparer] WHERE Emplacement = '" & emplacement_list(empl_index) & "';", dbOpenDynaset)
        With oRS
            Do While Not .EOF
                V = V + 1
                ReDim Preserve sngaAmounts(1 To V)
                sngaAmounts(V) = .Fields("Quantité MTR").Value
                .MoveNext
            Loop
            .Close
        End With
        Set oRS = Nothing
        m_vntaAmounts = sngaAmounts
        Call CreateCombos(m_vntaAmounts, intMaxValue)
 
        V = 0
        Erase m_vntaAmounts
        Erase m_intaBound
        Erase m_intaData
    Next empl_index
 
    MsgBox m_strComboResult, , m_intCountCombo & " combinaisons trouvées"
 
 
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 & "Emplacement : " & emplacement_list(empl_index) & ", Ligne : " & j & ":, Total : " & 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
dut-dut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2011, 15h48   #9
Candidat au titre de Membre du Club
 
Inscription : août 2009
Messages : 39
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 39
Points : 10
Points : 10
Par défaut Requette sélection simple

Merci Dut Dut

Où je devrais placer ce code.

Slts

Taoufik
Totik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 15h33   #10
Membre régulier
 
Guillaume
Inscription : décembre 2007
Messages : 161
Détails du profil
Informations personnelles :
Nom : Guillaume
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations forums :
Inscription : décembre 2007
Messages : 161
Points : 91
Points : 91
Totik,
Regarde en pièce jointe, j'ai rajouté un bouton sur ton formulaire Planning.
Je pense qu'avec ça tu pourras avancer. Je t'ai "mâché" un bonne partie du boulot...
@+
Fichiers attachés
Type de fichier : zip GetCombinaisons.zip (86,8 Ko, 11 affichages)
dut-dut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2011, 18h12   #11
Candidat au titre de Membre du Club
 
Inscription : août 2009
Messages : 39
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 39
Points : 10
Points : 10
Par défaut Requette séléction simple

Bonjour Dut Dut

quand j'éssaie de cliquer sur le bouton que vous avez ajouter " proposer une combinaison , access se ferme automatiquement ?

Slts
Taoufik
Totik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 15h11   #12
Membre régulier
 
Guillaume
Inscription : décembre 2007
Messages : 161
Détails du profil
Informations personnelles :
Nom : Guillaume
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations forums :
Inscription : décembre 2007
Messages : 161
Points : 91
Points : 91
C'est bizarre... ça tourne très bien chez moi.
Essaie de compiler pour voir si tu as un message d'erreur.
dut-dut 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 06h55.


 
 
 
 
Partenaires

Hébergement Web