Access

sabato 28 aprile 2012 - 14.42
Tag Elenco Tags  .NET 3.0  |  Windows 7  |  Access (.mdb)  |  Office 2003  |  Internet explorer 8.0  |  Javascript

speedy Profilo | Newbie

Ciao a tutti,
sono un nuovo utente, ed avrei bisogno di aiuto con un database access che ho costruito negli anni e adesso è un pò troppo grande e mi da qualche problema di compilazione.
Il database è composto da uno con le tabelle e da un'altro con le maschere e le query con il quale vengono compilate le tabelle che sono circa 60!
Il mio problema è che non tutte le tabelle sono compilate durante l'immissione dei dati, per cui quando eseguo una query che prevede alcune tabelle che in alcuni record non sono compilate, perdo dei record nella query.
Ora, io non sono esperto di VBA e/o di Macro, per cui chiederei aiuto per scrivere una routine/Funzione/macro che al momento dell'inserimento di alcuni dati inun record, al momento della chiusura dello stesso o al momento dell'inizio dell'inserimento, mi compili, attivando magari solo il campo ID_ comune a tutte e anche chiave primaria, tutte le tabelle collegate nel record
Ci sarebbe cortesemente qualcuno che mi può dare una mano? E' prevista una funzione in Access che impostata in qualche modo fa già questo?
Grazie in anticipo a tutti coloro che prenderanno in considerazione questa richiesta e complimenti per il sito
Speedy

renarig Profilo | Expert


Non riesco a capire il problema,

Da quello che dici mi dembra che
___ ti manca qualche valore predefinito
___ oppure devi perfezionare qualche Join


Ma se fosse un problema simile lo avresti osservato anche all'inizio
invece sembra dipenda dal carico di dati degli anni


___________________________________________________________________


Dicci qualcosa
_sulla struttura delle tabelle
_sui metodi di update / insert
_sulle query che ti fanno perdere i record

Dopo forse potremo capire meglio


Saluti

speedy Profilo | Newbie

Ciao Renaring, grazie della risposta.
Cercherò di spiegarmi meglio
Il database è composto da 91 tabelle nel file dati e circa 100 maschere nel file che gestisce i dati.
C'è una tabella principale (EVENTO_INDICE) a cui sono collegate tutte le altre con un join ID_EVENTO con rapporto uno-a-uno ed a qualcuna di queste sono collegate altre tabelle con un join uno-a-molti
Quando vengono inseriti i dati non vengono utilizzate sempre tutte le tabelle che peròper alcuni record vengono utilizzate nelle query, che non trovando tabelle collegate e compilate, escludono tutto il record (Esempio: Tabella EVENTO_INDICE, tab PRODOTTI, tab ORDINI, tab CLIENTI, con tab ORDINI senza inserimento dei dati perchè in quel momento non vi erano ordini. Quando si esegue la query che comprende tutte le tabelle specificate, questa esclude il record in cui non vi erano ordini). Si può fare in modo che quando inizio l'inserimento dati di un nuovo record, o quando lo si chiude alla fine dell'inserimento, il database attivi anche la tabella senza dati inseriti, magari aggiornando solo il campo ID_EVENTO, in modo che quando viene eseguita la query questa prenda in considerazione anche il record con la tabella senza dati, e quindi non venga perso tale record?
Spero di essere stato chiaro. Forse è un non-problema, ma a me servirebbe che tutte le tabelle del record attivo venissero in qualche modo attivate anche senza dati (mi rendo conto che almeno il campo indice di join lo dovrebbe!)
Grazie ancora per l'aiuto

Speedy

renarig Profilo | Expert

Provo a Schematizzare il problema:

Tu hai una tabella principale ( Chiamiamola AA )
con dentro i campi:
__ AAId _______ Key
__ AAEccetera

Poi hai delle tabelle dipendenti ( Chiamiamole BB, CC, DD, Eccetera )
con dentro i camoi:
__ BBId _______ Key
__ BBEccetera


