<?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: Using CROSSFILTER to work around Single Direction Relationship in DAX Commands and Tips</title>
    <link>https://community.fabric.microsoft.com/t5/DAX-Commands-and-Tips/Using-CROSSFILTER-to-work-around-Single-Direction-Relationship/m-p/1762077#M36889</link>
    <description>&lt;P&gt;Anonymous&lt;/LI-USER&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I don't have time to optimize this measure... but you might not even need it. To use the measure correctly (and understand its behaviour) you have to have a correct dimensional model and follow &lt;A href="https://docs.microsoft.com/en-us/power-bi/guidance/star-schema" target="_blank" rel="noopener"&gt;Best Practices&lt;/A&gt; of dimensional modeling in PBI (for instance, you should never slice by attributes in the fact table apart from a degenerate dimension). It's up to you to create correct models and take precautions to guide users to use them correctly.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="csharp"&gt;[First Isle Count] = 
var vAisleIsInScope = ISINSCOPE( WarehouseLocation[Aisle] )
var vCurrentAisle = SELECTEDVALUE( WarehouseLocation[Aisle] )
var vMissingAisleNotInScope = vCurrentAisle &amp;lt;&amp;gt; "missing"
RETURN
    IF( vAisleIsInScope &amp;amp;&amp;amp; vMissingAisleNotInScope,
        
        // Need to find all the packages
        // in the current context that have
        // the selected isle as the first one.
        // This must happen after the removal
        // of all filters from WarehouseLocation
        // and exclusion of the missing isle. All
        // other filters ARE HONORED.
        
        CALCULATE(
            SUMX(
                DISTINCT( WarehousePackage[Package ID] ),
                1 * CALCULATE(
                    // Change MINX to MAXX to have the
                    // other measure, Last Isle Count.
                    vCurrentAisle = MINX(
                        SUMMARIZE(
                            WarehousePackage,
                            WarehouseLocation[Aisle]
                        ),
                        WarehouseLocation[Aisle]
                    )
                )
            ),
            REMOVEFILTERS( WarehouseLocation ),
            WarehouseLocation[Aisle] &amp;lt;&amp;gt; "missing"
        )
        
    )&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Fri, 02 Apr 2021 23:32:32 GMT</pubDate>
    <dc:creator>daxer-almighty</dc:creator>
    <dc:date>2021-04-02T23:32:32Z</dc:date>
    <item>
      <title>Using CROSSFILTER to work around Single Direction Relationship</title>
      <link>https://community.fabric.microsoft.com/t5/DAX-Commands-and-Tips/Using-CROSSFILTER-to-work-around-Single-Direction-Relationship/m-p/1761847#M36871</link>
      <description>&lt;H2&gt;&lt;STRONG&gt;Data Model&lt;/STRONG&gt;&lt;/H2&gt;&lt;P&gt;&lt;STRONG&gt;WarehouseLocation&lt;/STRONG&gt; - Table of locations within a warehouse&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;WarehousePackage&lt;/STRONG&gt; - Table of warehouse pick locations by package&lt;/P&gt;&lt;P&gt;Single Direction relationship from WarehouseLocation to WarehousePackage.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;H2&gt;&lt;STRONG&gt;Desired Outcome&lt;/STRONG&gt;&lt;/H2&gt;&lt;P&gt;A table visual that counts the number of packages that start/end in each warehouse aisle, excluding Aisle = "MISSING".&lt;/P&gt;&lt;P&gt;Example for one Package (starts in A, ends in E):&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;Package ID&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;Location Desc&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;Aisle&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;10001&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;A4&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;A&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;10001&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;A8&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;A&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;10001&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;B1&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;B&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;10001&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;B3&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;B&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;10001&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;B6&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;B&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;10001&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;E3&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;E&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;10001&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;E4&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;E&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;10001&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;E5&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;E&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;10001&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;E8&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;E&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;For all packages in the example dataset/report:&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;Aisle&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;FirstAisle&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;LastAisle&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;A&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;41&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;0&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;B&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;7&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;0&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;C&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;1&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;2&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;D&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;1&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;3&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;E&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;0&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;45&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;H2&gt;&lt;STRONG&gt;Problem Statement&lt;/STRONG&gt;&lt;/H2&gt;&lt;P&gt;I don't have an option to modify the dataset, so I need to work around the single direction cross filter relationship.&amp;nbsp; When I assemble the table visual, the Location is still filtering even when I attempt to control for it, essentially counting all packages that hit an aisle, and not just the First and Last.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;H2&gt;&lt;STRONG&gt;DAX Measure&lt;/STRONG&gt;&lt;/H2&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="markup"&gt;_StartCount = 
