Newsgroup: it.comp.appl.access
Titolo: Cancellare record a catena senza impostare integrità referenziale

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

 ha scritto nel messaggio news:1159182183....@i3g2000cwc.googlegroups.com...







tabella fattura




[risposta]
Ma inizia a cancellare i record figli e poi il padre o viceversa?
Ciao.
-- 
Sergio MAZZA 

Sergio MAZZA ha scritto:

MA con l'integrità referenziale non te lo fa fare in quanto non te la
lascia applicare per i motivi sopraesposti ...

 ha scritto nel messaggio 
news:1159253936.3...@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 


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/

Sergio MAZZA ha scritto:

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

 ha scritto nel messaggio 
news:1159287472.0...@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 

Sergio MAZZA ha scritto:

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

 ha scritto nel messaggio 
news:1159290027.3...@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 

 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

 Michele
Il problema secondo me è in come gog ha progettato le tabelle...
Ciao.
-- 
Sergio MAZZA 

Michele (Giò) ha scritto:

Grazie michele , sarebbe una buona idea ma , oltre al fatto degli 0 ,
c'è anche il discorso che nel campo iddt possono trovarsi valori presi
o da tabella carivo o da tabella documento di trasporto che essendo 2
contatori in entrambe le tabelle , hanno valori diversi di volta in
volta ..
se faccio uno screen della struttura delle 3 tabelle , potrebbe esservi
utile?
Credo che come ha fatto notare Sergio , se non capite com'è
strutturata non potete darmi una mano
ecco il link allo screen :
http://www.cropcirclecrew.org/public/screenfatmag.jpg
spero che con questo abbia un pò chiarito
Grazie per gli sforzi :)
GoG

 ha scritto nel messaggio
news:1159346515.9...@d34g2000cwd.googlegroups.com...
Grazie michele , sarebbe una buona idea ma , oltre al fatto degli 0 ,
c'è anche il discorso che nel campo iddt possono trovarsi valori presi
o da tabella carivo o da tabella documento di trasporto che essendo 2
contatori in entrambe le tabelle , hanno valori diversi di volta in
volta ..
se faccio uno screen della struttura delle 3 tabelle , potrebbe esservi
utile?
Credo che come ha fatto notare Sergio , se non capite com'è
strutturata non potete darmi una mano
ecco il link allo screen :
http://www.cropcirclecrew.org/public/screenfatmag.jpg
spero che con questo abbia un pò chiarito
Grazie per gli sforzi :)
GoG
[risposta]
Mhmm...
Ma la tabella Magazzino che ce li ha a fare tutti quegli id se poi hai un
codice cliente che viene ripetuto nel DDT e Fattura?
Basterebbe legarle per codice cliente, ma, secondo me stiamo fuori strada...
Ciao.
-- 
Sergio MAZZA

Sergio MAZZA ha scritto:

Si, il codice cliente potrei anche levarlo (sto sistemandolo priam era
diverso quindi leverò ciò che non serve a tempo debito).
Tutti quegli ID servono , per tirare fuori i vari dati da stampare es,
idddt serve per ottenere il movimento e collegare l'intestazione del
ddt al movimento, idem per id fattura ma in questo caso l'intestazione
è presa dalla tabella fattura, id fattura fornitore è da deletare
dato che non serve.
Secondo voi quel discorso che io facevo su un modulo che esegue 2 query
delete in base a iddt che trova su form , non è fattibile?

 ha scritto nel messaggio 
news:1159352196.8...@m7g2000cwm.googlegroups.com...
Si, il codice cliente potrei anche levarlo (sto sistemandolo priam era
diverso quindi leverò ciò che non serve a tempo debito).
[risposta]
Veramente dicevo il contrario.
Tutti quegli ID servono , per tirare fuori i vari dati da stampare es,
idddt serve per ottenere il movimento e collegare l'intestazione del
ddt al movimento, idem per id fattura ma in questo caso l'intestazione
è presa dalla tabella fattura, id fattura fornitore è da deletare
dato che non serve.
Secondo voi quel discorso che io facevo su un modulo che esegue 2 query
delete in base a iddt che trova su form , non è fattibile?
[risposta]
(quasi)Tutto è possibile; fare due query di cancellazione non è un gran 
problema...
Ciao.
-- 
Sergio MAZZA 

Sergio MAZZA ha scritto:

Si lo so che fare le query non è una cosa impossibile, quello che non
mi riesce è creare un modulo che prenda come variabile ID DDT (che si
trova nella form)e lo passi alle 2 query per deletare i record .. per
me è una cosa abbastanza difficile.
Grazie

 ha scritto nel messaggio 
news:1159366277.5...@m73g2000cwd.googlegroups.com...
Si lo so che fare le query non è una cosa impossibile, quello che non
mi riesce è creare un modulo che prenda come variabile ID DDT (che si
trova nella form)e lo passi alle 2 query per deletare i record .. per
me è una cosa abbastanza difficile.
Grazie
[risposta]
dim strSQL as string
strSQL = "Delete * From nomeTabella Where iddt=" & me!iddt
Docmd.runsql strSQL
Ciao.
-- 
Sergio MAZZA 

Sergio MAZZA ha scritto:

Per far eseguira 2 volte una query delete al click di un pulsante,
basta che copio il codice 2 volte?
Sergio posso contattarti privatamente?
Grazie