@luquimbo/bi-superpowers 5.0.1 → 5.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.claude-plugin/skill-manifest.json +1 -1
- package/.plugin/plugin.json +1 -1
- package/AGENTS.md +3 -3
- package/CHANGELOG.md +35 -0
- package/README.md +6 -5
- package/bin/commands/validate-projects.js +1 -1
- package/commands/bi-modeling.md +1 -1
- package/package.json +4 -2
- package/skills/bi-connect/SKILL.md +1 -1
- package/skills/bi-connect/scripts/update-check.js +1 -1
- package/skills/bi-dax/SKILL.md +1 -1
- package/skills/bi-dax/scripts/update-check.js +1 -1
- package/skills/bi-kickoff/SKILL.md +1 -1
- package/skills/bi-kickoff/scripts/update-check.js +1 -1
- package/skills/bi-modeling/SKILL.md +2 -2
- package/skills/bi-modeling/scripts/update-check.js +1 -1
- package/skills/bi-performance/SKILL.md +1 -1
- package/skills/bi-performance/scripts/update-check.js +1 -1
- package/skills/bi-start/SKILL.md +1 -1
- package/skills/bi-start/scripts/update-check.js +1 -1
- package/src/content/skills/bi-modeling.md +1 -1
- package/templates/sales/AGENTS.md +33 -0
- package/templates/sales/sales-template.Report/.platform +11 -0
- package/templates/sales/sales-template.Report/StaticResources/RegisteredResources/BISuperpowers.json +3888 -0
- package/templates/sales/sales-template.Report/StaticResources/SharedResources/BaseThemes/Fluent2-CY26SU03.json +4104 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/page.json +123 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/10420560e5b8c5235857/visual.json +16 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/2181c54a94f0c67abb2d/visual.json +283 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/24eba6a7af0b59974ef5/visual.json +703 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/26db24c91e5b615a5c29/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/26db24c91e5b615a5c29/visual.json +528 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/2ec652d0956901dd2afd/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/2ec652d0956901dd2afd/visual.json +324 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/45dda4e0b159becf2dcd/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/45dda4e0b159becf2dcd/visual.json +359 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/4ca8800cf1539ad423f2/visual.json +468 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/4f5704218eb88f7cdff6/mobile.json +29 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/4f5704218eb88f7cdff6/visual.json +241 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/54d3fdbedbbb863a9d7a/visual.json +575 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/68043403e96ca8ed23e8/visual.json +575 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/80b54a678ef36a250994/visual.json +351 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/814f624b6056dc4c8de5/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/814f624b6056dc4c8de5/visual.json +421 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/85e1cc13559f4e107ede/visual.json +681 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/8686961b837e855963fe/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/8686961b837e855963fe/visual.json +720 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/8d302c5b7e87e8cb57bb/visual.json +590 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/a02c5b30f2e757637d78/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/a02c5b30f2e757637d78/visual.json +102 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/a405d29e7744c770d445/visual.json +575 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/b0dc2036d3cf2baafb35/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/b0dc2036d3cf2baafb35/visual.json +333 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/cdd696baaf3b80b326f8/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/cdd696baaf3b80b326f8/visual.json +468 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/ff77ca1bafff5bfe5044/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/ff77ca1bafff5bfe5044/visual.json +523 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/page.json +130 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/0352fd80d074693a65db/visual.json +681 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/1c5a14bf493697344b68/visual.json +351 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/3486cf7624c5b109b4e5/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/3486cf7624c5b109b4e5/visual.json +333 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/4d8b989008edc0db28d1/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/4d8b989008edc0db28d1/visual.json +102 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/5f4d76bbc870118e9840/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/5f4d76bbc870118e9840/visual.json +468 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/73629e1abebb7a444b59/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/73629e1abebb7a444b59/visual.json +359 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/749cb1388c7e0a88161c/visual.json +685 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/85090dcdf75ac2487d1e/visual.json +283 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/92cf92e3da10493adb78/visual.json +468 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a30bd0950630ed94e8a3/visual.json +590 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a56e91d9400a835e4814/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a56e91d9400a835e4814/visual.json +528 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a90aaa3e3117494f18f8/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a90aaa3e3117494f18f8/visual.json +523 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/aded24cd205c0b528642/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/aded24cd205c0b528642/visual.json +720 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/af34b26f14a8a724c9a9/mobile.json +37 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/af34b26f14a8a724c9a9/visual.json +1230 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/b06ef80aa78cabcef8a6/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/b06ef80aa78cabcef8a6/visual.json +324 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/d97979633a91e041107e/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/d97979633a91e041107e/visual.json +421 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/fa81f184e2cb0e8b087c/mobile.json +29 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/fa81f184e2cb0e8b087c/visual.json +241 -0
- package/templates/sales/sales-template.Report/definition/pages/pages.json +8 -0
- package/templates/sales/sales-template.Report/definition/report.json +89 -0
- package/templates/sales/sales-template.Report/definition/version.json +4 -0
- package/templates/sales/sales-template.Report/definition.pbir +9 -0
- package/templates/sales/sales-template.SemanticModel/.pbi/editorSettings.json +8 -0
- package/templates/sales/sales-template.SemanticModel/.platform +11 -0
- package/templates/sales/sales-template.SemanticModel/DAXQueries/.pbi/daxQueries.json +9 -0
- package/templates/sales/sales-template.SemanticModel/DAXQueries/Calendar445MonthNr.dax +0 -0
- package/templates/sales/sales-template.SemanticModel/DAXQueries/Consulta 1.dax +6 -0
- package/templates/sales/sales-template.SemanticModel/DAXQueries/Consulta 2.dax +32 -0
- package/templates/sales/sales-template.SemanticModel/definition/cultures/es-AR.tmdl +7324 -0
- package/templates/sales/sales-template.SemanticModel/definition/database.tmdl +3 -0
- package/templates/sales/sales-template.SemanticModel/definition/expressions.tmdl +233 -0
- package/templates/sales/sales-template.SemanticModel/definition/functions.tmdl +247 -0
- package/templates/sales/sales-template.SemanticModel/definition/model.tmdl +46 -0
- package/templates/sales/sales-template.SemanticModel/definition/relationships.tmdl +16 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Aux Comparaciones.tmdl +194 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Aux Dimensiones ventas.tmdl +71 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Aux Ejes temporales.tmdl +67 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Aux Per/303/255odos.tmdl" +318 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Aux Vista de calendario.tmdl +36 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Aux Vista del valor.tmdl +87 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Aux Vista temporal.tmdl +62 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Calendario.tmdl +198 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Canales.tmdl +59 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Clientes.tmdl +120 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Modelo Configuraci/303/263n.tmdl" +48 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Monedas.tmdl +43 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/M/303/251tricas.tmdl +553 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Productos.tmdl +73 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Tipo de cambio.tmdl +66 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Ventas.tmdl +133 -0
- package/templates/sales/sales-template.SemanticModel/definition.pbism +5 -0
- package/templates/sales/sales-template.SemanticModel/diagramLayout.json +239 -0
- package/templates/sales/sales-template.pbip +14 -0
package/templates/sales/sales-template.SemanticModel/definition/tables/Aux Vista de calendario.tmdl
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/// Tabla desconectada del template para alternar entre calendario gregoriano y semanal 4-4-5.
|
|
2
|
+
table 'Aux Vista de calendario'
|
|
3
|
+
lineageTag: 30c2b190-4109-4c7b-ae8c-a4cb2895f15e
|
|
4
|
+
|
|
5
|
+
column 'Vista de calendario'
|
|
6
|
+
lineageTag: 383b4358-0b80-44e6-9b0a-7eb5fe33f262
|
|
7
|
+
summarizeBy: none
|
|
8
|
+
sourceColumn: [Tipo Calendario]
|
|
9
|
+
sortByColumn: 'Orden vista de calendario'
|
|
10
|
+
|
|
11
|
+
column 'Vista de calendario EN'
|
|
12
|
+
isHidden
|
|
13
|
+
lineageTag: 1938c960-4bb8-497f-a416-56690510a5fc
|
|
14
|
+
summarizeBy: none
|
|
15
|
+
sourceColumn: [Tipo Calendario EN]
|
|
16
|
+
|
|
17
|
+
column 'Orden vista de calendario'
|
|
18
|
+
isHidden
|
|
19
|
+
formatString: 0
|
|
20
|
+
lineageTag: be4cbb5b-2720-41cb-aebd-b52005cead4e
|
|
21
|
+
summarizeBy: none
|
|
22
|
+
sourceColumn: [Orden Tipo Calendario]
|
|
23
|
+
|
|
24
|
+
partition 'Vista de calendario' = calculated
|
|
25
|
+
mode: import
|
|
26
|
+
source =
|
|
27
|
+
DATATABLE (
|
|
28
|
+
"Tipo Calendario", STRING,
|
|
29
|
+
"Tipo Calendario EN", STRING,
|
|
30
|
+
"Orden Tipo Calendario", INTEGER,
|
|
31
|
+
{
|
|
32
|
+
{ "Gregoriano", "Gregorian", 1 },
|
|
33
|
+
{ "Semanal 4-4-5", "4-4-5 Weekly", 2 }
|
|
34
|
+
}
|
|
35
|
+
)
|
|
36
|
+
|
package/templates/sales/sales-template.SemanticModel/definition/tables/Aux Vista del valor.tmdl
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
table 'Aux Vista del valor'
|
|
2
|
+
lineageTag: ed02182c-5eee-4e6f-97c7-2dd97712298b
|
|
3
|
+
|
|
4
|
+
/// Permite cambiar cómo se resume la métrica seleccionada: valor o acumulado.
|
|
5
|
+
calculationGroup
|
|
6
|
+
precedence: 10
|
|
7
|
+
|
|
8
|
+
multipleOrEmptySelectionExpression = SELECTEDMEASURE()
|
|
9
|
+
|
|
10
|
+
formatStringDefinition = SELECTEDMEASUREFORMATSTRING()
|
|
11
|
+
|
|
12
|
+
noSelectionExpression = SELECTEDMEASURE()
|
|
13
|
+
|
|
14
|
+
formatStringDefinition = SELECTEDMEASUREFORMATSTRING()
|
|
15
|
+
|
|
16
|
+
/// Muestra la métrica seleccionada con su agregación natural.
|
|
17
|
+
calculationItem Valor = SELECTEDMEASURE()
|
|
18
|
+
|
|
19
|
+
formatStringDefinition = SELECTEDMEASUREFORMATSTRING()
|
|
20
|
+
|
|
21
|
+
/// Acumula la métrica sobre las fechas visibles cuando la métrica lo permite. Sin métrica única en contexto devuelve blanco.
|
|
22
|
+
calculationItem Acumulado =
|
|
23
|
+
VAR __Value = SELECTEDMEASURE()
|
|
24
|
+
VAR __MetricName = SELECTEDVALUE ( 'Métricas'[Métrica] )
|
|
25
|
+
VAR __CanAccumulate = SELECTEDVALUE ( 'Métricas'[Acumulado] )
|
|
26
|
+
VAR __HasTemporalAxis =
|
|
27
|
+
ISINSCOPE ( 'Calendario'[Fecha] )
|
|
28
|
+
|| ISINSCOPE ( 'Calendario'[Semana] )
|
|
29
|
+
|| ISINSCOPE ( 'Calendario'[Año mes] )
|
|
30
|
+
|| ISINSCOPE ( 'Calendario'[Trimestre] )
|
|
31
|
+
|| ISINSCOPE ( 'Calendario'[Año] )
|
|
32
|
+
VAR __CalendarContext = CalendarContext ()
|
|
33
|
+
VAR __CurrentStart = MAXX ( __CalendarContext, [Current Start] )
|
|
34
|
+
VAR __CurrentEnd = MAXX ( __CalendarContext, [Current End] )
|
|
35
|
+
VAR __RunningEnd = MIN ( MAX ( 'Calendario'[Fecha] ), __CurrentEnd )
|
|
36
|
+
VAR __RunningDates =
|
|
37
|
+
FILTER (
|
|
38
|
+
ALLSELECTED ( 'Calendario'[Fecha] ),
|
|
39
|
+
'Calendario'[Fecha] >= __CurrentStart
|
|
40
|
+
&& 'Calendario'[Fecha] <= __RunningEnd
|
|
41
|
+
)
|
|
42
|
+
RETURN
|
|
43
|
+
IF (
|
|
44
|
+
NOT ISNUMBER ( __Value ),
|
|
45
|
+
__Value,
|
|
46
|
+
IF (
|
|
47
|
+
ISBLANK ( __MetricName ) || ISBLANK ( __CanAccumulate ),
|
|
48
|
+
BLANK (),
|
|
49
|
+
IF (
|
|
50
|
+
NOT __CanAccumulate,
|
|
51
|
+
BLANK (),
|
|
52
|
+
IF (
|
|
53
|
+
__HasTemporalAxis,
|
|
54
|
+
IF (
|
|
55
|
+
ISSELECTEDMEASURE ( [Periodo Actual] ),
|
|
56
|
+
IF (
|
|
57
|
+
NOT ISBLANK ( __CurrentStart ) && NOT ISBLANK ( __RunningEnd ),
|
|
58
|
+
CALCULATE (
|
|
59
|
+
[Selector métrica],
|
|
60
|
+
REMOVEFILTERS ( 'Aux Vista del valor' ),
|
|
61
|
+
TREATAS ( { __MetricName }, 'Métricas'[Métrica] ),
|
|
62
|
+
REMOVEFILTERS ( 'Calendario' ),
|
|
63
|
+
TREATAS ( __RunningDates, 'Calendario'[Fecha] )
|
|
64
|
+
)
|
|
65
|
+
),
|
|
66
|
+
CALCULATE (
|
|
67
|
+
SELECTEDMEASURE (),
|
|
68
|
+
FILTER (
|
|
69
|
+
ALLSELECTED ( 'Calendario'[Fecha] ),
|
|
70
|
+
'Calendario'[Fecha] <= MAX ( 'Calendario'[Fecha] )
|
|
71
|
+
)
|
|
72
|
+
)
|
|
73
|
+
),
|
|
74
|
+
SELECTEDMEASURE ()
|
|
75
|
+
)
|
|
76
|
+
)
|
|
77
|
+
)
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
formatStringDefinition = SELECTEDMEASUREFORMATSTRING()
|
|
81
|
+
|
|
82
|
+
column 'Vista del valor'
|
|
83
|
+
dataType: string
|
|
84
|
+
lineageTag: f8965a03-4327-4f99-a7bf-a2421b04b8fd
|
|
85
|
+
|
|
86
|
+
partition 'Partition_Vista del valor' = calculationGroup
|
|
87
|
+
|
package/templates/sales/sales-template.SemanticModel/definition/tables/Aux Vista temporal.tmdl
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
table 'Aux Vista temporal'
|
|
2
|
+
lineageTag: 0a468eed-913c-45b4-90f9-73a7ca69a446
|
|
3
|
+
|
|
4
|
+
/// Permite aplicar inteligencia de tiempo estándar sobre la métrica seleccionada.
|
|
5
|
+
calculationGroup
|
|
6
|
+
precedence: 20
|
|
7
|
+
|
|
8
|
+
multipleOrEmptySelectionExpression = SELECTEDMEASURE()
|
|
9
|
+
|
|
10
|
+
formatStringDefinition = SELECTEDMEASUREFORMATSTRING()
|
|
11
|
+
|
|
12
|
+
noSelectionExpression = SELECTEDMEASURE()
|
|
13
|
+
|
|
14
|
+
formatStringDefinition = SELECTEDMEASUREFORMATSTRING()
|
|
15
|
+
|
|
16
|
+
/// Muestra el valor actual de la métrica seleccionada.
|
|
17
|
+
calculationItem Actual = SELECTEDMEASURE()
|
|
18
|
+
|
|
19
|
+
formatStringDefinition = SELECTEDMEASUREFORMATSTRING()
|
|
20
|
+
|
|
21
|
+
/// Muestra la métrica seleccionada desplazada un mes hacia atrás.
|
|
22
|
+
calculationItem 'Mes anterior' = CALCULATE ( SELECTEDMEASURE (), DATEADD ( 'Calendario'[Fecha], -1, MONTH ) )
|
|
23
|
+
|
|
24
|
+
formatStringDefinition = SELECTEDMEASUREFORMATSTRING()
|
|
25
|
+
|
|
26
|
+
/// Muestra la métrica seleccionada desplazada un año hacia atrás.
|
|
27
|
+
calculationItem 'Año anterior' = CALCULATE ( SELECTEDMEASURE (), DATEADD ( 'Calendario'[Fecha], -1, YEAR ) )
|
|
28
|
+
|
|
29
|
+
formatStringDefinition = SELECTEDMEASUREFORMATSTRING()
|
|
30
|
+
|
|
31
|
+
/// Muestra la diferencia absoluta contra el mismo período del año anterior.
|
|
32
|
+
calculationItem 'Variación vs año anterior' =
|
|
33
|
+
VAR __Actual = SELECTEDMEASURE()
|
|
34
|
+
VAR __Anterior = CALCULATE ( SELECTEDMEASURE (), DATEADD ( 'Calendario'[Fecha], -1, YEAR ) )
|
|
35
|
+
RETURN
|
|
36
|
+
IF (
|
|
37
|
+
NOT ISNUMBER ( __Actual ) || NOT ISNUMBER ( __Anterior ),
|
|
38
|
+
BLANK (),
|
|
39
|
+
__Actual - __Anterior
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
formatStringDefinition = SELECTEDMEASUREFORMATSTRING()
|
|
43
|
+
|
|
44
|
+
/// Muestra la variación porcentual contra el mismo período del año anterior.
|
|
45
|
+
calculationItem 'Variación % vs año anterior' =
|
|
46
|
+
VAR __Actual = SELECTEDMEASURE()
|
|
47
|
+
VAR __Anterior = CALCULATE ( SELECTEDMEASURE (), DATEADD ( 'Calendario'[Fecha], -1, YEAR ) )
|
|
48
|
+
RETURN
|
|
49
|
+
IF (
|
|
50
|
+
NOT ISNUMBER ( __Actual ) || NOT ISNUMBER ( __Anterior ),
|
|
51
|
+
BLANK (),
|
|
52
|
+
DIVIDE ( __Actual - __Anterior, __Anterior )
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
formatStringDefinition = "0.0%;-0.0%;0.0%"
|
|
56
|
+
|
|
57
|
+
column 'Vista temporal'
|
|
58
|
+
dataType: string
|
|
59
|
+
lineageTag: 30cf2dbe-aa15-4c38-ad93-78f075797f3a
|
|
60
|
+
|
|
61
|
+
partition 'Partition_Vista temporal' = calculationGroup
|
|
62
|
+
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/// Dimensión de fechas generada en Power Query. Usa el parámetro FechaInicio y mantiene el contrato del calendario original del template.
|
|
2
|
+
table Calendario
|
|
3
|
+
lineageTag: fc2b01ae-35f8-43a7-9daf-840d8d051fc3
|
|
4
|
+
dataCategory: Time
|
|
5
|
+
|
|
6
|
+
column Fecha
|
|
7
|
+
dataType: dateTime
|
|
8
|
+
formatString: ddd d/M
|
|
9
|
+
lineageTag: 1e0ef155-a40c-4313-86f8-b20f516f7e24
|
|
10
|
+
summarizeBy: none
|
|
11
|
+
sourceColumn: Fecha
|
|
12
|
+
|
|
13
|
+
annotation UnderlyingDateTimeDataType = Date
|
|
14
|
+
|
|
15
|
+
column Año
|
|
16
|
+
dataType: int64
|
|
17
|
+
formatString: 0
|
|
18
|
+
lineageTag: 62d06d49-ffb4-4de2-becd-8506d910959b
|
|
19
|
+
summarizeBy: none
|
|
20
|
+
sourceColumn: Año
|
|
21
|
+
|
|
22
|
+
column 'Número de mes'
|
|
23
|
+
dataType: int64
|
|
24
|
+
isHidden
|
|
25
|
+
formatString: 0
|
|
26
|
+
lineageTag: b3fc12e9-9a3f-43a3-a07e-ff07772d83f5
|
|
27
|
+
summarizeBy: none
|
|
28
|
+
sourceColumn: Número de mes
|
|
29
|
+
|
|
30
|
+
column Mes
|
|
31
|
+
dataType: string
|
|
32
|
+
lineageTag: 2302ab09-e96d-41ee-9532-2735fb84f65e
|
|
33
|
+
summarizeBy: none
|
|
34
|
+
sourceColumn: Mes
|
|
35
|
+
sortByColumn: 'Orden año mes'
|
|
36
|
+
|
|
37
|
+
column 'Año mes'
|
|
38
|
+
dataType: string
|
|
39
|
+
lineageTag: ae89004f-54bf-4202-b16c-b4f91cc165f5
|
|
40
|
+
summarizeBy: none
|
|
41
|
+
sourceColumn: Año mes
|
|
42
|
+
sortByColumn: 'Orden año mes'
|
|
43
|
+
|
|
44
|
+
column 'Orden año mes'
|
|
45
|
+
dataType: int64
|
|
46
|
+
isHidden
|
|
47
|
+
formatString: 0
|
|
48
|
+
lineageTag: fc2e5c02-4dc6-4b91-acb3-1a096c35bca1
|
|
49
|
+
summarizeBy: none
|
|
50
|
+
sourceColumn: Orden año mes
|
|
51
|
+
|
|
52
|
+
column Trimestre
|
|
53
|
+
dataType: string
|
|
54
|
+
lineageTag: 81037ded-e661-4e9c-b222-532ceff66df9
|
|
55
|
+
summarizeBy: none
|
|
56
|
+
sourceColumn: Trimestre
|
|
57
|
+
sortByColumn: 'Trimestre Orden'
|
|
58
|
+
|
|
59
|
+
column Semana
|
|
60
|
+
dataType: string
|
|
61
|
+
lineageTag: e127647f-e6dc-4491-bf3b-d39680cef7d7
|
|
62
|
+
summarizeBy: none
|
|
63
|
+
sourceColumn: Semana
|
|
64
|
+
sortByColumn: 'Semana Orden'
|
|
65
|
+
|
|
66
|
+
column 'Trimestre Orden'
|
|
67
|
+
dataType: int64
|
|
68
|
+
isHidden
|
|
69
|
+
formatString: 0
|
|
70
|
+
lineageTag: 76c5b649-a987-4058-b491-1ce85317f2b5
|
|
71
|
+
sourceColumn: Trimestre Orden
|
|
72
|
+
|
|
73
|
+
column 'Semana Orden'
|
|
74
|
+
dataType: int64
|
|
75
|
+
isHidden
|
|
76
|
+
formatString: 0
|
|
77
|
+
lineageTag: d92f289b-1949-48c3-979c-d5b950b4c4ca
|
|
78
|
+
sourceColumn: Semana Orden
|
|
79
|
+
|
|
80
|
+
column Fiscal445Year
|
|
81
|
+
dataType: int64
|
|
82
|
+
isHidden
|
|
83
|
+
lineageTag: eb46cab4-413f-4000-a55d-f84fc7f5da22
|
|
84
|
+
summarizeBy: none
|
|
85
|
+
sourceColumn: Fiscal445Year
|
|
86
|
+
|
|
87
|
+
column Fiscal445MonthNr
|
|
88
|
+
dataType: int64
|
|
89
|
+
isHidden
|
|
90
|
+
lineageTag: 3467957a-082e-4b33-af38-53379e25ce88
|
|
91
|
+
summarizeBy: none
|
|
92
|
+
sourceColumn: Fiscal445MonthNr
|
|
93
|
+
|
|
94
|
+
column Fiscal445QuarterNr
|
|
95
|
+
dataType: int64
|
|
96
|
+
isHidden
|
|
97
|
+
lineageTag: b2d6bdd1-7bd0-4fbc-813e-5d22de24417c
|
|
98
|
+
summarizeBy: none
|
|
99
|
+
sourceColumn: Fiscal445QuarterNr
|
|
100
|
+
|
|
101
|
+
column Fiscal445SemesterNr
|
|
102
|
+
dataType: int64
|
|
103
|
+
isHidden
|
|
104
|
+
lineageTag: bfb0e639-0c4a-4a15-86df-b8116c227bff
|
|
105
|
+
summarizeBy: none
|
|
106
|
+
sourceColumn: Fiscal445SemesterNr
|
|
107
|
+
|
|
108
|
+
column Fiscal445MonthKey
|
|
109
|
+
dataType: int64
|
|
110
|
+
isHidden
|
|
111
|
+
lineageTag: e8f647cd-3033-48c9-a33d-5ccc52b244e6
|
|
112
|
+
summarizeBy: none
|
|
113
|
+
sourceColumn: Fiscal445MonthKey
|
|
114
|
+
|
|
115
|
+
column Fiscal445QuarterKey
|
|
116
|
+
dataType: int64
|
|
117
|
+
isHidden
|
|
118
|
+
lineageTag: c6d09169-b938-4eb6-a30a-7600fa043f55
|
|
119
|
+
summarizeBy: none
|
|
120
|
+
sourceColumn: Fiscal445QuarterKey
|
|
121
|
+
|
|
122
|
+
column Fiscal445SemesterKey
|
|
123
|
+
dataType: int64
|
|
124
|
+
isHidden
|
|
125
|
+
lineageTag: ddb27e62-672c-4cae-8c2b-c7fc38608dcf
|
|
126
|
+
summarizeBy: none
|
|
127
|
+
sourceColumn: Fiscal445SemesterKey
|
|
128
|
+
|
|
129
|
+
/// Drill-down estándar de Calendario: Año -> Trimestre -> Año mes -> Semana -> Fecha. Útil para visuales que permiten expand/collapse temporal.
|
|
130
|
+
hierarchy 'Jerarquía de fechas'
|
|
131
|
+
lineageTag: 1b532d19-e2dc-4b39-9ec0-7fec1f5e6c8b
|
|
132
|
+
|
|
133
|
+
level Año
|
|
134
|
+
lineageTag: 74148cbb-3e80-4d23-bba8-b003b8ecae99
|
|
135
|
+
column: Año
|
|
136
|
+
|
|
137
|
+
level Trimestre
|
|
138
|
+
lineageTag: db5bc9a3-45f2-4a8f-9a63-2c93a1508470
|
|
139
|
+
column: Trimestre
|
|
140
|
+
|
|
141
|
+
level 'Año mes'
|
|
142
|
+
lineageTag: d37f6098-923f-48bf-aea1-4e7b9f00761c
|
|
143
|
+
column: 'Año mes'
|
|
144
|
+
|
|
145
|
+
level Semana
|
|
146
|
+
lineageTag: a6d53cdc-03d4-4237-b8a9-38e6bfed27d1
|
|
147
|
+
column: Semana
|
|
148
|
+
|
|
149
|
+
level Fecha
|
|
150
|
+
lineageTag: 069c9ce9-c661-432c-8793-18b3ebfbd7fa
|
|
151
|
+
column: Fecha
|
|
152
|
+
|
|
153
|
+
partition 'Calendario M' = m
|
|
154
|
+
mode: import
|
|
155
|
+
queryGroup: Calendario
|
|
156
|
+
source =
|
|
157
|
+
let
|
|
158
|
+
// Lee el parametro de zona horaria para calcular Today rolling.
|
|
159
|
+
OffsetHours = Number.From(ZonaHoraria),
|
|
160
|
+
Today = Date.From(DateTimeZone.SwitchZone(DateTimeZone.UtcNow(), OffsetHours)),
|
|
161
|
+
StartDate = Date.From(FechaInicio),
|
|
162
|
+
// Calendario rolling: arranca en FechaInicio y termina en Today (con timezone).
|
|
163
|
+
DateCount = Duration.Days(Today - StartDate) + 1,
|
|
164
|
+
Dates = List.Dates(StartDate, DateCount, #duration(1, 0, 0, 0)),
|
|
165
|
+
Source = Table.FromList(Dates, Splitter.SplitByNothing(), {"Fecha"}),
|
|
166
|
+
TypedDate = Table.TransformColumnTypes(Source, {{"Fecha", type date}}),
|
|
167
|
+
// Etiquetas en espanol para meses abreviados.
|
|
168
|
+
MonthAbbr = {"Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic"},
|
|
169
|
+
// Columnas gregorianas visibles (consumidas por DAX, slicers y ejes).
|
|
170
|
+
AddYear = Table.AddColumn(TypedDate, "Año", each Date.Year([Fecha]), Int64.Type),
|
|
171
|
+
AddMonthNumber = Table.AddColumn(AddYear, "Número de mes", each Date.Month([Fecha]), Int64.Type),
|
|
172
|
+
AddMonth = Table.AddColumn(AddMonthNumber, "Mes", each MonthAbbr{[Número de mes] - 1} & " '" & Text.End(Text.From([Año]), 2), type text),
|
|
173
|
+
AddYearMonth = Table.AddColumn(AddMonth, "Año mes", each Text.From([Año]) & "-" & Text.PadStart(Text.From([Número de mes]), 2, "0"), type text),
|
|
174
|
+
AddYearMonthOrder = Table.AddColumn(AddYearMonth, "Orden año mes", each [Año] * 100 + [Número de mes], Int64.Type),
|
|
175
|
+
AddQuarterNumber = Table.AddColumn(AddYearMonthOrder, "Quarter Nr", each Date.QuarterOfYear([Fecha]), Int64.Type),
|
|
176
|
+
AddQuarter = Table.AddColumn(AddQuarterNumber, "Trimestre", each "Q" & Text.From([Quarter Nr]) & " '" & Text.End(Text.From([Año]), 2), type text),
|
|
177
|
+
AddQuarterOrder = Table.AddColumn(AddQuarter, "Trimestre Orden", each [Año] * 10 + [Quarter Nr], Int64.Type),
|
|
178
|
+
// La semana se etiqueta por su fecha de inicio para leerla facil.
|
|
179
|
+
AddWeek = Table.AddColumn(AddQuarterOrder, "Semana", each let weekStart = Date.StartOfWeek([Fecha], Day.Monday) in "S" & Text.PadStart(Text.From(Date.WeekOfYear([Fecha], Day.Monday)), 2, "0") & " (" & Text.From(Date.Day(weekStart)) & "/" & Text.From(Date.Month(weekStart)) & ")", type text),
|
|
180
|
+
AddWeekOrder = Table.AddColumn(AddWeek, "Semana Orden", each let weekStart = Date.StartOfWeek([Fecha], Day.Monday) in Date.Year(weekStart) * 100 + Date.WeekOfYear(weekStart, Day.Monday), Int64.Type),
|
|
181
|
+
// Columnas fiscales 4-4-5 (ocultas, las consume Aux Periodos para construir presets fiscales).
|
|
182
|
+
AddFiscalYear = Table.AddColumn(AddWeekOrder, "Fiscal445Year", each fxTemplateCalendar445Year([Fecha]), Int64.Type),
|
|
183
|
+
AddFiscalMonthNr = Table.AddColumn(AddFiscalYear, "Fiscal445MonthNr", each fxTemplateCalendar445MonthNr([Fecha]), Int64.Type),
|
|
184
|
+
AddFiscalQuarterNr = Table.AddColumn(AddFiscalMonthNr, "Fiscal445QuarterNr", each Number.IntegerDivide([Fiscal445MonthNr] - 1, 3) + 1, Int64.Type),
|
|
185
|
+
AddFiscalSemesterNr = Table.AddColumn(AddFiscalQuarterNr, "Fiscal445SemesterNr", each if [Fiscal445MonthNr] <= 6 then 1 else 2, Int64.Type),
|
|
186
|
+
AddFiscalMonthKey = Table.AddColumn(AddFiscalSemesterNr, "Fiscal445MonthKey", each [Fiscal445Year] * 100 + [Fiscal445MonthNr], Int64.Type),
|
|
187
|
+
AddFiscalQuarterKey = Table.AddColumn(AddFiscalMonthKey, "Fiscal445QuarterKey", each [Fiscal445Year] * 10 + [Fiscal445QuarterNr], Int64.Type),
|
|
188
|
+
AddFiscalSemesterKey = Table.AddColumn(AddFiscalQuarterKey, "Fiscal445SemesterKey", each [Fiscal445Year] * 10 + [Fiscal445SemesterNr], Int64.Type),
|
|
189
|
+
// Quita columnas auxiliares que no deben quedar visibles.
|
|
190
|
+
RemovedHelpers = Table.RemoveColumns(AddFiscalSemesterKey, {"Quarter Nr"}),
|
|
191
|
+
Reordered = Table.ReorderColumns(RemovedHelpers, {"Fecha", "Año", "Número de mes", "Mes", "Año mes", "Orden año mes", "Trimestre", "Semana", "Trimestre Orden", "Semana Orden", "Fiscal445Year", "Fiscal445MonthNr", "Fiscal445QuarterNr", "Fiscal445SemesterNr", "Fiscal445MonthKey", "Fiscal445QuarterKey", "Fiscal445SemesterKey"})
|
|
192
|
+
in
|
|
193
|
+
Reordered
|
|
194
|
+
|
|
195
|
+
annotation PBI_NavigationStepName = Navegación
|
|
196
|
+
|
|
197
|
+
annotation PBI_ResultType = Table
|
|
198
|
+
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/// Dimension de canales de venta sintética, cargada desde Power Query para que el sample dataset no dependa de DAX calculated tables.
|
|
2
|
+
table Canales
|
|
3
|
+
lineageTag: 8271174d-1f18-43d9-ad8e-370998b8d018
|
|
4
|
+
|
|
5
|
+
column CanalId
|
|
6
|
+
dataType: string
|
|
7
|
+
isHidden
|
|
8
|
+
lineageTag: c9c93f4f-3a85-4e54-ac8d-0a0b70be1d19
|
|
9
|
+
summarizeBy: none
|
|
10
|
+
sourceColumn: CanalId
|
|
11
|
+
|
|
12
|
+
annotation SummarizationSetBy = Automatic
|
|
13
|
+
|
|
14
|
+
column Canal
|
|
15
|
+
dataType: string
|
|
16
|
+
lineageTag: 08a98eb8-a791-4152-95d7-4e19d120f890
|
|
17
|
+
summarizeBy: none
|
|
18
|
+
sourceColumn: Canal
|
|
19
|
+
|
|
20
|
+
column 'Tipo de canal'
|
|
21
|
+
dataType: string
|
|
22
|
+
lineageTag: 0ffdfecc-0590-4bbf-8fe4-88976ec80165
|
|
23
|
+
summarizeBy: none
|
|
24
|
+
sourceColumn: Tipo Canal
|
|
25
|
+
|
|
26
|
+
/// Drill-down de canales: Tipo de canal -> Canal.
|
|
27
|
+
hierarchy 'Jerarquía de canales'
|
|
28
|
+
lineageTag: 71851210-3fe5-4b08-952f-0be1ca0869cc
|
|
29
|
+
|
|
30
|
+
level 'Tipo de canal'
|
|
31
|
+
lineageTag: e384b060-dce2-4831-b447-54f7f783f26d
|
|
32
|
+
column: 'Tipo de canal'
|
|
33
|
+
|
|
34
|
+
level Canal
|
|
35
|
+
lineageTag: 13f2950d-1530-4077-b9d9-418929ea4cfb
|
|
36
|
+
column: Canal
|
|
37
|
+
|
|
38
|
+
partition Canales = m
|
|
39
|
+
mode: import
|
|
40
|
+
queryGroup: 'Sample Dataset'
|
|
41
|
+
source =
|
|
42
|
+
let
|
|
43
|
+
Source = #table(
|
|
44
|
+
type table [CanalId = Int64.Type, Canal = text, #"Tipo Canal" = text],
|
|
45
|
+
{
|
|
46
|
+
{ 1, "Directo", "Owned" },
|
|
47
|
+
{ 2, "Partner", "Indirecto" },
|
|
48
|
+
{ 3, "Marketplace", "Digital" },
|
|
49
|
+
{ 4, "Outbound", "Sales-led" }
|
|
50
|
+
}
|
|
51
|
+
),
|
|
52
|
+
#"Tipo cambiado" = Table.TransformColumnTypes(Source,{{"CanalId", type text}, {"Canal", type text}, {"Tipo Canal", type text}})
|
|
53
|
+
in
|
|
54
|
+
#"Tipo cambiado"
|
|
55
|
+
|
|
56
|
+
annotation PBI_NavigationStepName = Navegación
|
|
57
|
+
|
|
58
|
+
annotation PBI_ResultType = Table
|
|
59
|
+
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/// Dimensión sintética de clientes con 210 empresas de Latinoamérica y España, cargada desde Power Query para que el sample dataset no dependa de DAX calculated tables.
|
|
2
|
+
table Clientes
|
|
3
|
+
lineageTag: 54ff947e-7506-466e-9b73-bff64c48595f
|
|
4
|
+
|
|
5
|
+
column ClienteId
|
|
6
|
+
dataType: string
|
|
7
|
+
isHidden
|
|
8
|
+
lineageTag: 2f987211-80a8-4f05-9eb7-da2c4dd9ea62
|
|
9
|
+
summarizeBy: none
|
|
10
|
+
sourceColumn: ClienteId
|
|
11
|
+
|
|
12
|
+
annotation SummarizationSetBy = Automatic
|
|
13
|
+
|
|
14
|
+
column Cliente
|
|
15
|
+
dataType: string
|
|
16
|
+
lineageTag: fecfa652-2fa2-473c-864c-7d09d7e648a9
|
|
17
|
+
summarizeBy: none
|
|
18
|
+
sourceColumn: Cliente
|
|
19
|
+
|
|
20
|
+
column Segmento
|
|
21
|
+
dataType: string
|
|
22
|
+
lineageTag: 36d442f5-31d1-4ab8-a1ba-11245bb9ad8f
|
|
23
|
+
summarizeBy: none
|
|
24
|
+
sourceColumn: Segmento
|
|
25
|
+
|
|
26
|
+
column País
|
|
27
|
+
dataType: string
|
|
28
|
+
lineageTag: 42ffd8c8-2cf0-4a05-ba20-6f66604f4ac1
|
|
29
|
+
summarizeBy: none
|
|
30
|
+
sourceColumn: Pais
|
|
31
|
+
|
|
32
|
+
/// Drill-down de clientes por geografía y segmento: País -> Segmento -> Cliente.
|
|
33
|
+
hierarchy 'Jerarquía cliente'
|
|
34
|
+
lineageTag: 1d161dd7-61e9-4d09-a0f7-e3f4f26ebe00
|
|
35
|
+
|
|
36
|
+
level País
|
|
37
|
+
lineageTag: adf1fd83-c944-4965-a35a-ea2004e353c4
|
|
38
|
+
column: País
|
|
39
|
+
|
|
40
|
+
level Segmento
|
|
41
|
+
lineageTag: 48391495-ee0e-4630-9ad5-a9c2c13afd65
|
|
42
|
+
column: Segmento
|
|
43
|
+
|
|
44
|
+
level Cliente
|
|
45
|
+
lineageTag: 9d1261b1-4c3b-4d2e-bc48-424ae929a18d
|
|
46
|
+
column: Cliente
|
|
47
|
+
|
|
48
|
+
partition Clientes = m
|
|
49
|
+
mode: import
|
|
50
|
+
queryGroup: 'Sample Dataset'
|
|
51
|
+
source =
|
|
52
|
+
let
|
|
53
|
+
Base = Table.FromList(List.Numbers(1, 210), Splitter.SplitByNothing(), {"ClienteId"}),
|
|
54
|
+
AddCountryId = Table.AddColumn(Base, "CountryId", each Number.Mod([ClienteId] - 1, 21) + 1, Int64.Type),
|
|
55
|
+
AddCompanySlot = Table.AddColumn(AddCountryId, "CompanySlot", each Number.IntegerDivide([ClienteId] - 1, 21) + 1, Int64.Type),
|
|
56
|
+
AddPais = Table.AddColumn(
|
|
57
|
+
AddCompanySlot,
|
|
58
|
+
"Pais",
|
|
59
|
+
each
|
|
60
|
+
if [CountryId] = 1 then "Argentina"
|
|
61
|
+
else if [CountryId] = 2 then "Bolivia"
|
|
62
|
+
else if [CountryId] = 3 then "Brasil"
|
|
63
|
+
else if [CountryId] = 4 then "Chile"
|
|
64
|
+
else if [CountryId] = 5 then "Colombia"
|
|
65
|
+
else if [CountryId] = 6 then "Costa Rica"
|
|
66
|
+
else if [CountryId] = 7 then "Cuba"
|
|
67
|
+
else if [CountryId] = 8 then "Ecuador"
|
|
68
|
+
else if [CountryId] = 9 then "El Salvador"
|
|
69
|
+
else if [CountryId] = 10 then "Guatemala"
|
|
70
|
+
else if [CountryId] = 11 then "Haiti"
|
|
71
|
+
else if [CountryId] = 12 then "Honduras"
|
|
72
|
+
else if [CountryId] = 13 then "Mexico"
|
|
73
|
+
else if [CountryId] = 14 then "Nicaragua"
|
|
74
|
+
else if [CountryId] = 15 then "Panama"
|
|
75
|
+
else if [CountryId] = 16 then "Paraguay"
|
|
76
|
+
else if [CountryId] = 17 then "Peru"
|
|
77
|
+
else if [CountryId] = 18 then "Republica Dominicana"
|
|
78
|
+
else if [CountryId] = 19 then "Uruguay"
|
|
79
|
+
else if [CountryId] = 20 then "Venezuela"
|
|
80
|
+
else "España",
|
|
81
|
+
type text
|
|
82
|
+
),
|
|
83
|
+
AddCompanyList = Table.AddColumn(
|
|
84
|
+
AddPais,
|
|
85
|
+
"CompanyList",
|
|
86
|
+
each
|
|
87
|
+
if [CountryId] = 1 then "Mercado Libre|Globant|YPF|Arcor|Techint|Banco Galicia|Aerolineas Argentinas|Telecom Argentina|Banco Macro|Despegar"
|
|
88
|
+
else if [CountryId] = 2 then "YPFB|Banco Nacional de Bolivia|Banco Mercantil Santa Cruz|Entel Bolivia|Cerveceria Boliviana Nacional|Sofia Ltda|PIL Andina|Tigo Bolivia|Fancesa|Imcruz"
|
|
89
|
+
else if [CountryId] = 3 then "Petrobras|Vale|Itau Unibanco|Bradesco|Ambev|Natura|Embraer|Magazine Luiza|Nubank|Localiza"
|
|
90
|
+
else if [CountryId] = 4 then "Cencosud|Falabella|LATAM Airlines|Banco de Chile|SQM|Copec|Enel Chile|Entel Chile|CCU|Ripley"
|
|
91
|
+
else if [CountryId] = 5 then "Ecopetrol|Bancolombia|Grupo Aval|Rappi|Avianca|Grupo Exito|Bavaria|Grupo Sura|Grupo Nutresa|Terpel"
|
|
92
|
+
else if [CountryId] = 6 then "FIFCO|BAC Credomatic|Dos Pinos|Florida Ice and Farm|Banco Nacional de Costa Rica|Kolbi|Auto Mercado|Grupo Purdy|Cafe Britt|Coopenae"
|
|
93
|
+
else if [CountryId] = 7 then "Cubana de Aviacion|ETECSA|Habanos|CIMEX|Gaviota|Havana Club|TRD Caribe|Banco Metropolitano|BioCubaFarma|Cubatur"
|
|
94
|
+
else if [CountryId] = 8 then "Banco Pichincha|Corporacion Favorita|Pronaca|Banco Guayaquil|CNT Ecuador|Tonicorp|La Fabril|Diners Club Ecuador|Supermaxi|Cerveceria Nacional Ecuador"
|
|
95
|
+
else if [CountryId] = 9 then "Grupo Calleja|Banco Agricola|Tigo El Salvador|Avianca El Salvador|La Constancia|Super Selectos|Davivienda El Salvador|Grupo Q|Pollo Campero El Salvador|AES El Salvador"
|
|
96
|
+
else if [CountryId] = 10 then "Pollo Campero|Banco Industrial|Tigo Guatemala|Cementos Progreso|Cerveceria Centro Americana|Grupo Pantaleon|Banco G&T Continental|Corporacion Multi Inversiones|CBC Guatemala|Agexport"
|
|
97
|
+
else if [CountryId] = 11 then "Digicel Haiti|Sogebank|Unibank Haiti|Rhum Barbancourt|Natcom Haiti|Comme Il Faut|Sunrise Airways|Brasserie Nationale d'Haiti|Valerio Canez|Caribbean Bottling"
|
|
98
|
+
else if [CountryId] = 12 then "Banco Atlantida|Tigo Honduras|Ficohsa|Cerveceria Hondurena|Diunsa|Grupo Terra|Supermercados La Colonia|Banco de Occidente Honduras|Lacthosa|Espresso Americano"
|
|
99
|
+
else if [CountryId] = 13 then "America Movil|Cemex|Grupo Bimbo|FEMSA|Banorte|Televisa|Grupo Modelo|Liverpool|Walmex|Aeromexico"
|
|
100
|
+
else if [CountryId] = 14 then "Banpro|Lafise Bancentro|Tigo Nicaragua|Claro Nicaragua|Flor de Cana|Grupo Pellas|Casa Pellas|Cargill Nicaragua|La Colonia Nicaragua|Agricorp"
|
|
101
|
+
else if [CountryId] = 15 then "Copa Airlines|Banco General|Bladex|Cable & Wireless Panama|Grupo Melo|Super 99|Rey Holdings|Cerveceria Nacional Panama|Banistmo|ASSA Seguros"
|
|
102
|
+
else if [CountryId] = 16 then "Banco Continental|Tigo Paraguay|Personal Paraguay|Cervepar|Inverfin|Vision Banco|Superseis|Chacomer|Banco Itau Paraguay|Copetrol"
|
|
103
|
+
else if [CountryId] = 17 then "Alicorp|Interbank|Banco de Credito del Peru|Backus|Credicorp|Ferreycorp|InRetail|Aenza|Volcan|Belcorp"
|
|
104
|
+
else if [CountryId] = 18 then "Grupo Popular|Banco BHD|Cerveceria Nacional Dominicana|Claro Dominicana|Altice Dominicana|Grupo Rica|Casa Brugal|Punta Cana Group|Banreservas|Aerodom"
|
|
105
|
+
else if [CountryId] = 19 then "ANCAP|Antel|Banco Republica|Conaprole|PedidosYa|Zonamerica|Tienda Inglesa|Montevideo Refrescos|Abitab|Ta-Ta"
|
|
106
|
+
else if [CountryId] = 20 then "PDVSA|Empresas Polar|Banco Mercantil|Digitel|Movistar Venezuela|Banesco|Farmatodo|Ron Santa Teresa|CANTV|Avior Airlines"
|
|
107
|
+
else "Telefonica|Santander|BBVA|Inditex|Iberdrola|Repsol|CaixaBank|Ferrovial|Mapfre|Mercadona",
|
|
108
|
+
type text
|
|
109
|
+
),
|
|
110
|
+
AddCliente = Table.AddColumn(AddCompanyList, "Cliente", each Text.Split([CompanyList], "|"){[CompanySlot] - 1}, type text),
|
|
111
|
+
AddSegmento = Table.AddColumn(AddCliente, "Segmento", each if [CompanySlot] <= 3 then "Enterprise" else if [CompanySlot] <= 7 then "Mid Market" else "SMB", type text),
|
|
112
|
+
Result = Table.SelectColumns(AddSegmento, {"ClienteId", "Cliente", "Segmento", "Pais"}),
|
|
113
|
+
#"Tipo cambiado" = Table.TransformColumnTypes(Result,{{"ClienteId", type text}, {"Cliente", type text}, {"Segmento", type text}, {"Pais", type text}})
|
|
114
|
+
in
|
|
115
|
+
#"Tipo cambiado"
|
|
116
|
+
|
|
117
|
+
annotation PBI_NavigationStepName = Navegación
|
|
118
|
+
|
|
119
|
+
annotation PBI_ResultType = Table
|
|
120
|
+
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/// Parámetros técnicos del modelo expuestos hacia DAX. Los valores vienen de parámetros de Power Query; Zona Horaria usa offset UTC simple, por ejemplo -3 para Buenos Aires.
|
|
2
|
+
table 'Modelo Configuración'
|
|
3
|
+
isHidden
|
|
4
|
+
lineageTag: 44275a58-c4cf-447c-843f-7a091b2de9dc
|
|
5
|
+
|
|
6
|
+
column Configuración
|
|
7
|
+
dataType: string
|
|
8
|
+
isNullable: false
|
|
9
|
+
lineageTag: 87493a2e-a4f7-4d34-b4a3-42e492eeaa6a
|
|
10
|
+
summarizeBy: none
|
|
11
|
+
sourceColumn: Configuración
|
|
12
|
+
|
|
13
|
+
column Valor
|
|
14
|
+
dataType: double
|
|
15
|
+
lineageTag: 55a982d0-34dd-46e8-ab29-e79506316bac
|
|
16
|
+
summarizeBy: none
|
|
17
|
+
sourceColumn: Valor
|
|
18
|
+
|
|
19
|
+
/// Valor de texto para parametros de modelo que no son numericos, como MonedaBase.
|
|
20
|
+
column ValorTexto
|
|
21
|
+
dataType: string
|
|
22
|
+
isNullable: false
|
|
23
|
+
lineageTag: 6ffd4e9b-4f87-4314-b5df-6e479e1be726
|
|
24
|
+
summarizeBy: none
|
|
25
|
+
sourceColumn: ValorTexto
|
|
26
|
+
|
|
27
|
+
partition 'Modelo Configuración' = m
|
|
28
|
+
mode: import
|
|
29
|
+
queryGroup: Params
|
|
30
|
+
source =
|
|
31
|
+
let
|
|
32
|
+
// Tabla puente para que DAX lea parametros de Power Query.
|
|
33
|
+
Source = #table(
|
|
34
|
+
type table [Configuración = text, Valor = number, ValorTexto = text],
|
|
35
|
+
{
|
|
36
|
+
// Zona Horaria viene del parametro editable ZonaHoraria.
|
|
37
|
+
{ "Zona Horaria", Number.From(ZonaHoraria), "" },
|
|
38
|
+
// Moneda Base define la moneda pivote del modelo y el default de visualizacion.
|
|
39
|
+
{ "Moneda Base", 0, Text.From(MonedaBase) }
|
|
40
|
+
}
|
|
41
|
+
)
|
|
42
|
+
in
|
|
43
|
+
Source
|
|
44
|
+
|
|
45
|
+
annotation PBI_NavigationStepName = Navegación
|
|
46
|
+
|
|
47
|
+
annotation PBI_ResultType = Table
|
|
48
|
+
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/// Selector desconectado de moneda de reporte, cargado desde Power Query para mantener el dataset de ejemplo fuera de DAX.
|
|
2
|
+
table Monedas
|
|
3
|
+
lineageTag: b7ee2bd9-23b2-416d-8794-e70029e343e8
|
|
4
|
+
|
|
5
|
+
column Moneda
|
|
6
|
+
dataType: string
|
|
7
|
+
lineageTag: 32e5f3f6-0e89-4a45-99af-d22fed0b43ef
|
|
8
|
+
summarizeBy: none
|
|
9
|
+
sourceColumn: Moneda
|
|
10
|
+
|
|
11
|
+
column Símbolo
|
|
12
|
+
dataType: string
|
|
13
|
+
lineageTag: 94423e83-79d8-496b-8503-771be16c228c
|
|
14
|
+
summarizeBy: none
|
|
15
|
+
sourceColumn: Simbolo
|
|
16
|
+
|
|
17
|
+
column Orden
|
|
18
|
+
dataType: int64
|
|
19
|
+
isHidden
|
|
20
|
+
lineageTag: ba2a6509-9118-492d-a6e6-cb80f60f44be
|
|
21
|
+
summarizeBy: none
|
|
22
|
+
sourceColumn: Orden
|
|
23
|
+
|
|
24
|
+
partition Monedas = m
|
|
25
|
+
mode: import
|
|
26
|
+
queryGroup: 'Sample Dataset'
|
|
27
|
+
source =
|
|
28
|
+
let
|
|
29
|
+
Source = #table(
|
|
30
|
+
type table [Moneda = text, Simbolo = text, Orden = Int64.Type],
|
|
31
|
+
{
|
|
32
|
+
{ "USD", "$", 1 },
|
|
33
|
+
{ "ARS", "$AR", 2 },
|
|
34
|
+
{ "EUR", "€", 3 }
|
|
35
|
+
}
|
|
36
|
+
)
|
|
37
|
+
in
|
|
38
|
+
Source
|
|
39
|
+
|
|
40
|
+
annotation PBI_NavigationStepName = Navegación
|
|
41
|
+
|
|
42
|
+
annotation PBI_ResultType = Table
|
|
43
|
+
|