Newsgroup: it.comp.lang.visual-basic
Titolo: ma come funzionano le relazioni????!?!?!

Vi prego consigliatemi un esempio di codice dove vengono usate le relazioni
con i datacontrol!
Ho un archivio access con delle relations tra tabelle, ma come posso
sfruttare queste relations con il VB?

 wrote in message
7sb8qd$8gj$1...@fe2.cs.interbusiness.it...

Le relazioni servono per definire vincoli inter-relazionali (leggi: tra
tabelle), a livello di struttura del database (e/o di comportamento in
alcune situazioni, come modifica ed eliminazione di record relazionati).
Non si "usano" con i datacontrol.
Quello di cui (forse) hai bisogno e' del costrutto JOIN dell'SQL, che ti
permette di avere un recordset costituito da campi appartenenti a piu'
tabelle.
Per maggiori informazioni ti consiglierei l'acquisto di un buon libro su SQL
o, come alternativa piu' scarsa, la ricerca di JOIN nell'help in linea di
VB.
--
Roal Zanazzi
z...@iol.it

Io consiglio di usarli tutti e due.... io mi sono dannato l'anima per
un mese su un testo che trattava lo standard ANSI SQL... prima di
scoprire  grazie all'help in linea che tanto il dialetto di Access che
il dialetto di SQL Server (nota, tra loro incompatibili) hanno alcuni
punti che si discostano dallo standard...
Ciao!
Luca Menegotto.



Scusate se la mia richiesta e' leggermente OT...
Luca, sai se esiste una lista delle "deviazioni" dallo standard SQL, almeno
per Access ed SQL-Server 7 ?
--
Roal Zanazzi
z...@iol.it

