Toutes mes réponses sur les forums
-
AuteurMessages
-
Stéphane Lorin
ParticipantBonsoir
Avec Power Query je dépivote d’abord les autres colonnes que la première avec Table.UnpivotOtherColumns
Puis je sépare la colonne attribut avec le caractère _ en utilisant Table.SplitColumn
pour avoir d’un coté le imp et Mnt et de l’autre M, M-1 et M-2Enfin je pivote la colonne la colonne “imp/Mnt” avec Table.Pivot
Voir la pièce jointe en remplaçant l’extension .xlsx par .pbix avant.
Cordialement
Attachments:
You must be logged in to view attached files.15 janvier 2021 à 10 h 02 min en réponse à : Calculer le délai de travail entre deux dates Power BI (DAX) #85966Stéphane Lorin
ParticipantBonjour
Voici une solution avec Power Query
J’ai une table avec une référence (“Id”) et une date/heure de “Début” et une date/heure de “Fin”
Ainsi qu’un planning d’ouverture pour chaque jour “H_Début” et “H_Fin” (via une table de correspondance)Avec la fonction List.Dates je crée une liste des jours entre “Début” et “Fin”
Je développe en lignes puis je fusionne pour récupérer les “H_Début” et “H_Fin” de chaque jour
Ensuite la durée de mon “Id” sur chacune de ces journée “Date” est donnée par la différence si elle est positive de
MIN(“Fin” , “Date + H_Fin”)-MAX(“Début” , “Date + H_Début)Il ne reste plus qu’à regrouper la table en sommant ces durées quotidiennes
Voir exemple Excel ci-joint
Cordialement
Stéphane
Attachments:
You must be logged in to view attached files.Stéphane Lorin
ParticipantBonjour
Après actualisation du TCD, pour afficher uniquement les composants des OF il faut ajouter un champ Valeur dans le TCD (somme ou nombre de composants par exemple). Par contre les OF fils sans composant ne sont pas affichés.
Pour la seconde question, il faut créer une table inversée par le menu Données/Connexions existantes puis l’onglet “Tables”.
Cordialement
Stéphane
Stéphane Lorin
ParticipantBonjour
En quoi est-ce un problème ? Que voulez vous faire avec ces dates et avec cette formule LIREDONNEESTABCROISDYNAMIQUE ?
Si vous voulez paramétrer cette formule pour rendre la dynamique suivant une date inscrite en cellule G1 par exemple vous pouvez modifier votre formule ainsi :
=LIREDONNEESTABCROISDYNAMIQUE(“[Measures].[Somme de montant total]”;$A$6;”[Commandes].[date d’encaissement]”;”[Commandes].[date d’encaissement].&[“&TEXTE(G1;”aaaa-mm-jj”)&”T00:00:00]”)
Stéphane
Stéphane Lorin
ParticipantBonjour
Pour bien commencer ce premier post de l’année, je vous adresse tous mes voeux pour 2021 et en particulier à Sophie qui nous apprends toujours beaucoup de choses. Merci !
Je reviens sur ce sujet laissé avant les fêtes de fin d’année.
J’ai testé rapidement des solutions via des fonctions Power Query qui s’appelle elle-même ou un List.Generate.
Le résultat était correct mais le temps de réponse dès qu’il y avait plus de 3 ou 4 niveaux était trop long.J’ai donc essayé la fonction PATH en DAX. Cette fonction est très pratique pour remonter les ascendants dans une relation Père/Fils. A partir d’un élément la recherche du père, du grand-père… est très rapide.
Ainsi pour connaître les descendants, il suffit de filtrer sur tous les éléments dont un des ascendants est l’OF que l’on cherche.Dans mon exemple j’ai donc 2 tables : “Choix” avec le n° de l’OF dont on cherche les descendants et “Liste” qui est la liste des relations Père/Fils (999 OF dans mon exemple)
Trois colonnes calculées dans la table “Liste”
Ascendance=PATH([N° Ordre];[N° Ordre père])
Position dans ascendance=FIND(CONCATENATEX(Choix;[Choix];””);[Ascendance];;0)
Rang=IF([Position dans ascendance]>0;(FIND([N° Ordre];[Ascendance])-[Position dans ascendance])/8)Pour trouver tous les OF qui dépendent d’un autre on commence par créer la liste de tous les ascendants de tous les OF avec la fonction PATH qui renvoie le résultat sous la forme : OF00001 | OF00002 | OF00006
La fonction CONCATENATEX renvoie l’OF recherché format texte
La fonction FIND cherche ce texte dans l’ascendance et renvoie la position du texte ou 0 si non trouvé
Pour obtenir le rang on calcule l’écart entre la position de l’élément en cours (qui est en dernier) et de celui qu’on recherche.
Comme le nombre de caractères de l’OF est 7 et qu’il y a un séparateur, on obtient l’écart de position en divisant par 8.
Résultat = (vide) si ce n’est pas un descendant, 0 pour l’OF lui-même, puis 1 pour les fils, 2 pour les petit-fils…A chaque changement d’OF, il faut actualiser le TCD. (ajouter une macro événementielle pour automatiser ce dernier point au besoin)
Cordialement
Stéphane
Attachments:
You must be logged in to view attached files.Stéphane Lorin
ParticipantRe-bonjour
J’ai peu de temps pour répondre, je ferme le PC pour l’année 2020 dans quelques minutes !
Donc la fonction renvoie une liste pour pouvoir facilement développer les lignes ensuite (c’est plus simple qu’une table)
Oui, j’ai ajouté le try… otherwise à la main pour gérer le cas où la fonction est alimenté par un null ce qui génère une erreur. J’aurai pu faire une condition du style if [niveaux]<>null then fonction else null
Désolé, j’ai “bidouillé” une solution ce matin en quelques minutes, ce n’est peut être pas très “propre” mais c’est pour donner une piste (c’est l’objet d’un forum)
La fonction n’est pas créé à la main, c’est une requête avec un paramètre que je transforme en fonction (par clic droit), c’est plus facile pour modifier ensuite cette fonction car la requête et la fonction sont “liées”
Enfin, pas de boucle type while à ma connaissance dans Power Query, mais il existe des fonctions récursives voir l’aide Microsoft, il faut ajouter un @ devant la fonction.
https://docs.microsoft.com/fr-fr/powerquery-m/m-spec-functionsBon courage et bonne fin d’année
Stéphane
Stéphane Lorin
ParticipantBonjour
Vous n’avez pas joint de fichier comme indiqué dans votre message
Je vous propose une solution en pièce jointe avec une fonction qui filtre la liste Père/Fils sur le champ “Père” suivant un paramètre et renvoie la liste des “Fils” associés
J’applique cette fonction 5 fois avec comme départ le ou les père(s) choisi(s) par l’utilisateur afin d’avoir les 5 niveaux en gérant les null avec un try … otherwise puis je décroise la table pour obtenir l’ensemble des descendants avec leur niveau respectif.
Il est peut être possible d’utiliser les fonctions récursives de Power Query avec le @ mais je n’ai pas testé.
Cordialement
Stéphane
Attachments:
You must be logged in to view attached files.Stéphane Lorin
ParticipantBonjour
Difficile de répondre ne connaissant pas vos données sources ni vos modifications.
Il faut tester les solutions !Personnellement c’est souvent un mix des deux.
En général une fonction d’import pour mettre les données sources au propre
Puis un traitement en masse de l’ensemble des données qui ont été combinées.Par exemple si vous devez fusionner vos données avec une autre table, il me semble qu’il vaut mieux le faire dans la seconde étape car sinon je pense que vous allez charger cette table fusionnée autant de fois que vous exécutez la fonction.
Stéphane
15 décembre 2020 à 12 h 58 min en réponse à : Répartir des valeurs selon une clé de répartition automatique #85254Stéphane Lorin
ParticipantBonjour
Voici une proposition avec Power Query
– Calcul de la base à répartir par fusion, filtre sur HQ et List.Sum sur la colonne € pour obtenir les -600
– Calcul de la répartition par fusion, filtre hors HQ, regroupement (somme pour obtenir les 5500 de base et toutes les lignes), développement, division de la valeur de chaque ligne par les 5500 pour la clé de répartition puis multiplication par le calcul précédent pour la contribution de chacun
– Ajout de la table initiale filtrée hors HQ avec la table du calcul de la répartitionCette table est ajoutée au modèle de données pour générer le TCD en orange.
Sûrement transposable en DAX mais ça dépasse mes compétences
Stéphane
Attachments:
You must be logged in to view attached files.Stéphane Lorin
ParticipantBonjour
Il faut retirer le filtrer sur la colonne [Sun Opth Id] avec la fonction ALL
Test 1 qty > 15:=if(SUMX(ALL(Tableau1[Sun Opth Id]);CALCULATE([Somme de Invoice QTY];Tableau1[Brands SAM]=”oui”))>=16;1;0)Stéphane
Stéphane Lorin
ParticipantBonjour
Voici une proposition pour votre problématique
A partir de la table initiale, je construis une table projetée sur 12 mois avec la dernière valeur connue
– regroupement par devise + valeur max du mois : afin de connaitre le dernier mois de chaque devise
– fusion de cette table avec la table initiale sur la devise et le mois afin de récupérer la valeur du dernier mois
– ajout d’une colonne personnalisée avec une liste {1..12}
– extraction de cette liste en ligne. Chaque triplet devise/dernier mois/dernière valeur est répétée 12 fois
– utilisation de la fonction Date.AddMonths pour ajouter x mois au dernier mois
– sélection des colonnes vouluesIl suffit de modifier le 12 pour avoir plus de mois.
De cette façon, le dernier mois connu de chaque devise peut ne pas être le même.Enfin on ajoute la table initiale et la projection.
Voir le fichier exemple joint
Cordialement
Stéphane
Attachments:
You must be logged in to view attached files.Stéphane Lorin
ParticipantDepuis votre fichier de destination, il faut donc vous connecter au fichier Excel source, lire les données de l’onglet et remplir vers le bas la seconde colonne comme l’indiquait Sophie
StéphaneStéphane Lorin
Participantdésolé, j’ai mal compris la question. et ma réponse s’est croisée avec celle de Sophie
StéphaneStéphane Lorin
ParticipantBonjour
Votre question n’est pas très précise : voulez-vous traiter vos données à l’intérieur de votre fichier ou dans un autre fichier ?
Si c’est à l’intérieur de votre fichier, la fonction “Excel.CurrentWorkbook()” ne permet de lire que les tableaux. Ce n’est donc pas possible directement comme vous précisez que c’est une feuille et non un tableau
Il faut donc passer un classeur externe et lire le contenu de votre fichier REQUETEX
Vous importez votre fichier via le menu, vous sélectionnez l’onglet, vous modifiez la requête et sélectionnez vos colonnes.Vous allez avoir une requête qui va ressembler à
let
Source = Excel.Workbook(File.Contents(“Votre dossier\REQUETEX.xlsx”), null, true),
Feuil1_Sheet = Source{[Item=”Feuil1″,Kind=”Sheet”]}[Data],
#”Autres colonnes supprimées” = Table.SelectColumns(Feuil1_Sheet,{“Column4”, “Column5″})
in
#”Autres colonnes supprimées”A noter que les premières lignes et colonnes vides sont automatiquement retirées.
Vos données sont en colonnes F et G mais comme vos colonnes A et B sont vides, il faut bien prendre les “Column4” et “Column5” dans la requête.Il est même possible d’exécuter exactement la requête à l’intérieur de votre fichier source mais il faudra l’enregistrer pour prendre en compte les modifications de votre liste en vert.
En effet, “Excel.CurrentWorkbook” analyse les données du classeur en cours même ce qui n’est pas enregistré
Par contre, “Excel.Workbook” nécessite d’enregistrer les modifications pour les prendre en compte.Cordialement
Stéphane
Stéphane Lorin
ParticipantBonjour
Vous ne dites pas quelle est la valeur de la cellule E13
Mais si vous avez 2019 en E13 il faut remplacer “[Periode].[Période].&[2019]” par “[Periode].[Période].&[“&E13&”]”Stéphane
-
AuteurMessages