Tabelle Logiche e operazioni gestionali
Un linguaggio di programmazione orientato agli oggetti come il Delphi e' predisposto a delle strategie progettuali per gestire dal lato del programmatore operazioni su archivi elettronici. Questa guida illustra le operazioni attuabili per le tabelle. Tanto per chiarire le idee, le tabelle rappresentano una entita' o relazione, un insieme di queste tabelle dentro a un file unico e' un archivio a tutti gli effetti, come puo' essere un database SQL. In realta' il programmatore solitamente decide se usare file separati in collegamento logico (una via piu' semplice ma a volte troppo disordinata) o la via piu' concreta, cioe' l'archivio unico (dove e' richiesto uno studio piu' minuzioso perche' l'integrita' se non rispettata puo' portare allo disfacimento di tutte le associazioni al suo interno).
Passiamo quindi agli approcci iniziali:
Delphi prevede un' applicazione che permette la creazione delle tabelle: Database Desktop.
L'utilizzo di questo programma e' abbastanza intuitivo: dal menu File si passa alla voce New e poi Table. Da qui si comincia alla costruzione degli attributi (colonne della tabella) a seconda della realta' da rappresentare. Consigliamo di utilizzare il formato Paradox anche perche' e' abbastanza noto e compatibile con altre applicazioni quali Access della Microsoft.
E' sempre buona norma prevedere una chiave (Alfanumerica o Incrementale) anche perche' ricordiamo che stiamo costruendo una tabella fine a se stessa e quindi e' funzionale dare una struttura fisica ben indirizzabile, per quanto riguarda le tuple (righe della tabella). Ora passiamo all'interfaccia mento software in Delphi. L'oggetto logico che rappresenta la nostra tabella fisica e' di classe TTable presente nelle Palette di nome BDE.
Oggetto TTable
Questo oggetto cerca di rappresentare la nostra tabella fisica. In piu' permette la gestione delle sue informazioni dando modo di effettuare operazioni di aggiornamento o interrogazioni quali il filtraggio. Il primo passo per cominciare ad usare questo oggetto e' l'impostazione della destinazione del file fisico. Le proprieta' piu' rilevanti sono le seguenti: DatabaseName, SessionName, TableName e TableType, Active.
-
DatabaseName: indica la destinazione o la directory dove la nostra tabella e' posizionata. Normalmente se nella path del progetto dove lavoriamo abbiamo salvato direttamente anche la nostra tabella fisica si setta il seguente valore " ./ " che sta ad indicare la posizione corrente. Comunque e' possibile anche spostarsi in cartelle interne od esterne rispetto la posizione del progetto, ad esempio: " ./CartellaInterna/ " o " ../CartellaEsterna/ ";
-
SessionName: indica il nome della sessione che e' buona norma impostarlo su "Default";
-
TableName: indica il nome della tabella fisica o del file che la rappresenta. Se il DatabaseName e' corretto apparira' un menu a tendina con tutte le tabelle presenti;
-
TableType: e' un campo decisamente importante che va impostato a seconda del formato di tabella utilizzato. Nel nostro caso va impostato su ttParadox.
-
Active: la tabella dovra' essere attivata per divenire utilizzabile. Questo campo dovra' essere settato su true, in caso contrario verranno negate tutte le funzionalita' di aggiornamento e visibilita'.
- Operazioni di Indirizzamento:
La tabella e' trattata come un insieme di record ognuno posizionato in un certo punto. Ogni tupla e' interrogabile come se fosse un array associativo con chiave corrispettiva al nome del campo o della colonna (quello che abbiamo dato in fase di costruzione nell'editor Database Desktop o Access).
Per acquisire quindi il valore di un certo campo della riga puntata in quel momento si usa la notazione: nomeTabella['Nome Campo']
Se non usiamo un supporto grafico e' possibile spostare il puntatore tramite i seguenti metodi: First, Next, Prior, Last.
-
First: posiziona il puntatore al primo elemento o riga della tabella;
-
Next: sposta di una posizione in avanti rispetto quella corrente;
-
Prior: sposta di una posizione indietro rispetto quella corrente;
-
Last: sposta all'ultima posizione cioe' l'ultima riga della tabella.
Un altro metodo molto importante e' Locate che ci permette di spostarci non in modo sequenziale ma tramite il contenuto di un certo campo:
Sintassi: tableX.locate(<nome campo>, <valore campo>, [opz1, opz2]);
-
<nome campo> e' il nome della colonna (in formato stringa);
-
<valore campo> il contenuto che dovra' avere per essere trovato o puntato (formato stringa o numerico).
Questo confronto di uguaglianza che fa automaticamente il metodo puo' prevedere diverse opzioni:
-
loCaseInsensitive: <valore campo> puo' contenere caratteri minuscoli o maiuscoli, cioe' 'CIAO' = 'cIaO' sara' visto come vero;
-
loPartialKey: il confronto non deve rispettare tutta la stringa ma basta una sottostringa del <valore campo> per essere considerata , cioe' 'CIAO' = 'CI' sara' visto come vero.
Passiamo ora alle varie procedure che l'oggetto TTable ci permette di attuare per cio' che riguarda gli aggiornamenti.
- Operazioni di aggiornamento:
Le operazioni di aggiornamento hanno lo scopo di cambiare le informazioni della tabella con Inserimento, Modifica e Cancellazione.
Inserimento (Append): per inserire una nuova tupla nella tabella viene usata la funzione Append. Questa e' la via piu' semplice e veloce, visto che si preoccupa infatti di aggiungere la tupla nella posizione successiva rispetto l'ultima riga presente indifferentemente da dove il puntatore record sia posizionato in quel momento.
Esempio:
tableX.append;
tableX['ColonnaA'] := valoreX;
tableX['ColonnaB'] := valoreY;
tableX.post;
Questa serie di istruzioni creeranno una nuova riga valorizzata nei relativi campi 'ColonnaA' e 'ColonnaB' che grazie alla operazione di Post sara' confermata e quindi inserita definitivamente.
Modifica (Edit): per modificare i valori di una certa tupla nella tabella viene usata la funzione Edit. E' molto importante sapere dove il puntatore record e' posizionato perche' la riga che sara' soggetta all'aggiornamento e' quella indirizzata in quel momento.
Esempio:
tableX.edit;
tableX['ColonnaB'] := valoreW;
tableX.post;
Questa serie di istruzioni assegneranno un nuovo valore al campo 'ColonnaB' che grazie alla operazione di Post rendera' effettiva la modifica.
Cancellazione (Delete): per cancellare una certa tupla nella tabella viene usata la funzione Delete. E' molto importante anche qui conoscere dove il puntatore record e' posizionato perche' la riga che sara' cancellata e' quella indirizzata in quel momento.
Esempio:
tableX.delete;
La cancellazione e' la funzionalita' piu' rapida e non ha bisogno della conferma tramite il metodo Post.
- Cosa e' un Filtro:
Molto importante e' il concetto di filtraggio. Si usa come la parola stessa dice per filtrare le informazioni o insomma andare a lavorare su un insieme di tuple che rispettino il criterio dettato dal Filtro. Il filtro e' principalmente una stringa dove viene fissata la caratteristica del contenuto di uno o piu' attributi con condizioni logiche quali di confronto o di concatenamento booleano. Se una tabella contiene un certo numero di record quando lavora su un filtro ne mostrera' solo alcuni o insomma quelli che rispettano il criterio. Le tuple che non sono accettate dal filtro non saranno piu' visibili a tutti gli effetti, e' come se la tabella fisica avesse perso quelle determinate tuple. Per riacquistarle dovra' cambiare il filtro o essere definitivamente disabilitato. La tabella seguente mostra i principali parametri da utilizzare per impostare un filtro:
| Operatori di confronto | |
| = | Segno di uguaglianza |
| > | Confronto per maggioranza |
| < | Confronto per minoranza |
| >= | Confronto per maggioranza o uguaglianza |
| <= | Confronto per minoranza o uguaglianza |
| Operatori Booleani | |
| AND | ‘E' logico |
| OR | ‘O' logico |
| NOT | ‘NON' logico: vero diventa falso e viceversa |
| ( , ) | All'occorrenza e' persino possibile usare le parentesi per raggruppare i confronti legandoli dagli operatori booleani And, Or e Not. |
- Settare e usare il Filtro:
la proprieta' della tabella si chiama filter e tramite l'assegnazione sara' possibile impostarlo.
Esempi:
tableX.filter := '(ColonnaA = 10 AND ColonnaB >= 30) OR ColonnaB = 0';
A filtro attivo la tabella tableX mostrera' tutte le righe dove l'attributo di nome ColonnaA ha volore 10 e nella ColonnaB un valore maggiore o uguale a 30 o tutte le tuple dove la ColonnaB ha valore 0.
Se invece andiamo a eseguire confronti non su valori numerici ma su ulteriori stringhe queste dovranno essere delimitate dal carattere apice. Delphi ha predisposto una funzione che aggiunge all'inizio e alla fine di una qualsiasi stringa l'accento “ ' â€Â.
Esempi:
tableX.filter := 'ColonnaA =' + quotedstr('CIAO');
che e' uguale a dire,
tableX.filter := 'Colonna A = ''CIAO''';
Quando il filtro sara' impostato dovremo decidere se attivarlo. Le tabelle hanno la proprieta' filtered che impostata su vero (true) attivera' il criterio sulle tuple, nel caso contrario non avverra' nessun filtraggio (indifferentemente se filter e' stato valorizzato o meno).
Esempio:
tableX.filter := 'colonnaA =' + quotedstr('CIAO');
tableX.filtered := true;
La tabella tableX mostrera' tutte le tuple dove l'attributo di nome ColonnaA ha valore ‘CIAO'.
Oggetto TDataSource
C'e' un po' di confusione nel capire perche' esiste il TDataSource. Ma quale e' la sua funzione principalmente?
Beh, in programmazione bisogna usare esempi reali per capire i concetti logici e in questo caso dobbiamo pensare ad un ponte. Esatto: gli oggetti che rappresentano gli archivi o le tabelle condividono le informazioni fisiche attraverso il DataSource e tutti gli strumenti che cercano di rappresentare a livello visuale queste informazioni non devono sapere se saranno acquisite da il FileX su una base di dati Y ma da un interfaccia mento a loro comprensibile quale e' questo oggetto. Tutte le strategie di comunicazione sono mascherate e attuate da questo strumento in modo autonomo. E' impensabile che ogni oggetto grafico debba essere impostato a seconda dell'archivio usato, cioe' lo scopo e' rendere il linguaggio piu' veloce e organizzato e per questo siamo positivamente obbligati a usare l'oggetto in questione. E' anche interessante far notare che questa sorta di ponte e' bidirezionale cioe' l'oggetto grafico a seconda del tipo puo' modificare le informazione dell'archivio associato e sara' sempre il DataSource che provvedera' a soddisfare le richieste dell'oggetto grafico. Quando l'archivio viene modificato l'oggetto visuale mostrera' i cambiamenti e quindi riceve le informazioni dettate sempre dal DataSource. Per dare ancora piu' semplicita' al discorso in realta' c'e' un omino al centro del ponte che vede le richieste da ambi i versi e decide come gestirle per permette il corretto collegamento tra base di dati e oggetto grafico.

Un oggetto DataSource comunica con un oggetto BDE, (nel nostro caso TTable), tramite la proprieta' DataSet.
Gli oggetti visuali che fanno parte delle Palette Data Controls per acquisire informazioni da una base di dati dovranno avere nella proprieta' DataSource il nome della sorgente associata ad essa.


Invia nuovo commento