@luquimbo/bi-superpowers 1.0.0
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/plugin.json +8 -0
- package/.mcp.json +25 -0
- package/AGENTS.md +244 -0
- package/CHANGELOG.md +265 -0
- package/LICENSE +21 -0
- package/README.md +211 -0
- package/bin/build-plugin.js +30 -0
- package/bin/cli.js +1064 -0
- package/bin/commands/add.js +533 -0
- package/bin/commands/add.test.js +77 -0
- package/bin/commands/build-desktop.js +166 -0
- package/bin/commands/changelog.js +443 -0
- package/bin/commands/diff.js +325 -0
- package/bin/commands/lint.js +419 -0
- package/bin/commands/lint.test.js +103 -0
- package/bin/commands/mcp-setup.js +246 -0
- package/bin/commands/pull.js +287 -0
- package/bin/commands/pull.test.js +36 -0
- package/bin/commands/push.js +231 -0
- package/bin/commands/push.test.js +14 -0
- package/bin/commands/search.js +344 -0
- package/bin/commands/search.test.js +115 -0
- package/bin/commands/setup.js +545 -0
- package/bin/commands/setup.test.js +46 -0
- package/bin/commands/sync-profile.js +405 -0
- package/bin/commands/sync-profile.test.js +14 -0
- package/bin/commands/sync-source.js +418 -0
- package/bin/commands/sync-source.test.js +14 -0
- package/bin/commands/watch.js +206 -0
- package/bin/lib/generators/claude-plugin.js +266 -0
- package/bin/lib/generators/claude-plugin.test.js +110 -0
- package/bin/lib/generators/index.js +116 -0
- package/bin/lib/generators/shared.js +282 -0
- package/bin/lib/licensing/index.js +35 -0
- package/bin/lib/licensing/storage.js +364 -0
- package/bin/lib/licensing/storage.test.js +55 -0
- package/bin/lib/licensing/validator.js +213 -0
- package/bin/lib/licensing/validator.test.js +137 -0
- package/bin/lib/microsoft-mcp.js +176 -0
- package/bin/lib/microsoft-mcp.test.js +106 -0
- package/bin/lib/skills.js +84 -0
- package/bin/mcp/powerbi-modeling-launcher.js +38 -0
- package/bin/postinstall.js +44 -0
- package/bin/utils/errors.js +159 -0
- package/bin/utils/git.js +298 -0
- package/bin/utils/logger.js +142 -0
- package/bin/utils/mcp-detect.js +274 -0
- package/bin/utils/mcp-detect.test.js +105 -0
- package/bin/utils/pbix.js +305 -0
- package/bin/utils/pbix.test.js +37 -0
- package/bin/utils/profiles.js +312 -0
- package/bin/utils/projects.js +168 -0
- package/bin/utils/readline.js +206 -0
- package/bin/utils/readline.test.js +47 -0
- package/bin/utils/tui.js +314 -0
- package/bin/utils/tui.test.js +127 -0
- package/commands/contributions.md +265 -0
- package/commands/data-model-design.md +468 -0
- package/commands/dax-doctor.md +248 -0
- package/commands/fabric-scripts.md +452 -0
- package/commands/migration-assistant.md +290 -0
- package/commands/model-documenter.md +242 -0
- package/commands/pbi-connect.md +239 -0
- package/commands/project-kickoff.md +905 -0
- package/commands/report-layout.md +296 -0
- package/commands/rls-design.md +533 -0
- package/commands/theme-tweaker.md +624 -0
- package/config.example.json +23 -0
- package/config.json +23 -0
- package/desktop-extension/manifest.json +37 -0
- package/desktop-extension/package.json +10 -0
- package/desktop-extension/server.js +95 -0
- package/docs/openrouter-free-models.md +92 -0
- package/library/examples/README.md +151 -0
- package/library/examples/finance-reporting/README.md +351 -0
- package/library/examples/finance-reporting/data-model.md +267 -0
- package/library/examples/finance-reporting/measures.dax +557 -0
- package/library/examples/hr-analytics/README.md +371 -0
- package/library/examples/hr-analytics/data-model.md +315 -0
- package/library/examples/hr-analytics/measures.dax +460 -0
- package/library/examples/marketing-analytics/README.md +37 -0
- package/library/examples/marketing-analytics/data-model.md +62 -0
- package/library/examples/marketing-analytics/measures.dax +110 -0
- package/library/examples/retail-analytics/README.md +439 -0
- package/library/examples/retail-analytics/data-model.md +288 -0
- package/library/examples/retail-analytics/measures.dax +481 -0
- package/library/examples/supply-chain/README.md +37 -0
- package/library/examples/supply-chain/data-model.md +69 -0
- package/library/examples/supply-chain/measures.dax +77 -0
- package/library/examples/udf-library/README.md +228 -0
- package/library/examples/udf-library/functions.dax +571 -0
- package/library/snippets/dax/README.md +292 -0
- package/library/snippets/dax/business-domains.md +576 -0
- package/library/snippets/dax/calculate-patterns.md +276 -0
- package/library/snippets/dax/calculation-groups.md +489 -0
- package/library/snippets/dax/error-handling.md +495 -0
- package/library/snippets/dax/iterators-and-aggregations.md +474 -0
- package/library/snippets/dax/kpis-and-metrics.md +293 -0
- package/library/snippets/dax/rankings-and-topn.md +235 -0
- package/library/snippets/dax/security-patterns.md +413 -0
- package/library/snippets/dax/text-and-formatting.md +316 -0
- package/library/snippets/dax/time-intelligence.md +196 -0
- package/library/snippets/dax/user-defined-functions.md +477 -0
- package/library/snippets/dax/virtual-tables.md +546 -0
- package/library/snippets/excel-formulas/README.md +84 -0
- package/library/snippets/excel-formulas/aggregations.md +330 -0
- package/library/snippets/excel-formulas/dates-and-times.md +361 -0
- package/library/snippets/excel-formulas/dynamic-arrays.md +314 -0
- package/library/snippets/excel-formulas/lookups.md +169 -0
- package/library/snippets/excel-formulas/text-functions.md +363 -0
- package/library/snippets/governance/naming-conventions.md +97 -0
- package/library/snippets/governance/review-checklists.md +107 -0
- package/library/snippets/power-query/README.md +389 -0
- package/library/snippets/power-query/api-integration.md +707 -0
- package/library/snippets/power-query/connections.md +434 -0
- package/library/snippets/power-query/data-cleaning.md +298 -0
- package/library/snippets/power-query/error-handling.md +526 -0
- package/library/snippets/power-query/parameters.md +350 -0
- package/library/snippets/power-query/performance.md +506 -0
- package/library/snippets/power-query/transformations.md +330 -0
- package/library/snippets/report-design/accessibility.md +78 -0
- package/library/snippets/report-design/chart-selection.md +54 -0
- package/library/snippets/report-design/layout-patterns.md +87 -0
- package/library/templates/data-models/README.md +93 -0
- package/library/templates/data-models/finance-model.md +627 -0
- package/library/templates/data-models/retail-star-schema.md +473 -0
- package/library/templates/excel/README.md +83 -0
- package/library/templates/excel/budget-tracker.md +432 -0
- package/library/templates/excel/data-entry-form.md +533 -0
- package/library/templates/power-bi/README.md +72 -0
- package/library/templates/power-bi/finance-report.md +449 -0
- package/library/templates/power-bi/kpi-scorecard.md +461 -0
- package/library/templates/power-bi/sales-dashboard.md +281 -0
- package/library/themes/excel/README.md +436 -0
- package/library/themes/power-bi/README.md +271 -0
- package/library/themes/power-bi/accessible.json +307 -0
- package/library/themes/power-bi/bi-superpowers-default.json +858 -0
- package/library/themes/power-bi/corporate-blue.json +291 -0
- package/library/themes/power-bi/dark-mode.json +291 -0
- package/library/themes/power-bi/minimal.json +292 -0
- package/library/themes/power-bi/print-friendly.json +309 -0
- package/package.json +93 -0
- package/skills/contributions/SKILL.md +267 -0
- package/skills/data-model-design/SKILL.md +470 -0
- package/skills/data-modeling/SKILL.md +254 -0
- package/skills/data-quality/SKILL.md +664 -0
- package/skills/dax/SKILL.md +708 -0
- package/skills/dax-doctor/SKILL.md +250 -0
- package/skills/dax-udf/SKILL.md +489 -0
- package/skills/deployment/SKILL.md +320 -0
- package/skills/excel-formulas/SKILL.md +463 -0
- package/skills/fabric-scripts/SKILL.md +454 -0
- package/skills/fast-standard/SKILL.md +509 -0
- package/skills/governance/SKILL.md +205 -0
- package/skills/migration-assistant/SKILL.md +292 -0
- package/skills/model-documenter/SKILL.md +244 -0
- package/skills/pbi-connect/SKILL.md +241 -0
- package/skills/power-query/SKILL.md +406 -0
- package/skills/project-kickoff/SKILL.md +907 -0
- package/skills/query-performance/SKILL.md +480 -0
- package/skills/report-design/SKILL.md +207 -0
- package/skills/report-layout/SKILL.md +298 -0
- package/skills/rls-design/SKILL.md +535 -0
- package/skills/semantic-model/SKILL.md +237 -0
- package/skills/testing-validation/SKILL.md +643 -0
- package/skills/theme-tweaker/SKILL.md +626 -0
- package/src/content/base.md +237 -0
- package/src/content/mcp-requirements.json +69 -0
- package/src/content/routing.md +203 -0
- package/src/content/skills/contributions.md +259 -0
- package/src/content/skills/data-model-design.md +462 -0
- package/src/content/skills/data-modeling.md +246 -0
- package/src/content/skills/data-quality.md +656 -0
- package/src/content/skills/dax-doctor.md +242 -0
- package/src/content/skills/dax-udf.md +481 -0
- package/src/content/skills/dax.md +700 -0
- package/src/content/skills/deployment.md +312 -0
- package/src/content/skills/excel-formulas.md +455 -0
- package/src/content/skills/fabric-scripts.md +446 -0
- package/src/content/skills/fast-standard.md +501 -0
- package/src/content/skills/governance.md +197 -0
- package/src/content/skills/migration-assistant.md +284 -0
- package/src/content/skills/model-documenter.md +236 -0
- package/src/content/skills/pbi-connect.md +233 -0
- package/src/content/skills/power-query.md +398 -0
- package/src/content/skills/project-kickoff.md +899 -0
- package/src/content/skills/query-performance.md +472 -0
- package/src/content/skills/report-design.md +199 -0
- package/src/content/skills/report-layout.md +290 -0
- package/src/content/skills/rls-design.md +527 -0
- package/src/content/skills/semantic-model.md +229 -0
- package/src/content/skills/testing-validation.md +635 -0
- package/src/content/skills/theme-tweaker.md +618 -0
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
# Query Parameters
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
Power Query patterns for using parameters to create dynamic, reusable queries that can be easily configured for different environments and scenarios.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Creating Parameters
|
|
9
|
+
|
|
10
|
+
### In Power Query Editor
|
|
11
|
+
1. Home → Manage Parameters → New Parameter
|
|
12
|
+
2. Configure: Name, Type, Current Value, Allowed Values
|
|
13
|
+
|
|
14
|
+
### Parameter Types
|
|
15
|
+
| Type | Use Case | Example |
|
|
16
|
+
|------|----------|---------|
|
|
17
|
+
| Text | Server names, file paths, API keys | `param_ServerName` |
|
|
18
|
+
| Number | Limits, thresholds, IDs | `param_TopN` |
|
|
19
|
+
| Date | Start/end dates, cutoff dates | `param_StartDate` |
|
|
20
|
+
| DateTime | Timestamps with time | `param_LastRefresh` |
|
|
21
|
+
| True/False | Feature flags | `param_IncludeArchived` |
|
|
22
|
+
| List | Multiple allowed values | Environment options |
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Common Parameter Patterns
|
|
27
|
+
|
|
28
|
+
### Server/Database Parameters
|
|
29
|
+
```m
|
|
30
|
+
// Parameters (create in Manage Parameters)
|
|
31
|
+
// param_ServerName: Text, e.g., "prod-sql-01.database.windows.net"
|
|
32
|
+
// param_DatabaseName: Text, e.g., "SalesDB"
|
|
33
|
+
|
|
34
|
+
let
|
|
35
|
+
Source = Sql.Database(param_ServerName, param_DatabaseName),
|
|
36
|
+
Sales = Source{[Schema="dbo", Item="Sales"]}[Data]
|
|
37
|
+
in
|
|
38
|
+
Sales
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### File Path Parameter
|
|
42
|
+
```m
|
|
43
|
+
// param_FilePath: Text, e.g., "C:\Data\SalesData.xlsx"
|
|
44
|
+
|
|
45
|
+
let
|
|
46
|
+
Source = Excel.Workbook(File.Contents(param_FilePath), true, true),
|
|
47
|
+
Sheet1 = Source{[Item="Sheet1", Kind="Sheet"]}[Data]
|
|
48
|
+
in
|
|
49
|
+
Sheet1
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Folder Path Parameter
|
|
53
|
+
```m
|
|
54
|
+
// param_FolderPath: Text, e.g., "C:\Data\Monthly Reports\"
|
|
55
|
+
|
|
56
|
+
let
|
|
57
|
+
Source = Folder.Files(param_FolderPath),
|
|
58
|
+
FilteredFiles = Table.SelectRows(Source, each Text.EndsWith([Name], ".csv"))
|
|
59
|
+
in
|
|
60
|
+
FilteredFiles
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Date Range Parameters
|
|
64
|
+
```m
|
|
65
|
+
// param_StartDate: Date, e.g., #date(2024, 1, 1)
|
|
66
|
+
// param_EndDate: Date, e.g., #date(2024, 12, 31)
|
|
67
|
+
|
|
68
|
+
let
|
|
69
|
+
Source = Sql.Database(param_ServerName, param_DatabaseName),
|
|
70
|
+
Sales = Source{[Schema="dbo", Item="Sales"]}[Data],
|
|
71
|
+
FilteredByDate = Table.SelectRows(Sales, each
|
|
72
|
+
[OrderDate] >= param_StartDate and [OrderDate] <= param_EndDate
|
|
73
|
+
)
|
|
74
|
+
in
|
|
75
|
+
FilteredByDate
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### API Token Parameter
|
|
79
|
+
```m
|
|
80
|
+
// param_APIToken: Text (mark as sensitive if supported)
|
|
81
|
+
|
|
82
|
+
let
|
|
83
|
+
Source = Json.Document(
|
|
84
|
+
Web.Contents(
|
|
85
|
+
"https://api.example.com/data",
|
|
86
|
+
[
|
|
87
|
+
Headers = [
|
|
88
|
+
#"Authorization" = "Bearer " & param_APIToken
|
|
89
|
+
]
|
|
90
|
+
]
|
|
91
|
+
)
|
|
92
|
+
)
|
|
93
|
+
in
|
|
94
|
+
Source
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Dynamic Parameters
|
|
100
|
+
|
|
101
|
+
### Relative Date Parameters
|
|
102
|
+
```m
|
|
103
|
+
// Calculate dates dynamically
|
|
104
|
+
let
|
|
105
|
+
Today = Date.From(DateTime.LocalNow()),
|
|
106
|
+
StartOfMonth = Date.StartOfMonth(Today),
|
|
107
|
+
StartOfYear = Date.StartOfYear(Today),
|
|
108
|
+
Last30Days = Date.AddDays(Today, -30),
|
|
109
|
+
LastMonthStart = Date.StartOfMonth(Date.AddMonths(Today, -1)),
|
|
110
|
+
LastMonthEnd = Date.EndOfMonth(Date.AddMonths(Today, -1))
|
|
111
|
+
in
|
|
112
|
+
// Use in queries
|
|
113
|
+
Last30Days
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Rolling Period Query
|
|
117
|
+
```m
|
|
118
|
+
// No parameter needed - always last 12 months
|
|
119
|
+
let
|
|
120
|
+
EndDate = Date.From(DateTime.LocalNow()),
|
|
121
|
+
StartDate = Date.AddMonths(EndDate, -12),
|
|
122
|
+
|
|
123
|
+
Source = Sql.Database(param_ServerName, param_DatabaseName),
|
|
124
|
+
Sales = Source{[Schema="dbo", Item="Sales"]}[Data],
|
|
125
|
+
Filtered = Table.SelectRows(Sales, each
|
|
126
|
+
[OrderDate] >= StartDate and [OrderDate] <= EndDate
|
|
127
|
+
)
|
|
128
|
+
in
|
|
129
|
+
Filtered
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Environment Configuration
|
|
135
|
+
|
|
136
|
+
### Environment Parameter Pattern
|
|
137
|
+
```m
|
|
138
|
+
// param_Environment: Text, Allowed Values: "Development", "Staging", "Production"
|
|
139
|
+
|
|
140
|
+
let
|
|
141
|
+
// Configuration table
|
|
142
|
+
Config = #table(
|
|
143
|
+
{"Environment", "Server", "Database"},
|
|
144
|
+
{
|
|
145
|
+
{"Development", "dev-sql-01", "SalesDB_Dev"},
|
|
146
|
+
{"Staging", "stg-sql-01", "SalesDB_Stg"},
|
|
147
|
+
{"Production", "prod-sql-01", "SalesDB"}
|
|
148
|
+
}
|
|
149
|
+
),
|
|
150
|
+
|
|
151
|
+
// Get current environment config
|
|
152
|
+
CurrentConfig = Table.SelectRows(Config, each [Environment] = param_Environment){0},
|
|
153
|
+
|
|
154
|
+
// Connect using config values
|
|
155
|
+
Source = Sql.Database(CurrentConfig[Server], CurrentConfig[Database])
|
|
156
|
+
in
|
|
157
|
+
Source
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### Configuration Table Query
|
|
161
|
+
```m
|
|
162
|
+
// Create a query called "Config" with environment settings
|
|
163
|
+
let
|
|
164
|
+
Source = #table(
|
|
165
|
+
type table [
|
|
166
|
+
Setting = text,
|
|
167
|
+
Development = text,
|
|
168
|
+
Staging = text,
|
|
169
|
+
Production = text
|
|
170
|
+
],
|
|
171
|
+
{
|
|
172
|
+
{"ServerName", "dev-sql-01", "stg-sql-01", "prod-sql-01"},
|
|
173
|
+
{"DatabaseName", "SalesDB_Dev", "SalesDB_Stg", "SalesDB"},
|
|
174
|
+
{"APIEndpoint", "https://dev-api.example.com", "https://stg-api.example.com", "https://api.example.com"},
|
|
175
|
+
{"RefreshDays", "7", "30", "365"}
|
|
176
|
+
}
|
|
177
|
+
)
|
|
178
|
+
in
|
|
179
|
+
Source
|
|
180
|
+
|
|
181
|
+
// Usage in other queries:
|
|
182
|
+
let
|
|
183
|
+
ServerName = Config{[Setting="ServerName"]}[param_Environment],
|
|
184
|
+
DatabaseName = Config{[Setting="DatabaseName"]}[param_Environment],
|
|
185
|
+
Source = Sql.Database(ServerName, DatabaseName)
|
|
186
|
+
in
|
|
187
|
+
Source
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## Parameter in Native SQL
|
|
193
|
+
|
|
194
|
+
### Date in SQL Query
|
|
195
|
+
```m
|
|
196
|
+
// param_StartDate: Date
|
|
197
|
+
|
|
198
|
+
let
|
|
199
|
+
FormattedDate = Date.ToText(param_StartDate, "yyyy-MM-dd"),
|
|
200
|
+
Query = "SELECT * FROM dbo.Sales WHERE OrderDate >= '" & FormattedDate & "'",
|
|
201
|
+
Source = Sql.Database(param_ServerName, param_DatabaseName, [Query = Query])
|
|
202
|
+
in
|
|
203
|
+
Source
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### Multiple Parameters in SQL
|
|
207
|
+
```m
|
|
208
|
+
let
|
|
209
|
+
StartDateText = Date.ToText(param_StartDate, "yyyy-MM-dd"),
|
|
210
|
+
EndDateText = Date.ToText(param_EndDate, "yyyy-MM-dd"),
|
|
211
|
+
|
|
212
|
+
Query = "
|
|
213
|
+
SELECT *
|
|
214
|
+
FROM dbo.Sales
|
|
215
|
+
WHERE OrderDate BETWEEN '" & StartDateText & "' AND '" & EndDateText & "'
|
|
216
|
+
AND Region = '" & param_Region & "'
|
|
217
|
+
",
|
|
218
|
+
|
|
219
|
+
Source = Sql.Database(param_ServerName, param_DatabaseName, [Query = Query])
|
|
220
|
+
in
|
|
221
|
+
Source
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### Parameterized Stored Procedure
|
|
225
|
+
```m
|
|
226
|
+
let
|
|
227
|
+
Source = Sql.Database(param_ServerName, param_DatabaseName),
|
|
228
|
+
Result = Source{[Schema="dbo", Item="usp_GetSalesByRegion"]}[Data]({param_Region, param_StartDate, param_EndDate})
|
|
229
|
+
in
|
|
230
|
+
Result
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
## Parameter Validation
|
|
236
|
+
|
|
237
|
+
### Validate Before Use
|
|
238
|
+
```m
|
|
239
|
+
let
|
|
240
|
+
// Validate required parameters
|
|
241
|
+
ValidServer = if param_ServerName = null or param_ServerName = ""
|
|
242
|
+
then error "Server name is required"
|
|
243
|
+
else param_ServerName,
|
|
244
|
+
|
|
245
|
+
ValidDatabase = if param_DatabaseName = null or param_DatabaseName = ""
|
|
246
|
+
then error "Database name is required"
|
|
247
|
+
else param_DatabaseName,
|
|
248
|
+
|
|
249
|
+
Source = Sql.Database(ValidServer, ValidDatabase)
|
|
250
|
+
in
|
|
251
|
+
Source
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### Default Values
|
|
255
|
+
```m
|
|
256
|
+
let
|
|
257
|
+
// Use default if parameter is empty
|
|
258
|
+
ServerName = if param_ServerName = null or param_ServerName = ""
|
|
259
|
+
then "default-server"
|
|
260
|
+
else param_ServerName,
|
|
261
|
+
|
|
262
|
+
StartDate = if param_StartDate = null
|
|
263
|
+
then Date.AddMonths(Date.From(DateTime.LocalNow()), -12)
|
|
264
|
+
else param_StartDate,
|
|
265
|
+
|
|
266
|
+
Source = Sql.Database(ServerName, param_DatabaseName)
|
|
267
|
+
in
|
|
268
|
+
Source
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## Parameter Functions
|
|
274
|
+
|
|
275
|
+
### Create Reusable Connection Function
|
|
276
|
+
```m
|
|
277
|
+
// Query name: fn_GetSqlConnection
|
|
278
|
+
(serverName as text, databaseName as text) as table =>
|
|
279
|
+
let
|
|
280
|
+
Source = Sql.Database(serverName, databaseName)
|
|
281
|
+
in
|
|
282
|
+
Source
|
|
283
|
+
|
|
284
|
+
// Usage:
|
|
285
|
+
let
|
|
286
|
+
DB = fn_GetSqlConnection(param_ServerName, param_DatabaseName),
|
|
287
|
+
Sales = DB{[Schema="dbo", Item="Sales"]}[Data]
|
|
288
|
+
in
|
|
289
|
+
Sales
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
### Parameterized Data Function
|
|
293
|
+
```m
|
|
294
|
+
// Query name: fn_GetSalesByDateRange
|
|
295
|
+
(startDate as date, endDate as date) as table =>
|
|
296
|
+
let
|
|
297
|
+
Source = Sql.Database(param_ServerName, param_DatabaseName),
|
|
298
|
+
Sales = Source{[Schema="dbo", Item="Sales"]}[Data],
|
|
299
|
+
Filtered = Table.SelectRows(Sales, each
|
|
300
|
+
[OrderDate] >= startDate and [OrderDate] <= endDate
|
|
301
|
+
)
|
|
302
|
+
in
|
|
303
|
+
Filtered
|
|
304
|
+
|
|
305
|
+
// Usage:
|
|
306
|
+
let
|
|
307
|
+
Q1Sales = fn_GetSalesByDateRange(#date(2024,1,1), #date(2024,3,31)),
|
|
308
|
+
Q2Sales = fn_GetSalesByDateRange(#date(2024,4,1), #date(2024,6,30))
|
|
309
|
+
in
|
|
310
|
+
Table.Combine({Q1Sales, Q2Sales})
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
---
|
|
314
|
+
|
|
315
|
+
## Best Practices
|
|
316
|
+
|
|
317
|
+
### Naming Conventions
|
|
318
|
+
| Pattern | Example | Use |
|
|
319
|
+
|---------|---------|-----|
|
|
320
|
+
| `param_` prefix | `param_ServerName` | All parameters |
|
|
321
|
+
| PascalCase | `param_StartDate` | Multi-word names |
|
|
322
|
+
| Descriptive | `param_SalesRegion` | Clear purpose |
|
|
323
|
+
|
|
324
|
+
### Security Considerations
|
|
325
|
+
1. **Never hardcode credentials** - Use parameters or environment variables
|
|
326
|
+
2. **Mark sensitive parameters** - Power Query supports sensitive parameter marking
|
|
327
|
+
3. **Don't log sensitive values** - Avoid exposing tokens in error messages
|
|
328
|
+
4. **Use connection strings from data gateway** when possible
|
|
329
|
+
|
|
330
|
+
### Documentation
|
|
331
|
+
```m
|
|
332
|
+
// Document parameter usage at top of query
|
|
333
|
+
// Required Parameters:
|
|
334
|
+
// param_ServerName: SQL Server hostname
|
|
335
|
+
// param_DatabaseName: Target database name
|
|
336
|
+
// param_StartDate: Beginning of date range (inclusive)
|
|
337
|
+
// param_EndDate: End of date range (inclusive)
|
|
338
|
+
|
|
339
|
+
let
|
|
340
|
+
Source = ...
|
|
341
|
+
in
|
|
342
|
+
Source
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
---
|
|
346
|
+
|
|
347
|
+
## Related Resources
|
|
348
|
+
|
|
349
|
+
- [Connections](./connections.md)
|
|
350
|
+
- [Power Query Skill](../../skills/power-query/SKILL.md)
|