Discussione:
Cancellare record a catena senza impostare integrità referenziale
(troppo vecchio per rispondere)
gog
2006-09-25 11:03:03 UTC
Permalink
Salve , non sò neanche da dove iniziare .. ci provo.
Per problemi di struttura delle tabelle , mi è impossibile applicare
l'integrità referenziale tra la tabella documento di trasporto e la
tabella magazzino. Il db permette sia di gestire documenti di trasporto
sia fatture immeddiate sia (come normale che sia) il carico magazzino)
. Il problema è che essendo 3 tabelle distinte:

tabella documento di trasporto (dove viene inserita l'itestazione del
DDT) :

ID DDT contatore e chiave primaria
CODICE CLIENTE (per tirare fuori i dati dalla tabella clienti che
detiene tutta l'anagrafica)
NUMERO DDT
SEDE DDT (il db gestisce varie sedi identificate da una sigla)
DATA DDT
MODALITA TRASPORTO
CAUSALE TRASPORTO ECC... CAMPI CHE NON CI INTERESSANO PER RISOLVERE IL
PROBLEMA

tabella magazzino (dove vengono memorizzate tutte le movimentazioni)

ID MAGAZZINO (contatore e chiave primaria)
ID DDT (collega i movimenti di questa tabella a quella "documento di
trasporto")
ID FATTURA (collega i movimenti di questa tabella a quella "fattura")
QUANTITA
PREZZO
MAGAZ (per sapere da quale magazzino si ha la movimentazione)
TIPO MOV (per sapere se è un carico o scarico)
DATAMOV (per lo storico)

tabella DDT CARICO (dove metto numero e data del carico e che potrei
comunque eliminare unificandola con documentro di trasporto) :

ID DDT (per legarlo alla tabella magazzino)
CODICE CLIENTE
NUMERO DDT
DATA DDT
MAGAZZ (magazzino dove viene caricato)

tabella fattura

ID FATTURA
CODICE CLIENTE
NUMERO FAT
DATA FATT
ECC..

il problema sta nella tabella magazzino dove vengono memorizzati i
movimenti. L'integrità referenziale non posso applicarla perchè non
sempre il valore che ho su id ddt sta sulla tabella documento di
trasporto esempio
se si inserisce una fattura immediata il campo idddt sta a 0 dato che
verrà dato un valore al campo id fattura .. per cui la tabella
documento di trasporto non avrà un record corrispondente.

Avevo pensato a creare una query che tirasse fuori i valori dalla
tabella documento di trasporto ed i relativi movimenti corrispondenti
all'id di un certo numero ddt per poi usarla su un delete .. ma non mi
fa cancellare come immagginavo.
l'ultima idea sarebbe di creare un modulo che deleti eseguendo 2 delete
sulel 2 tabelle prendendo come variabile l'idddt di un certo numero ddt
es: numero ddt= 2 ha iddt =112 il modulo fa un delete sulla tabella
documento di trasporto per il record identificato dal quell'id e nesso
stesso momento fa un delete per idddt=112 anche nella tabella
magazzino.

Scusate se sono stato lungo ma non so come risolvere.
Grazie
Sergio MAZZA
2006-09-25 17:41:33 UTC
Permalink
"gog" <***@gmail.com> ha scritto nel messaggio news:***@i3g2000cwc.googlegroups.com...
Salve , non sò neanche da dove iniziare .. ci provo.
Per problemi di struttura delle tabelle , mi è impossibile applicare
l'integrità referenziale tra la tabella documento di trasporto e la
tabella magazzino. Il db permette sia di gestire documenti di trasporto
sia fatture immeddiate sia (come normale che sia) il carico magazzino)
. Il problema è che essendo 3 tabelle distinte:

tabella documento di trasporto (dove viene inserita l'itestazione del
DDT) :

ID DDT contatore e chiave primaria
CODICE CLIENTE (per tirare fuori i dati dalla tabella clienti che
detiene tutta l'anagrafica)
NUMERO DDT
SEDE DDT (il db gestisce varie sedi identificate da una sigla)
DATA DDT
MODALITA TRASPORTO
CAUSALE TRASPORTO ECC... CAMPI CHE NON CI INTERESSANO PER RISOLVERE IL
PROBLEMA

tabella magazzino (dove vengono memorizzate tutte le movimentazioni)

ID MAGAZZINO (contatore e chiave primaria)
ID DDT (collega i movimenti di questa tabella a quella "documento di
trasporto")
ID FATTURA (collega i movimenti di questa tabella a quella "fattura")
QUANTITA
PREZZO
MAGAZ (per sapere da quale magazzino si ha la movimentazione)
TIPO MOV (per sapere se è un carico o scarico)
DATAMOV (per lo storico)

tabella DDT CARICO (dove metto numero e data del carico e che potrei
comunque eliminare unificandola con documentro di trasporto) :

ID DDT (per legarlo alla tabella magazzino)
CODICE CLIENTE
NUMERO DDT
DATA DDT
MAGAZZ (magazzino dove viene caricato)

tabella fattura

ID FATTURA
CODICE CLIENTE
NUMERO FAT
DATA FATT
ECC..

il problema sta nella tabella magazzino dove vengono memorizzati i
movimenti. L'integrità referenziale non posso applicarla perchè non
sempre il valore che ho su id ddt sta sulla tabella documento di
trasporto esempio
se si inserisce una fattura immediata il campo idddt sta a 0 dato che
verrà dato un valore al campo id fattura .. per cui la tabella
documento di trasporto non avrà un record corrispondente.

Avevo pensato a creare una query che tirasse fuori i valori dalla
tabella documento di trasporto ed i relativi movimenti corrispondenti
all'id di un certo numero ddt per poi usarla su un delete .. ma non mi
fa cancellare come immagginavo.
l'ultima idea sarebbe di creare un modulo che deleti eseguendo 2 delete
sulel 2 tabelle prendendo come variabile l'idddt di un certo numero ddt
es: numero ddt= 2 ha iddt =112 il modulo fa un delete sulla tabella
documento di trasporto per il record identificato dal quell'id e nesso
stesso momento fa un delete per idddt=112 anche nella tabella
magazzino.

Scusate se sono stato lungo ma non so come risolvere.
Grazie


[risposta]
Ma inizia a cancellare i record figli e poi il padre o viceversa?

Ciao.
--
Sergio MAZZA
gog
2006-09-26 06:58:56 UTC
Permalink
Post by gog
Salve , non sò neanche da dove iniziare .. ci provo.
Per problemi di struttura delle tabelle , mi è impossibile applicare
l'integrità referenziale tra la tabella documento di trasporto e la
tabella magazzino. Il db permette sia di gestire documenti di trasporto
sia fatture immeddiate sia (come normale che sia) il carico magazzino)
tabella documento di trasporto (dove viene inserita l'itestazione del
ID DDT contatore e chiave primaria
CODICE CLIENTE (per tirare fuori i dati dalla tabella clienti che
detiene tutta l'anagrafica)
NUMERO DDT
SEDE DDT (il db gestisce varie sedi identificate da una sigla)
DATA DDT
MODALITA TRASPORTO
CAUSALE TRASPORTO ECC... CAMPI CHE NON CI INTERESSANO PER RISOLVERE IL
PROBLEMA
tabella magazzino (dove vengono memorizzate tutte le movimentazioni)
ID MAGAZZINO (contatore e chiave primaria)
ID DDT (collega i movimenti di questa tabella a quella "documento di
trasporto")
ID FATTURA (collega i movimenti di questa tabella a quella "fattura")
QUANTITA
PREZZO
MAGAZ (per sapere da quale magazzino si ha la movimentazione)
TIPO MOV (per sapere se è un carico o scarico)
DATAMOV (per lo storico)
tabella DDT CARICO (dove metto numero e data del carico e che potrei
ID DDT (per legarlo alla tabella magazzino)
CODICE CLIENTE
NUMERO DDT
DATA DDT
MAGAZZ (magazzino dove viene caricato)
tabella fattura
ID FATTURA
CODICE CLIENTE
NUMERO FAT
DATA FATT
ECC..
il problema sta nella tabella magazzino dove vengono memorizzati i
movimenti. L'integrità referenziale non posso applicarla perchè non
sempre il valore che ho su id ddt sta sulla tabella documento di
trasporto esempio
se si inserisce una fattura immediata il campo idddt sta a 0 dato che
verrà dato un valore al campo id fattura .. per cui la tabella
documento di trasporto non avrà un record corrispondente.
Avevo pensato a creare una query che tirasse fuori i valori dalla
tabella documento di trasporto ed i relativi movimenti corrispondenti
all'id di un certo numero ddt per poi usarla su un delete .. ma non mi
fa cancellare come immagginavo.
l'ultima idea sarebbe di creare un modulo che deleti eseguendo 2 delete
sulel 2 tabelle prendendo come variabile l'idddt di un certo numero ddt
es: numero ddt= 2 ha iddt =112 il modulo fa un delete sulla tabella
documento di trasporto per il record identificato dal quell'id e nesso
stesso momento fa un delete per idddt=112 anche nella tabella
magazzino.
Scusate se sono stato lungo ma non so come risolvere.
Grazie
[risposta]
Ma inizia a cancellare i record figli e poi il padre o viceversa?
Ciao.
--
Sergio MAZZA
MA con l'integrità referenziale non te lo fa fare in quanto non te la
lascia applicare per i motivi sopraesposti ...
Sergio MAZZA
2006-09-26 07:29:03 UTC
Permalink
"gog" <***@gmail.com> ha scritto nel messaggio news:***@i42g2000cwa.googlegroups.com...

MA con l'integrità referenziale non te lo fa fare in quanto non te la
lascia applicare per i motivi sopraesposti ...


[risposta]
C'è qualcosa che mi sfugge.
Se elimini i figli e poi i padri non vedo perché l'integrità referenziale
dovrebbe "interferire".
Quindi per eliminare i record padri o fai come ti ho illustrato o cerchi il
motivo che blocca l'attivazione della integrità referenziale. Uno di questi
potrebbe essere che in uno dei campi ci sono valori nulli.
Leggi l'help in linea alla voce: Informazioni sulle relazioni in un database
di Access; in basso trovi: Integrità referenziale

Ciao.
--
Sergio MAZZA
andrea
2006-09-26 08:05:34 UTC
Permalink
Post by gog
MA con l'integrità referenziale non te lo fa fare in quanto non te la
lascia applicare per i motivi sopraesposti ...
[risposta]
C'è qualcosa che mi sfugge.
Se elimini i figli e poi i padri non vedo perché l'integrità referenziale
dovrebbe "interferire".
Quindi per eliminare i record padri o fai come ti ho illustrato o cerchi il
motivo che blocca l'attivazione della integrità referenziale. Uno di questi
potrebbe essere che in uno dei campi ci sono valori nulli.
Leggi l'help in linea alla voce: Informazioni sulle relazioni in un database
di Access; in basso trovi: Integrità referenziale
Ciao.
--
Sergio MAZZA
Buondì. Io cancellerei da una maschera che comprenda tutta le tabelle in
gioco prima l'ultima tabella nella catena delle relazioni, facendo sempre
riferimento alla chiave della tabella della tabella immediatamente
precedente sempre della catena. In pratica, ti gestisci tu l'integrità
referenziale...nel senso che dell'ultima tabella cancelli solo i record che
hanno la chiave della tabella immediatamente superiore e così via, fino ad
arrivare alla prima tabella, dove cancellerai il record che ha originato ilt
tutto.

Però mi sembra un pò troppo banale per non averci già pensato... :-(

--------------------------------
Inviato via http://arianna.libero.it/usenet/
gog
2006-09-26 16:17:52 UTC
Permalink
Post by gog
MA con l'integrità referenziale non te lo fa fare in quanto non te la
lascia applicare per i motivi sopraesposti ...
[risposta]
C'è qualcosa che mi sfugge.
Se elimini i figli e poi i padri non vedo perché l'integrità referenziale
dovrebbe "interferire".
Quindi per eliminare i record padri o fai come ti ho illustrato o cerchi il
motivo che blocca l'attivazione della integrità referenziale. Uno di questi
potrebbe essere che in uno dei campi ci sono valori nulli.
Leggi l'help in linea alla voce: Informazioni sulle relazioni in un database
di Access; in basso trovi: Integrità referenziale
Ciao.
--
Sergio MAZZA
Sergio , il problema non è che non mi fa fare l'integrità sul momento
, non lo lo ffare perchè i dati tra Master e secondaria non
corrispondono ne corrisponderanno mai quindi se creo l'integrità a
tabella vuota , poi non m,i farebbe mettere dei record che violano
questa integrità (e la violeranno sempre) dato che iddt della tabella
magazzino ha dei valori che possono essere : 0 se viene emessa una
fattura immediata (dato che viene riempito il campo id fattura e
lasciato a 0 id ddt) oppure iddt della tabella magazzino potrebbe
prendere il valore dalla tabella carico ( e quindi ci sarebbe una
incongruenza nella integrità dato che io la imposterei per le tabelle
documento di trasporto e magazzino) che quindi avrebbe un valore che si
trova nella tabella magazzino e NON nella tabella documento di
trasporto

In questo momento l'unica soluzione che mi viene in mente è quella di
un modulo che su click di un button esegua 2 query che deletano i
record delle 2 tabelle in base all idddt che prendono dalla form .. il
fatto è che personalmente sono 0 a creare codice e non saprei come
creare una cosa del genere
Sergio MAZZA
2006-09-26 16:21:06 UTC
Permalink
"gog" <***@gmail.com> ha scritto nel messaggio news:***@h48g2000cwc.googlegroups.com...
Sergio , il problema non è che non mi fa fare l'integrità sul momento
, non lo lo ffare perchè i dati tra Master e secondaria non
corrispondono ne corrisponderanno mai quindi se creo l'integrità a
tabella vuota , poi non m,i farebbe mettere dei record che violano
questa integrità (e la violeranno sempre) dato che iddt della tabella
magazzino ha dei valori che possono essere : 0 se viene emessa una
fattura immediata (dato che viene riempito il campo id fattura e
lasciato a 0 id ddt) oppure iddt della tabella magazzino potrebbe
prendere il valore dalla tabella carico ( e quindi ci sarebbe una
incongruenza nella integrità dato che io la imposterei per le tabelle
documento di trasporto e magazzino) che quindi avrebbe un valore che si
trova nella tabella magazzino e NON nella tabella documento di
trasporto

In questo momento l'unica soluzione che mi viene in mente è quella di
un modulo che su click di un button esegua 2 query che deletano i
record delle 2 tabelle in base all idddt che prendono dalla form .. il
fatto è che personalmente sono 0 a creare codice e non saprei come
creare una cosa del genere

[risposta]
Forse ho capito che mi sfugge.
Tu hai messo in relazione dei campi non di tipo contatore ma gestiti da te;
è così?

Ciao.
--
Sergio MAZZA
gog
2006-09-26 17:00:27 UTC
Permalink
Post by gog
Sergio , il problema non è che non mi fa fare l'integrità sul momento
, non lo lo ffare perchè i dati tra Master e secondaria non
corrispondono ne corrisponderanno mai quindi se creo l'integrità a
tabella vuota , poi non m,i farebbe mettere dei record che violano
questa integrità (e la violeranno sempre) dato che iddt della tabella
magazzino ha dei valori che possono essere : 0 se viene emessa una
fattura immediata (dato che viene riempito il campo id fattura e
lasciato a 0 id ddt) oppure iddt della tabella magazzino potrebbe
prendere il valore dalla tabella carico ( e quindi ci sarebbe una
incongruenza nella integrità dato che io la imposterei per le tabelle
documento di trasporto e magazzino) che quindi avrebbe un valore che si
trova nella tabella magazzino e NON nella tabella documento di
trasporto
In questo momento l'unica soluzione che mi viene in mente è quella di
un modulo che su click di un button esegua 2 query che deletano i
record delle 2 tabelle in base all idddt che prendono dalla form .. il
fatto è che personalmente sono 0 a creare codice e non saprei come
creare una cosa del genere
[risposta]
Forse ho capito che mi sfugge.
Tu hai messo in relazione dei campi non di tipo contatore ma gestiti da te;
è così?
Ciao.
--
Sergio MAZZA
No nel primo post spiegavo la struttura delle tabelle , la tabella
documento di trasporto ha IDDDT come contatore, la tabella ddt carico
ha IDDDT come contatore , la tabella magazzino ha IDDDT come numerico (
qui viene salvato o il valore di IDDT della tabella documento di
trasporto o il valore di id ddt della tabella ddt carico .. per questo
non posso applicare l'integrità)
GoG
Sergio MAZZA
2006-09-26 17:06:13 UTC
Permalink
"gog" <***@gmail.com> ha scritto nel messaggio news:***@e3g2000cwe.googlegroups.com...

No nel primo post spiegavo la struttura delle tabelle , la tabella
documento di trasporto ha IDDDT come contatore, la tabella ddt carico
ha IDDDT come contatore , la tabella magazzino ha IDDDT come numerico (
qui viene salvato o il valore di IDDT della tabella documento di
trasporto o il valore di id ddt della tabella ddt carico .. per questo
non posso applicare l'integrità)
GoG

[risposta]
Mi suona ancora molto strano.
Io l'integrità la applico senza problemi a campi contatore(univoco) - >
numerico intero lungo(duplicati ammessi) senza problemi.

Il problema è che utilizzi due campi idddt nella stessa tabella...

Ciao.
--
Sergio MAZZA
Michele (Giò)
2006-09-26 17:39:33 UTC
Permalink
Post by gog
No nel primo post spiegavo la struttura delle tabelle , la tabella
documento di trasporto ha IDDDT come contatore, la tabella ddt carico
ha IDDDT come contatore , la tabella magazzino ha IDDDT come numerico (
qui viene salvato o il valore di IDDT della tabella documento di
trasporto o il valore di id ddt della tabella ddt carico .. per questo
non posso applicare l'integrità)
Scusate se oso intromettermi, ma ho fatto fatica pure io a seguire i Vostri discorsi.

Se il problema sta nel fatto che hai più zeri dal lato figlio che non ticonsente di applicare
l'integrità referenziale in quanto manca il record padre, fai come me in qualche occasione
particolare.

Ti crei un record fasullo (Io lo chiamo Dummy, il manichino dei crash test...) che contenga lo zero
che ti consentirà di creare l'integrità referenziale, ma dovrai fare in modo che in tutte le
maschere venga filtrato e reso quindi non visibile ai non addetti.

Quando lo riterrai opportuno, potrai vedere invece tutti i figli del manichino (ah ah).

Secondo me è un bel sistema. Il record Dummy lo usavo le prime volte quando non ero ancora pratico
di VBA.

Saluti

Michele
Sergio MAZZA
2006-09-27 06:02:10 UTC
Permalink
Post by Michele (Giò)
Scusate se oso intromettermi, ma ho fatto fatica pure io a seguire i Vostri discorsi.
Vostri? Sono nell'NG e a disposizione di tutti.
Post by Michele (Giò)
Se il problema sta nel fatto che hai più zeri dal lato figlio che non
ticonsente di applicare l'integrità referenziale in quanto manca il record
padre, fai come me in qualche occasione particolare.
Ti crei un record fasullo (Io lo chiamo Dummy, il manichino dei crash
test...) che contenga lo zero che ti consentirà di creare l'integrità
referenziale, ma dovrai fare in modo che in tutte le maschere venga
filtrato e reso quindi non visibile ai non addetti.
Quando lo riterrai opportuno, potrai vedere invece tutti i figli del manichino (ah ah).
Secondo me è un bel sistema. Il record Dummy lo usavo le prime volte
quando non ero ancora pratico di VBA.
Saluti
Michele
Il problema secondo me è in come gog ha progettato le tabelle...

Ciao.
--
Sergio MAZZA