<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: RLS DAX to provide dynamic BETWEEN where a user can have multiple rows in DAX Commands and Tips</title>
    <link>https://community.fabric.microsoft.com/t5/DAX-Commands-and-Tips/RLS-DAX-to-provide-dynamic-BETWEEN-where-a-user-can-have/m-p/3461549#M132040</link>
    <description>&lt;P&gt;&lt;a href="javascript:void(0)" data-lia-user-mentions="" data-lia-user-uid="6799" data-lia-user-login="OwenAuger" class="lia-mention lia-mention-user"&gt;OwenAuger&lt;/a&gt;&amp;nbsp;- Thank you so much, both these rules work.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Having tested their impact through DAX Studio the version with TREATAS is the most optimal. More optimal in fact than a direct (m-to-m) join on all the possible values of [tgd_key] e.g. listing the [tgd_keys] in rls account_caledar_meta rather than using a start and end.&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;I knew I needed to match on the [territory_code] and [time_grain] values, but I couldnt quite see how I was going to bring these values from the fact into my variables - it was actually more simple than I was making it. However I wouldnt have got to your NOT ISEMPTY solution at the end, so once again THANK YOU!!&lt;/P&gt;</description>
    <pubDate>Thu, 05 Oct 2023 11:47:44 GMT</pubDate>
    <dc:creator>mark_endicott</dc:creator>
    <dc:date>2023-10-05T11:47:44Z</dc:date>
    <item>
      <title>RLS DAX to provide dynamic BETWEEN where a user can have multiple rows</title>
      <link>https://community.fabric.microsoft.com/t5/DAX-Commands-and-Tips/RLS-DAX-to-provide-dynamic-BETWEEN-where-a-user-can-have/m-p/3460030#M131982</link>
      <description>&lt;P&gt;Hi,&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I'm trying to wrap my head around a complex RLS rule, where we need to filter the a column of a table to all the values between a start and an end point in the RLS table, however the complication is, a user can have multiple rows in the RLS table, and therefore multiple start and end values.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The RLS table is in the strutcture below:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;username&lt;/TD&gt;&lt;TD&gt;territory_code&lt;/TD&gt;&lt;TD&gt;time_grain&lt;/TD&gt;&lt;TD&gt;start_tgd_key&lt;/TD&gt;&lt;TD&gt;end_tgd_key&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;A href="mailto:Test@test.com" target="_blank" rel="noopener"&gt;Test@test.com&lt;/A&gt;&lt;/TD&gt;&lt;TD&gt;AU&lt;/TD&gt;&lt;TD&gt;Week&lt;/TD&gt;&lt;TD&gt;11200249&lt;/TD&gt;&lt;TD&gt;11299901&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;A href="mailto:Test@test.com" target="_blank" rel="noopener"&gt;Test@test.com&lt;/A&gt;&lt;/TD&gt;&lt;TD&gt;AU&lt;/TD&gt;&lt;TD&gt;Period&lt;/TD&gt;&lt;TD&gt;12200249&lt;/TD&gt;&lt;TD&gt;12299901&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;A href="mailto:Test@test.com" target="_blank" rel="noopener"&gt;Test@test.com&lt;/A&gt;&lt;/TD&gt;&lt;TD&gt;AU&lt;/TD&gt;&lt;TD&gt;Quarter&lt;/TD&gt;&lt;TD&gt;13200249&lt;/TD&gt;&lt;TD&gt;13299901&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;A href="mailto:Test@test.com" target="_blank" rel="noopener"&gt;Test@test.com&lt;/A&gt;&lt;/TD&gt;&lt;TD&gt;IE&lt;/TD&gt;&lt;TD&gt;Week&lt;/TD&gt;&lt;TD&gt;41200249&lt;/TD&gt;&lt;TD&gt;41299901&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;A href="mailto:Test@test.com" target="_blank" rel="noopener"&gt;Test@test.com&lt;/A&gt;&lt;/TD&gt;&lt;TD&gt;IE&lt;/TD&gt;&lt;TD&gt;Period&lt;/TD&gt;&lt;TD&gt;42200249&lt;/TD&gt;&lt;TD&gt;42299901&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;A href="mailto:Test@test.com" target="_blank" rel="noopener"&gt;Test@test.com&lt;/A&gt;&lt;/TD&gt;&lt;TD&gt;IE&lt;/TD&gt;&lt;TD&gt;Quarter&lt;/TD&gt;&lt;TD&gt;43200249&lt;/TD&gt;&lt;TD&gt;43299901&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;A href="mailto:Test@test.com" target="_blank" rel="noopener"&gt;Test@test.com&lt;/A&gt;&lt;/TD&gt;&lt;TD&gt;NZ&lt;/TD&gt;&lt;TD&gt;Week&lt;/TD&gt;&lt;TD&gt;91200849&lt;/TD&gt;&lt;TD&gt;91299901&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;A href="mailto:Test@test.com" target="_blank" rel="noopener"&gt;Test@test.com&lt;/A&gt;&lt;/TD&gt;&lt;TD&gt;NZ&lt;/TD&gt;&lt;TD&gt;Period&lt;/TD&gt;&lt;TD&gt;92200849&lt;/TD&gt;&lt;TD&gt;92299901&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;A href="mailto:Test@test.com" target="_blank" rel="noopener"&gt;Test@test.com&lt;/A&gt;&lt;/TD&gt;&lt;TD&gt;NZ&lt;/TD&gt;&lt;TD&gt;Quarter&lt;/TD&gt;&lt;TD&gt;93200849&lt;/TD&gt;&lt;TD&gt;93299901&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;A href="mailto:Test@test.com" target="_blank" rel="noopener"&gt;Test@test.com&lt;/A&gt;&lt;/TD&gt;&lt;TD&gt;UK&lt;/TD&gt;&lt;TD&gt;Week&lt;/TD&gt;&lt;TD&gt;111199801&lt;/TD&gt;&lt;TD&gt;111299901&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;A href="mailto:Test@test.com" target="_blank" rel="noopener"&gt;Test@test.com&lt;/A&gt;&lt;/TD&gt;&lt;TD&gt;UK&lt;/TD&gt;&lt;TD&gt;Period&lt;/TD&gt;&lt;TD&gt;112199801&lt;/TD&gt;&lt;TD&gt;112299901&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;A href="mailto:Test@test.com" target="_blank" rel="noopener"&gt;Test@test.com&lt;/A&gt;&lt;/TD&gt;&lt;TD&gt;UK&lt;/TD&gt;&lt;TD&gt;Quarter&lt;/TD&gt;&lt;TD&gt;113199801&lt;/TD&gt;&lt;TD&gt;113299901&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;And the table that the rule will be imposed upon like below:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;Stat_week&lt;/TD&gt;&lt;TD&gt;territory_code&lt;/TD&gt;&lt;TD&gt;time_grain&lt;/TD&gt;&lt;TD&gt;tgd_key&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;199801&lt;/TD&gt;&lt;TD&gt;UK&lt;/TD&gt;&lt;TD&gt;Week&lt;/TD&gt;&lt;TD&gt;111199801&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;199801&lt;/TD&gt;&lt;TD&gt;UK&lt;/TD&gt;&lt;TD&gt;Period&lt;/TD&gt;&lt;TD&gt;112199801&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;199801&lt;/TD&gt;&lt;TD&gt;UK&lt;/TD&gt;&lt;TD&gt;Quarter&lt;/TD&gt;&lt;TD&gt;113199801&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;200249&lt;/TD&gt;&lt;TD&gt;AU&lt;/TD&gt;&lt;TD&gt;Week&lt;/TD&gt;&lt;TD&gt;11200249&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;200249&lt;/TD&gt;&lt;TD&gt;AU&lt;/TD&gt;&lt;TD&gt;Period&lt;/TD&gt;&lt;TD&gt;12200249&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;200249&lt;/TD&gt;&lt;TD&gt;AU&lt;/TD&gt;&lt;TD&gt;Quarter&lt;/TD&gt;&lt;TD&gt;13200249&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;200249&lt;/TD&gt;&lt;TD&gt;IE&lt;/TD&gt;&lt;TD&gt;Week&lt;/TD&gt;&lt;TD&gt;41200249&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;200249&lt;/TD&gt;&lt;TD&gt;IE&lt;/TD&gt;&lt;TD&gt;Period&lt;/TD&gt;&lt;TD&gt;42200249&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;200249&lt;/TD&gt;&lt;TD&gt;IE&lt;/TD&gt;&lt;TD&gt;Quarter&lt;/TD&gt;&lt;TD&gt;43200249&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;200849&lt;/TD&gt;&lt;TD&gt;NZ&lt;/TD&gt;&lt;TD&gt;Week&lt;/TD&gt;&lt;TD&gt;91200849&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;200849&lt;/TD&gt;&lt;TD&gt;NZ&lt;/TD&gt;&lt;TD&gt;Period&lt;/TD&gt;&lt;TD&gt;92200849&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;200849&lt;/TD&gt;&lt;TD&gt;NZ&lt;/TD&gt;&lt;TD&gt;Quarter&lt;/TD&gt;&lt;TD&gt;93200849&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The rule needs to match the&amp;nbsp;territory_code &amp;amp; time_grain values between tables, and then filter to all the values in&amp;nbsp;tgd_key that are between the start_tgd_key and end_tgd_key.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;My starting point is the code below, which worked until we had to make it mulitple rows per user.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="markup"&gt;VAR Start_filter =
    CALCULATETABLE (
        VALUES ( 'rls account_calendar_meta'[start_tgd_key] ),
        'rls account_calendar_meta'[username] = USERPRINCIPALNAME ()
    )

	
