<?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 URGENT! Custom Table Data Limit in Developer</title>
    <link>https://community.fabric.microsoft.com/t5/Developer/URGENT-Custom-Table-Data-Limit/m-p/2223295#M33316</link>
    <description>&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I've been struggling with getting my custom table visual to display&amp;nbsp;&lt;EM&gt;all&amp;nbsp;&lt;/EM&gt;the data I need: I know the record limit is 30,000, but fetchMoreData is supposed to allow my Typescript logic to operate on all 100,000 records, correct?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I am iterating over all rows and checking whether two fields are mismatched. There are none in the first 30,000 but I can confirm there are more later on.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Here's my visual.ts:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="javascript"&gt;// Power BI visual to display mismatching ngoc and npsp data

"use strict";

import "core-js/stable";
import "./../style/visual.less";
import powerbi from "powerbi-visuals-api";
import VisualConstructorOptions = powerbi.extensibility.visual.VisualConstructorOptions;
import VisualUpdateOptions = powerbi.extensibility.visual.VisualUpdateOptions;
import IVisual = powerbi.extensibility.visual.IVisual;
import EnumerateVisualObjectInstancesOptions = powerbi.EnumerateVisualObjectInstancesOptions;
import VisualObjectInstance = powerbi.VisualObjectInstance;
import DataView = powerbi.DataView;
import VisualObjectInstanceEnumerationObject = powerbi.VisualObjectInstanceEnumerationObject;
import DataViewMetadataColumn = powerbi.DataViewMetadataColumn;
import DataViewTable = powerbi.DataViewTable;
import DataViewTableRow = powerbi.DataViewTableRow;
import PrimitiveValue = powerbi.PrimitiveValue;
import { VisualSettings } from "./settings";
import IVisualHost = powerbi.extensibility.visual.IVisualHost;


export class Visual implements IVisual {
    private target: HTMLElement;
    private settings: VisualSettings;
    private printRow: boolean;
    private host: IVisualHost;
    private windowsLoaded: number;
    private requestAccepted: Boolean;
    private btnNext: HTMLButtonElement;
    private btnPrev: HTMLButtonElement;
    private tbl: DataViewTable;
    private table: HTMLTableElement;


    // create base table element
    constructor(options: VisualConstructorOptions) {
        this.target = options.element;
        options.element.style.overflow = 'auto';
        this.table = document.createElement("table");
        this.target.appendChild(this.table);
        this.host = options.host;
        this.windowsLoaded = 0;
    }


    // update table display
    public update(options: VisualUpdateOptions) {
        console.log(options);
        this.tbl = options.dataViews[0].table;
        if (this.tbl.rows.length == 30000) {
            this.tbl
        }
        const tbl: DataViewTable = options.dataViews[0].table;
        while (this.table.firstChild) this.table.removeChild(this.table.firstChild);
        this.printRow = false;

        if (options.dataViews[0].metadata.segment) {
            this.requestAccepted = !this.host.fetchMoreData()
            if (!this.requestAccepted) {
                console.log('Cannot fetch more data. Total rows: ', tbl.rows.length);
                console.log(this.table.rows.length);
                return;
            }
            else console.log('we have all ', tbl.rows.length, ' rows!');
        }

        // Make headers
        const header = document.createElement("th");
        tbl.columns.forEach((col: DataViewMetadataColumn) =&amp;gt; {
            const headerCol = document.createElement("td");
            headerCol.innerText = col.displayName;
            header.appendChild(headerCol);

            //header.appendChild(document.createElement("nbsp"));
        });

        this.table.appendChild(header);

        // Order for columns must be: NGOC Id, NPSP Id, NGOC Field, NPSP Field
        tbl.rows.forEach((row: DataViewTableRow) =&amp;gt; {
            const tblRow = document.createElement("tr");

            // iterate over rows, creating a new row wherever a mismatch is found
            if (row[0] != null &amp;amp;&amp;amp; row[1] != null
                &amp;amp;&amp;amp; row[2].toString() != row[3].toString()) {
                console.log('found one!');
                row.forEach((col: PrimitiveValue) =&amp;gt; {
                    const cell = document.createElement("td");
                    cell.innerText = col.toString();
                    tblRow.appendChild(cell);
                    this.printRow = true;
                });
            }
            if (this.printRow) {
                this.table.appendChild(tblRow);
            }
        });
        console.log(options);
    }

    private static parseSettings(dataView: DataView): VisualSettings {
        return &amp;lt;VisualSettings&amp;gt;VisualSettings.parse(dataView);
    }

