Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Scinder une fature [ Base de données / Access ] (jessenierin)

vendredi 9 mai 2008 à 09:06:38 | Scinder une fature

jessenierin

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


vendredi 9 mai 2008 à 10:29:18 | Re : Scinder une fature

CarSoftAja

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

vendredi 9 mai 2008 à 20:19:38 | Re : Scinder une fature

jessenierin

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



vendredi 9 mai 2008 à 22:23:59 | Re : Scinder une fature

CarSoftAja

Réponse acceptée !

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


dimanche 11 mai 2008 à 13:10:46 | Re : Scinder une fature

jessenierin

Merci carsoftaja
Le code marche super!!!!!
Thanks

dimanche 18 mai 2008 à 15:31:50 | Re : Scinder une fature

jessenierin

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

mardi 20 mai 2008 à 16:38:38 | Re : Scinder une fature

CarSoftAja

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


mercredi 21 mai 2008 à 19:45:03 | Re : Scinder une fature
mercredi 21 mai 2008 à 19:45:52 | Re : Scinder une fature

jessenierin

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.


dimanche 25 mai 2008 à 16:18:17 | Re : Scinder une fature

jessenierin

Bjr CarSoftAja,
je n'arrive pas toujours à faire ce qu'il faut pour avoir ce que je veux.
Ou dois-je donc modifier ??
Merci




Cette discussion est classé dans : rs1, mt, scinder, folio, bd0


Répondre à ce message

Sujets en rapport avec ce message

scinder des cellules excel [ par lebleu ] j'ai un fichier ckient dans lequel j'ai besoin de scinder la colonne titre+nom+prenom en une colonne titre, une colonne nom et une colonne prenom...je datareport ->printreport [ par Rahan ] En apercu j ai pas de bleme quand j en ferme un l autre s affiche tout desuite avec les valeurs radraichies mais quand je remplace show parprintreport datareport et imprimession [ par lolo ] bonjourj ai une boucle ds laquelle j imprime des report les uns apres les autresSi chaque report contiennent une seule page c est okmais des lors ou u VB et ssdbgrid [ par pimousse75 ] bonjour, j'ai ce bout de code While Not rs1.EOF index = index + 1 'SSDBGrid1.AddNew 'SSDBGrid1.MoveNext MsgBox SSDBGrid1.Row AddItemString = "" 'AddIt connexion ADO et recordset?urgent [ par marlo ] je veux récupérer la valeur d'un recordset d'une connexion ADO "conn1".Set rs1 = New ADODB.Recordsetrs1.CursorType = adOpenStaticrs1.CursorLocation = connexion ADO et utilisation de recordset?urgent?urgent?urgent [ par marlo ] salut,s'il vous plaît je veux afficher le contenu d'un recordset d'une connexion ADO mais pour le cas ou le champ à afficher et dans une variable, le Bout de code incompréhensible [ par pimousse75 ] Salut,je récupère un pgr avec ceci 'verrouillage du principal intervenant si nécessaire If rs1.RecordCount = 0 Then CheckPI.Enabled SOS sur combo et filtre [ par soni ] Bonjour,J'ai un recrdset créé en ado par code.Tout va bien sur le recordset.Je le lie à un dbcombo ou une datalist pour afficher les valeurs d'un cham combo et fitre [ par soni ] Bonjour, J'ai un recrdset créé en ado par code. Tout va bien sur le recordset. Je le lie à un dbcombo ou une datalist pour afficher les valeurs d'un ADO - moveprevious - recordset - access2000 - CacheSize - deplacement arriere [ par sansoussix ] bonjour, je suis nouveau en vb et j'essaie d'effectuer des lectures dans une base de donnees access 2000.J'ai utilise le provider 4.0 pour ma connecti


Nos sponsors

Sondage...

CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,218 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.