No, mi dispiace.
Ti diro', pero', che le mie informazioni non sono molto recenti.... io
sto ancora usando SQL-server 6.5, Access97 e il mio abbonamento a MSDN
è scaduto un po' di tempo fa...
Devo peraltro dirti che quel (poco) che so non l'ho scoperto grazie a
'liste di divergenza dallo standard', ma scornandomi e confrontando il
'come' riportato sul mio manuale dello standard e il 'come' riportato
nell'help in linea... :((
Ciao!
Luca Menegotto


 
z...@iol.it
Su Computer Programming di Settembre, a firma di Marco Russo, compare un
articolo che elenca le principali differenze dei vari Server di Database
rispetto all'SQL-92.
Riporto uno specchietto tratto da detto articolo che confronta SQL Server
6.5, Oracle 7, Informix On-Line e Access 97. I testi tra parentesi quadre
sono opzionali.
------------------------------------------------------------
SELECT
------------------------------------------------------------
La select generica (da una o più tabelle) nella forma dell'SQL-92, è
supportata da tutti i database.
Ci sono differenze invece nell'uso dei Join.
INNER JOIN
-----------------
Per l'Inner Join, lo standard SQL-92 è accettato da SQL Server, Oracle e
Access 97
SELECT <field list>
FROM <table1>
[INNER] JOIN <table2>
ON <table1.fieldname> = <table2.fieldname>
Tale sintassi NON è supportata da Informix che interpreta solo l'Inner Join
fatto tramite la clausola WHERE
SELECT <field list>
FROM <table1>, <table2>
WHERE <table1.fieldname> = <table2.fieldname>
Questa ultima sintassi è supportata anche da tutti gli altri motori di
database (ed è quindi, volendo, la più compatibile).
LEFT OUTER JOIN
--------------------------
Il Left Outer Join secondo lo standard SQL-92 è
SELECT <field list>
FROM <table1>
LEFT [OUTER] JOIN <table2>
LEFT [OUTER] JOIN <table3>
ON <table2.fieldname> = <table3.fieldname>
ON <table1.fieldname> = <table2.fieldname>
Tale sintassi è supportata solo da SQL Server che supporta anche la variante
con le parentesi di Access (vedi sotto); SQL Server supporta anche la
variante che segue
SELECT <field list>
FROM <table1>
LEFT [OUTER] JOIN <table2>
ON <table1.fieldname> = <table2.fieldname>
LEFT [OUTER] JOIN <table3>
ON <table2.fieldname> = <table3.fieldname>
La sintassi di Access 97 è simile allo standard ma con l'inserimento di
parentesi che raggruppano i vari Join nidificati
SELECT <field list>
FROM <table1>
LEFT [OUTER] JOIN (<table2>
LEFT [OUTER] JOIN <table3>
ON <table2.fieldname> = <table3.fieldname>)
ON <table1.fieldname> = <table2.fieldname>
La sintassi di Oracle, molto diversa dallo standard, è la seguente
SELECT <field list>
FROM <table1>, <table2>, <table3>
WHERE <table3.fieldname> (+)= <table2.fieldname>
AND <table2.fieldname> (+)= <table1.fieldname>
La sintassi di Informix, anch'essa molto differente dall'SQL-92 è invece
<SELECT> <field list>
FROM <table1>, OUTER (<table2>, OUTER (<table3>))
WHERE <table2.fieldname> = <table3.fieldname>
AND <table1.fieldname> = <table2.fieldname>
ALTRI TIPI DI JOIN
--------------------------
Lo standard SQL-92 per il RIGHT OUTER JOIN e per il FULL OUTER JOIN è
supportato da SQL Server, Oracle ed Access 97.
Su Informix questi tipi di Join non sono disponibili.
SELEZIONE DEI PRIMI N RECORD
-------------------------------------------------
Non esiste nello standard SQL-92. Access supporta la ben nota
SELECT TOP <value> <field list>
FROM <table1>
ORDER BY <field1>
P.es. "SELECT TOP 5 * FROM Articoli ORDER BY Prezzo DESC" seleziona i primi
cinque record della tabella Articoli con il prezzo più alto.
Tale sintassi è supportata anche da SQL 7.
Con Informix è possibile ottenere il medesimo risultato utilizzando invece
SELECT FIRST <value>
FROM <table1>
ORDER BY <field1>
Oracle ed SQL Server 6.5 non hanno alcun corrispettivo nel loro dialetto
SQL.
CREAZIONE DI UNA TABELLA DA UNA SELECT
----------------------------------------------------------------------
Lo standard SQL-92 non prevede nessun costrutto per ottenere tale risultato
e a ciò si adegua Oracle.
Con SQL Server ed Access 97 è possibile utilizzare la seguente sintassi
SELECT <field list>
INTO <table2>
FROM <table1>
WHERE <conditions>
che crea la tabella <table2> con i record ed i campi prelevati da <table1>.
In Informix si ottiene il medesimo risultato con il costrutto
SELECT <field list>
FROM <table1>
WHERE <conditions>
INTO TEMP <table2>
però la tabella creata può essere solo temporanea (al termine della sessione
che l'ha creata viene cancellata automaticamente).
-------------------------------------------------------
UPDATE
-------------------------------------------------------
Tutti i database utilizzano la sintassi di SQL-92 tranne che per la
possibilità di assegnare il valore di default ad un campo attraverso la
parola chiave DEFAULT. Tale possibilità è fornita solo da SQL Server, il
quale è quindi l'unico a supportare in pieno lo standard, potendo scrivere
un UPDATE nel modo seguente
UPDATE Articoli
SET Prezzo = DEFAULT
WHERE ID = 1
--------------------------------------------------------
DELETE
--------------------------------------------------------
Lo standard SQL-92 è supportato da tutti i database.
DELETE FROM <table1>
WHERE <conditions>
Access, SQL Server ed Oracle supportano inoltre una loro variante (che è
quindi da sconsigliarsi per motivi di compatibilità).
Per Access
DELETE * FROM <table1>
WHERE <conditions>
Per SQL Server ed Oracle
DELETE <table1>
WHERE <conditions>
--------------------------------------------------------
INSERT
--------------------------------------------------------
La situazione è come quella dell'Update: tutti supportano lo standard tranne
che per l'uso della parola chiave DEFAULT, utilizzabile solo con SQL Server.
La seguente sintassi (pienamente compatibile con SQL-92) è quindi supportata
solo da SQL-Server
INSERT INTO Articoli
(ID, Descrizione, Prezzo)
VALUES (98, "Nuovo articolo", DEFAULT)
E' ovvio che i campi non nominati vengono riempiti con i valori di default
da tutti i database; quindi la sintassi qui sotto ottiene lo stesso
risultato e la compatibilità tra i vari motori
INSERT INTO Articoli
(ID, Descrizione)
VALUES (98, "Nuovo articolo")
Infine SQL Server supporta la sintassi fuori standard
INSERT INTO <table1> DEFAULT VALUES
che aggiunge un record alla tabella <table1> inserendo in ciascun campo il
valore di Default.
------------------------------------------------------------
Anf! Spero di aver fatto cosa gradita... :-)
Ciao,
   <--< Nik >-->

e a ciò si adegua Oracle.
Falso
CREATE TABLE <table1>  AS SELECT * FROM <Table2>
Saluti,
Silvio