    public enumerateObjectInstances(options: EnumerateVisualObjectInstancesOptions): VisualObjectInstance[] | VisualObjectInstanceEnumerationObject {
        return VisualSettings.enumerateObjectInstances(this.settings || VisualSettings.getDefault(), options);
    }
}&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;...and Capabilities.json:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="markup"&gt;{
    "dataRoles": [
        {
            "displayName": "Ids on top, fields on bottom",
            "name": "column",
            "kind": "Grouping"
        }
    ],
    "dataViewMappings": [
        {
            "conditions": [
                {
                    "column": {
                        "max": 4
                    }
                }
            ],
            "table": {
                "rows": {
                    "select": [
                        {
                            "for": {
                                "in": "column"
                            }
                        }
                    ],
                    "dataReductionAlgorithm": {
                        "window": {
                            "count": 30000
                        }
                    }
                }
            }
        }
    ],
    "sorting": {
        "implicit": {
            "clauses": [
                {
                    "role": "column",
                    "direction": 2
                }
            ]
        }
    },
    "objects": {
        "general": {
            "displayName": "General",
            "displayNameKey": "formatting",
            "properties": {
                "selfFilter": {
                    "type": {
                        "filter": {
                            "selfFilter": true
                        }
                    }
                }
            }
        }
    }
}&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Mon, 06 Dec 2021 16:12:02 GMT</pubDate>
    <dc:creator>Avery</dc:creator>
    <dc:date>2021-12-06T16:12:02Z</dc:date>
    <item>
      <title>URGENT! Custom Table Data Limit</title>
      <link>https://community.fabric.microsoft.com/t5/Developer/URGENT-Custom-Table-Data-Limit/m-p/2223295#M33316</link>
      <description>&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I've been struggling with getting my custom table visual to display&amp;nbsp;&lt;EM&gt;all&amp;nbsp;&lt;/EM&gt;the data I need: I know the record limit is 30,000, but fetchMoreData is supposed to allow my Typescript logic to operate on all 100,000 records, correct?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I am iterating over all rows and checking whether two fields are mismatched. There are none in the first 30,000 but I can confirm there are more later on.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Here's my visual.ts:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="javascript"&gt;// Power BI visual to display mismatching ngoc and npsp data

"use strict";

import "core-js/stable";
import "./../style/visual.less";
import powerbi from "powerbi-visuals-api";
import VisualConstructorOptions = powerbi.extensibility.visual.VisualConstructorOptions;
import VisualUpdateOptions = powerbi.extensibility.visual.VisualUpdateOptions;
import IVisual = powerbi.extensibility.visual.IVisual;
import EnumerateVisualObjectInstancesOptions = powerbi.EnumerateVisualObjectInstancesOptions;
import VisualObjectInstance = powerbi.VisualObjectInstance;
import DataView = powerbi.DataView;
import VisualObjectInstanceEnumerationObject = powerbi.VisualObjectInstanceEnumerationObject;
import DataViewMetadataColumn = powerbi.DataViewMetadataColumn;
import DataViewTable = powerbi.DataViewTable;
import DataViewTableRow = powerbi.DataViewTableRow;
import PrimitiveValue = powerbi.PrimitiveValue;
import { VisualSettings } from "./settings";
import IVisualHost = powerbi.extensibility.visual.IVisualHost;


export class Visual implements IVisual {
    private target: HTMLElement;
    private settings: VisualSettings;
    private printRow: boolean;
    private host: IVisualHost;
    private windowsLoaded: number;
    private requestAccepted: Boolean;
    private btnNext: HTMLButtonElement;
    private btnPrev: HTMLButtonElement;
    private tbl: DataViewTable;
    private table: HTMLTableElement;


    // create base table element
    constructor(options: VisualConstructorOptions) {
        this.target = options.element;
        options.element.style.overflow = 'auto';
        this.table = document.createElement("table");
        this.target.appendChild(this.table);
        this.host = options.host;
        this.windowsLoaded = 0;
    }


