Newsgroup: it.comp.appl.access
Titolo: query particolare

Con una query dovrei popolare una colonna presente in una tabella : il 
valore da inserire è in funzione
del valore presente in un altra colonna della medesima tabella.
Esempio : se nella colonna A c'è il valore  X  allora nella colonna B  metti 
una Y .
Se nella colonna A c'è invece il valore Z , allora metti il valore K nella 
colonna B.
Si può creare una query che operi questa valutazione prima di inserire un 
valore nella colonna B ?
grazie e saluti 

 ha scritto nel messaggio 
news:458f048c$0$22399$4faf...@reader2.news.tin.it...

Buon Natale Gabriele,
credo che tu stia cercando di violare il primo comandamento della 
Normalizzazione dei DB.
Non creare campi che contengano valori che derivano da calcoli di altri 
campi dello stesso record.
Questo perchè è meglio ricalcolare ed ottenere il valore, che consumare 
spazio inutile nelle tabelle.
Ma siccome oggi siamo tutti buoni, quello che vuoi fare è possibile tramite 
una query di aggirnamento.
qualcosa del tipo
UPDATE tPerQuery SET tPerQuery.campoB = 
IIf([campoA]="X","Y",IIf([campoA]="Z","K",""));
logicamente dovrai sostituire i nomi dei campi [campoA]origine e 
[campoB]destinazione ed anche il nome della tabella[tPerQuery].
In tutto questo è implicito che se il vaglio diventa più complesso la 
formula diventa illegibile e... ci sono anche dei limiti alla IIF indentate, 
ma con 2007 credo superati.
Il primo comandamento ti imporrebbe di prevedere un [controllo calcolato] 
sulla maschera o sul report, che ha origine da [campoA] ed esegue la 
'conversione' al volo. Effetto hi un solo campo in tabella e ne puoi 
'mostrare' varie faccie dove vuoi tu.
IvanDaBologna 

 'mostrare' varie faccie dove vuoi tu.
 in realtà non è un calcolo matematico , ma una mera associazione.
Ad es. nella colonna  A c'è il nome di una nazione , nella colonna B ci devo 
inserire la rispettiva capitale:
per evitare di compilare il campo capitale riga per riga  da una apposita 
maschera con i controlli text box
collegati a tale tabella , pensavo di far prima e riempire la colonna B 
appunto con una query , previa
valutazione della nazione corrispondente presente sullo stesso record .
Si può fare quindi ?
ciao e grazie 

 ha scritto nel messaggio 
news:45905ba0$0$19088$4faf...@reader4.news.tin.it...

e allora Buon S.Stefano,
ti indico il modo di agire più diffuso (per non dire il migliore).
Devi creare una tabella Nazioni, con  almeno tre campi 
idNaz,Nazione,Capitale (poi se vuoi ci puoi mettere anche altri dati 
caratteristici, ma non ciservono ora).
Questa nuova tabella sarà relazionata a quella che hai già.
La relazione si stabilisce su un campo di tipo numerico lungo che chiamerai 
Naz (nell vecchia tabella).
Ecco la magia! già fatto!
A uesto punto hai già risolto:
1) hai i dati Nazione una volta sola!
2) nelle tabelle collegate ti riferisci al solo idNazi per 'prelevare' i 
dati che ti servono, bada bene che 'prelevare' vuol solo dire 'mostrare' e 
non 'inserire' fisicamente il dato nella tabella. Infatti non serve 
inserire, ma solo riferirsi al giusto record.
Ammettiamo che la nazione 1 sia l'Albania, con capitale Tirana.
Nella tabella destinazione avresti il campo che contiene il solo numero 1 !
Stabilisci correttamente la relazione (menu Strumenti-->Relazioni ... 
selezioni le due tabelle, afferri il campo IdNaz(da tabella nazioni) e lo 
trascini verso il campo Naz (tabella tua!) e poi click destro sulla linea 
che hai creato e Modifica relazione .. premi il bottone Tipo join .. e 
scegli il tipo 2).
A questo punto hai imposto un legame tra le due tabelle.
Per vederne gli effetti crea una query che comprenda le due tabelle e che 
elenchi tutti i campi. Vedrai righe esattamente composte da tutti i dati, 
nazione compresa, che fisicamente risiedono in tabelle diverse e SOPRATUTTO 
non sono ripetuti! Infatti tu puoi riferirti in svariati records all'Albania 
e leggerne la capitale, ma in realtà hai solo l'occupazione di un numero per 
ogni record e non la ripetizione di Stringhe di caratteri uguali.
IvanDaBologna 

 idNaz,Nazione,Capitale
