-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathRecursividadeEstrutura.txt
114 lines (98 loc) · 6.11 KB
/
RecursividadeEstrutura.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
let
funcao =
// ------------------------------------------------------------------- INICIO DA FUNCAO -------------------------------------------------------------------
(
Estruturas as table,
ProdutosExplodir as list
) =>
let
TabelaExplodir =
let
ListaProdutosBuffer = List.Buffer(ProdutosExplodir),
FonteBuffer = Table.Buffer(Estruturas),
SomenteProdutosSelecionados = Table.SelectRows(FonteBuffer, each List.Contains(ListaProdutosBuffer, [PRODUTO]) ),
DuplicarColuna = Table.DuplicateColumn(SomenteProdutosSelecionados, "COMPONENTE", "NivelComponente"),
RenomearColunasExplodir = Table.RenameColumns(DuplicarColuna,{{"PRODUTO", "ProdutoFim"}, {"COMPONENTE", "NivelProduto"}, {"QTD", "NivelQtd"}})
in
RenomearColunasExplodir,
Saida =
(
TabelaInicial as table,
optional Loops as number,
optional ListaComprasInicial as table
) =>
let
i =
if Loops = null
then 1
else Loops+1,
Fonte = TabelaInicial,
ProcurarAberturaEstrutura = Table.NestedJoin(Fonte, {"NivelComponente"}, Estruturas, {"PRODUTO"}, "TabelaEstruturas", JoinKind.LeftOuter),
TabelaEstruturasExpandido = Table.ExpandTableColumn(ProcurarAberturaEstrutura, "TabelaEstruturas", {"PRODUTO", "COMPONENTE", "QTD"}, {"TabelaEstruturas.PRODUTO", "TabelaEstruturas.COMPONENTE", "TabelaEstruturas.QTD"}),
// Inicio da Lista de Compras,
SomenteProdutosSemRecursividade = Table.SelectRows(TabelaEstruturasExpandido, each ([TabelaEstruturas.QTD] = null)),
SelecionarSomenteColunasUsadas = Table.SelectColumns(SomenteProdutosSemRecursividade,{"ProdutoFim", "NivelProduto", "NivelComponente", "NivelQtd"}),
ListaCompra =
if i = 1
then SelecionarSomenteColunasUsadas
else Table.Combine({ListaComprasInicial, SelecionarSomenteColunasUsadas}),
// Produtos com recursividade => preparar Loop
SomenteProdutosComRecursividade = Table.SelectRows(TabelaEstruturasExpandido, each ([TabelaEstruturas.QTD] <> null)),
MultiplicarQuantidades = Table.AddColumn(SomenteProdutosComRecursividade, "QTD_Loop", each [NivelQtd] * [TabelaEstruturas.QTD], type number),
EscolherColunasVoltar = Table.SelectColumns(MultiplicarQuantidades,{"ProdutoFim", "TabelaEstruturas.PRODUTO", "TabelaEstruturas.COMPONENTE", "QTD_Loop"}),
VoltarLoop = Table.RenameColumns(EscolherColunasVoltar,{{"TabelaEstruturas.PRODUTO", "NivelProduto"}, {"TabelaEstruturas.COMPONENTE", "NivelComponente"}, {"QTD_Loop", "NivelQtd"}}),
out =
if Table.RowCount(VoltarLoop) > 0
then @Saida(VoltarLoop, i, ListaCompra)
else ListaCompra
in
out
in
Saida(TabelaExplodir)
// ------------------------------------------------------------------- FIM DA FUNCAO -------------------------------------------------------------------
, metadados = [
Documentation.Name = "RecursividadeEstrutura",
Documentation.Description = "
by Joviano Silveira (www.joviano.com)
Essa função explode a estrutura do produto, encontrando o ultimo nivel do produto dela, ou seja, a lista de compras de materiais para fazer cada produto. ===ATENÇÃO=== a tabela tem que conter esses campos, com exatamente esses nomes: PRODUTO, COMPONENTE, QTD
",
Documentation.Examples = {
// exemplo 01
[
Description = "descricao do exemplo 1",
Code = "
RecursividadeEstrutura(
Table.FromRecords({
[PRODUTO = 100001, COMPONENTE = 200001, QTD = 2],
[PRODUTO = 100001, COMPONENTE = 500001, QTD = 1],
[PRODUTO = 100001, COMPONENTE = 500002, QTD = 3],
[PRODUTO = 100002, COMPONENTE = 200001, QTD = 4],
[PRODUTO = 100002, COMPONENTE = 500001, QTD = 6],
[PRODUTO = 100002, COMPONENTE = 500002, QTD = 2],
[PRODUTO = 200001, COMPONENTE = 500003, QTD = 1],
[PRODUTO = 200001, COMPONENTE = 500004, QTD = 5]
}),
{100001, 100002}
)
",
Result = "
ProdutoFim | NivelProduto | NivelComponente | NivelQtd
100001 | 500001 | 500001 | 1
100002 | 500001 | 500001 | 6
100001 | 500002 | 500002 | 3
100002 | 500002 | 500002 | 2
100001 | 200001 | 500003 | 2
100002 | 200001 | 500003 | 4
100001 | 200001 | 500004 | 10
100002 | 200001 | 500004 | 20
"
]
}
]
in
Value.ReplaceType(
funcao,
Value.ReplaceMetadata(
Value.Type(funcao),metadados
)
)