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(guardrequireFeature: 'pivot-grid'). - Con licenza Developer la route risponde con accesso negato: controlla
featuresinGET /api/Meta/LicenseStatus.
API (MetadataProviderService → MetaService.*)
| Metodo client | Endpoint | Ritorna |
|---|---|---|
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.createPivotView | crea la vista, la scaffolda come route e opzionalmente pianifica il refresh |
Parametri:
rowColumns/columnColumns: alias delle colonne della route (nome friendlymc_nome_colonna).valueColumns+aggregateFunction(SUM|AVG|MIN|MAX|COUNT), oppurevalueDefinitions[]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:
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.
maxRowse' 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).