Scinder une fature

Résolu
jessenierin Messages postés 12 Date d'inscription samedi 15 juillet 2006 Statut Membre Dernière intervention 27 août 2009 - 9 mai 2008 à 09:06
jessenierin Messages postés 12 Date d'inscription samedi 15 juillet 2006 Statut Membre Dernière intervention 27 août 2009 - 25 mai 2008 à 16:18
<noscript>
<meta http-equiv="Refresh" content="0; URL=/ym/login?nojs=1" />
* { visibility: hidden; }
</noscript>Bonjour
Voici mon code pour scinder une fature

Function Num_Folio(NumFacture As Variant)
Dim bd0 As Database
Dim rs1 As Recordset
Dim mt As Double
Dim folio As Integer
Set bd0 = CurrentDb
folio = 1
Set rs1 = bd0.OpenRecordset(" SELECT *  FROM DETAIL_COMMANDE WHERE (factureID=" & NumFacture & " );")
rs1.MoveFirst
While Not rs1.EOF
    
    rs1.Edit
    mt = mt + rs1!PU * rs1!QuantiteColis
    If mt > 1500 Then
        
        folio = folio + 1
        rs1!folioID = folio
        rs1.Update
        mt = rs1!PU * rs1!QuantiteColis
    Else
    rs1!folioID = folio
    rs1.Update
    
    End If
rs1.MoveNext
Wend
rs1.Close
End Function

Seulement cela va dans tous les sens parce qu'il scinde systematiquement toutes les factures superieure a 1500 mais il les eclate drolement:
exemple : pour un total de 3200
il a fais un folio avec 320
un autre avec 800
un autre avec 1200
et le 4eme folio avec 880.
Mais il faut aussi dire que ces montants correspondent au total de chaque ligne de facture qui en compte 4.
Ou est mon erreur please??

Help please

9 réponses

CarSoftAja Messages postés 26 Date d'inscription lundi 5 mai 2008 Statut Membre Dernière intervention 21 mai 2008
9 mai 2008 à 22:23
J'ai fait un p'tit truc en vitesse, qui pourrait sûrement être simplifiém, mais ça à l'air de fonctionner

Function Num_Folio(NumFacture As Variant)
Dim bd0 As Database
Dim rs1 As DAO.Recordset
Dim mt As Double
Dim folio As Integer




' Pour que ça fonctionne, il faut que le champ FolioID de la table soit = à 0 au départ

folio = 1
mt = 0





'Requête à partir de la table, incluant le champ tot qui est  [QuantitéColis]*PU et trié

' ne sélectionner que les champs non-traités; c'est-à-dire où folioID =0



Set rs1 = CurrentDb.OpenRecordset(" SELECT *, [QuantiteColis]*[pu] AS tot FROM DETAIL_COMMANDE WHERE (factureID=" & NumFacture & " AND folioID=0) ORDER BY [QuantiteColis]*[pu] DESC")



rs1.MoveFirst
While Not rs1.EOF
     While Not rs1.EOF
       If mt + rs1!tot <= 1500 Then
         While Not rs1.EOF
           If mt + rs1!tot <= 1500 Then
                rs1.Edit
                rs1!folioID = folio
                rs1.Update
                mt = mt + rs1!tot
                rs1.MoveNext
              Else
              rs1.MoveNext
            End If
         Wend
         Else
            rs1.Edit
            rs1!folioID = folio
            folio = folio + 1
            rs1.Update
           rs1.MoveNext
       End If
     Wend
   mt = 0
   rs1.Close
' Je refait le recordset pour l'actualiser en fonction des champs FolioID écrit entre-temps
Set rs1 = CurrentDb.OpenRecordset(" SELECT *, [QuantiteColis]*[pu] AS tot FROM DETAIL_COMMANDE WHERE (factureID=" & NumFacture & " AND folioID=0) ORDER BY [QuantiteColis]*[pu] DESC")
   If rs1.RecordCount > 0 Then
        folio = folio + 1
        rs1.MoveFirst
   End If
Wend
rs1.Close
End Function
3
CarSoftAja Messages postés 26 Date d'inscription lundi 5 mai 2008 Statut Membre Dernière intervention 21 mai 2008
9 mai 2008 à 10:29
Salut,
J'ai pas vraiment compris le but, mais je remarque déjà un problème évident avec 'mt' . En effet, à chaque passage dans la boucle il sera augmenté ( au lieu de reprendre la valeur de la ligne de l'enregistrement actuel ?)
En effet, si au premier passage mt= 1600, soit 2*800 (PU*QuantitéColis), lors du deuxième passage il sera de 1600+ (PU*QuantitéColis) de l'enregistrement suivant

    rs1.Edit
    mt = mt + rs1!PU * rs1!QuantiteColis ' risque d'être souvent >1500, vu que le total est augmenté à
    If mt > 1500 Then                                  ' chaque passage dans la boucle
        
        folio = folio + 1
        rs1!folioID = folio
        rs1.Update
        mt = rs1!PU * rs1!QuantiteColis       'à quoi sert cette ligne ?
    Else
    rs1!folioID = folio
    rs1.Update
