Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
e37ab03
Update Time Intelligence Calculation Group Creation.csx
bernatagulloesbrina Jan 15, 2023
eca3c97
completed dynamic label for moving totals
bernatagulloesbrina Jan 24, 2023
94c33ee
Update Time Intelligence Calculation Group Creation.csx
bernatagulloesbrina Jan 25, 2023
901a6ac
Dynamic Header Script release
bernatagulloesbrina Jan 26, 2023
af693f9
Update Dynamic Header Field Parameter.csx
bernatagulloesbrina Jan 26, 2023
e31f5c6
Update Referential Integrity Check Measures.csx
bernatagulloesbrina Feb 15, 2023
f179ee0
Merge branch 'main' of https://github.com/bernatagulloesbrina/Tabular…
bernatagulloesbrina Feb 28, 2023
faf44ab
variations on the sum script
bernatagulloesbrina Feb 28, 2023
7a24dae
has data measure and more
bernatagulloesbrina Jun 8, 2023
ca8603b
Merge branch 'main' of https://github.com/bernatagulloesbrina/Tabular…
bernatagulloesbrina Jun 8, 2023
aaf28a3
Update Create Has Data Measure.csx
bernatagulloesbrina Jun 27, 2023
1bb1bcb
Multi-Total Calc Group
bernatagulloesbrina Jul 9, 2023
c4a1f25
Create Generate Calc Group to Sort a Matrix by a Calc Item Column.csx
bernatagulloesbrina Jul 27, 2023
dcad774
Merge branch 'PowerBI-tips:main' into main
bernatagulloesbrina Aug 2, 2023
14f782f
Create Autogenerate DISTINCTCOUNT Measures.csx
bernatagulloesbrina Aug 2, 2023
6c748a1
Merge branch 'main' of https://github.com/bernatagulloesbrina/Tabular…
bernatagulloesbrina Aug 2, 2023
4f189fb
Create Number Format Calc Group.csx
bernatagulloesbrina Nov 28, 2023
c8d81cd
Improvements with suggestions by Ed Hansberry
bernatagulloesbrina Dec 22, 2023
3f4ed66
Scripts for Comparing arbitrary periods of time
bernatagulloesbrina Jun 2, 2024
0c94159
Update for Create Data Problems Button
bernatagulloesbrina Jul 12, 2024
8487806
Rename Data Problems Button.csx to Data Problems Button Measures.csx
bernatagulloesbrina Jul 12, 2024
365f72e
Merge branch 'PowerBI-tips:main' into main
bernatagulloesbrina Jul 12, 2024
249f5fb
folder rename
bernatagulloesbrina Jul 12, 2024
22c9528
Merge branch 'main' of https://github.com/bernatagulloesbrina/Tabular…
bernatagulloesbrina Jul 12, 2024
ed2ce9f
added link, commented TE3 exclusive lines
bernatagulloesbrina Jul 13, 2024
b2b7315
updates for RI report sheet script
bernatagulloesbrina Jul 14, 2024
2861f96
minor updates
bernatagulloesbrina Jul 14, 2024
e278cbd
Update Create Referential Integrity Sheet.csx
bernatagulloesbrina Jul 14, 2024
2d8de0e
rename
bernatagulloesbrina Jul 14, 2024
79beb2a
Configure Table as field Parameter & bug fixes
bernatagulloesbrina Aug 9, 2024
c757233
Update Configure Table as Field Parameter.csx
bernatagulloesbrina Aug 9, 2024
a3fbbcd
Create Data Problems Button.csx
bernatagulloesbrina Aug 24, 2024
ffc0cfd
configure table as field parameter
bernatagulloesbrina Mar 1, 2025
2dd710e
Create Fix Broken Fields.cs
bernatagulloesbrina May 10, 2025
ec37dfa
Update Fix Broken Fields.cs
bernatagulloesbrina May 12, 2025
c2a8f7e
Update Time Intelligence Calculation Group Creation.csx
bernatagulloesbrina May 14, 2025
30a5f2a
Update Fix Broken Fields.cs
bernatagulloesbrina May 17, 2025
653eab0
Create Repleace Field.csx
bernatagulloesbrina May 25, 2025
c83f590
new script and fix
bernatagulloesbrina May 25, 2025
bab6f42
links
bernatagulloesbrina May 25, 2025
97b7940
Update Open Visual Json file.csx
bernatagulloesbrina Jun 22, 2025
de19693
Create Add Bilingual Layer Visuals.csx
bernatagulloesbrina Jun 24, 2025
767b1b8
Create Copy Visual.csx
bernatagulloesbrina Jul 5, 2025
80a78ca
Update Open Visual Json file.csx
bernatagulloesbrina Jul 5, 2025
99bd34e
Update Add Bilingual Layer Visuals.csx
bernatagulloesbrina Jul 7, 2025
2f29c0a
Create Create Text Versions of Numeric Measures with prefix and sufix…
bernatagulloesbrina Jul 28, 2025
8cb6780
Update Create Text Versions of Numeric Measures with prefix and sufix…
bernatagulloesbrina Jul 28, 2025
60f7c29
DAX UDF Script!
bernatagulloesbrina Sep 16, 2025
68fd23b
Update create measures from daxudfs.csx
bernatagulloesbrina Sep 16, 2025
17e7b84
Update create measures from daxudfs.csx
bernatagulloesbrina Sep 26, 2025
71bf11c
Update create measures from daxudfs.csx
bernatagulloesbrina Sep 26, 2025
99f9b5b
Update create measures from daxudfs.csx
bernatagulloesbrina Sep 26, 2025
36038a0
Update create measures from daxudfs.csx
bernatagulloesbrina Sep 26, 2025
53d004d
Update create measures from daxudfs.csx
bernatagulloesbrina Sep 26, 2025
2e84776
Update create measures from daxudfs.csx
bernatagulloesbrina Sep 26, 2025
b9e3666
major refactor
bernatagulloesbrina Sep 27, 2025
c5c7d11
Create Create Time Intel Functions.cs
bernatagulloesbrina Sep 30, 2025
eeeb1c1
Update Create Time Intel Functions.cs
bernatagulloesbrina Oct 4, 2025
fa5d211
Update Create Time Intel Functions.cs
bernatagulloesbrina Oct 4, 2025
e04915c
Update Create Time Intel Functions.cs
bernatagulloesbrina Oct 5, 2025
72ba62c
Create Adjust Line above Columns.cs
bernatagulloesbrina Oct 11, 2025
8152cb1
Update Adjust Line above Columns.cs
bernatagulloesbrina Oct 11, 2025
93fadfc
new report layer scripts
bernatagulloesbrina Oct 22, 2025
e74d198
Update Copy Conditional Formatting Between headers.csx
bernatagulloesbrina Oct 22, 2025
4382e4b
display name management scripts
bernatagulloesbrina Nov 15, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
455 changes: 455 additions & 0 deletions Advanced/DaxUDF Macros/Create Time Intel Functions.cs