VAR __Summary =
    SUMMARIZE (
        FILTER(WarehousePackage, WarehousePackage[Location Desc] &amp;lt;&amp;gt; "MISSING"),
        WarehousePackage[Package ID],
        "FirstAisle", CALCULATE (MIN(WarehouseLocation[Aisle]), CROSSFILTER(WarehouseLocation[Location ID], WarehousePackage[Location ID], Both))
    )

VAR __Count =
    CALCULATE (
        COUNTROWS (
            FILTER ( __Summary, [FirstAisle] = SELECTEDVALUE ( WarehouseLocation[Aisle] ) )
        ),
        CROSSFILTER(WarehouseLocation[Location ID], WarehousePackage[Location ID], Both)    
    )
RETURN
    __Count&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;PBIX - &lt;A href="https://www.dropbox.com/s/jww9rxk43x5xsnj/Warehouse.pbix?dl=0" target="_blank" rel="noopener"&gt;https://www.dropbox.com/s/jww9rxk43x5xsnj/Warehouse.pbix?dl=0&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Fri, 02 Apr 2021 15:50:13 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/DAX-Commands-and-Tips/Using-CROSSFILTER-to-work-around-Single-Direction-Relationship/m-p/1761847#M36871</guid>
      <dc:creator>Anonymous</dc:creator>
      <dc:date>2021-04-02T15:50:13Z</dc:date>
    </item>
    <item>
      <title>Re: Using CROSSFILTER to work around Single Direction Relationship</title>
      <link>https://community.fabric.microsoft.com/t5/DAX-Commands-and-Tips/Using-CROSSFILTER-to-work-around-Single-Direction-Relationship/m-p/1762077#M36889</link>
      <description>&lt;P&gt;Anonymous&lt;/LI-USER&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I don't have time to optimize this measure... but you might not even need it. To use the measure correctly (and understand its behaviour) you have to have a correct dimensional model and follow &lt;A href="https://docs.microsoft.com/en-us/power-bi/guidance/star-schema" target="_blank" rel="noopener"&gt;Best Practices&lt;/A&gt; of dimensional modeling in PBI (for instance, you should never slice by attributes in the fact table apart from a degenerate dimension). It's up to you to create correct models and take precautions to guide users to use them correctly.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="csharp"&gt;[First Isle Count] = 
var vAisleIsInScope = ISINSCOPE( WarehouseLocation[Aisle] )
var vCurrentAisle = SELECTEDVALUE( WarehouseLocation[Aisle] )
var vMissingAisleNotInScope = vCurrentAisle &amp;lt;&amp;gt; "missing"
RETURN
    IF( vAisleIsInScope &amp;amp;&amp;amp; vMissingAisleNotInScope,
        
        // Need to find all the packages
        // in the current context that have
        // the selected isle as the first one.
        // This must happen after the removal
        // of all filters from WarehouseLocation
        // and exclusion of the missing isle. All
        // other filters ARE HONORED.
        
        CALCULATE(
            SUMX(
                DISTINCT( WarehousePackage[Package ID] ),
                1 * CALCULATE(
                    // Change MINX to MAXX to have the
                    // other measure, Last Isle Count.
                    vCurrentAisle = MINX(
                        SUMMARIZE(
                            WarehousePackage,
                            WarehouseLocation[Aisle]
                        ),
                        WarehouseLocation[Aisle]
                    )
                )
            ),
            REMOVEFILTERS( WarehouseLocation ),
            WarehouseLocation[Aisle] &amp;lt;&amp;gt; "missing"
        )
        
    )&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 02 Apr 2021 23:32:32 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/DAX-Commands-and-Tips/Using-CROSSFILTER-to-work-around-Single-Direction-Relationship/m-p/1762077#M36889</guid>
      <dc:creator>daxer-almighty</dc:creator>
      <dc:date>2021-04-02T23:32:32Z</dc:date>
    </item>
    <item>
      <title>Re: Using CROSSFILTER to work around Single Direction Relationship</title>
      <link>https://community.fabric.microsoft.com/t5/DAX-Commands-and-Tips/Using-CROSSFILTER-to-work-around-Single-Direction-Relationship/m-p/1762097#M36891</link>
      <description>&lt;P&gt;Thank you for the detailed reply!&amp;nbsp; Completely agree that this model does not follow best practices for this use case; it was developed for a more general self-service option for less technical end users.&lt;/P&gt;</description>
      <pubDate>Sat, 03 Apr 2021 00:07:09 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/DAX-Commands-and-Tips/Using-CROSSFILTER-to-work-around-Single-Direction-Relationship/m-p/1762097#M36891</guid>
      <dc:creator>Anonymous</dc:creator>
      <dc:date>2021-04-03T00:07:09Z</dc:date>
    </item>
  </channel>
</rss>

