Accueil > Forum > > > > Scinder une fature
Scinder une fature
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ée 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
Livres en rapport
|
Derniers Blogs
GESTION D'EXCEPTION AVEC LES TASKSGESTION D'EXCEPTION AVEC LES TASKS par richardc
Nous avons vu dans un précédent article comment utiliser Task pour effectuer des opérations dans un autre thread.
Malheureusement, comme tout le monde n'est pas parfait, il se peut que cette exécution se passe mal et qu'une exception se produise.
La...
Cliquez pour lire la suite de l'article par richardc DéMARRONS AVEC LES TASKSDéMARRONS AVEC LES TASKS par richardc
Que vous le vouliez ou non, le développement multi-tâche est maintenant une obligation pour toute nouvelle application. Il est donc vital d'en comprendre les mécanismes et de s'y mettre le plus tôt possible.
En attendant le .NET Framework 4.5 avec le...
Cliquez pour lire la suite de l'article par richardc SLIDE & DéMO TECHDAYS 2012 - FAST & FURIOUS XAML APPSSLIDE & DéMO TECHDAYS 2012 - FAST & FURIOUS XAML APPS par Vko
Retrouvez les slides et les démo de ma session Fast & Furious XAML Apps. A ceux qui se posent la question : "est-ce que le code de la DataGrid est disponible?", je vous répondrais "pas encore". Je vais mettre en place un projet codeplex pour part...
Cliquez pour lire la suite de l'article par Vko XNA IS DEAD!XNA IS DEAD! par richardc
Depuis la semaine dernière (et grâce aux TechDays 2012), je me penche activement sur la nouvelle version de Windows, aka Windows 8. Vous me direz, il était temps puisque la première preview date de Septembre dernier.
OK. Remarquez, on n'en est qu'aux...
Cliquez pour lire la suite de l'article par richardc TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 !TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 ! par ROMELARD Fabrice
Speakers: Fabrice Meillon et Stanislas Quastana Cette session est basée entièrement sur celle donnée lors de la BUILD cet hiver. Il n'y a pas d'ajout d'information en rapport avec cet évènement passé. Windows 8 Server sera intégralem...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
DocTranslate (V3.1.0.0)DOCTRANSLATE (V3.1.0.0)DocTranslate est un traducteur de document Microsoft Word, PowerPoint et Excel. Il permet d'autom... Cliquez pour télécharger DocTranslate Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System
|