Overview

Pivot

Pivot Grid (feature di licenza pivot-grid, tier Professional): genera ed esegue query PIVOT lato server a partire da una route metadata, con anteprima nel Pivot Builder e materializzazione in vista. Questa pagina descrive runtime e API; per l'interfaccia vedi View/Pivot builder.

Cosa fa

  • Da una route (md_route_name) scegli le colonne dell'asse righe, le colonne dell'asse colonne (chiave di pivot) e uno o piu' valori aggregati.
  • Il backend emette l'SQL pivot nel dialetto del DBMS della route, applica filtri e ordinamenti della route e restituisce righe con colonne dinamiche.
  • Il risultato puo' essere materializzato come vista e scaffoldato come nuova route (con voce di menu opzionale), cosi' liste, grafici e report la usano come una tabella qualsiasi.

Route e licenza

  • UI: /<route>/pivot-builder (guard requireFeature: 'pivot-grid').
  • Con licenza Developer la route risponde con accesso negato: controlla features in GET /api/Meta/LicenseStatus.

API (MetadataProviderService → MetaService.*)

Metodo clientEndpointRitorna
generatePivotQuery(route, rowColumns, columnColumns, valueColumns, aggregateFunction, valueDefinitions?, filterInfo?, sortInfo?, rowColumnOptions?, columnColumnOptions?, topRows=300)MetaService.generatePivotQuery{ ok, query }: l'SQL pronto, senza eseguirlo
executePivotQuery(route, rowColumns, columnColumns, valueColumns, aggregateFunction, valueDefinitions?, filterInfo?, sortInfo?, maxRows=200, rowColumnOptions?, columnColumnOptions?)MetaService.executePivotQuery{ ok, rows, rowCount } con colonne dinamiche (maxRows massimo 1000)
createPivotView(..., targetSchema='dbo', createMenu=false, viewName?, enableDynamicScheduler=false, schedulerFrequency='', topRows=300, overwriteIfExists=false)MetaService.createPivotViewcrea la vista, la scaffolda come route e opzionalmente pianifica il refresh

Parametri:

  • rowColumns / columnColumns: alias delle colonne della route (nome friendly mc_nome_colonna).
  • valueColumns + aggregateFunction (SUM | AVG | MIN | MAX | COUNT), oppure valueDefinitions[] con { alias, aggregateFunction, caption } per un aggregato diverso per ogni valore.
  • rowColumnOptions / columnColumnOptions: { alias, castDate, groupBy } per trattare una colonna data e raggrupparla per periodo sugli assi.
  • filterInfo / sortInfo: stesso formato dei filtri e degli ordinamenti della list-grid.
  • topRows: limite di righe della query generata (default 300).

Esempio:

Snippet 1ts
const res = await metadataProvider.executePivotQuery(
  'orders',        // route
  ['customer'],    // rowColumns
  ['year'],        // columnColumns
  ['amount'],      // valueColumns
  'SUM',           // aggregateFunction
  undefined,       // valueDefinitions

Materializzazione e refresh

createPivotView crea la vista targetSchema.viewName (default dbo), la registra come route metadata (con createMenu=true aggiunge anche la voce di menu) e con enableDynamicScheduler=true + schedulerFrequency crea un task dello scheduler che la rigenera periodicamente (vedi Scheduling). overwriteIfExists=true sostituisce una vista esistente con lo stesso nome.

Limiti e note

  • Le colonne dinamiche dipendono dai valori presenti nei dati al momento della query: cambiando i dati cambia lo schema della vista, da cui il refresh schedulato.
  • maxRows e' limitato a 1000 in anteprima; per volumi maggiori materializza la vista e leggila con la list-grid paginata.
  • Una chiave JSON sbagliata nel payload non ritorna 400: il backend usa i default (vedi Troubleshooting).