VAR End_filter =
    CALCULATETABLE (
        VALUES ( 'rls account_calendar_meta'[end_tgd_key] ),
        'rls account_calendar_meta'[username] = USERPRINCIPALNAME ()
    )
RETURN
    AND ( [tgd_key] &amp;gt;= Start_filter, [tgd_key] &amp;lt;= End_filter )&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Grateful for any assistance that can be provided!!&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thanks,&lt;/P&gt;&lt;P&gt;Mark&lt;/P&gt;</description>
      <pubDate>Wed, 04 Oct 2023 17:12:07 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/DAX-Commands-and-Tips/RLS-DAX-to-provide-dynamic-BETWEEN-where-a-user-can-have/m-p/3460030#M131982</guid>
      <dc:creator>mark_endicott</dc:creator>
      <dc:date>2023-10-04T17:12:07Z</dc:date>
    </item>
    <item>
      <title>Re: RLS DAX to provide dynamic BETWEEN where a user can have multiple rows</title>
      <link>https://community.fabric.microsoft.com/t5/DAX-Commands-and-Tips/RLS-DAX-to-provide-dynamic-BETWEEN-where-a-user-can-have/m-p/3461009#M132014</link>
      <description>&lt;P&gt;Hi&amp;nbsp;&lt;a href="javascript:void(0)" data-lia-user-mentions="" data-lia-user-uid="343036" data-lia-user-login="mark_endicott" class="lia-mention lia-mention-user"&gt;mark_endicott&lt;/a&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Here are a couple of equivalent RLS filter expressons I would suggest:&lt;/P&gt;