0
jessenierin Messages postés 12 Date d'inscription samedi 15 juillet 2006 Statut Membre Dernière intervention 27 août 2009
9 mai 2008 à 20:19
Bsr
mt=rs!PU*rs1!quantitecolis 'permet selon moi de faire le meme calcul dans le folio suivant.
est-ce une erreur ??
Voici un exemple concret:

La facture comporte 5 articles:
Rose blanche Quantitecolis 5 et PU 200
rose rouge Quantitecolis 3 et PU 175
margurite quantitécolis 10 et pu 225
magnola quantitecolis 8 et PU 70
Rose quantitecolis 7 et PU 60

Je lui demande de faire:
5*200 si le montant trouvé est inférieur a 1500, il prend une autre ligne de facture et l'ajoute au premier montant trouvé qui est 1000. nous conattons que s'il prend la 2eme ligne de facture; le montant trouvé sera >1500.
Comment faire pour lui demander de prendre une autre ligne de facture pour combler l'ecart du premier calcul (1500 -1000)?
ce serait soit 1000 + 8*70 ; soit 1000+7*60 si d'autres ajouts ne sont plus possibles parceque les lignes suivantes ne le permetent pas,
qu'il crée un 2eme folio dans lequel il pousuivrait ses calculs et ainsi de suite jusqu'a épuration de toutes les lignes de la facture.
tel est mon problème.
Merci d'avance
0
jessenierin Messages postés 12 Date d'inscription samedi 15 juillet 2006 Statut Membre Dernière intervention 27 août 2009
11 mai 2008 à 13:10
Merci carsoftaja
Le code marche super!!!!!
Thanks
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jessenierin Messages postés 12 Date d'inscription samedi 15 juillet 2006 Statut Membre Dernière intervention 27 août 2009
18 mai 2008 à 15:31
Bjr

Ce code donné par Carsoftaja marche bien.

Function Num_Folio(NumFacture As Variant)
Dim bd0 As Database
Dim rs1 As DAO.Recordset
Dim mt As Double
Dim folio As Integer

' Pour que ça fonctionne, il faut que le champ FolioID de la table soit = à 0 au départ
folio = 1
mt = 0

'Requête à partir de la table, incluant le champ tot qui est  [QuantitéColis]*PU et trié
' ne sélectionner que les champs non-traités; c'est-à-dire où folioID =0
Set rs1 = CurrentDb.OpenRecordset(" SELECT *, [QuantiteColis]*[pu] AS tot FROM DETAIL_COMMANDE WHERE (factureID=" & NumFacture & " AND folioID=0) ORDER BY [QuantiteColis]*[pu] DESC")

rs1.MoveFirst
While Not rs1.EOF
     While Not rs1.EOF
       If mt + rs1!tot <= 1500 Then
         While Not rs1.EOF
           If mt + rs1!tot <= 1500 Then
                rs1.Edit
                rs1!folioID = folio
                rs1.Update
                mt = mt + rs1!tot
                rs1.MoveNext
              Else
              rs1.MoveNext
            End If
         Wend
         Else
            rs1.Edit
            rs1!folioID = folio
            folio = folio + 1
            rs1.Update
           rs1.MoveNext
       End If
     Wend
   mt = 0
   rs1.Close
' Je refait le recordset pour l'actualiser en fonction des champs FolioID écrit entre-temps
Set rs1 = CurrentDb.OpenRecordset(" SELECT *, [QuantiteColis]*[pu] AS tot FROM DETAIL_COMMANDE WHERE (factureID=" & NumFacture & " AND folioID=0) ORDER BY [QuantiteColis]*[pu] DESC")
   If rs1.RecordCount > 0 Then
        folio = folio + 1
        rs1.MoveFirst
   End If
Wend
rs1.Close
End Function

J'ai voulu intégrer un autre critère que j'ai appelé "rubrique"
Chaque rubrique contient une liste d'articles.
a- Rubrique Rose contient
Rose rouge, rose blanche, rose rose ....
b- rubrique feuillage contient:
Feuille verte, feuille jaune, feuille rouge...
Ce que je voudrais en fait c'est que le code face la boucle dans chaque rubrique, epuise le critère qui est toujours <=1500 par folio avant de continuer vers une autre rubrique de la meme facture.
Ilne serait pas souhaitable que l'on retrouve dans la meme rubrique des artcicles qui n'appartiennent pas a cette rubrique.
Je ne sais comment m'y prendre.
help please.
Merci d'avance
0
CarSoftAja Messages postés 26 Date d'inscription lundi 5 mai 2008 Statut Membre Dernière intervention 21 mai 2008
20 mai 2008 à 16:38
Il suffit de rajouter une boucle avant le traitement, qui sélectionne chaque rubrique existante. J'ai donc créé un recordset (RS0) qui sélectionne les rubriques existantes et je boucle sur ce recordset, tout en passant cette rubrique contenue dans la variable "varRubrique" au recordset rs1 qui traite les factures.

