Skip to content
Release notes

What changed, release by release.

Newest first. These are the notes the app itself shows on its What's new page, published here as they are written.

Latest
1.9.1
Released
Sep 24, 2026
Versions
1752 releases
First release
Aug 20, 2026

Grouped by version; fixes are listed with the release they belong to.

1.9

1.9.0 to 1.9.1Latest

Help

  • The in-app guide is the website's help, one set of articles. Help now opens an index of eighteen articles in seven sections, from Getting started to Administration, each with a summary. An article shows its sections under On this page, links to the articles around it, and keeps What's new at the top. The app and the website now read the same files, kept with the product, so the guide in NetSuite and the help on hiscalesolutions.com say the same thing and change together; before, the app had its own shorter guide that could drift from the website.
  • Links in an article stay in the app. A link to another help article opens it in the app; a link to anything else on the website opens a new tab.
  • 1.9.1Plainer wording across the help articles. The eighteen articles now read more plainly, with shorter sentences and the app named as the one doing the work. Their meaning has not changed, and every step, control name, table and example is the same.

1.8

1.8.0 to 1.8.4

Numbers

  • Full or compact, per page and per viewer. A report or dashboard carries a default number style, set with Numbers in the layout editor's toolbar: in full ($9,809,607.48) or compact ($9.81M, 1.5K). A Numbers control at the top of the page lets a viewer choose otherwise, and the choice is kept in their browser for that report or dashboard. The table, every chart, the stat tiles, the totals row and a statement follow.
  • 1.8.3Compact reaches the stat tiles and the charts. The stat tile, the bar and pie hover cards and the line hover card kept reading numbers in full whatever the page said; they now follow the Numbers choice like the table and the statement.
  • 1.8.4Stat tiles render again. 1.8.3 broke a stat tile that shows a comparison line; fixed within minutes, and the harness now stops on a failing check before anything is deployed.

Statement widget

  • Section names stay frozen. A section line was one cell spanning the table, so it scrolled away with the periods while the account names stayed put. It is now a normal line whose first cell is frozen like every other.
  • The frozen column is marked. A border and a soft shadow on its right edge tell the frozen column apart from the periods scrolling beneath it; the Statement section of the panel can switch the mark off.
  • 1.8.2The period headers no longer show over the frozen column. The corner cell of the header now stacks above the month headers, and the month headers above the frozen body cells, so scrolling sideways or down never paints one over another.

Top bar

  • 1.8.1The title keeps its room. While a layout is being edited the viewer's Numbers control steps aside (the editor toolbar has the default), so the report name is not squeezed out of the top bar; the Numbers control names itself in its options instead of a label, and the search box is a little narrower, for the same reason.

1.7

1.7.0 to 1.7.1

Statement widget

  • A report laid out as a financial statement. The new Statement widget puts one row per value of a column (an account) in sections (a section column, in a chosen order), one column per period (by month, quarter or year) and a Total column, with a total line after each section, percent-of lines between two sections (Commissions as a percent of Income) and a last line over everything. Over a postings report with one row per account, section and month it reads as NetSuite's Income Statement, and it follows the report's filters, a subsidiary or a range of months, like every widget. Sections collapse on a click; negatives read in parentheses.

Layout editor

  • 1.7.1The widget panel scrolls sideways. The edit-mode side panel is a little wider and scrolls horizontally as well as vertically, so a long column name in Columns shown, or any control wider than the panel, is reached instead of cut off at the edge.

1.6

Charts

  • Lines with a series, and a dashed future. A line chart grouped on a date or month column runs in date order and takes a Series column: one line per value, purchase orders expected against bills received, one vendor against another. Where the axis runs past today, the part of each line still to come is dashed and a Today marker stands at the current bucket, solid for what happened, dashed for what is expected, the reading the Demand Planning forecast uses. The hover card lists every series at the point.
  • The comparison trend shows what is expected. A bucket after today that already holds rows (an expected receipt date, a due date) keeps its value, drawn dashed past the Today marker instead of being cut off; buckets with nothing stay gaps.

1.5

Catalogue

  • The table view shows each description in full. Under the name, on every row of All Reports and of a category, so what a report is for can be read without opening it. The cards keep their two lines and show the whole text on hover. The Dashboards table does the same.
  • The table view sorts. Click a column heading to sort the reports by name, category, last run, opens, rows or status; click again to reverse, a third time to return to the list's own order.

Dashboards

  • A report opened from a dashboard keeps the dashboard's filters. The report name in a widget's title bar, and every drill-through from a table widget, now carry the dashboard filters that apply to that widget; the report opens with them as column filters, in the target column's own shape (a month on a date column is that month's dates). A drill-through's row values take precedence on a column both carry.
  • New Dashboard in the top bar. On the dashboards pages the top-bar button creates a dashboard, where it used to offer a new report.

Authoring

  • Column order without touching the SQL. The Columns step has an Order column: move a column up or down and the report shows them in that order. The order survives a re-preview of the query; a column new to the query is appended after the ordered ones.

1.4

1.4.0 to 1.4.1

One report, any grain

  • Group by Month, Quarter or Year on one report. A report stored by month no longer needs a "by Year" twin. When its month column offers the switch (set in the wizard's Columns step), the report page shows Group by with Month, Quarter and Year, starting on the grain the author chose; the choice is in the address, so a link can pin it. The rows are rolled up in the browser, and the grid, its filters, the totals row, every widget and the export all read the rolled-up rows. A quarter or a year clicked on a drill-through link narrows the detail to that quarter or year.
  • Each measure rolls up by its rule. In the Columns step every number, currency or percent column has a Roll-up: Sum (the default for numbers and money, and right for a count of things that each belong to one month), Ratio of two columns (a margin percentage is margin over revenue, an on-time rate is on-time lines over lines; the ratio is recomputed from the two sums, never averaged), or Month only, which leaves the value blank at any other grain. A percent column with no rule is Month only, so a wrong number is never shown. A median, a min or max, or a count of things that span months (vendors active, work orders completed) cannot be rolled up from month rows: mark them Month only, or read them from a dashboard over the detail report (below).

Widgets

  • Group by a date, by year, quarter, month or week. A chart or stat tile grouped on a date or month column has a By choice under Group by. Over a detail report, where each row is a line, that is exact for every aggregate.
  • Distinct count and median. Two new aggregates for charts, stat tiles and the totals row. With the bucket above, a dashboard over a detail report gives "distinct vendors per quarter" or "median days to proposal per year" exactly, which no roll-up of a summary can.

Import and widgets

  • 1.4.1An import can archive. An archive list in an import file names reports already in the account, by export key or by exact name, and an in-place import archives them once the rest of the file is in, exactly as Archive on the catalogue does (portlet deployments down, Restore brings it back). The preview lists each one or says why it is skipped: not in this account, already archived, or updated by the same file. A copy import never archives. The file can hold an archive list alone.
  • 1.4.1Widgets read quarter and year keys. A widget with a period filter ("This year", "Last quarter") or a By bucket on the period column of a report grouped by Quarter or Year showed nothing: a quarter key is not a date, and a bare year read as the previous December 31 in US time zones. A month, quarter or year key now reads as the first local day of its period, everywhere a cell is read as a date. A month key was also read as UTC midnight before, so "2026-01" fell into the previous year under a period filter in US zones; fixed by the same change.

1.3

1.3.0 to 1.3.1

Which reports does anyone still use

  • Opens are counted. Each time a report page is opened (a NetSuite dashboard portlet over it counts too), and each time a dashboard is opened, the record keeps the day in a 90-day log. The catalogue's cards and table now say Opened 12 times, last 3 days ago, Not opened in 90 days or Never opened; dashboard cards say the same. Counting starts with this release, so a report with no opens may simply predate it: the list below says since when.
  • Not opened in 90 days. A new entry at the foot of the Reports group, for authors, lists the reports nobody opened in the last 90 days, with the day counting began at the top and an Archive button on each row. It asks first when a dashboard widget points at the report, as the catalogue does. After a month or two this is the answer to "what can we retire".

Import and export

  • A report that was written in the account can be updated by a file. Until now an imported report was recognised only by its export key, which a report created in the account does not have until it is first exported, so a file could only duplicate it. A report with no key is now recognised by its exact name, or by the name the file says it used to have (renamedFrom), and takes the file's key from then on. That is how a report built in the account can be renamed and refiled by an import without leaving a copy behind.

Catalogue

  • 1.3.1Archived and Not opened are filters, not pages. The sidebar entries added in 1.2.0 and 1.3.0 are gone. A Show control beside Cards and Table on All Reports (and on each category) switches between All, Not opened in 90 days and Archived, with a count on each; the search box and the category scope apply to whichever is shown, and Select, Archive and Restore work in place. The Dashboards page has the same control with All and Archived. The choice is in the address, so a category click keeps it.

1.2

1.2.0 to 1.2.1

Archive

  • Reports and dashboards can be archived, and brought back. Until now the only way to retire a report was Delete, which is permanent and takes the report's portlets with it. Archive sits beside Delete in the catalogue's selection mode and on the Dashboards page. An archived report disappears from every list in the app, from the sidebar counts, from Import/Export, from the drill-through and portlet pickers, and it stops refreshing; its definition, its last result and its export key all stay on the record. Archived at the foot of the Reports group and of the Dashboards group lists what has been put away, newest first, each with Restore, which puts it back exactly as it was. Both entries are for authors.
  • A report a dashboard uses asks first. Archiving a report that a dashboard widget points at would leave that widget saying the report is not available, so the catalogue looks that up before archiving and names the dashboards; Archive anyway goes ahead. A report nothing uses archives at once, and archiving is reversible, so there is no other confirmation.
  • A report's NetSuite dashboard portlets come down with it and go back up with it. Archiving deletes the report's portlet deployments (the portlet definitions stay), so a NetSuite dashboard does not keep framing a report nobody can open; Restore recreates them with the report's audience, as saving an audience does.
  • Under the hood it is the record's Inactive box, so ticking Inactive on the record itself in NetSuite has the same effect, and the archive is visible there too.

Widgets

  • 1.2.1Charts and stat tiles show numbers the way the grid does. A chart's hover card, its value axis and a stat tile used to show the raw number: 0.5834413793103448 for an on-time rate the grid shows as 58.34%, and 1234567.891 for money. A widget's figure now takes the format of the column it totals or averages: money as money, a percent column as a percentage, everything else to two decimals, and the value axis in short form (1.4M, 60%). A count stays a whole number. Comparisons and targets on a stat tile follow the same format.
  • 1.2.1A widget's title keeps its words. On a dashboard the report's name sits beside the widget title in the title bar; on a narrow tile it used to squeeze the title down to "L…". The report name now gives way first.

1.1

1.1.0 to 1.1.1

Summary and detail

  • Drill-through from one report to another. A column of a report can now open another report, narrowed to the row that was clicked. A summary such as Spend by Vendor by Month links its amount to the purchase order lines behind it: click the figure for ACME in August and the detail opens showing ACME, August, and nothing else. In the wizard's Columns step, choose Another report (drill-through) where a record type is chosen today, pick the report to open, and list the values to carry across: which column of the detail is narrowed by which column of this row. Columns the two reports share by name are filled in for you.
  • A carried value fits the column it lands on. The same "2026-08" becomes a month pick on a month column and the whole of August on a date column; a year becomes that year; a name becomes a dropdown pick or an exact text match; an empty cell opens the rows where that column is empty. A value the detail has no column for is simply left out.
  • The slice replaces the detail's own starting filters. A detail report that normally opens on "this year" would otherwise hide a row from last year behind a filter the viewer never chose. A bar above the report says what it is showing (Vendor: ACME, Month: 2026-08), and Show everything returns the report to its normal view. Back returns to the summary.
  • A link is only drawn when it can be followed. The server offers the link only to a viewer who may open the detail report; for anyone else the figure is plain text, not a door onto a refusal. The link names its target by the report's export key, not its number, so it survives Import/Export between accounts as it is; a report written in the account gets a key the first time it is offered as a target.
  • 1.1.1A drill-through can carry a fixed value. Until now a link could only hand the detail the values of the row that was clicked. That falls short when a figure stands for a subset the row has no column for: the number of open opportunities, the billed side of freight, the income line of a profit and loss. The detail opened on everything behind the row, and the viewer had to narrow it by hand to find the number they had clicked. A line of the link can now be A fixed value instead of one of this row's columns: Outcome is Open, Side is Billed, Account Type is Income. The clicked figure then equals the total of the rows that open. Writing the first set of summary and detail reports for a customer ran into this in four report families out of nine, which is why it follows 1.1.0 so closely.

Fixes

  • A date written as 2026-09-14 no longer shows as the 13th. A query that produces its own ISO day (TO_CHAR) was read as midnight UTC, which is the evening before in every US time zone: the cell rendered a day early and fell out of a filter on its own date. NetSuite's native dates were never affected. Dates are now read as the local day everywhere: the grid, the column filters and the widgets' periods.
  • Header filters follow a reset. When a report's starting filters change while it is open, the header controls used to put the previous values straight back on top of the new ones. They now start from the new filters.

1.0

1.0.0 to 1.0.2

A brand-new account

  • Accounts without OneWorld, or without Departments, now work. On the first install in an account that is not OneWorld, every page failed with "Could not load the catalogue: An unexpected SuiteScript error has occurred", the Dashboards page failed the same way, and a new report could not be saved. The cause: a report's and a dashboard's audience can name subsidiaries and departments, and NetSuite leaves those two fields out of the install, without saying so, in an account that has no subsidiaries or no Departments feature. Every query that read the missing field then failed. The app now asks the account which of the two it has and works without the ones it lacks, for reading, for saving, and for the audience of a dashboard portlet. If OneWorld or Departments is switched on later, the app keeps working straight away, and the matching audience list appears after the next update of the app is installed.
  • Only the audiences the account has are offered. The audience lists in the report wizard, in the catalogue and in a dashboard's settings no longer show Subsidiaries in an account that is not OneWorld, or Departments where that feature is off. Roles and Employees are always there.
  • The Reports group is always in the sidebar. It used to disappear while the catalogue was loading, when it failed to load, and when there were no reports at all, which on a new install left Dashboards as the only navigation and no way back to the reports. All Reports is now always there.
  • An empty catalogue says what to do next. With no reports yet, an author sees a short explanation, a Create the first report button and a link to the guide, as well as New Report in the top bar. A viewer sees that nothing has been shared with them yet and who to ask.
  • 1.0.1Saving a new report or dashboard checks the account first. 1.0.0 worked out which audience fields an account has (Subsidiaries needs OneWorld, Departments needs its feature) the first time it read a report, but creating one is a save with no read before it, so that save relied on NetSuite's feature switch alone. A save that names a department or subsidiary audience now confirms the field exists before writing it, once per request, and leaves out the one the account does not have. Nothing changes on screen; it closes the last path by which a missing field could stop a save. A full review of the app found no other place that depends on subsidiaries or departments: those four audience fields are the only ones tied to a feature, link columns to a Subsidiary or Department record already fall back to plain text, and the pick lists already come back empty rather than failing.

Version

  • 1.0.0. The first release installed from scratch in an account other than the ones it was built in. From here a fix raises the third number, a feature the second.

Refreshing

  • 1.0.2Two refreshes of the same report no longer trip over each other. Reports refresh on a schedule that ticks every 15 minutes, and the Refresh button starts a run of its own. When the two landed on the same report at the same time, both ran it: the first to finish stored the result, and the second, finding the run already finished, marked the report Failed with "No run plan on the record to assemble the chunks with", although the result underneath was complete and correct. It showed up right after an import, when every new report is waiting for its first run and the person importing also clicks Refresh. Now a run claims the report before it starts, a second run that finds the report claimed leaves it alone, and a run only ever marks a report it claimed itself, so it can no longer fail, or remove the files of, a run that is not its own. A report whose run was cut short (the account restarted mid-run) is picked up again after an hour, as before. A report already showing this message is cleared by its next run: click Refresh once, or wait for its schedule.

0.7

Widgets

  • Comparison trend. A new chart that lays two periods of one measure over each other on a single time axis and a single value axis: the period being reported as a solid line, the period it is compared with as a dashed grey line behind it, lined up by position, so the third month sits over the third month. Choose the date column, the value to total, the period (this month, this quarter, this year, last 30 days and the rest, or custom dates), what to compare it with (the period right before, the same period a year earlier, or custom dates) and the points (day, week, month, quarter, or automatic). Months still to come are left as a gap rather than drawn as zero. The legend names both periods with their totals and the change; while the current period is still running, both totals cover only the elapsed part, so a year to date is never measured against a whole prior year. Hovering a point shows both values and the change between them. It works in report layouts, dashboards and NetSuite portlets, follows the table's filters and a dashboard's filter bar like every other widget, and takes the same extra filter as the other charts. It follows the trend charts on the Demand Planning forecast page: solid against dashed, one axis, gaps not zeros.

0.6

0.6.0 to 0.6.1

Dashboards

  • Categories for dashboards. Every category now says what it is for: Reports, Dashboards or both, two tick boxes under Configuration, Categories. A category created before the boxes existed counts as a report category. The report wizard offers only report categories; a dashboard's settings and the New Dashboard form offer only dashboard categories. The sidebar's Dashboards group lists one entry per category, with counts, plus Uncategorized.
  • A list built for choosing. The Dashboards page shows each dashboard's description under its name, as cards or a table (the choice is remembered per user), with its category, owner and widget count, so a viewer can pick the right one. New Dashboard asks for a name, a description and a category. The description is also edited under Settings.
  • Audience from the list, and selection. An author sees each dashboard's audience as a chip and changes it in place. Select in the header turns on selection mode (click, Ctrl+click, Shift+click for a range) with Set Audience and Delete for the selection, the same tools the report catalogue has.

Import and export

  • Dashboards travel. The Export tab lists dashboards under the reports. A picked dashboard travels with the reports it uses unless "Include the reports each dashboard uses" is switched off, for a target account that already holds them. Each dashboard carries a stable export key, like a report, so a later import updates it rather than duplicating it; "Add as a new copy" copies it.
  • An import checks a dashboard's reports first. Every report a dashboard's widgets read must be either in the file or already in the account (matched by export key). If one is in neither, the preview refuses the whole file and names the dashboard and the missing report, before anything is written. A dashboard imported into a category that does not exist gets it created, marked for dashboards.

Navigation

  • 0.6.1The Reports and Dashboards groups fold away. Each heading in the sidebar is now a button with a chevron: click it to hide that group's categories, click again to show them. A folded group shows how many entries it holds, and the choice is remembered per user, so a long list of report categories no longer pushes Dashboards off the screen.

Configuration

  • 0.6.1The Used for boxes save as they are ticked. Ticking Reports or Dashboards on a category saves straight away and says Saved beside the boxes; the row's Save button is only for the name, icon and description. A half-typed rename in the same row is not committed by ticking a box. Unticking both puts Reports back, since a category for nothing is not a state the app uses.

0.5

Dashboards

  • Pages of widgets from several reports. A new Dashboards entry in the sidebar lists the dashboards you can open. An author creates one, then adds tables, charts, stat tiles and notes, each over any report they can open, on the same drag-and-drop grid a report layout uses. A dashboard may hold several tables. Each widget shows its report's cached result and refreshes with it; a widget over a report you cannot open shows a notice instead of data.
  • Shared filters across widgets. A dashboard has its own filter bar. Each filter is one control (text, dropdown, number, date, month or yes/no) that the author routes to a chosen column of each widget, so two reports that name the same field differently can still be filtered together. A filter can carry a starting value the dashboard opens with, and viewers can change or clear it.
  • Dashboard audience. Settings on a dashboard set its name, description and audience: Public, or roles, employees, departments and subsidiaries, the same model a report has. Every widget still follows its own report's audience on top of that.
  • Open report from a widget. Each dashboard widget's title bar names its report as a link to the report page, the same Open report a NetSuite portlet has.
  • A warning when a filter's targets disagree. The filters editor says so when a filter is routed to columns that look like different fields (Brand on one widget, Vendor on another), or to a column whose type the filter cannot read (a month filter on a text column). Two columns that link to the same record type are trusted whatever they are called. It is a question, not a refusal: the columns come from each report's SQL, so the author decides.
  • Fixes. A widget added to a dashboard before its first save showed "not available to you" until the dashboard was saved; its report is now fetched straight away. The filter bar's dropdown and month pickers opened underneath the first row of widgets.

Filters

  • Month columns. A column grouped by month ("2026-03") can be given the new month format in the Columns step. Its filter then offers Pick months (a checklist of the months present, grouped by year, with a tick per whole year), Whole year, Month range, relative ranges (this year, last quarter, last 12 months and the rest), From month and Up to month, instead of a text box. The Filters step offers the same operators for a starting filter, and the widget panel's period filter accepts a month column.
  • Dropdowns for long lists. A dropdown column with thousands of distinct values, a vendor or customer column, is still a dropdown: the picker shows the ticked values and the first three hundred matches, and the search box reaches the rest. The text fallback now applies only past twenty thousand values.
  • Table filters narrow the other widgets. On a report page, the filters set in the table's header also narrow every chart and stat tile over the same report, so the widgets around a table follow what the viewer filtered it to.

Layout editor

  • A new widget lands at the top. Adding a widget places it at the top-left of the grid and moves everything else down, where the author is looking, instead of under the last row of a table that may be a screen away.
  • No gap under a short table. A table sized for a hundred rows but showing twenty-two no longer leaves the widgets under it a screen away: they move up to sit under the rows actually shown, and move down again when the table grows.
  • A widget list for selecting. Edit mode lists every widget on the page in the side panel; clicking one selects it and scrolls it into view, and the selected widget paints above any widget it overlaps, so one that is hidden under another can still be reached and moved.

Widgets

  • Stat tiles say which periods they compare. The primary number is captioned with the period it covers, such as This year (Jan 1 to Sep 16, 2026), and the comparison line names its period, such as Last year (Jan 1 to Dec 31, 2025), so "1,004 vs 1,335" reads without opening the widget panel.
  • Chart legends wrap. A pie or donut legend with long category names wraps onto several lines inside the widget instead of running past its edge.

Fixes

  • Dashboard portlets for everyone the report is visible to. A dashboard portlet showed the chooser instead of its pinned widget to anyone but the administrator who built it: the portlet script looked up the definition record as the viewing user, most roles cannot read that record type, and the failed lookup fell back to the chooser. The pinned widget is now read from the deployment parameter every role can see. Refreshing a deployment's audience after a report is made public now writes through a full record save, since not every audience field accepts a partial update.

0.4

0.4.0 to 0.4.1

Filters step

  • Operators per column type. Each column shows its type, and the Filter column is now a list of operators suited to it. Text: Contains, Does not contain, Is, Is not, Starts with, Ends with, Is any of, Is none of, Is empty, Is not empty. Numbers: Between, Equals, Does not equal, Greater than, At least, Less than, At most, Is empty, Is not empty. Dates: Date range, Relative, On or after, On or before, Is empty, Is not empty. Dropdown columns: Is any of, Is none of, Is empty, Is not empty. Yes / No columns: Is Yes, Is No.
  • The Default cell shows only what the operator needs. Two dates for a range, the relative range list for Relative, one date for On or after.
  • Several values, with OR and AND spelled out. Text operators take one box per value, with "+ Add value", and a switch between "Any of these (OR)" and "All of these (AND)". Each box after the first is labelled OR or AND, and a sentence under the filter says in words what it does.
  • Pick values from the results. Is any of and Is none of show a checklist of the values actually present in the report's stored result, with how many rows carry each, a search box, and Reload values for after the report was refreshed. A value can also be added by hand, and a chosen value that has since disappeared from the results stays listed and marked.

Grid filters

  • The same operators in the report view. Number columns have an operator picker, date columns add On or after, On or before, Is empty and Is not empty, dropdown columns can hide the ticked values instead of showing them, and Yes / No columns have their own All / Yes / No filter. Every default set in the wizard can be seen and changed from the grid.
  • Text filters take a short syntax. a | b keeps either, a & b needs both, !a excludes, =a is exact, a* starts with, *a ends with, and = alone is empty. Hover over the box to see it. A text default from the wizard appears written in this syntax.

Editing

  • One Save when editing. The Save at the top right saves from any step, and step 5 no longer has a second Save Changes button. Creating a new report still finishes with Create Report on step 5.

Fixes

  • Export dropped default filters. A report's default filters now travel in an export and come back on import.

Filters

  • 0.4.1Help beside a text filter while you type. In the report grid, a small panel to the right of a text filter lists the syntax (a | b, a & b, !a, =a, a*, *a and the rest) while the box has focus. In the Filters step, the panel beside a value box says what the operator does, how several values combine, how the filter will read in the report's filter box, and what viewers can type there. The panel stays on the right, narrowing if space is tight, and closes on Escape or when you leave the box.

0.3

0.3.0 to 0.3.6

Refresh

  • No row limit. A refresh now reads the whole result, however large. Rows stream straight into files of about 9 MB each, and a run that needs more governance than one execution allows saves its progress on the report record and continues in the next execution, with the previous result still readable until the new one is complete. The row cap and total byte cap in Configuration are now optional safety valves, off by default.
  • Result files are listed on the report record. The new Result Files field holds a manifest of every file the result occupies, its row count and size, plus the run facts and the partial-refresh watermark. The Result File field keeps pointing at the first file. Files are named per run, so a new run never overwrites the one being read; the old files are removed once the new run is complete.
  • Partial refresh merges file by file. The changed rows are matched into each stored file in turn and the additions appended, so a partial refresh no longer needs the whole result in memory. A delta too large for one execution falls back to a full run, which can continue across executions.
  • 0.3.1Every stage does its part. The map stage now counts the query's rows, writes the run's plan on the record and hands out one reduce key per 25,000 rows. Each reduce key reads only its rows and writes its own files, so chunks are independent and can run side by side up to the deployment's concurrency limit. Summarize stitches the chunks into the manifest and stamps the record. There is no row limit and no run ever needs a second execution.
  • 0.3.1The read form is remembered. Which way a statement can be paged (ROWNUM window, OFFSET/FETCH, or NetSuite's paged API) is probed once with a one-row query and stored with the result, so later runs do not try a form that will be refused. The probe no longer writes an error entry to the execution log when a form is refused.
  • 0.3.1A run that died is cleaned up. Files written by a run that never finished are removed at the next run, and a failed run's files are removed by the failure itself, so only the readable result stays on disk.

Viewing

  • Reports open part by part. The browser fetches the result one file at a time and shows how far it has got. Dashboard portlets load the same way.
  • Default filters. A new Filters step in the wizard, between Columns and Details, sets the filters a report opens with: contains text, a number range, a date range, or a list of values for a dropdown column. They run in the browser after the query, and viewers can change or clear them.
  • 0.3.3A proper loading state. A report loads behind a progress bar with the percentage, rows received and file count, instead of a line of text.
  • 0.3.3Shorter row-cap notice. A result cut by the optional row cap now says "Limited to the first N rows by the configured row cap."

Housekeeping

  • Deleting a report now deletes its result files.
  • A stored row cap left over from before (the seeded 50,000, or a 250,000 set when that was the documented maximum) is retired automatically on the next refresh, so no account keeps a cap nobody chose. A different value is kept.
  • 0.3.3Result file names are zero-padded (c0001.p01, part001) so the File Cabinet lists them in row order.

Filters

  • 0.3.1Relative date ranges. The grid's date filters and the wizard's Filters step both offer This month, Last 30 days, This quarter, Year to date and the rest. A relative range stored as a default is worked out each time the report opens; choosing one in the grid fills the dates, and typing a date makes it a fixed range again.

Fixes

  • 0.3.2A large result was read as the first 5,000 rows over and over. NetSuite silently ignores OFFSET/FETCH on some statements and returns the first rows for every offset, so a 26,272-row report was stored as 250,000 duplicated rows. The refresh now proves a read form seeks before using it (rows at offset 0 and offset 1 must line up and differ), falls back to NetSuite's paged read when no window form seeks, and stops a read that returns the same window twice instead of looping until its governance runs out. A statement read through the paged API is read in one piece, since two paged reads of an unordered statement are not guaranteed the same order.
  • 0.3.2Scheduled refreshes ran hours late. The due check compared the Last Run date, stored in the running user's time zone, with the server clock, so an hourly report refreshed about every four hours. It now compares the epoch stamp the refresh writes, which has no time zone.
  • 0.3.4Run duration counted the whole queue. A report's duration was measured from its plan to the end of the job, so with fifty reports in one run each one showed the queue's total. It is now the report's own read-and-write time.
  • 0.3.5Default filters did not save on reports whose column names have spaces. A column named with a quoted alias, such as "Transaction Date", carries a space in its key, and the save kept only keys made of letters, digits and underscores. Every default filter on such a report was dropped without a message. Any column key is accepted now.
  • 0.3.5Saved changes did not show until the page was reloaded. After Save, the edit wizard, the report view and any dashboard portlet kept what they had loaded before. They now refetch the report, so default filters and column changes appear straight away. The grid also picks up new default filters without a reload.
  • 0.3.5Partial refresh fell back to a full refresh on the same reports. A unique identifier or last-modified column with a space in its name was treated as missing. It is accepted now, and the refresh writes it back into the query exactly as the query spells it.

Editing

  • 0.3.6Cancel in the report editor. Editing a report now has a Cancel button beside Save that returns to the report view without saving. It asks first only when something was changed.
  • 0.3.6Cancel in the layout editor asks before discarding. Cancel beside Save layout still returns to the report view, and now asks first when the layout was changed.

0.2

0.2.0 to 0.2.3

In the app

  • What's new page. These notes are bundled with every build and shown under Help, so a user can see what changed without leaving NetSuite. The running version is expanded, older ones are collapsed.
  • Version badge. The sidebar shows the running version under Manage. It is highlighted until What's new has been opened on that version, so an upgrade is noticed.
  • Help reorganised into tabs. Using reports, Building reports, Dashboards and Administration, each covering what shipped since the first release: partial refresh, the audience pickers, record types, dashboard portlets, the catalogue selection tools and the table changes.

Navigation

  • 0.2.1Back to NetSuite. A link at the foot of the sidebar, above Manage, returns to the NetSuite home dashboard. It also works from inside a dashboard portlet.

Fixes

  • 0.2.1A large report failed on refresh with "Invalid or unsupported search" while reading rows past 0. Results beyond 5,000 rows are read in windows, and the first window form is refused when a quoted column alias contains punctuation, such as "Margin %" or "Memo/Description". The refresh now tries a second window form that runs the statement as written, then NetSuite's paged read, and only reports an error when none of them returns rows. The log records which form was used.
  • 0.2.2The Back to NetSuite link was laid out wrong. Its arrow icon took the label's space and pushed the text to the edge. Icons in the sidebar keep their own width now.

Editing

  • 0.2.2View in NetSuite. The edit wizard's header has a button that opens the report's own NetSuite record in a new tab.
  • 0.2.2Result file on the Details step. The Details step lists the stored result file, its size, a link to its File Cabinet record (view, replace or delete) and a direct download. A result split across several files lists each part.

Refresh

  • 0.2.2Large results no longer fail on size. A result larger than one File Cabinet file can hold (limits.max_bytes, 9 MB by default) is now split by rows across part files and read back as one result. The refresh only refuses a result over the new total cap, limits.max_total_bytes (60 MB by default), which an administrator can change in Configuration.

Configuration

  • 0.2.3Limits show their allowed range. Every numeric setting in Configuration states its allowed range under the field, and the field refuses a value outside it before Save. The server refuses one too, and a stored value outside the range is clamped when read. The row cap allows up to 250,000 rows, the per-file byte cap up to 10,000,000 bytes (NetSuite's limit for one file), and the total byte cap up to 100,000,000 bytes. Each setting's note says where its ceiling comes from.

0.1

0.1.0 to 0.1.12

First release: stored SuiteQL reports refreshed on a schedule, the authoring wizard, the catalogue as cards or a table, widget layouts with charts, stat tiles and totals, categories, configuration, and export and import between accounts.

Fixes

  • 0.1.1A long query could not be saved. The SQL, column, layout and parameter fields were capped at 4,000 characters; they now hold up to a million.
  • 0.1.5Some reports failed on refresh with "Invalid or unsupported search", or refreshed to zero rows, although they previewed fine. The refresh used NetSuite's paged query, which rewrites a statement before running it and rejects or empties some queries the ordinary query accepts. The refresh now runs the ordinary query first and only pages past 5,000 rows.
  • 0.1.5Rows showed above the table header when scrolling the catalogue. The header pins flush to the top now.
  • 0.1.11A report failed with "Only a single statement is allowed" although its query was valid. The stored SQL had been HTML-escaped by the field type change in 0.1.1, so ">" was stored as ">" and the entity's semicolon was read as a second statement. Stored SQL is now decoded before it is checked or run, and shows clean in the wizard.

Authoring

  • 0.1.2Audience pickers. Roles, employees, departments and subsidiaries are searchable lists with removable chips. Internal ids no longer have to be looked up and typed.
  • 0.1.2Link record types are a dropdown, fed by a Record Types tab under Manage, where a custom record can be given its own URL template so its links resolve.
  • 0.1.2New category from the wizard, for admins, without leaving the Details step.
  • 0.1.2Edit Layout and Edit Report switch between the two editors with one click each way.
  • 0.1.2Dragging a widget while scrolling. A widget being dragged now follows the pointer when the mouse wheel scrolls the page; it used to stay behind.

Catalogue

  • 0.1.2Uncategorized appears in the sidebar when any report has no category, so those reports are reachable.
  • 0.1.2The icon picker in Categories no longer squeezes into its table cell.
  • 0.1.12Audience shown and edited in place. Every card and table row shows who can see the report (Public, or counts of roles, employees, departments and subsidiaries). Clicking it opens an editor, so an audience can be changed without opening the wizard.
  • 0.1.12Select several reports. A Select button turns on selection mode: click or Ctrl+click toggles, Shift+click selects a range, and a header checkbox selects every report you may edit. A bar above the list refreshes them all, sets one audience on all of them, or deletes them (with a confirmation that Shift+click skips). Reports you cannot edit are greyed out. This exists so a large batch of newly imported reports can be published in one go.
  • 0.1.12Deleting a report removes its dashboard portlets too. They used to be left behind, pointing at a report that no longer existed.

Wording

  • 0.1.2Em-dashes removed throughout the app.

Refresh

  • 0.1.3Partial refresh. For a large report where little changes between runs, the refresh can fetch only rows added or changed since the last run and merge them into the existing result. Set it on the Details step by naming a unique identifier column and a last-modified column. The report page gains a Full Refresh button. Rows deleted at the source are not removed until a full refresh, and the wizard says so.
  • 0.1.3The refresh mode travels with a report through export and import.
  • 0.1.6Traceable runs. A refresh failure used to show only in the app. Every step now writes an audit line titled "AR refresh <id>: <step>", from the definition loaded to the file stored, with row counts and timings, so a failed run can be followed in the execution log.

Navigation

  • 0.1.4A menu tab. "HiScale Advanced Reports" appears in the NetSuite menu bar and opens the app, so it is reachable without a bookmark.

Dashboards

  • 0.1.7Report widgets on NetSuite dashboards. Any widget a layout can show (table, bar, horizontal bar, line, pie, donut, stat tile, text note) can be a dashboard portlet. Define it under Manage, Portlets: pick the report and the widget, and configure it with the same side panel as the layout editor, with a live preview. Top N, sorting and filters are the widget's own settings, so "top 5 customers by invoiced" needs nothing extra.
  • 0.1.8Choose the widget inside the portlet. A portlet added to a dashboard with nothing pinned on it lists every widget the user may see and remembers the choice, so nobody has to edit a script deployment. A Change link switches later.
  • 0.1.8Each portlet remembers its own choice. Two portlets on one dashboard used to share the last choice; each now has its own.
  • 0.1.9One dashboard entry per widget. Saving a portlet definition creates a portlet deployment named "Advanced Report - <name>", so Set Up on a dashboard lists each widget by its own name and it loads at once. Renaming or deleting the definition follows through.
  • 0.1.9Same audience as the report. A portlet deployment is audienced exactly like its report: All Roles when public, otherwise the report's roles, employees, departments and subsidiaries plus the owner. It re-syncs whenever the report's audience changes, so a dashboard can never show a report to someone the report itself would refuse.
  • 0.1.9Portlets travel with their reports in export and import, and their dashboard entries are recreated on import.

Import and export

  • 0.1.9Two tabs, a filter, and ids. Export and Import are separate tabs. The export list filters by name or category, and ids show beside names, including in the overwrite picker, so two reports with the same name can be told apart.

Tables

  • 0.1.10Headers stay put. A table taller than the screen now scrolls inside its box with the header pinned, instead of the whole page scrolling the header away.
  • 0.1.10No blank space under a short page. A table showing 24 rows at 100 per page was as tall as 100 rows. The box is now sized to the rows actually shown.
  • 0.1.10Row numbers, as an option per table widget, for referring to a line in a discussion.
  • 0.1.10A second horizontal scrollbar above wide tables, in step with the one at the bottom, for readers who do not know Shift plus mouse wheel. Both scrollbars are slimmer and rounded.