Newsgroup: it.comp.appl.access
Titolo: casella di riepilogo da 2 tabelle: il seguito

Prima di tutto ringrazio Antonio, Roberto ed Emanuele per le
osservazioni che mi hanno dato al quesito che di nuovo espongo. Ho
proposto una mia soluzione, ma forse perché ho sbagliato qualcosa
nell'invio del messaggio oppure soltanto a causa del ritardo, non ho
visto i Vostri commenti. Riespongo nuovamente quesito e presunta
soluzione, sperando che loro stessi e magari anche altri mi possano
dare un contributo. Grazie a tutti anticipatamente1
IL QUESITO:
La tabella Attività è formata, tra gli altri, dai seguenti campi:
...|data_ora|impianto|utente|attività|...;
Il campo  "utente" può riferirsi sia alla tabella Persone che alla
tabella Società (2 diverse entità), ed il relativo valore dovrebbe
essere ricercato a mezzo di apposita casella di riepilogo che unisca i
valori.
L'entità "utente" dovrebbe in altre parole essere referenziata da
attributi che variano a seconda che siano "persone" (es. Nome,Cognome)
o "associazioni" (es. Denominazione, Partita Iva), oltre ad altri
attributi comuni (es. Indirizzo, Codice Fiscale).
Come posso relazionare tra loro le tabelle in modo da garantirmi anche
l'integrità referenziata uno-> molti tra Persone o Società ed
Attività?
Una query di unione non mi consente l'applicazione della suddetta
integrità referenziata.
LA MIA (PRESUNTA) SOLUZIONE:
Struttura tabelle:
-	Attività:  ...|data_ora|impianto|ID_Utenti|attività|...
-	Utenti:    |ID|ID_Società|ID_Persone|
-	Società:   |ID|Denominazione|...
-	Persone:   |ID|Cognome|Nome|...
Note sulle tabelle:
-	i campi ID sono del tipo numerico contatore
-	i campi ID_* sono caselle di riepilogo
-	nella tabella Utenti i campi ID_Società ed ID_Persone costituiscono
altrettanti indici univoci ed inoltre le regole di convalida dei dati
inseriti nella medesima tabella costringono all'immissione di un
valore (1 soltanto!) nel campo ID_Società oppure nel campo ID_Persone
Relazioni con applicazione dell'integrità referenziale:
-	Utenti.ID -> Attività.ID_Utenti (tipo uno-a-molti)
-	Società.ID -> Utenti.ID_Società (tipo uno-a-uno)
-	Persone.ID -> Utenti.ID_Persone (tipo uno-a-uno)
In questo modo penso di:
1.	rispettare maggiormente le regole di normalizzazione, potendo poi
utilizzare più facilmente le entità Persone ed Associazioni in altri
contesti database
2.	avere a disposizione per le maschere ed i report da costruire una
casella di riepilogo Utenti, indipendente dalle diverse entità che vi
confluiscono: al momento ne ho individuate solo 2 (Società e Persone)
ma potrebbe aumentare...;
3.	gestire l'immissione dei valori nella tabella utenti tramite gruppo
di opzioni sulla maschera principale e sottomaschera/e.
Saluti a tutti. Rinaldo

> "rinaldo" [...]:

    Io invece farei una tabella Utenti con i campi:
        IDUtente
        IDTipo
        IDEntità
dove, xes:
        IDTipo { 1 = Società; 2 = Associazione; 3 = Società; ... }
--
Ciao :-)
Maurizio
--------
?SPQR(C)
 X
--------

...

Per favore potresti precisarmi a cosa ti riferisci con IDEntità?
Si tratta in pratica di mettere assieme, in unica tabella, gli
attributi di Società e Persone?
Ho mandato una mail personale, a te come agli altri che mi avevavno
risposto, potendo in questo modo allegarvi un mio file mdb di esempio.
Non intendo escludere il NG, ho sbagliato? Ho tutto da imparare...
Aspetto fiducioso una tua risposta e da chi altri desidererà
intervenire sull'argomento.
Saluti. Rinaldo

 intervenire sull'argomento.
--


 > > > > "Maurizio Borrelli" [...]:
Prima di tutto scusami se il mio comportamento non è stato "corretto",
ma ho agito in tutta buona fede. Adesso ho imparato qualcosa sulle
regole di comportamento nel NG...
Ritornando al problema, grazie per la tua risposta molto ben
dettagliata con la quale ho rivisto struttura e relazioni in questo
modo:
                                         +----------+
                                         | Persone  |
                                         +----------+ 
                                       -1| ID       |   +-----------+
                 +--------------+     /  | ...      |   | Attività  |
 +-----------+   | Utenti       |    /   +----------+   +-----------+
 | Categorie |   +--------------+   /                   | inizio    |
 +-----------+   | ID           |1-/-------------------8| ID_Utenti |
 | ID        |1-8| ID_Categorie | /                     | ...       |
 | Nome      |   | ID_Entità    |1(8)                   +-----------+
 +-----------+   +--------------+ \ 
                                   \ 
                                    \    +----------+
                                     \   | Società  |
                                      \  +----------+
                                       -1| ID       |
                                         | ...      |
                                         +----------+
Ed ho creato una prima query che "swiccia" (non avevo immaginato
questa possibilità!):
        SELECT
            Attività.inizio,
            Choose
               (Nz([Utenti].[ID_Categorie_Utenti],0),
               [Società].[denominazione],
               [Persone].[Cognome] & " " & [Persone].[Nome])
               AS utente
        FROM Società
             RIGHT JOIN ((Persone
             RIGHT JOIN Utenti
                   ON Persone.ID = Utenti.ID_Entità)
             RIGHT JOIN Attività ON Utenti.ID = Attività.ID_Utenti)
                   ON Società.ID = Utenti.ID_Entità
        ORDER BY Attività.inizio;
A questo punto mi rimane un problema:
come posso avvalermi dell'integrità referenziale nelle relazioni
     Persone.ID 1-1 Utente.Id_Entità
   e Società.ID 1-1 Utente.Id_Entità
dal momento che in ID_Entità possono sussistere valori referenziati da
Persone.ID non presenti in Società.ID e viceversa?
Saluti e buon lavoro a tutti.
Rinaldo

 Persone.ID non presenti in Società.ID e viceversa?
    Per mezzo degli indici, se ho ben compreso cio' che chiedi. Per esempio,
nel realizzare il mio esempio avevo definito, per la tabella Utenti, gli
indici seguenti:
        Tabella Utenti
            Indici
                ID
                    Nome campo: ID
                    Primario: Si'
                    Univoco: Si'
                ID_Categorie
                    Nome campo: ID_Categorie
                ID_Entità
                    Nome campo: ID_Entità
                uk Utenti
                    Nome campo: ID_Categorie, ID_Entità
                    Univoco: Si'


                     Univoco: Si'
In effetti ho definito gli indici della Tabella Utenti come nel tuo
esempio.
Ma non credo sia questo il punto. Cerco di spiegarmi meglio con un
esempio:
         ---------------------    -----------------------
         Societā                  Persone
         ---------------------    -----------------------
         |ID    |Denominazione    |ID  |Cognome  |Nome
         ---------------------    -----------------------
           1     SocietāA           1   Pinco     Pallino
           2     SocietāB           2   Caio      Sempronio
           3     SocietāC
                          ----------------
                          Categorie
                          ----------------
                          |ID  |Categoria
                          ----------------
                            1   Societā
                            2   Persone
 
                          -----------------------------
                          Utenti
                          -----------------------------
                          |ID  |ID_categorie |ID_Entitā
                          -----------------------------
                            1    1             1
                            2    1             2
                            3    1             3
                            4    2             1
                            5    2             2
Dunque, se applico l'integritā referenziale tra Societā.ID ed
Utente.Id_Entitā va tutto bene. Quando ripeto l'operazione tra
Persone.ID ed Utente.Id_Entitā Access non me lo consente, ovviamente
perchč trova nella chiave esterna un valore inesistente nella primaria
(nell'esempio il valore 3).
E' possibile aggirare il problema?
Grazie ancora Maurizio! Rinaldo

 > > > "Maurizio Borrelli" [...]:

    Pero ci devi giustificare perche' esistano Attivita' con IDUtente Null.
    ;-)

    Ti devi accertare che la tabella Utenti sia sempre a destra. Apri la
finestra "Modifica relazioni" e verifica che sia:
        Tabella/query      Tabella/query correlata
        Persone            Utenti
        IDPersona          IDEntitā
        Societā            Utenti
        IDSocietā          IDEntitā
    (Se ho colto il problema).


 > > > > > >    (Se ho colto il problema).
La relazione и orientata come mi hai precisato, ma il problema stа nel
fatto che ho 2 chiavi primarie (Persona.ID e Societа.ID) ed una chiave
esterna comune (ID_Entitа), per cui tutto funziona se le 2 chiavi
primarie contengono gli stessi valori, ma nel caso in cui il valore di
una delle 2 и diverso (come nell'esempio che avevo fatto: SocietаC =
3) quest'ultimo non puт essere aggiunto alla colonna ID_Entitа di
Utenti, in quanto entra in conflitto con la chiave primaria di
Persone, che non contiene il valore 3.
C'и una soluzione o devo rinunciare all'integritа referenziale?
Grazie. Rinaldo

 C'è una soluzione o devo rinunciare all'integrità referenziale?
    Mi dispiace averti fatto attendere, speravo di aver piu' tempo per
rivedere la cosa ma ancora non ho potuto.
    A occhio direi che tu debba rinunciare all'integrita' referenziale.