Large diffs are not rendered by default.

642 changes: 642 additions & 0 deletions Advanced/DaxUDF Macros/create measures from daxudfs.csx

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,272 @@
#r "Microsoft.VisualBasic"
using System.Windows.Forms;

using Microsoft.VisualBasic;
string calcGroupName = Fx.GetNameFromUser("Input Calc Group Name",DefaultResponse: "Model");
string selectedCalcItemName = Fx.GetNameFromUser("Input Selected calc Item name", DefaultResponse: "Selected");
string referenceCalcItemName = Fx.GetNameFromUser("Input Reference calc Item name", DefaultResponse: "Reference");
string comparisonCalcItemName = Fx.GetNameFromUser("Input Comparison calc item name", DefaultResponse: "Comparison");
string comparisonPctCalcItemName = Fx.GetNameFromUser("Input Comparison % name", DefaultResponse: "Comparison %");
string daysMeasureName = Fx.GetNameFromUser("Input Days Selected Measure name", DefaultResponse: "Days Selected");
string referenceDaysRawMeasureName = Fx.GetNameFromUser("Input Days Reference raw Measure name", DefaultResponse: "Days Reference Raw");
string referenceDaysMeasureName = Fx.GetNameFromUser("Input Days Refference name", DefaultResponse: "Days Reference");
string daysDifferenceMeasureName = Fx.GetNameFromUser("Input Days Difference name", DefaultResponse: "Days Difference");
IEnumerable<Table> dateTables = Fx.GetDateTables(Model);
if (dateTables == null) return;
if (dateTables.Count() < 2)
{
Error("Less than 2 date tables detected in your model. A minimum of 2 date tables (marked as date tables) are required to run this script");
return;
}
Table dateTable = SelectTable(tables: dateTables, preselect: dateTables.First(), label: "Select main date table");
if (dateTable == null)
{
Error("No table selected.");
return;
}
Func<Column, bool> weekColFunc = c => c.Name.Contains("Week") || c.Name.Contains("Semana");
IEnumerable<Column> dayOfWeekColumns = Fx.GetFilteredColumns(dateTable.Columns, weekColFunc);

