Dati gerarchici con ADO Data Shaping 1/2

di Roberto Insalata, in Database,
  • 0
  • 0
  • 0
  • 76,56 KB

Affronteremo in questa serie di due articoli un'interessante funzionalità di ADO che offre enormi vantaggi a quelle applicazioni che fanno uso di query tra tabelle relazionate. Vedremo come usare ADO Data Shape , che introduce una nuova visione dei dati di tipo gerarchica, ben definita ma non sempre intuitiva.

Requisiti per le prove

Per la corretta esecuzione delle prova presenti in quest'articolo è necessario disporre di MDAC 2.1 o successivi e del Provider OLEDB MSDataShape , che consente ad ADO di usare dati di tipo gerarchico.

Introduzione

OLE-DB nasce come interfaccia per fornire l'accesso a qualsiasi fonte dati, non necessariamente relazionale (posta elettronica, file ASCII, ecc.). Affinché questo sia possibile, OLEDB fa uso di Provider OLEDB , aventi la funzione di "mediatori" tra un Data Consumer (ADO) e le fonti dati stesse.

In genere sono usati solo Provider di dati, poiché si fa spesso uso di fonti dati di tipo "rettangolare", per poi procedere con le normali funzionalità di selezione/modifica. L'uso di Provider + Data Provider consente invece di ottenere interessanti funzionalità aggiuntive sui dati, come quella di recordset gerarchici, offerta dal Provider MSDataShape .

Il Data Consumer delle nostre prove sarà come sempre ADO , il quale farà uso di MSDataShape e del Data Provider Jet per ottenere finalmente i dati gerarchici.

Nei prossimi paragrafi affronteremo i seguenti aspetti:

  • Perché usare Data Shaping?
  • Sintassi di ADO Data Shape
  • Accesso ai recordset CHILD
  • Usare ADO Data Shape con ASP
  • Benefici e svantaggi di Data Shape

Perché usare Data Shaping?

Data Shaping (introdotto con ADO 2.0) nasce con l'intento di semplificare la modellazione di dati complessi, ossia dati provenienti da relazioni uno a molti, molti a molti, generalmente usati in applicazioni di reportistica avanzata, analisi dei dati, ecc. I benefici di questa tecnica sono molti, al costo però di una sintassi non proprio immediata. I recordset gerarchici si prestano molto per linguaggio XML (ADO 2.1), divenuto ormai uno standard per lo scambio di dati indipendenti dalla piattaforma.

Immaginate di avere una struttura dati simile alla struttura del vostro file-system, dove al primo livello (ROOT) troviamo le directory principali, al secondo le directory appartenenti alle directory di ROOT e così via. ADO Data Shape estende questo concetto ai recordset complessi, fornendo tutti gli strumenti per la creazione, gestione e modifica dei dati in forma gerarchica.

Procediamo con un esempio. Abbiamo realizzato un database contenente due tabelle: ORDINI e DETTAGLIO_ORDINI, la cui struttura è riportata nella figura seguente:

Immagine

E' stata definita una relazione UNO-A-MOLTI tra la prima e la seconda tabella, in quanto ad un solo ordine può corrispondere uno o più articoli (o dettagli), ma non il contrario. Se volessimo ottenere un recordset contenente un riferimento all'ORDINE e ai DETTAGLI corrispondenti, useremmo una query del tipo:

SELECT ORDINI.CODICE,DETTAGLIO_ORDINI.* FROM ORDINI INNER JOIN DETTAGLIO_ORDINI ON ORDINI.CODICE=DETTAGLIO_ORDINI.ORDINE;

Questa query introduce molta ridondanza di record PARENT (tabella ORDINI), in quanto replica tanti record ORDINI.CODICE per quanti record DETTAGLIO_ORDINI soddisfano la relazione ( ORDINI.CODICE=DETTAGLIO_ORDINI.ORDINE ). Immaginiamo di avere circa 1000 ordini e 10 articoli in media per ogni ORDINE; il recordset risultante conterrebbe 10.000 record!