&lt;P&gt;(replace &lt;STRONG&gt;FactTable&lt;/STRONG&gt; with the correct name)&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;VAR UPN = USERPRINCIPALNAME ( )
VAR CurrentTerritory =
    FactTable[territory_code]
VAR CurrentTimeGrain =
    FactTable[time_grain]
VAR CurrentTGDKey =
    FactTable[tgd_key]
RETURN
    CALCULATE (
        NOT ISEMPTY ( 'rls account_calendar_meta' ),
        'rls account_calendar_meta'[username] = UPN,
        'rls account_calendar_meta'[territory_code] = CurrentTerritory,
        'rls account_calendar_meta'[time_grain] = CurrentTimeGrain,
        CurrentTGDKey &amp;gt;= 'rls account_calendar_meta'[start_tgd_key],
        CurrentTGDKey &amp;lt;= 'rls account_calendar_meta'[end_tgd_key]
    )&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;VAR UPN = USERPRINCIPALNAME ( )
VAR CurrentTerritory = FactTable[territory_code]
VAR CurrentTimeGrain = FactTable[time_grain]
VAR CurrentTGDKey = FactTable[tgd_key]
RETURN
    CALCULATE (
        NOT ISEMPTY ( 'rls account_calendar_meta' ),
        TREATAS (
            { ( UPN, CurrentTerritory, CurrentTimeGrain ) },
            'rls account_calendar_meta'[username],
            'rls account_calendar_meta'[territory_code],
            'rls account_calendar_meta'[time_grain]
        ),
        CurrentTGDKey &amp;gt;= 'rls account_calendar_meta'[start_tgd_key],
        CurrentTGDKey &amp;lt;= 'rls account_calendar_meta'[end_tgd_key]
    )