Column dayOfWeekColumn = SelectColumn(dayOfWeekColumns, dayOfWeekColumns.First(), label: "Select Day of Week column");
if (dayOfWeekColumn == null) { Error("No column selected"); return; }
Table referenceDateTable = SelectTable(tables: dateTables, preselect: dateTables.Last(), label: "Select reference date table");
if (referenceDateTable == null)
{
Error("No table selected.");
return;
}
IEnumerable<Column> referenceDayOfWeekColumns = Fx.GetFilteredColumns(referenceDateTable.Columns, weekColFunc);
Column referenceDayOfWeekColumn = SelectColumn(referenceDayOfWeekColumns, referenceDayOfWeekColumns.First(), label: "Select Day of Week column of reference Date Table");
if (referenceDayOfWeekColumn == null) { Error("No column selected"); return; }
CalculationGroupTable calcGroup = Model.AddCalculationGroup(calcGroupName);
Column calcGroupColumn = calcGroup.Columns[0];
calcGroupColumn.Name = calcGroup.Name;
string selectedCalcItemExpression =
String.Format(
@"CALCULATE(
SELECTEDMEASURE( ),
REMOVEFILTERS( {0} )
)",
referenceDateTable.DaxObjectFullName);
CalculationItem selectedCalcItem = calcGroup.AddCalculationItem(selectedCalcItemName, selectedCalcItemExpression);
selectedCalcItem.FormatDax();
selectedCalcItem.Ordinal = 0;
string referenceCalcItemExpression =
String.Format(
@"CALCULATE(
CALCULATE( SELECTEDMEASURE( ), REMOVEFILTERS( {0} ) ),
TREATAS(
VALUES( {1} ),
{2}
)
)",
dateTable.DaxObjectFullName,
dayOfWeekColumn.DaxObjectFullName,
referenceDayOfWeekColumn.DaxObjectFullName
);
CalculationItem referenceCalcItem = calcGroup.AddCalculationItem(referenceCalcItemName, referenceCalcItemExpression);
referenceCalcItem.FormatDax();
referenceCalcItem.Ordinal = 1;
string comparisonCalcItemExpression =
String.Format(
@"VAR _selection =
CALCULATE(
SELECTEDMEASURE( ),
REMOVEFILTERS( {0} )
)
VAR _refrence =
CALCULATE(
CALCULATE( SELECTEDMEASURE( ),REMOVEFILTERS( {1} )),
TREATAS(
VALUES( {2} ),
{3}
)
)
VAR _result =
IF(
ISBLANK( _selection ) || ISBLANK( _refrence ),
BLANK( ),
_selection - _refrence
)
RETURN
_result",
referenceDateTable.DaxObjectFullName,
dateTable.DaxObjectFullName,
dayOfWeekColumn.DaxObjectFullName,
referenceDayOfWeekColumn.DaxObjectFullName);
string comparisonCalcItemFormatStringExpression =
@"VAR _fs = SELECTEDMEASUREFORMATSTRING()
RETURN ""+"" & _fs & "";-"" & _fs & "";-"" ";
CalculationItem comparisonCalcItem = calcGroup.AddCalculationItem(comparisonCalcItemName, comparisonCalcItemExpression);
comparisonCalcItem.FormatStringExpression = comparisonCalcItemFormatStringExpression;
comparisonCalcItem.FormatDax();
comparisonCalcItem.Ordinal = 2;
string comparisonPctCalcItemExpression =
String.Format(
@"VAR _selection =
CALCULATE(
SELECTEDMEASURE( ),
REMOVEFILTERS( {0} )
)
VAR _refrence =
CALCULATE(
CALCULATE( SELECTEDMEASURE( ),REMOVEFILTERS( {1} ) ),
TREATAS(
VALUES( {2} ),
{3}
)
)
VAR _result =
IF(
ISBLANK( _selection ) || ISBLANK( _refrence ),
BLANK( ),
DIVIDE( _selection - _refrence, _refrence )
)
RETURN
_result",
referenceDateTable.DaxObjectFullName,
dateTable.DaxObjectFullName,
dayOfWeekColumn.DaxObjectFullName,
referenceDayOfWeekColumn.DaxObjectFullName);
string comparisonPctCalcItemFormatStringExpression = @"""+0 %;-0 %;-""";
CalculationItem comparisonPctCalcItem = calcGroup.AddCalculationItem(comparisonPctCalcItemName, comparisonPctCalcItemExpression);
comparisonPctCalcItem.FormatStringExpression = comparisonPctCalcItemFormatStringExpression;
comparisonPctCalcItem.FormatDax();
comparisonPctCalcItem.Ordinal = 3;
string daysMeasureExpression =
String.Format(
@"COUNTROWS({0})",
dateTable.DaxObjectFullName);
Measure daysMeasure = dateTable.AddMeasure(name: daysMeasureName, expression: daysMeasureExpression);
daysMeasure.FormatString = @"""0""";
daysMeasure.FormatDax();
string referenceDaysRawMeasureExpression =
String.Format(
@"COUNTROWS({0})",
referenceDateTable.DaxObjectFullName);
Measure referenceDaysRawMeasure = referenceDateTable.AddMeasure(name: referenceDaysRawMeasureName, expression: referenceDaysRawMeasureExpression);
referenceDaysRawMeasure.FormatString = @"""0""";
referenceDaysRawMeasure.FormatDax();
string referenceDaysMeasureExpression =
String.Format(
@"CALCULATE({0},{1}=""{2}"")",
referenceDaysRawMeasure.DaxObjectFullName,
calcGroupColumn.DaxObjectFullName,
referenceCalcItem.Name);
Measure referenceDaysMeasure = referenceDateTable.AddMeasure(name: referenceDaysMeasureName, expression: referenceDaysMeasureExpression);
referenceDaysMeasure.FormatDax();
string daysDifferenceMeasureExpression =
String.Format(
@"{0} - {1}",
daysMeasure.DaxObjectFullName,
referenceDaysMeasure.DaxObjectFullName);
Measure differenceDaysMeasure = referenceDateTable.AddMeasure(name: daysDifferenceMeasureName, expression: daysDifferenceMeasureExpression);
differenceDaysMeasure.FormatDax();
differenceDaysMeasure.FormatString = @"""0""";

public static class Fx
{
public static IEnumerable<Table> GetDateTables(Model model)
{
IEnumerable<Table> dateTables = null as IEnumerable<Table>;
if (model.Tables.Any(t => t.DataCategory == "Time" && t.Columns.Any(c => c.IsKey == true)))
{
dateTables = model.Tables.Where(t => t.DataCategory == "Time" && t.Columns.Any(c => c.IsKey == true && c.DataType == DataType.DateTime));
}
else
{
Error("No date table detected in the model. Please mark your date table(s) as date table");
}
return dateTables;
}
public static Table GetTablesWithAnnotation(IEnumerable<Table> tables, string annotationLabel, string annotationValue)
{
Func<Table, bool> lambda = t => t.GetAnnotation(annotationLabel) == annotationValue;
IEnumerable<Table> matchTables = GetFilteredTables(tables, lambda);
if(matchTables == null)
{
return null;
}
else
{
return matchTables.First();
}
}
public static IEnumerable<Table> GetFilteredTables(IEnumerable<Table> tables, Func<Table,bool> lambda)
{
if (tables.Any(t => lambda(t)))
{
return tables.Where(t => lambda(t));
}
else
{
return null as IEnumerable<Table>;
}
}
public static IEnumerable<Column> GetFilteredColumns(IEnumerable<Column> columns, Func<Column,bool> lambda, bool returnAllIfNoneFound = true)
{
if (columns.Any(c => lambda(c)))
{
return columns.Where(c => lambda(c));
}
else
{
if(returnAllIfNoneFound)
{
return columns;
}
else
{
return null as IEnumerable<Column>;
}
}
}
public static Table CreateCalcTable(Model model, string tableName, string tableExpression)
{
if(!model.Tables.Any(t => t.Name == tableName))
{
return model.AddCalculatedTable(tableName, tableExpression);
}
else
{
return model.Tables.Where(t => t.Name == tableName).First();
}
}
public static string GetNameFromUser(string Prompt, string Title ="", string DefaultResponse = "")
{
string response = Interaction.InputBox(Prompt, Title, DefaultResponse, 740, 400);
return response;
}
public static string ChooseString(IList<string> OptionList)
{
Func<IList<string>, string, string> SelectString = (IList<string> options, string title) =>
{
var form = new Form();
form.Text = title;
var buttonPanel = new Panel();
buttonPanel.Dock = DockStyle.Bottom;
buttonPanel.Height = 30;
var okButton = new Button() { DialogResult = DialogResult.OK, Text = "OK" };
var cancelButton = new Button() { DialogResult = DialogResult.Cancel, Text = "Cancel", Left = 80 };
var listbox = new ListBox();
listbox.Dock = DockStyle.Fill;
listbox.Items.AddRange(options.ToArray());
listbox.SelectedItem = options[0];
form.Controls.Add(listbox);
form.Controls.Add(buttonPanel);
buttonPanel.Controls.Add(okButton);
buttonPanel.Controls.Add(cancelButton);
var result = form.ShowDialog();
if (result == DialogResult.Cancel) return null;
return listbox.SelectedItem.ToString();
};
//let the user select the name of the macro to copy
String select = SelectString(OptionList, "Choose a macro");
//check that indeed one macro was selected
if (select == null)
{
Info("You cancelled!");
}
return select;
}
}
Loading