    // update table display
    public update(options: VisualUpdateOptions) {
        console.log(options);
        this.tbl = options.dataViews[0].table;
        if (this.tbl.rows.length == 30000) {
            this.tbl
        }
        const tbl: DataViewTable = options.dataViews[0].table;
        while (this.table.firstChild) this.table.removeChild(this.table.firstChild);
        this.printRow = false;

        if (options.dataViews[0].metadata.segment) {
            this.requestAccepted = !this.host.fetchMoreData()
            if (!this.requestAccepted) {
                console.log('Cannot fetch more data. Total rows: ', tbl.rows.length);
                console.log(this.table.rows.length);
                return;
            }
            else console.log('we have all ', tbl.rows.length, ' rows!');
        }

        // Make headers
        const header = document.createElement("th");
        tbl.columns.forEach((col: DataViewMetadataColumn) =&amp;gt; {
            const headerCol = document.createElement("td");
            headerCol.innerText = col.displayName;
            header.appendChild(headerCol);

            //header.appendChild(document.createElement("nbsp"));
        });

        this.table.appendChild(header);

        // Order for columns must be: NGOC Id, NPSP Id, NGOC Field, NPSP Field
        tbl.rows.forEach((row: DataViewTableRow) =&amp;gt; {
            const tblRow = document.createElement("tr");

            // iterate over rows, creating a new row wherever a mismatch is found
            if (row[0] != null &amp;amp;&amp;amp; row[1] != null
                &amp;amp;&amp;amp; row[2].toString() != row[3].toString()) {
                console.log('found one!');
                row.forEach((col: PrimitiveValue) =&amp;gt; {
                    const cell = document.createElement("td");
                    cell.innerText = col.toString();
                    tblRow.appendChild(cell);
                    this.printRow = true;
                });
            }
            if (this.printRow) {
                this.table.appendChild(tblRow);
            }
        });
        console.log(options);
    }

    private static parseSettings(dataView: DataView): VisualSettings {
        return &amp;lt;VisualSettings&amp;gt;VisualSettings.parse(dataView);
    }

    public enumerateObjectInstances(options: EnumerateVisualObjectInstancesOptions): VisualObjectInstance[] | VisualObjectInstanceEnumerationObject {
        return VisualSettings.enumerateObjectInstances(this.settings || VisualSettings.getDefault(), options);
    }
}&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;...and Capabilities.json:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="markup"&gt;{
    "dataRoles": [
        {
            "displayName": "Ids on top, fields on bottom",
            "name": "column",
            "kind": "Grouping"
        }
    ],
    "dataViewMappings": [
        {
            "conditions": [
                {
                    "column": {
                        "max": 4
                    }
                }
            ],
            "table": {
                "rows": {
                    "select": [
                        {
                            "for": {
                                "in": "column"
                            }
                        }
                    ],
                    "dataReductionAlgorithm": {
                        "window": {
                            "count": 30000
                        }
                    }
                }
            }
        }
    ],
    "sorting": {
        "implicit": {
            "clauses": [
                {
                    "role": "column",
                    "direction": 2
                }
            ]
        }
    },
    "objects": {
        "general": {
            "displayName": "General",
            "displayNameKey": "formatting",
            "properties": {
                "selfFilter": {
                    "type": {
                        "filter": {
                            "selfFilter": true
                        }
                    }
                }
            }
        }
    }
}&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 06 Dec 2021 16:12:02 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Developer/URGENT-Custom-Table-Data-Limit/m-p/2223295#M33316</guid>
      <dc:creator>Avery</dc:creator>
      <dc:date>2021-12-06T16:12:02Z</dc:date>
    </item>
    <item>
      <title>Re: URGENT! Custom Table Data Limit</title>
      <link>https://community.fabric.microsoft.com/t5/Developer/URGENT-Custom-Table-Data-Limit/m-p/2229163#M33357</link>
      <description>&lt;P&gt;Hi &lt;a href="https://community.fabric.microsoft.com/t5/user/viewprofilepage/user-id/343720"&gt;@Avery&lt;/a&gt;&amp;nbsp;,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Dataview total row count is limited to 1,048,576 rows but&amp;nbsp;In segments aggregation mode(default), dataview memory size is limited to 100 MB.&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Therefore, dataview size is expected to grow with each update. For example, if a total of 100,000 rows are expected and the window size is set to 10,000, the first update dataview should include 10,000 rows, the second update dataview should include 20,000 rows, and so on.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Best Regards,&lt;BR /&gt;Liang&lt;BR /&gt;If this post helps, then please consider Accept it as the solution to help the other members find it more quickly.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 09 Dec 2021 02:50:28 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Developer/URGENT-Custom-Table-Data-Limit/m-p/2229163#M33357</guid>
      <dc:creator>V-lianl-msft</dc:creator>
      <dc:date>2021-12-09T02:50:28Z</dc:date>
    </item>
  </channel>
</rss>