ADO Data Shape risolve brillantemente questa ridondanza: nel nostro esempio questa tecnica avrebbe restituito solo 1000 record, corrispondenti al numero di record PARENT . Ad ogni record PARENT sarebbero associati (in campi definiti CHILD ) i dettagli relativi, senza alcuno spreco. Il prezzo di questa flessibilità è una sintassi poco intuitiva, ma che con il tempo diverrà sempre più familiare.

Il concetto essenziale dei recordset gerarchici è quello di legare un recordset PARENT a uno o più recordset CHILD , che possono essere a loro volta PARENT di altri recordset CHILD , e così via, definendo così link di parentela tra gli stessi.

La figura di seguito illustra il concetto di Data Shaping applicato all'esempio di cui ci siamo serviti:

Immagine

Il campo DETTAGLIO_ORDINI.ORDINE è, in realtà, un riferimento alla tabella DETTAGLIO_ORDINI, anche se vista come campo dal recordset gerarchico. Vedremo in seguito come recuperare i dati CHILD attraverso ADO.

Riepilogando, ha senso gerarchizzare i dati quando esistono le condizioni per farlo, e cioè:

  • Due o più tabelle relazionate
  • Molti record coinvolti nei risultati

Sintassi di ADO Data Shaping

Come già anticipato, la nota dolente del Data Shaping sta' proprio nella sintassi poco intuitiva, che cercherò (per quanto possibile) di semplificare.

Il Provider MSDataShape , responsabile della formattazione dei dati secondo gerarchie, riconosce la seguente sintassi:

SHAPE {TABELLA/QUERY PARENT} [AS alias_parent]

APPEND ({TABELLA/QUERY CHILD} AS alias_child

RELATE CAMPO_PARENT TO CAMPO_CHILD) [AS alias_relazione]

Dove:

TABELLA/QUERY PARENT
è il nome (o la query) della tabella PARENT (ORDINI)

alias_parent
è il nome simbolico da dare al PARENT

TABELLA/QUERY CHILD
è il nome (o la query) della tabella CHILD (DETTAGLIO_ORDINI)

alias_child  
è il nome simbolico del campo CHILD contenuto nel recordset

CAMPO_PARENT
è il nome del campo contenuto nella tabella PADRE che si vuole relazionare (ORDINI.CODICE)

CAMPO_CHILD
è il nome del campo contenuto nella tabella CHILD che si vuole relazionare (DETTAGLIO_ORDINI.ORDINE)

Naturalmente il Provider consente di "appendere" uno o più recordset CHILD, sempre che le relazione espressa con la clausola

RELATE 
sia valida.

Nulla vieta ancora di complicare ulteriormente i risultati, usando SHAPE annidati, in modo da creare gerarchie complesse come ORDINI->DETTAGLI->VENDITE.

Volendo usare le tabelle del nostro esempio, la query Data Shape da usare è la seguente:

SHAPE {SELECT CODICE FROM ORDINI} AS ORDINI

APPEND ({SELECT * FROM DETTAGLIO_ORDINI} AS DETTAGLI

RELATE ORDINI.CODICE TO DETTALIO_ORDINI.ORDINE)

In questo modo abbiamo comunicato al Provider di creare un recordset contenente due campi: CODICE e DETTAGLI . Il campo CODICE conterrà il valore effettivo recuperato dalla relativa tabella ORDINI, mentre il campo DETTAGLI conterrà un riferimento alla tabella DETTAGLIO_ORDINI , in cui il campo ORDINE sia uguale al valore del campo CODICE (vedi espressione

RELATE
).

Il numero dei record restituiti equivale al numero degli ORDINI presenti ( PARENT ), evitando quindi qualsiasi ridondanza. Il numero dei record CHILD equivale semplicemente alla sommatoria del numero di record DETTAGLI_ORDINE per ogni ORDINE.

La sintassi Data Shaping è in realtà molto più laboriosa, ma per il momento è sufficiente conoscere come creare recordset gerarchici senza funzionalità aggiuntive, oggetto della seconda parte dell'articolo.

2 pagine in totale: 1 2

Attenzione: Questo articolo contiene un allegato.

Contenuti dell'articolo

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti