Добрый день, мы тут с чатжпт не можем решить задачу. У меня уже есть код, который из таблицы с Кодом Ребенка, Кодом Родителя, Именем Ребенка, Именем Родителя - возвращает колонку HighestParent Я пытаюсь просто добавить колонку HighestParent-1 То есть если у меня код ребенка А а у его предков соответственно B-C-D-E, я хочу получить Е для HighestParent и D для HighestParent-1 А для D из предыдущего примера Е для HighestParent и тоже E для HighestParent-1.
Файл с power query в приложении мой код:
Код
let
Source = Hierarchy,
ListEnfant = List.Buffer( Source[#"Id Compte enfant"] ),
ListParentID = List.Buffer( Source[#"Id Compte parent"] ),
fnAncetre = (n as text) as text =>
let
PosOfParent = List.PositionOf( ListEnfant, n ),
ParID = if PosOfParent >= 0 then ListParentID{PosOfParent} else null
in
if ParID = null then n else @fnAncetre(ParID),
AncetreID = Table.AddColumn( Source,
"HighestParent",
each fnAncetre( [#"Id Compte enfant"] ),
type text)
in
AncetreID
TheBestOfTheBest, так он вроде и делает это (@fnAncetre(ParID)) badzen, код, очевидно, взят отсюда. Если я правильно вас понял, то вам не хватает данных из предпоследнего шага? Всю цепочку вы можете получить с помощью List.Generate, например (ну как мне кажется ). И уже оттуда вытягивать последнее, предпоследнее и какое хотите значение. Можно подумать насчет оптимизации алгоритма, конечно (цепочки то отрабатываются по многу раз). Но я бы для начала решил эту вашу насущную задачу "тупо в лоб", а потом "допиливал" решение до оптимального.
Alien Sphinx, ну по сути можно особо не париться и всего лишь чуть изменить функцию:
Код
let
Source = Hierarchy,
ListEnfant = List.Buffer ( Source[#"Id Compte enfant"] ),
ListParentID = List.Buffer ( Source[#"Id Compte parent"] ),
fnAncetre = ( n as text, optional k as text ) as record =>
let
PosOfParent = List.PositionOf ( ListEnfant, n ),
ParID = if PosOfParent >= 0 then ListParentID{PosOfParent} else null
in
if ParID = null then [ HighestParent = n, preHighestParent = k ] else @fnAncetre ( ParID, n ),
AncetreID = Table.FromRecords ( Table.TransformRows ( Source, ( r ) => Record.Combine ( { r, fnAncetre ( r[#"Id Compte enfant"] ) } ) ) )
in
AncetreID