__ CCId _______ Key
__ CCEccetera


__ DDId _______ Key
__ DDEccetera


Poi hai delle relazioni 1 a 1 fra:

__ AAId e BBId
__ AAId e CCId
__ AAId e DDId



Immagino che tu abbia usato la "Integrita referenziale "
per cui potresti avere dei record mancanti in BB, CC, DD,
Ma NON puoi avere dei record mancanti in AA
Giusto ?


_________________________________________________________________

Consideriamo per semplicita solo le tabelle AA e BB
________________________________________________________________



In AAId hai i valori: 1, 2, 3, 4,
In BBId hai i valori: 1, 2, 4,


_________ Con la query Q01

SELECT
AA.AAId,
AA.AAEccetera,
BB.BBId,
BB.BBEccetera
FROM
AA
INNER JOIN
BB
ON
AA.AAId = BB.BBId
;

Ottieni giustamente i valori 1, 2, 4,
perche hai un JNNER JOIN



_________ Ma con la query Q02

SELECT
AA.AAId,
AA.AAEccetera,
BB.BBId,
BB.BBEccetera
FROM
AA
LEFT JOIN
BB
ON
AA.AAId = BB.BBId
;


Ottieni i valori 1, 2, 3, 4,
perche hai un LEFT JOIN



Questa potrebbe essere una prima soluzione del tuo problema
e non devi aggiungere nessun record nelle tabelle
bensi modificare le query.



_________________________________________________________________________
_________________________________________________________________________
_________________________________________________________________________
_________________________________________________________________________



Una seconda e diversa soluzione invece potrebbe essere:

__ Lasci le query come sono
__ Aggiungi i dati mancanti nelle tabelle


La tabella AA la consideriamo sempre completa e modello per tutte le altre tabelle
( ricorda che sopra abbiamo ipotizzato di usare la "integrita referenziale")

Le tabelle BB, CC, DD devono aggiornarsi


In particolare alla tabella BB dobbiamo aggiungere il record 3


Quindi devi fare una query QAABB
di accodamento fra AA e BB




INSERT INTO BB
( BBId )
SELECT
AA.AAId
FROM
AA
LEFT JOIN
BB
ON
AA.AAId = BB.BBId
WHERE
(((BB.BBId) Is Null))
;



Di queste query ne devi fare 1 per ogni tabella QAABB, QAACC, QAADD

__________________________________________________________________
_________________________________________________________________
__________________________________________________________________
__________________________________________________________________



La terza soluzione ( che è una evoluzione naturale della seconda )
è quella di raggruppare tutte le tue QAABB, QAACC, QAADD in un modulo VBA
che puoi eseguire quando vuoi.



Per questa soluzione ( Che mi sembra la migliore )
guardati bene nel file allegato la maschera "Mas1"
e il suo codice


_____________________________________________________________________



Facci sapere

Saluti

speedy Profilo | Newbie

Grazie Renarig,
Penso che proverò ad usare la terza soluzione, anche se scrivere codice per 90 tabelle è dura!
Ti farò sapere
Speedy

renarig Profilo | Expert

ma non è poi cosi dura,

è solo questione di copia e incolla

Poi devi modificare in ognuna delle 90 query i nomi della tabella e del campo.

Ti posto sotto una versione un po piu evoluta di codice della "Mas1"
le modifiche apportare sono:
__ Ho scritto a query su una sola riga per risparmiare spazio nella lunghezza del codice
__ Ho dichiarato all'inizio di ogni query NT e NC ( NomeTabella e NomeCampo )
in modo che li devi scrivere una sola volta per ogni query



Saluti




Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

speedy Profilo | Newbie

Sei grande!
Avevo già fatto e provato la query che funziona alla grande (mi ha aggiornato tutti i 1000 e passa record che avevo già inserito)
Comunque grazie per la versione evoluta sarà utile per qualcun altro
Non so come ringraziarti, mi hai veramente risolto un grosso problema

Speedy
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5