DEFQUERYCTE
Permette di inizializzare una query di tipo CTE per la sua successiva definizione.
Deve essere collegata alla query principale definita in precedenza tramite la specifica @DEFQUERY.
Parametri
| Parametro | Definizione | I/O | Versione traduttore | SMP | |
|---|---|---|---|---|---|
| IDQUERY | Long | ||||
| IDQUERYPADRE | Long | ||||
| QUERY | Classe BCQUERY | 31.3 | |||
| QUERYPADRE | Classe BCQUERY | 31.3 | |||
| ELIMINADUPLICATI | Intero | ||||
| MAXRECORD | Long | ||||
| MULTIGRUPPO | Intero | ||||
| MULTISTAZIONE | Intero | ||||
| MULTIDOMINIO | Intero | ||||
| VINCOLI | Intero | ||||
| ALIAS | Stringa | ||||
| PARTE | Enumerazione | ||||
| NOLOCK | Intero | 31.2 | |||
| ERRORE | Intero |
IDQUERY
Identificatore della query restituito dalla specifica DEFQUERY
IDQUERYPADRE
Indica l'identificatore della query esterna che contiene la subquery (o sottoquery), da usarsi nel richiamo delle successive specifiche di definizione della subquery.
QUERY
Identificatore della query, da usarsi nel richiamo delle successive specifiche di definizione o di esecuzione della query.
QUERYPADRE
Identificatore della query esterna che contiene questa query
ELIMINADUPLICATI
Indica se eliminare dal risultato della query le eventuali righe duplicate (con stessi valori su tutte le colonne). Corrisponde all'applicazione della clausola DISTINCT al comando SQL della query
Parametro con valori ammessi, si possono utilizzare i seguenti valori:
| Valore | Descrizione |
|---|---|
0 | No |
1 | Si |
MAXRECORD
Definisce il numero di record da leggere dall'insieme dei record restituiti dalla query. Corrisponde all'applicazione della clausola TOP 'MaxRecord'. Se non indicato verranno letti tutti i record
MULTIGRUPPO
Indica se applicare o meno il filtro automatico sul campo GR (DBGruppo) sulle tabelle di gruppo nella query
Parametro con valori ammessi, si possono utilizzare i seguenti valori:
| Valore | Descrizione |
|---|---|
0 | Viene applicato il filtro sul campo gruppo per le tabelle che lo prevedono |
1 | NON viene applicato il filtro sul campo gruppo per le tabelle che lo prevedono (Legge tutto) |
MULTISTAZIONE
Indica se applicare o meno il filtro automatico sul campo WS (DBStazione) sulle tabelle di stazione nella query
Parametro con valori ammessi, si possono utilizzare i seguenti valori:
| Valore | Descrizione |
|---|---|
0 | La query inserisce il filtro sul campo stazione per le tabelle che lo prevedono |
1 | La query NON inserisce il filtro sul campo stazione per le tabelle che lo prevedono |
MULTIDOMINIO
Indica la possibilità di accedere ai record di una tabella relativi a più domini
Parametro con valori ammessi, si possono utilizzare i seguenti valori:
| Valore | Descrizione |
|---|---|
0 | La query NON gestisce la possibilità di accedere ai record di una tabella relativi a più domini |
1 | La query gestisce la possibilità di accedere ai record di una tabella relativi a più domini |
VINCOLI
Permette di abilitare la gestione della profilazione se la tabella è soggetta a un vincolo di tipo elenco, inserendo in modo automatico delle clausole SQL da parte dell'ambiente, per filtrare gli elementi della tabella
Parametro con valori ammessi, si possono utilizzare i seguenti valori:
| Valore | Descrizione |
|---|---|
0 | No |
1 | Si |
ALIAS
E' il nome che identifica la CTE nella query.
PARTE
Parametro enumerato, può assumere i seguenti valori:
| Valore | Descrizione |
|---|---|
FISSA | |
RICORSIVA |
NOLOCK
Corrisponde all'applicazione della clausola WITH (NOLOCK) su tutte le tabelle SQL presenti nella query.
Parametro con valori ammessi, si possono utilizzare i seguenti valori:
| Valore | Descrizione |
|---|---|
0 | Esegue la lettura dei record usando il criterio di isolamento definito sulla transazione. Per valore predefinito la transazione è READ COMMITTED |
1 | Usa un livello di isolamento READ UNCOMMITED, ovvero non applica alcun lock per la lettura dei record |
ERRORE
Consente al programma di intercettare e gestire l'errore restituito dalla funzione.
Utilizzare uno dei metodi GetLastError*() della classe BCContextInfo per ottenere le informazioni dell'errore.
Esempi
Definizione
DIM idQueryPrincipale[INT]
DIM idQueryCTE1[INT]
DIM idQueryCTE2[INT]
'@DEFQUERY IDQUERY[idQueryPrincipale] NOME["TEST_DEFQUERYCTE_5"]
'@DEFQUERYCTE IDQUERY[idQueryCTE1] ALIAS["Articoli"] IDQUERYPADRE[idQueryPrincipale]
'@DEFQUERYCTE IDQUERY[idQueryCTE2] ALIAS["Varianti"] IDQUERYPADRE[idQueryCTE2]
'@DEFQUERYFROM IDQUERY[idQueryCTE2] TABELLA[BLDVAR]
'@DEFQUERYCOLUMN IDQUERY[idQueryCTE2] ESPR[BLDVAR.DES AS [DesVarianteV]] _
ESPR[BLDVAR.CODART AS [CodArtV]] _
ESPR[BLDVAR.COSTO AS [CodCostoSTDV]]
'@DEFQUERYFROM IDQUERY[idQueryCTE1] TABELLA[BLDART]
'@DEFQUERYJOIN IDQUERY[idQueryCTE1] TABELLA[[Varianti]] TABELLAPADRE[BLDART] _
REL[[Varianti].CodArtV = BLDART.COD] _
OPERATOREJOIN["INNER"]
'@DEFQUERYCOLUMN IDQUERY[idQueryCTE2] ESPR[BLDART.COD AS [CodArt]] _
ESPR[BLDART.DES AS [DesArtA]] _
ESPR[BLDART.PREZZO AS [PrezzoA]] _
ESPR[[Varianti].DesVarianteV AS [DesVarianteA]] _
ESPR[[Varianti].CodCostoSTDV AS [CodCostoSTDA]]
'@DEFQUERYFROM IDQUERY[idQueryPrincipale] TABELLA[[Articoli]]
'@DEFQUERYCOLUMN IDQUERY[idQueryPrincipale] ESPR[[Articoli].DesArtA AS [DesArticolo]] _
ESPR[[Articoli].PrezzoA AS [Prezzo]] _
ESPR[[Articoli].DesVarianteA AS [DesVariante]] _
ESPR[[Articoli].CodCostoSTDA AS [CostoVariante]]
' Statement SQL generato
'
' WITH Varianti (DesVarianteV, CodArtV, CodCostoSTDV)
' AS
' (SELECT
' BLDVarianti.DesVariante AS [DesVarianteV]
' ,BLDVarianti.CodArt AS [CodArtV]
' ,BLDVarianti.CodCostoSTD AS [CodCostoSTDV]
' FROM BLDVarianti AS [BLDVarianti]
' WHERE (BLDVarianti.DBGruppo = 'GG')),
' Articoli (CodArt, DesArtA, PrezzoA, DesVarianteA, CodCostoSTDA)
' AS
' (SELECT
' BLDArticoli.CodArt AS [CodArt]
' ,BLDArticoli.DesArt AS [DesArtA]
' ,BLDArticoli.Prezzo AS [PrezzoA]
' ,Varianti.DesVarianteV AS [DesVarianteA]
' ,Varianti.CodCostoSTDV AS [CodCostoSTDA]
' FROM BLDArticoli AS [BLDArticoli]
' INNER JOIN Varianti AS [Varianti]
' ON (Varianti.CodArtV = BLDArticoli.CodArt)
' WHERE (BLDArticoli.DBGruppo = 'GG'))
' SELECT
' DesArtA AS [DesArticolo]
' ,PrezzoA AS [Prezzo]
' ,DesVarianteA AS [DesVariante]
' ,CodCostoSTDA AS [CostoVariante]
' FROM Articoli AS [Articoli]
'
' Risultato della query
'
' DesArticolo Prezzo DesVariante CostoVariante
' ------------------------- --------- --------------------------- ----------------
' Articolo 001 120.00 Variante 001 25.000000
' Articolo 001 120.00 Variante 002 23.000000
' Articolo 001 120.00 Variante 003 22.000000
' Articolo 005 2.50 Variante 01 23.670000
' Articolo 018 134.00 Variante 001 0.000000
' Articolo 018 134.00 Variante 002 0.000000
' Articolo 018 134.00 Variante 003 0.000000
' Articolo con matricole 10.00 Articolo di colore Blu 2.000000
' Articolo con matricole 10.00 Articolo di colore Rosso 3.000000
Definizione ricorsiva
DIM idQueryPrincipale[INT]
DIM idQueryCTE1[INT]
DIM idQueryCTE2[INT]
'@DEFQUERY IDQUERY[idQueryPrincipale] NOME["TEST_DEFQUERYCTE_5"]
'@DEFQUERYCTE IDQUERY[idQueryCTE1] ALIAS["Report"] IDQUERYPADRE[idQueryPrincipale] PARTE[#RICORSIVA]
'@DEFQUERYCTE IDQUERY[idQueryCTE2] ALIAS["Report"] IDQUERYPADRE[idQueryCTE2] PARTE[#FISSA]
'@DEFQUERYFROM IDQUERY[idQueryCTE2] TABELLA[BLDIMPIEGATI]
'@DEFQUERYCOMPUTEDCOLUMN IDQUERY[idQueryCTE2] ESPR[FNTRSD$(BLDIMPIEGATI.Nome) + " " + FNTRSD$(BLDIMPIEGATI.Cognome) AS [DesImpiegato] FMT[TESTO[255]]]
'@DEFQUERYCOLUMN IDQUERY[idQueryCTE2] ESPR[BLDIMPIEGATI.IDImpiegato AS [IDImpiegato]]
'@DEFQUERYCOMPUTEDCOLUMN IDQUERY[idQueryCTE2] ESPR[DECODDES$(BLDIMPIEGATI.Posizione) AS [Posizione] FMT[TESTO[255]]] _
'@DEFQUERYCOMPUTEDCOLUMN IDQUERY[idQueryCTE2] ESPR[1 AS [Livello] FMT[NUMERICO[2]]]
'@DEFQUERYCOMPUTEDCOLUMN IDQUERY[idQueryCTE2] ESPR[FNTRSD$(BLDIMPIEGATI.Nome) + " " + FNTRSD$(BLDIMPIEGATI.Cognome) AS [Sort] FMT[TESTO[255]]]
'@DEFQUERYWHERE IDQUERY[idQueryCTE2] ESPR[BLDIMPIEGATI.IDResponsabile = 0]
'@DEFQUERYFROM IDQUERY[idQueryCTE1] TABELLA[BLDIMPIEGATI]
'@DEFQUERYJOIN IDQUERY[idQueryCTE1] TABELLA[[Report]] TABELLAPADRE[BLDIMPIEGATI] _
REL[[Report].IDImpiegato = BLDIMPIEGATI.IDResponsabile] _
OPERATOREJOIN["JOIN"]
'@DEFQUERYCOMPUTEDCOLUMN IDQUERY[idQueryCTE1] ESPR[STRING$([Report].Livello, "| ") + FNTRSD$(BLDIMPIEGATI.Nome) + " " + FNTRSD$(BLDIMPIEGATI.Cognome) AS [DesImpiegato] FMT[TESTO[255]]]
'@DEFQUERYCOLUMN IDQUERY[idQueryCTE1] ESPR[BLDIMPIEGATI.IDImpiegato AS [IDImpiegato]]
'@DEFQUERYCOMPUTEDCOLUMN IDQUERY[idQueryCTE1] ESPR[DECODDES$(BLDIMPIEGATI.Posizione) AS [Posizione] FMT[TESTO[255]]] _
'@DEFQUERYCOMPUTEDCOLUMN IDQUERY[idQueryCTE1] ESPR[[Report].Livello + 1 AS [Livello] FMT[NUMERICO[2]]]
'@DEFQUERYCOMPUTEDCOLUMN IDQUERY[idQueryCTE1] ESPR[FNTR$([Report].Sort) + "| " + FNTRSD$(BLDIMPIEGATI.Nome) + " " + FNTRSD$(BLDIMPIEGATI.Cognome) AS [Sort] FMT[TESTO[255]]]
'@DEFQUERYFROM IDQUERY[idQueryPrincipale] TABELLA[[Report]]
'@DEFQUERYCOLUMN IDQUERY[idQueryPrincipale] ESPR[[Report].IDImpiegato AS [IDImpiegato]] _
ESPR[[Report].DesImpiegato AS [DesImpiegato]] _
ESPR[[Report].Posizione AS [Posizione]] _
ESPR[[Report].Livello AS [Livello]] _
ESPR[[Report].Sort AS [Sort]] NOOUTPUT[1]
'@DEFQUERYORDERBY IDQUERY[idQueryPrincipale] ESPR[[Sort]]
' Statement SQL generato
'
' ;
' WITH Report (DesImpiegato, IDImpiegato, Posizione, Livello, Sort)
' AS
' (SELECT
' CAST(LTRIM(RTRIM(BLDImpiegati.Nome)) + ' ' + LTRIM(RTRIM(BLDImpiegati.Cognome)) AS VARCHAR(255)) AS [DesImpiegato]
' ,BLDImpiegati.IDImpiegato AS [IDImpiegato]
' ,CAST(CASE BLDImpiegati.Posizione
' WHEN 1 THEN 'Amministratore delegato'
' WHEN 2 THEN 'Vicepresidente delle vendite'
' WHEN 3 THEN 'Direttore vendite'
' WHEN 4 THEN 'Rappresentante commerciale'
' WHEN 5 THEN 'Direttore vendite esterno'
' WHEN 6 THEN 'Direttore marketing'
' WHEN 7 THEN 'Specialista marketing'
' END AS VARCHAR(255)) AS [Posizione]
' ,1 AS [Livello]
' ,CAST(LTRIM(RTRIM(BLDImpiegati.Nome)) + ' ' + LTRIM(RTRIM(BLDImpiegati.Cognome)) AS VARCHAR(255)) AS [Sort]
' FROM BLDImpiegati AS [BLDImpiegati]
' WHERE ((BLDImpiegati.IDResponsabile = 0))
' AND (BLDImpiegati.DBGruppo = 'GG')
'
'
'
' UNION ALL
' SELECT
' CAST(REPLICATE('| ', Report_1.Livello) + LTRIM(RTRIM(BLDImpiegati.Nome)) + ' ' + LTRIM(RTRIM(BLDImpiegati.Cognome)) AS VARCHAR(255)) AS [DesImpiegato]
' ,BLDImpiegati.IDImpiegato AS [IDImpiegato]
' ,CAST(CASE BLDImpiegati.Posizione
' WHEN 1 THEN 'Amministratore delegato'
' WHEN 2 THEN 'Vicepresidente delle vendite'
' WHEN 3 THEN 'Direttore vendite'
' WHEN 4 THEN 'Rappresentante commerciale'
' WHEN 5 THEN 'Direttore vendite esterno'
' WHEN 6 THEN 'Direttore marketing'
' WHEN 7 THEN 'Specialista marketing'
' END AS VARCHAR(255)) AS [Posizione]
' ,Report_1.Livello + 1 AS [Livello]
' ,CAST(RTRIM(Report_1.Sort) + '| ' + LTRIM(RTRIM(BLDImpiegati.Nome)) + ' ' + LTRIM(RTRIM(BLDImpiegati.Cognome)) AS VARCHAR(255)) AS [Sort]
' FROM BLDImpiegati AS [BLDImpiegati]
' INNER JOIN Report AS [Report_1]
' ON (Report_1.IDImpiegato = BLDImpiegati.IDResponsabile)
' WHERE (BLDImpiegati.DBGruppo = 'GG'))
' SELECT
' IDImpiegato AS [IDImpiegato]
' ,DesImpiegato AS [DesImpiegato]
' ,Posizione AS [Posizione]
' ,Livello AS [Livello]
' FROM Report AS [Report]
'
'
' ORDER BY Sort ASC
'
' Risultato della query
'
' IDImpiegato DesImpiegato Posizione Livello
' -------------- --------------------------------- ------------------------------- ----------
' 1 Mario Rossi Amministratore delegato 1
' 273 | Paolo Verdi Vicepresidente delle vendite 2
' 16 | | Davide Fucsia Direttore marketing 3
' 23 | | | Maria Rosa Specialista marketing 4
' 274 | | Giovannni Bianchi Direttore vendite 3
' 276 | | | Linda Blu Rappresentante commerciale 4
' 275 | | | Michele Gialli Rappresentante commerciale 4
' 285 | | Sara Viola Direttore vendite esterno 3
' 286 | | | Laura Arancione Rappresentante commerciale 4
Definizione con union tra query
DIM idQueryPrincipale[INT]
DIM idUnionQuery[INT]
DIM idUnionQuery2[INT]
DIM idUnionQuery3[INT]
DIM idQueryCTE1[INT]
DIM idQueryCTE2[INT]
'@DEFQUERY IDQUERY[idQueryPrincipale] NOME["TEST_DEFQUERYCTE_8"]
'@DEFQUERY IDQUERY[idUnionQuery] NOME["TEST_DEFQUERY_9"]
'@DEFQUERYCTE IDQUERY[idQueryCTE1] ALIAS["Impiegati"] IDQUERYPADRE[idUnionQuery]
'@DEFQUERYFROM IDQUERY[idQueryCTE1] TABELLA[BLDIMPIEGATI]
'@DEFQUERYCOLUMN IDQUERY[idQueryCTE1] ESPR[GROUPBY(BLDIMPIEGATI.IDUfficio) AS [IdUfficio]] _
ESPR[COUNT(BLDIMPIEGATI.IDImpiegato) AS [ContaUfficio]]
'@DEFQUERYWHERE IDQUERY[idQueryCTE1] ESPRHAVING[[ContaUfficio] > 1]
'@DEFQUERYFROM IDQUERY[idUnionQuery] TABELLA[BLDUFFICI]
'@DEFQUERYJOIN IDQUERY[idUnionQuery] TABELLA[[Impiegati]] TABELLAPADRE[BLDUFFICI] _
REL[[Impiegati].IdUfficio = BLDUFFICI.IDUfficio] _
OPERATOREJOIN["INNER"]
'@DEFQUERYCOLUMN IDQUERY[idUnionQuery] ESPR[BLDUFFICI.Descrizione AS [DescrizioneUfficio]] _
ESPR[[Impiegati].ContaUfficio AS [NumeroImpiegati]]
'@DEFQUERY IDQUERY[idUnionQuery2] NOME["TEST_DEFQUERY_9_2"]
'@DEFQUERYCTE IDQUERY[idQueryCTE2] ALIAS["Impiegati2"] IDQUERYPADRE[idUnionQuery2]
'@DEFQUERYFROM IDQUERY[idQueryCTE2] TABELLA[BLDIMPIEGATI]
'@DEFQUERYCOLUMN IDQUERY[idQueryCTE2] ESPR[GROUPBY(BLDIMPIEGATI.IDUfficio) AS [IdUfficio]] _
ESPR[COUNT(BLDIMPIEGATI.IDImpiegato) AS [ContaUfficio]]
'@DEFQUERYWHERE IDQUERY[idQueryCTE2] ESPRHAVING[[ContaUfficio] = 1]
'@DEFQUERYFROM IDQUERY[idUnionQuery2] TABELLA[BLDUFFICI]
'@DEFQUERYJOIN IDQUERY[idUnionQuery2] TABELLA[[Impiegati2]] TABELLAPADRE[BLDUFFICI] _
REL[[Impiegati2].IdUfficio = BLDUFFICI.IDUfficio] _
OPERATOREJOIN["INNER"]
'@DEFQUERYCOLUMN IDQUERY[idUnionQuery2] ESPR[BLDUFFICI.Descrizione AS [DescrizioneUfficio]] _
ESPR[[Impiegati2].ContaUfficio AS [NumeroImpiegati]]
'@DEFQUERY IDQUERY[idUnionQuery3] NOME["TEST_DEFQUERY_9_3"]
'@DEFQUERYFROM IDQUERY[idUnionQuery3] TABELLA[BLDUFFICI]
'@DEFQUERYCOMPUTEDCOLUMN IDQUERY[idUnionQuery3] ESPR["Ufficio fittizio" AS [DescrizioneUfficio] FMT[TESTO[255]]]
'@DEFQUERYCOMPUTEDCOLUMN IDQUERY[idUnionQuery3] ESPR[12 AS [NumeroImpiegati] FMT[NUMERICO[2]]]
'@DEFQUERYUNION IDQUERYUNION[idQueryPrincipale] _
QUERY[idUnionQuery] _
QUERY[idUnionQuery2] _
QUERY[idUnionQuery3]
'@DEFQUERYSET IDQUERY[idQueryPrincipale] ESPR[QRY(idUnionQuery) UNION QRY(idUnionQuery2) UNION QRY(idUnionQuery3)]
'@DEFQUERYORDERBY IDQUERY[idQueryPrincipale] ESPR[[DescrizioneUfficio]]
' Statement SQL generato
'
' ;
' WITH Impiegati (IdUfficio, ContaUfficio)
' AS
' (SELECT
' IDUfficio AS [IdUfficio]
' ,COUNT(IDImpiegato) AS [ContaUfficio]
' FROM BLDImpiegati AS [BLDImpiegati]
' WHERE (DBGruppo = 'GG')
' GROUP BY IDUfficio
' HAVING (COUNT((IDImpiegato)) > 1)),
' Impiegati2 (IdUfficio, ContaUfficio)
' AS
' (SELECT
' IDUfficio AS [IdUfficio]
' ,COUNT(IDImpiegato) AS [ContaUfficio]
' FROM BLDImpiegati AS [BLDImpiegati]
' WHERE (DBGruppo = 'GG')
' GROUP BY IDUfficio
' HAVING (COUNT((IDImpiegato)) = 1))
' SELECT
' BLDUffici_1.Descrizione AS [DescrizioneUfficio]
' ,Impiegati_1.ContaUfficio AS [NumeroImpiegati]
' FROM BLDUffici AS [BLDUffici_1]
' INNER JOIN Impiegati AS [Impiegati_1]
' ON (Impiegati_1.IdUfficio = BLDUffici_1.IDUfficio)
' WHERE (BLDUffici_1.DBGruppo = 'GG')
'
'
' UNION SELECT
' BLDUffici_1.Descrizione AS [DescrizioneUfficio]
' ,Impiegati2.ContaUfficio AS [NumeroImpiegati]
' FROM BLDUffici AS [BLDUffici_1]
' INNER JOIN Impiegati2 AS [Impiegati2]
' ON (Impiegati2.IdUfficio = BLDUffici_1.IDUfficio)
' WHERE (BLDUffici_1.DBGruppo = 'GG')
'
'
' UNION SELECT
' 'Ufficio fittizio' AS [DescrizioneUfficio]
' ,12 AS [NumeroImpiegati]
' FROM BLDUffici AS [BLDUffici_1]
' WHERE (BLDUffici_1.DBGruppo = 'GG')
'
'
' ORDER BY [DescrizioneUfficio] ASC
'
' Risultato della query
'
' DescrizioneUfficio NumeroImpiegati
' ---------------------- ------------------
' Direzione 1
' Ufficio Commerciale 6
' Ufficio fittizio 12
' Ufficio Marketing 2
Riferimenti
Le query in BC
Le subquery in BC
Le common table expressions (CTEs) in BC