Microsoft 365 Cumul progressif en PowerQuery

Laurent78

XLDnaute Occasionnel
Bonsoir à tous,
J'espère que vous avez passé une excellente première partie des fêtes de fin d'année.

J'ai un petit sujet à traiter.
Il s'agit de "virtuellement" refabriquer des numéros de pièces dans une bases de données comptables (afin de pouvoir par la suite faire des liens/jointures, mais cette suite n'est pas dans le problème).
Sachant que les bases de données comportent plusieurs centaines de milliers des lignes (et dépassent le million de ligne d'une feuille Excel), j'utilise PowerQuery, sauf que, autant il est simple de faire un cumul progressif dans Excel autant c'est un peu plus compliqué dans PQ, et surtout, l'autojointure + regroupement sur des centaines de millier de lignes risque de prendre beaucoup de temps.
Bref si quelqu'un qui passe par là a une idée, ce serait chouette.

Bien évidement, arrivé ici, vous n'avez certainement pas compris grand chose ;)

Donc, je joins une fichier Anonymisé avec 2 Onglets, l'un ("Le but") comprend la base et ce que je souhaite obtenir, le second ("DataBase Exemple") la base (sous forme de tableau structuré) pour faire mumuse dans PQ.

Un grand merci d'avance à ceux qui auront des idées voire la solution !

@+
Laurent
 

Pièces jointes

  • écriture galère anonymisée V3.xlsx
    17.6 KB · Affichages: 6
Solution
Re,

Du coup, tu peux tester avec cette requête :
PowerQuery:
let
    Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
    AddColumn_Index = Table.AddIndexColumn(Source, "Index", 1, 1, Int64.Type),
    AddColumn_MontantSigné = Table.AddColumn(AddColumn_Index, "Montant signé", each [Débit]-[Crédit], type number),
    listMontantSignés = List.Buffer(AddColumn_MontantSigné[Montant signé]),
    AddColumn_CumulProgressif = Table.AddColumn(AddColumn_MontantSigné, "Cumul progressif", each List.Sum(List.FirstN(listMontantSignés, [Index])), type number),
    AddColumn_FlagZero = Table.AddColumn(AddColumn_CumulProgressif, "FlagZero", each if [Cumul progressif]=0 then [Index] else null),
    FillUp_FlagZero = Table.FillUp(AddColumn_FlagZero,{"FlagZero"})...

mromain

XLDnaute Barbatruc
Bonsoir Laurent,

Ci-dessous une possibilité :

PowerQuery:
let
    Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
    AddColumn_MontantSigné = Table.AddColumn(Source, "Montant signé", each [Débit]-[Crédit], type number),
    listMontantSignés = List.Buffer(AddColumn_MontantSigné[Montant signé]),
    AddColumn_CumulProgressif = Table.AddColumn(AddColumn_MontantSigné, "Cumul progressif", each List.Sum(List.FirstN(listMontantSignés, [ID])), type number)
in
    AddColumn_CumulProgressif

A+

edit : pour la dernière colonne (A-1, B-1n ...) je t'avoue ne pas trop comprendre...
 

Laurent78

XLDnaute Occasionnel
Bonsoir Laurent,

Ci-dessous une possibilité :

PowerQuery:
let
    Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
    AddColumn_MontantSigné = Table.AddColumn(Source, "Montant signé", each [Débit]-[Crédit], type number),
    listMontantSignés = List.Buffer(AddColumn_MontantSigné[Montant signé]),
    AddColumn_CumulProgressif = Table.AddColumn(AddColumn_MontantSigné, "Cumul progressif", each List.Sum(List.FirstN(listMontantSignés, [ID])), type number)
in
    AddColumn_CumulProgressif

A+

edit : pour la dernière colonne (A-1, B-1n ...) je t'avoue ne pas trop comprendre...
Bonsoir Romain,
Déjà un grand merci pour ce début de réponse.
évidement, j'ai fait une première boulette, la colonne ID, donc, on ne peut pas s'appuyer dessus, ne devrait pas être là, je l'avais ajouté dans Excel (j'ai modifié mon fichier exemple dans le Post#1); Mais cela ne pose de problème majeur, puisqu'il suffit d'ajouter un colonne Index en PQ.
Ensuite, le but final est en fait de dire, lorsque le cumul progressif passe à 0, alors c'est la dernière ligne de la pièce comptable, qui doit donc avoir le même numéro que la ligne au dessus (A-1), mais ensuite, on passe à un nouveau numéro de pièce (B-1). Je pense que j'aurais dû écrire A1, A2, etc et non A-1 ou le signe "-" porte à confusion. Il fallait lire "A tiret 1" et non pas "A moins 1". Du coup, j'ai supprimé les "-" (tirets)
Suis-je clair ?🤔
Encore merci.
Laurent
 
Dernière édition:

mromain

XLDnaute Barbatruc
Re,

Du coup, tu peux tester avec cette requête :
PowerQuery:
let
    Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
    AddColumn_Index = Table.AddIndexColumn(Source, "Index", 1, 1, Int64.Type),
    AddColumn_MontantSigné = Table.AddColumn(AddColumn_Index, "Montant signé", each [Débit]-[Crédit], type number),
    listMontantSignés = List.Buffer(AddColumn_MontantSigné[Montant signé]),
    AddColumn_CumulProgressif = Table.AddColumn(AddColumn_MontantSigné, "Cumul progressif", each List.Sum(List.FirstN(listMontantSignés, [Index])), type number),
    AddColumn_FlagZero = Table.AddColumn(AddColumn_CumulProgressif, "FlagZero", each if [Cumul progressif]=0 then [Index] else null),
    FillUp_FlagZero = Table.FillUp(AddColumn_FlagZero,{"FlagZero"}),
    DeleteColumn_Index = Table.RemoveColumns(FillUp_FlagZero,{"Index"}),
    GroupBy_PieceFlagZero = Table.Group(DeleteColumn_Index, {"Pièce", "FlagZero"}, {{"Data", each _, type table [Jour=datetime, Pièce=text, Compte général=any, Débit=number, Crédit=number, Montant signé=number, Cumul progressif=number, FlagZero=number]}}),
    AddColumn_GroupIndex = Table.AddIndexColumn(GroupBy_PieceFlagZero, "GroupIndex", 0, 1, Int64.Type),
    listGroupPièce = List.Buffer(AddColumn_GroupIndex[Pièce]),
    AddColumn_IdPiece = Table.AddColumn(AddColumn_GroupIndex, "ID Pièce", each let piece = [Pièce], idx = [GroupIndex] in piece & "-" & Text.From(List.Count(List.Select(List.FirstN(listGroupPièce, idx), each _ = piece)))),
    SelectColumns = Table.SelectColumns(AddColumn_IdPiece,{"Data", "ID Pièce"}),
    DevelopDataGroup = Table.ExpandTableColumn(SelectColumns, "Data", {"Jour", "Pièce", "Compte général", "Débit", "Crédit", "Montant signé", "Cumul progressif"}, {"Jour", "Pièce", "Compte général", "Débit", "Crédit", "Montant signé", "Cumul progressif"})
in
    DevelopDataGroup

Peut-être y aura-t-il d'autres propositions plus performante, surtout si tu as un gros volume de données.

A+
 

Statistiques des forums

Discussions
315 093
Messages
2 116 137
Membres
112 668
dernier inscrit
foyoman