Function Num_Folio(NumFacture As Variant)
Dim bd0 As Database
Dim rs1 As DAO.Recordset
Dim rs0 As DAO.Recordset
Dim mt As Double
Dim folio As Integer
Dim varRubrique


' Pour que ça fonctionne, il faut que le champ FolioID de la table soit = à 0 au départ
folio = 1
mt = 0


'Requête qui regroupe toutes les différentes rubriques utilisées avec le N° de facture NumFacture
' Ne prend qu'une fois chaque rubrique grâce au mot clé DISTINCT
Set rs0 = CurrentDb.OpenRecordset("SELECT DISTINCT Rubrique FROM DETAIL_COMMANDE WHERE [factureID]=" & NumFacture)
rs0.MoveFirst
' On boucle sur chaque rubrique
While Not rs0.EOF


        'Requête à partir de la table, incluant le champ tot qui est  [QuantitéColis]*PU et trié
        ' ne sélectionner que les champs non-traités; c'est-à-dire où folioID =0 et dont la rubrique est égale à rs0
        varRubrique = rs0!Rubrique
        Set rs1 = CurrentDb.OpenRecordset(" SELECT *, [QuantiteColis]*[pu] AS tot FROM DETAIL_COMMANDE WHERE (factureID=" & NumFacture & " AND folioID=0 AND [Rubrique] LIKE""" & varRubrique & """) ORDER BY [QuantiteColis]*[pu] DESC")
       
        rs1.MoveFirst
        While Not rs1.EOF
             While Not rs1.EOF
               If mt + rs1!tot <= 1500 Then
                 While Not rs1.EOF
                   If mt + rs1!tot <= 1500 Then
                        rs1.Edit
                        rs1!folioID = folio
                        rs1.Update
                        mt = mt + rs1!tot
                        rs1.MoveNext
                      Else
                      rs1.MoveNext
                    End If
                 Wend
                 Else
                    rs1.Edit
                    rs1!folioID = folio
                    folio = folio + 1
                    rs1.Update
                   rs1.MoveNext
               End If
             Wend
           mt = 0
           rs1.Close
        ' Je refais le recordset pour l'actualiser en fonction des champs FolioID écrit entre-temps
        Set rs1 = CurrentDb.OpenRecordset(" SELECT *, [QuantiteColis]*[pu] AS tot FROM DETAIL_COMMANDE WHERE (factureID=" & NumFacture & " AND folioID=0 AND [Rubrique] LIKE""" & varRubrique & """) ORDER BY [QuantiteColis]*[pu] DESC")
           If rs1.RecordCount > 0 Then
                folio = folio + 1
                rs1.MoveFirst
           End If
        Wend
        rs1.Close
' On passe à la rubrique suivante en incrémentant le folio
   folio = folio + 1
   rs0.MoveNext
Wend
rs0.Close
End Function
0
jessenierin Messages postés 12 Date d'inscription samedi 15 juillet 2006 Statut Membre Dernière intervention 27 août 2009
21 mai 2008 à 19:45
0
jessenierin Messages postés 12 Date d'inscription samedi 15 juillet 2006 Statut Membre Dernière intervention 27 août 2009
21 mai 2008 à 19:45
Bonjour

je viens d'inserer le code dans ma base de donnée.
Resulta; pour une montant de 4200F; il a éclater la facture en 08 folios. Ce qui est normal compte tenu du fait que la facture avait 08 rubriques.
J'ai essayé de corriger en supprimant : folio = folio+1
' On passe à la rubrique suivante en incrémentant le folio
folio = folio + 1
rs0.MoveNext
Wend
rs0.Close
la alors il a tout simplement regroupé la facture en un bloc et selon les rubriques.
Ce qui me conviendrait ce serait que: pour ce meme montant par exemple; qui'il fasse :
Folio1
Rubrique Roses
Rose rouge 150
Rose blanche 450
Rose jaune 550
Rubrique Feuillages
Feuillage vert 100
feuillage jaune 230
TOTAL 1480 qui est <= 1500
Folio2
Rubrique feuillages
Feuillage sec 450
feuillage ... 200
Ainsi de suite.
Que le code aie la possibiliter de faire continuer dans le 2eme folio une rubrique entamée dans le folio précedent.

Comment m'y prendre??
Merci d'avance.
0
jessenierin Messages postés 12 Date d'inscription samedi 15 juillet 2006 Statut Membre Dernière intervention 27 août 2009
25 mai 2008 à 16:18
Bjr CarSoftAja,
je n'arrive pas toujours à faire ce qu'il faut pour avoir ce que je veux.
Ou dois-je donc modifier ??
Merci
0
Rejoignez-nous