&lt;/LI-CODE&gt;
&lt;P&gt;The logic is to filter the &lt;STRONG&gt;'rls account_calendar_meta'&lt;/STRONG&gt; table based on the current fact table row, and return TRUE if &lt;STRONG&gt;'rls account_calendar_meta'&lt;/STRONG&gt; is nonempty.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Do these work for you?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Regards&lt;/P&gt;</description>
      <pubDate>Thu, 05 Oct 2023 05:56:09 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/DAX-Commands-and-Tips/RLS-DAX-to-provide-dynamic-BETWEEN-where-a-user-can-have/m-p/3461009#M132014</guid>
      <dc:creator>OwenAuger</dc:creator>
      <dc:date>2023-10-05T05:56:09Z</dc:date>
    </item>
    <item>
      <title>Re: RLS DAX to provide dynamic BETWEEN where a user can have multiple rows</title>
      <link>https://community.fabric.microsoft.com/t5/DAX-Commands-and-Tips/RLS-DAX-to-provide-dynamic-BETWEEN-where-a-user-can-have/m-p/3461549#M132040</link>
      <description>&lt;P&gt;&lt;a href="javascript:void(0)" data-lia-user-mentions="" data-lia-user-uid="6799" data-lia-user-login="OwenAuger" class="lia-mention lia-mention-user"&gt;OwenAuger&lt;/a&gt;&amp;nbsp;- Thank you so much, both these rules work.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Having tested their impact through DAX Studio the version with TREATAS is the most optimal. More optimal in fact than a direct (m-to-m) join on all the possible values of [tgd_key] e.g. listing the [tgd_keys] in rls account_caledar_meta rather than using a start and end.&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;I knew I needed to match on the [territory_code] and [time_grain] values, but I couldnt quite see how I was going to bring these values from the fact into my variables - it was actually more simple than I was making it. However I wouldnt have got to your NOT ISEMPTY solution at the end, so once again THANK YOU!!&lt;/P&gt;</description>
      <pubDate>Thu, 05 Oct 2023 11:47:44 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/DAX-Commands-and-Tips/RLS-DAX-to-provide-dynamic-BETWEEN-where-a-user-can-have/m-p/3461549#M132040</guid>
      <dc:creator>mark_endicott</dc:creator>
      <dc:date>2023-10-05T11:47:44Z</dc:date>
    </item>
  </channel>
</rss>