Invece con la query che utilizza l'espressione condizionale IIF  , come 
diventa ?
Il fatto è che non vorrei creare una terza  tabella , dal momento che le 
capitali esatte risiedono già
in un file TXT pronto da importare .
Il problema è la modalità di imporatazione , la tabella esistente ha già la 
colonna CAPITALE , ma è vuota , io devo
riempirla .
ciao

 ha scritto nel messaggio 
news:45914dad$0$16146$4faf...@reader3.news.tin.it...

a questo punto sono confuso ...
Se hai un file di testo con nazioni e capitali, importa quello in una 
tabella temporanea e poi decidi se farla diventare la tabella effettiva.
Altrimenti, una volta importato in una tabella temporanea, crei una query 
che 'associa' la capitale con la nazione, ma vado a tentoni ... dimmi 
esattamente cosa devi fare.
 Con le IIF puoi arrivare fino a sei o sette o otto condizioni ma poi ti 
fermi( e comunque fai prima a immetterle a mano che costruirti una 
condizione così complessa!!).
 Con una query non avresti problema anche per i 254 stati del mondo!
IvanDaBologna

 esattamente cosa devi fare.
esiste nel file di access  la tabella A , con le colonne IDNAZ,NOME_NAZIONE 
, ABITANTI , SUPERFICIE ....,CAPITALE.
La colonna capitale è vuota , vorrei riempirla con una query anzichè da form 
, per risparmiare lavoro all'operatore .
Mi hanno preparato un file txt pronto per l'import , cioè con un tracciato 
che rispetta le colonne della tabella A.
Nel file txt ci sono solo due campi valorizzati , IDNAZ e  CAPITALE.
Come imposto la query affinchè mi si popoli la colonna CAPITALE 
automaticamente importando tale  file txt ?
Se importassi in una NUOVA tabella anzichè dentro alla tabella A , otterrei 
una tabella con sole due colonne popolate , IDNAZ e CAPITALE.
Il programma che usa tale tabella A chiaramente ignorerebbe la tabella NUOVA 
, per cui non saprei usarla tale NUOVA tabella.
grazie e ciao 

 ha scritto nel messaggio 
news:4592ec36$0$22397$4faf...@reader2.news.tin.it...

Scusa ma ho capito il tuo problema.
La tabella nuova devi crearla e la ELIMINERAI al termine dell'AGGIORNAMENTO.
(anzi crea anche una copia di tabellaA così puoi sempre recuperare la 
situazione precedente!!!)
La crei e importi il file di testo, due colonne come descritto.
Devi fare questo per avere disponibili i campi per la query di AGGIORNAMENTO 
che andrai a creare.
La query avrà questa struttura ( i nomi dei campi e delle tabelle sono da 
adattare alla tua realtà):
UPDATE tabellaA
INNER JOIN tabellaDaTESTO ON tabellaA.idNAZ = tabellaDaTESTO.idNAZ
SET tabellaA.CAPITALE = tabelladatesto.capitale;
Il tutto lo copi nella zona SQL di una nuova query vuota e, dopo aver 
adattato i nomi di campi e tabelle, la esegui.
Se l'aggiornamento ha avuto l'effetto desiderato puoi 'buttare via' la 
tabella Nuova e la query !!!!!
Ora hai la tua bella tabellaA aggiornata con i dati che ti hanno preparato.
IvanDaBologna


ok , provo questa , grazie