[Power Query] Entrées et sorties en stock
Bonjour à tous,
J'ai 2 tables: une table qui répertorie mes sorties en stock pour chaque référence de produit, et une autre table qui répertorie quant à elle les entrées en stock.
Pour chaque mouvement (entrée ou sortie) de chaque produit, il y a une date associée. Je souhaite:
- obtenir la date la + récente d'entrée et également la date la + récente de sortie pour chaque produit
- sommer, pour chaque produit, les sorties stock sur les 3 derniers mois et une autre colonne pour les 6 derniers mois
- idem pour les entrées en stock
Tout ceci se trouve dans le jeu de données que je joins (voir feuille "Résultat attendu").
La 2ème partie de ma requête un peu plus "touchy" concerne les colonnes H et I de cette feuille.
En effet, je souhaite faire, pour chaque produit, une moyenne mensuelle des entrées et des sorties en se basant sur les 3 derniers mois.
La difficulté est que l'entrepôt est fermé à certaines périodes de l'année (tous les ans c'est: 2 jours de clôture en S12, 5 jours en S31, 5 jours en S32, 5 jours en S33, 2 jours en S38 et 5 jours en S52)
Je souhaite être le plus proche possible de la réalité et afin de faire une moyenne qui tienne compte de ces jours non travaillés, j'aimerai écrire une formule de calcul de moyenne dans ce style:
Moyenne = (Somme entrées sur les 3 derniers mois / nombre de jours ouvrés sur ces 3 derniers mois) puis multiplié par 21 (on part du principe que 21 jours ouvrés par mois en moyenne) afin d'obtenir une moyenne mensuelle d'entrée, et idem pour les sorties.
J'ai intégré au jeu de données 2 fonctions en Query qui répertorient les jours fériés et jours ouvrés pour les années à venir.
Je pense qu'intégrer à mon Query une table sous forme de calendrier qui répertorie les fermetures serait la solution la plus logique ? Mais je n'ai pas idée de comment réaliser ceci.
Je ne sais pas si la solution/formule que je propose est la + cohérente et logique, je suis bien évidemment ouvert à toute proposition.
Si le problème est trop technique/pas assez clair et qu'uniquement la 1ère partie de mon besoin peut être résolue, ça serait déjà super !
Merci !
Bonjour à tous,
premiere partie
pour la deuxiemme, il faudrait les dates des jours de fermeture, pas les semaines
Crdlmt
Bonjour,
Merci pour cette proposition, mais je cherche à résoudre le problème via Power Query
Bonne journée !
Hello,
Une proposition,
Après je n'ai pas compris la moyenne ce que tu attendais comme résultat si jamais tu peux me donner le détail du calcul pour X1
@+
Bonjour,
Merci pour cette proposition qui répond parfaitement à la 1ère partie du problème.
Une petite question: il se peut qu'à l'avenir, dans la colonne B de mes tables entrée et sortie, j'ai des entrées et retours liés à du SAV. Il sera alors inscrit "Entree SAV" ou "Sortie SAV" (voir jeu de données ci-joint)
Je crains qu'ils ne soient pas repris dans la formule du GroupBy qui elle inclue uniquement les cellules avec inscrit "Entree" ou "Sortie". J'ai essayé de compléter la formule comme ceci mais Query n'aime pas cette syntaxe:
each [Type] = "Sortie" OR "Sortie SAV"Une petite idée ?
Désolé de ne pas avoir pensé à exprimer ce besoin potentiel avant
Merci !
Hello,
Essaie plutôt cette syntaxe :)
each [Type] = "Sortie" or [Type] = "Sortie SAV"et du coup pour la moyenne ?
@+
Bonjour,
Parfait ça fonctionne, merci !
Pour la moyenne mensuelle des sorties pour X1:
- Je somme les sorties de X1 sur mes 3 derniers mois: j'obtiens 92.
- Je divise ce 92 par le nombre de jours travaillés sur les 3 derniers mois: d'où l'utilisation d'une liste de jours ouvrés et une autre de jours fériés.
L'idée est de sommer les jours ouvrés sur les 3 derniers mois, à ça je soustrais les jours fériés sur la période (3 jours fériés car 10/04 01/05 08/05) et je soustrais encore par les 2 jours de fermeture sur la S12. Soit au total 60 jours TRAVAILLES sur les 3 derniers mois.
- De mon résultat 92/60= 1,5 j'ai une moyenne quotidienne, je le multiplie par 21 pour avoir une moyenne mensuelle.
J'espère avoir été clair
Merci !!
Hello,
Une proposition avec les jours ouvrés et fériés pris en compte.
J'ai mis les deux jours de fermeture en dur dans le code, à voir comment on les gère
@+
Bonjour,
Autre test de sélection possible des lignes : Text.StartsWith( [Type], "Sortie")
Je suis content de voir que mes fonctions (fnJourOuvrés) pondu sous un autre pseudo (hasco) sur XLD servent à quelques choses.
Une référence, au moins à XLD aurait été correcte.
fnJoursFeriés quant à elle est une adaptation pour PQ d'une fonction vba du début des années 2000 et qu'on trouvait largement sur le net et dont l'auteur serait peut-être Laurent Longre (à véfifier)
Re,
Dans la fonction fnJoursOuvrés vous pouvez lui passer une liste d'exclusion de dates.
Cette liste peut être la référence à une colonne de table qui contient ses dates
fnJoursOuvrés(#date(2023, 5, 1), #date(2023, 6, 4), LaTable[ColonneDeDatesExclues] )
Si vous avez 2 listes à lui passer (jours fériés + vos jours non travaillés) vous pouvez le faire comme ceci, avec l'esperluette entre les deux
fnJoursOuvrés(#date(2023, 5, 1), #date(2023, 6, 4), Liste1 & Liste2 )
Pour les jours ouvrés sur une année vous pouvez modifier la fonction en l'écrivant comme ceci
(optional Année as number, optional Exclusions as list) as list =>
let
// contrôle de l'année
Source = if Année = null or Année <1 or Année > 9999 then Date.Year(DateTime.FixedLocalNow()) else Année,
// Construction de la liste des dates
Dates = List.Transform({Number.From(#date(Source,1,1)) .. Number.From(#date(Source,12,31))},Date.From),
// Si Exclusion est null on conserve toutes les dates sinon on ne garde que les dates hors Exclusions (feriés, vacances etc.)
Finales = if Exclusions = null then Dates else List.Difference(Dates, List.Transform(Exclusions, Date.From )),
// Sélectionner les dates hors samedi et dimanche
Retour = List.Select(Finales, each Date.DayOfWeek(_, 1) < 5 )
in
RetourEt l'appeler comme l'autre. Mais comme vous le disait @DjiDji409430 il vous faut des dates et pas des numéros de semaine.
PQ ne pourra pas choisir pour vous, quelles dates de ces semaines seront non travaillées.
Bonjour à tous,
@BAROUTE78 merci pour cette solution ! Je joins la liste des dates de fermeture prévues dans l'excel. Afin d'éviter de modifier en dur le code que tu as proposé en fonction de où on se situe dans l'année, savons-nous inclure le tableau de fermeture que j'ai mis dans l'excel (feuille Jours de repos) ? Le gérer via un if afin de se situer dans l'année ou que sais-je ?
@inconnu concernant les fonctions de liste, je les avais récupéré à une époque par un certain "Daniel" sur lecfomasque. Je n'ai pas connaissance du forum XLD dont vous parlez. Merci pour la solution proposée, je l'approfondis + en détail et je vous fais un retour !
Très bonne journée.
Bonjour à tous,
Merci @BAROUTE78 pour cette solution, c'est parfait cela fonctionne à merveille
Petite (et ultime
il se peut que certaines de mes entrées/sorties soient annulées (flaggées ANNUL ENTREE/ANNUL SORTIE en colonne [Type]). Ce sont les valeurs négatives.
J'aimerai en tenir compte, dans le GroupBy, lors du calcul de mes colonnes Entrées 3mois,Entrées 6mois et Sorties 3mois,Sorties 6 mois.
En clair pour chaque composant je ferai Sorties + Sortie SAV - ANNUL SORTIE sur l'horizon de 3 mois dans le passé et 6mois et idem pour les entrées.
J'espère avoir été assez clair??
Merci et désolé pour cette ultime évolution du besoin initial!
Excellente journée !
Hello,
Je suis passé par les valeurs absolues du coup en fonction de ce que j'ai compris de ton besoin,
N'hésite pas si besoin
@+
Bonjour à tous,
Merci @BAROUTE78 pour cette solution qui fonctionne à merveille.
Finalement il suffisait de rajouter mes "ANNUL" dans le GroupBy, ce qui inclue automatiquement dans mes calculs les valeurs négatives
J'ai supprimé l'étape des valeurs absolues qui ne me sera pas utile dans mon cas car je souhaite garder la notion de positivité/négativité.
C'est si "simple" une fois qu'on a la solution sous les yeux
Merci pour votre aide si précieuse, je marque le sujet en résolu !
Très bonne journée,
Xav.