Hi Dennis
Zufällig habe ich mich zum Zeitvertreib soeben noch einmal mit der Aufgabe beschäftigt. Logik aussen vor d.h. die Formellogik übernommen.
Ja, man kann die Aufgabe auch mit PQ lösen, aber es ist nicht das geeignete Mittel, weil...
- Der Aufwand für die Erstellung des M-Codes ist enorm, wenn man es mit der Einfachheit der beiden Formeln vergleicht
- Die Aufgabe hat nichts mit Abfragen/Queries zu tun
- PQ ist nicht für den Abgleich von Zeilen untereinander geeignet. Die Performance wird beeinträchtigt.
Aber lustig ist die M-Code Programmierung ja trotzdem...
https://www.herber.de/bbs/user/153914.xlsx
Ablauf:
- Quellbezug und Sortierung
- Funktion fxHilfsspalte() erzeugt eine neue TabelleHilfsspalte mit Index und Hilfsspalte
- Quellbezug und TabelleHilfsspalte wird zusammengeführt (Join) woraus sich QuelleMitHilfsspalte ergibt
- Funktion fxPalettennummer() erzeugt eine neue TabellePalettennummer mit Index und Paletten-Spalte
- QuelleMitHilfsspalte und TabellePalettennummer wird zusammengeführt (Join) woraus sich das Abfrageergebnis ergibt
cu
Chris
QuelleBezug:
let
Quelle = Excel.CurrentWorkbook(){[Name="Tabelle1"]}[Content],
#"Geänderter Typ" = Table.TransformColumnTypes(Quelle,{{"Artikel", type text}, {"Anzahl", Int64.Type}, {"Paletten", type number}, {"Kategorie", type text}, {"Restkartons", Int64.Type}}),
#"Sortierte Zeilen" = Table.Sort(#"Geänderter Typ",{{"Kategorie", Order.Ascending}, {"Restkartons", Order.Descending}})
in
#"Sortierte Zeilen"
TabelleHilfsspalte:
let
Quelle = fxHilfsspalte(QuelleBezug,18,{},0)
in
Quelle
Funktion fxHilfsspalte:
(Inputtabelle as table, Schwellwert as number, listNeu as list, loop as number) =>
let
listKategorie = Inputtabelle[Kategorie],
listRestmenge = Inputtabelle[Restkartons],
listNeu =
if loop = 0 then
List.InsertRange(listNeu,List.Count(listNeu),{List.First(List.Range(listRestmenge, loop))})
else
if List.First(List.Range(listKategorie, loop)) List.First(List.Range(listKategorie, loop-1)) or
List.First(List.Range(listNeu, loop-1))+List.First(List.Range(listRestmenge, loop)) > Schwellwert
then
List.InsertRange(listNeu,List.Count(listNeu),{List.First(List.Range(listRestmenge, loop))})
else
List.InsertRange(listNeu,List.Count(listNeu),{List.First(List.Range(listNeu, loop-1))+List.First(List.Range(listRestmenge, loop))}),
Output =
if loop = List.Count(listRestmenge) - 1 then
Table.AddIndexColumn(Table.RenameColumns(Table.FromList(listNeu, Splitter.SplitByNothing(), null, null, ExtraValues.Error),{{"Column1", "Hilfsspalte"}}), "Index", 0, 1, Int64.Type)
else
fxHilfsspalte(Inputtabelle,Schwellwert,listNeu,loop+1)
in
Output
QuelleMitHilfsspalte:
let
Quelle = QuelleBezug,
#"Hinzugefügter Index" = Table.AddIndexColumn(Quelle, "Index", 0, 1, Int64.Type),
#"Zusammengeführte Abfragen" = Table.NestedJoin(#"Hinzugefügter Index", {"Index"}, TabelleHilfsspalte, {"Index"}, "TabelleHilfsspalte", JoinKind.LeftOuter),
#"Erweiterte TabelleHilfsspalte" = Table.ExpandTableColumn(#"Zusammengeführte Abfragen", "TabelleHilfsspalte", {"Hilfsspalte"}, {"Hilfsspalte"}),
#"Sortierte Zeilen" = Table.Sort(#"Erweiterte TabelleHilfsspalte",{{"Index", Order.Ascending}})
in
#"Sortierte Zeilen"
TabellePalettennummer:
let
Quelle = fxPalettennummer(QuelleMitHilfsspalte,{},0)
in
Quelle
Funktion fxPalettennummer:
(Inputtabelle as table, listNeu as list, loop as number) =>
let
listHilfsspalte = Inputtabelle[Hilfsspalte],
listNeu =
if loop = 0 then
List.InsertRange(listNeu,List.Count(listNeu),{1})
else
if List.First(List.Range(listHilfsspalte, loop))
Abfrageergebnis:
let
Quelle = QuelleMitHilfsspalte,
#"Zusammengeführte Abfragen" = Table.NestedJoin(Quelle, {"Index"}, TabellePalettennummer, {"Index"}, "TabellePalettennummer", JoinKind.LeftOuter),
#"Erweiterte TabellePalettennummer" = Table.ExpandTableColumn(#"Zusammengeführte Abfragen", "TabellePalettennummer", {"Palettennummer"}, {"Palettennummer"}),
#"Sortierte Zeilen" = Table.Sort(#"Erweiterte TabellePalettennummer",{{"Index", Order.Ascending}}),
#"Entfernte Spalten" = Table.RemoveColumns(#"Sortierte Zeilen",{"Index"})
in
#"Entfernte Spalten"