Newsgroup: it.comp.appl.access
Titolo: trasposizione dati tra due tabelle

Buonasera a tutto l'NG !
Un questione che per me, dopo aver consultato gli arretrati sull NG risulta
insormontabile.......
Ho due tabelle cosi strutturate :
TAB1
tipo|codice|nomevalore|valore
piatto|000042305010|colore|23
piatto|000042306010|materiale|alluminio
piatto|000042307010|lavorazione|a caldo
piatto|000042311010|imballo|scatola
piatto|000042316010|dimensioni|21
TAB2
ogni famiglia di prodotto eredita della tabella 1  i nomi dei campi che sono
quelli che nella TAB1 sono in orizzontale come valore dei campi nomevalore e
valore
tipodiprodotto|codice|colore|materiale|lavorazione|imballo|dimensioni
piatto|000042305010||blu|alluminio|a freddo|scatola|21 cm
come posso fare a realizzare una cosa del genere? premetto che ho circa 50
tabelle da comporre che attualmente sono vuote ma gia contengono per ogni
struttura i nomi dei campi corrispondenti ai valori dei campi da trasporre
in orizzontale dalla tabella 1
Mi date una mano per favore per  poter risolvere questo problema ?
spero tanto di essermi spiegato sufficentemente!
Grazie e in eterno debito al NG!
Paolo

 ha scritto nel messaggio
news:Uqgxe.40760$bc.3...@tornado.fastwebnet.it...

Per prima cosa mi viene di pensare che dovrebbe esserci anche una tabella
dei colori, visto che in TAB1 i colori sono espressi con un numero mentre in
TAB2 vuoi i colori in chiaro (nel tuo esempio in TAB1 c'è il colore 23
mentre in TAB2 c'è blu); visto che non hai accennato all'esistenza ed alla
struttura di una tabella dei colori, nella mia soluzione riporterò in TAB2
il numero del colore trovato in TAB1.
Sembrerebbe anche che esiste un problema relativo all'unità di misura delle
dimensioni che nel tuo esempio sembra essere uguale a cm: è sempre uguale a
cm? Se si è inutile indicarlo in TAB2, in caso contrario dovresti dire quale
è la regola per determinare l'unità di misura: nella mia soluzione riporterò
in TAB2 solo il numero della dimensione trovato in TAB1.
Comunque le modifice da apportare per risolvere questi due problemi sono
sicuramente marginali.
Se la struttura di TAB1 è la seguente:
ID                    Contatore e chiave primaria
tipo                  Testo
codice              Testo
nomevalore       Testo
valore               Testo
A proposito, ti sconsiglio di usare per i tuoi oggetti nomi come tipo,
codice, valore: con il generatore di espressione potresti avere degli
incomprensibili malfunzionamenti.
Se la struttura di TAB2 è la seguente:
ID                    Contatore e chiave primaria
tipodiprodotto   Testo
codice               Testo
colore                Testo
materiale           Testo
lavorazione        Testo
imballo              Testo
dimensioni         Testo
Per inomi vale quanto scritto sopra.
Per popolare TAB2 potresti usare una query di accodamento che abbia il
seguente codice SQL:
INSERT INTO TAB2 ( tipodiprodotto, codice, colore, materiale, lavorazione,
imballo, dimensioni )
SELECT TAB1.tipo AS tipodiprodotto, TAB1.codice,
DLookUp("valore","TAB1","tipo='" & [tipo] & "' And codice ='" & [codice] &
"' And nomevalore= 'colore'") AS colore, DLookUp("valore","TAB1","tipo='" &
[tipo] & "' And codice ='" & [codice] & "' And nomevalore= 'materiale'") AS
materiale, DLookUp("valore","TAB1","tipo='" & [tipo] & "' And codice ='" &
[codice] & "' And nomevalore= 'lavorazione'") AS lavorazione,
DLookUp("valore","TAB1","tipo='" & [tipo] & "' And codice ='" & [codice] &
"' And nomevalore= 'imballo'") AS imballo, DLookUp("valore","TAB1","tipo='"
& [tipo] & "' And codice ='" & [codice] & "' And nomevalore= 'dimensioni'")
AS dimensioni
FROM TAB1
GROUP BY TAB1.tipo, TAB1.codice;
Se poi preferisci usare delle subquery al posto della funzione di
aggrgazione DLookup, usa una query di accodamento che ha il seguqnte codice
SQL:
INSERT INTO TAB2 ( tipodiprodotto, codice, colore, materiale, lavorazione,
imballo, dimensioni )
SELECT Pippo.tipo AS tipodiprodotto, Pippo.codice, (SELECT valore FROM TAB1
WHERE [tipo] = Pippo.tipo And [codice] = Pippo.codice And [nomevalore] =
"colore";) AS colore, (SELECT valore FROM TAB1 WHERE [tipo] = Pippo.tipo And
[codice] = Pippo.codice And [nomevalore] = "materiale";) AS materiale,
(SELECT valore FROM TAB1 WHERE [tipo] = Pippo.tipo And [codice] =
Pippo.codice And [nomevalore] = "lavorazione";) AS lavorazione,
DLookUp("valore","TAB1","tipo='" & [tipo] & "' And codice ='" & [codice] &
"' And nomevalore= 'imballo'") AS imballo, DLookUp("valore","TAB1","tipo='"
& [tipo] & "' And codice ='" & [codice] & "' And nomevalore= 'dimensioni'")
AS dimensioni
FROM TAB1 AS Pippo
GROUP BY Pippo.tipo, Pippo.codice;
Visto che si usano query di accodamento, occorre, prima di eseguirle, di
cancellare tutti gli eventuali record contenuti in TAB2, in caso contrario i
nuovi record si accoderanno ai vecchi; in alternativa usa delle query di
creazione tabella invece che query di accodamento, nel qual caso TAB2 non
devi dichiarartela a priori, saranno le query stesse a crearne la strutura
ex-novo.
Se opti per questa soluzione i codici SQL delle due queries di cui sopra
diventeranno rispettivamente:
SELECT TAB1.tipo AS tipodiprodotto, TAB1.codice,
DLookUp("valore","TAB1","tipo='" & [tipo] & "' And codice ='" & [codice] &
"' And nomevalore= 'colore'") AS colore, DLookUp("valore","TAB1","tipo='" &
[tipo] & "' And codice ='" & [codice] & "' And nomevalore= 'materiale'") AS
materiale, DLookUp("valore","TAB1","tipo='" & [tipo] & "' And codice ='" &
[codice] & "' And nomevalore= 'lavorazione'") AS lavorazione,
DLookUp("valore","TAB1","tipo='" & [tipo] & "' And codice ='" & [codice] &
"' And nomevalore= 'imballo'") AS imballo, DLookUp("valore","TAB1","tipo='"
& [tipo] & "' And codice ='" & [codice] & "' And nomevalore= 'dimensioni'")
AS dimensioni INTO TAB2
FROM TAB1
GROUP BY TAB1.tipo, TAB1.codice;
e
SELECT Pippo.tipo AS tipodiprodotto, Pippo.codice, (SELECT valore FROM TAB1
WHERE [tipo] = Pippo.tipo And [codice] = Pippo.codice And [nomevalore] =
"colore";) AS colore, (SELECT valore FROM TAB1 WHERE [tipo] = Pippo.tipo And
[codice] = Pippo.codice And [nomevalore] = "materiale";) AS materiale,
(SELECT valore FROM TAB1 WHERE [tipo] = Pippo.tipo And [codice] =
Pippo.codice And [nomevalore] = "lavorazione";) AS lavorazione,
DLookUp("valore","TAB1","tipo='" & [tipo] & "' And codice ='" & [codice] &
"' And nomevalore= 'imballo'") AS imballo, DLookUp("valore","TAB1","tipo='"
& [tipo] & "' And codice ='" & [codice] & "' And nomevalore= 'dimensioni'")
AS dimensioni INTO TAB2
FROM TAB1 AS Pippo
GROUP BY Pippo.tipo, Pippo.codice;
Comunque fossi in te io eviterei di crearmi TAB2 per contenere i dati dopo
la trasposizione e mi limiterei a creare una query a campi incrociati che
abbia il seguente codice SQL:
TRANSFORM First(TAB1.valore) AS [Il valore]
SELECT TAB1.tipo AS tipodiprodotto, TAB1.codice
FROM TAB1
GROUP BY TAB1.tipo, TAB1.codice
PIVOT TAB1.nomevalore;
quindi userei nella mie elaborazioni tale query al posto di TAB2.
-- 
Roberto
-----------------------------------------------------
il Sito Comune di it.comp.appl.access
http://www.sitocomune.com
----------------------------------------------------

 ha scritto nel
messaggio news:kBsxe.33162$yM4.5...@twister2.libero.it...

Ciao Roberto e infinite grazie per la esaurientissima risposta che adesso
provero ad attuare nel DB! si le tue considerazioni in base a cio che ho
elencato sono corrette, cerco comunque di spiegare meglio, anche se mi sa
che le soluzioni che mi hai indicato credo siano gia a posto....ti sapro
senz'altro dire.
In sostanza si tratta di una tabella che contiene oltre alla famiglia di
prodotto (che sono circa diciamo 30) e i relativi codici, un campo che
contiene gli attributi del prodotto ma messi in verticale con sempre in
verticale il relativo valore, mentre l'altra tabella riporta gli attributi
dei campi (che in tab1 sono in verticale) come nome dei campi (quindi
passano da valore a nome del campo con il relativo valore di riferimento.
Adesso provo non prima di ringraziarti di nuovo !
Scusate se ho lasciato il tutto ....nel replay...
Paolo



Ciao Roberto, ho applicato tutte e 3 le soluzioni che mi hai proposto e,
come mi suggerivi la terza che crea la TAB2 a campi incrociati è immediata
anche perche non dipende dal numero dei campi (tipodi valore) che puo essere
variabile, le altre due si eseguono normalmente ma non scrivono i valori nei
campi ma solo il tipo di prodotto e il codice, e non sono riuscito a
comprendere il perche.
Ultima questione banale se vuoi ma che non ho chiara, la query a campi
incrociati come posso fare a salvarla come tabella in modo che i campi che
vengono creati dalla query siano effettivi anche nella tabella? (dato che se
la salvo mi restituisce i campi come fosse la TAB1) scusami per la domanda
messa in questo modo per favore.
Grazie infinite della tua collaborazione!


 Paolo
-- 
Roberto


Ciao Roberto e buona domenica anche a tutto il NG
Ho repplicato esattamente le strutture delle tabelle come tu le hai
indicate e qualcosa è cambiato nel senso che ora scrive in tab2   3 su
5 valori, andro alla ricerca di dove ancora ho degli errori e alla fine
penso che riusciro a far quadrare le cose....
L'utilizzo dei dati da poter scrivere in tabella è motivato dal fatto
che questi devono poi comunque finire in tante altre tabelle
predefinite che alimenteranno il caricamento di dati in ambiente
Oracle.
Scrivo tramite web dato che sulla rete fastweb il server news è down
da due gg.....
Ti auguro una buona settimana e grazie di nuovo per il tuo prezioso
aiuto come sempre
Paolo

rispondo a me stesso per dire a Roberto che le soluzione che creano la
tab2 funzionano molto bene, ho solo corretto l'SQL come segue :
SELECT [TAB1].[tipo] AS tipodiprodotto, [TAB1].[codice],
DLookUp("valore","TAB1","tipo='" & [tipo] & "' And codice ='" &
[codice] & "' And nomevalore= 'colore'") AS colore,
DLookUp("valore","TAB1","tipo='" & [tipo] & "' And codice ='" &
[codice] & "' And nomevalore= 'materiale'") AS materiale,
DLookUp("valore","TAB1","tipo='" & [tipo] & "' And codice ='" &
[codice] & "' And nomevalore= 'lavorazione'") AS lavorazione,
DLookUp("valore","TAB1","tipo='" & [tipo] & "' And codice ='" &
[codice] & "' And nomevalore= 'imballo'") AS imballo,
DLookUp("valore","TAB1","tipo='" & [tipo] & "' And codice ='" &
[codice] & "' And nomevalore= 'dimensioni'") AS dimensioni INTO TAB2ok3
FROM TAB1
GROUP BY [TAB1].[tipo], [TAB1].[codice];
SELECT Pippo.tipo AS tipodiprodotto, Pippo.codice, (SELECT valore FROM
TAB1  WHERE [tipo] = Pippo.tipo And [codice] = Pippo.codice And
[nomevalore] =  "colore";) AS colore, (SELECT valore FROM TAB1 WHERE
[tipo] = Pippo.tipo And  [codice] = Pippo.codice And [nomevalore] =
"materiale";) AS materiale, (SELECT valore FROM TAB1 WHERE [tipo] =
Pippo.tipo And [codice] =  Pippo.codice And [nomevalore] =
"lavorazione";) AS lavorazione, (SELECT valore FROM TAB1  WHERE [tipo]
= Pippo.tipo And [codice] = Pippo.codice And [nomevalore] =
"imballo";) AS imballo, (SELECT valore FROM TAB1 WHERE [tipo] =
Pippo.tipo And  [codice] = Pippo.codice And [nomevalore] =
"dimensioni";) AS dimensioni INTO TAB2ok4
FROM TAB1 AS Pippo
GROUP BY Pippo.tipo, Pippo.codice;
nella prima c'erano dei caratteri (.) che sono stati inseriti dal copia
e incolla....
nella seconda ho sostituito le DLookup con le SELECT come per i primi
tre valori che regolarmente scriveva
Tutto ok quindi .....e a Roberto il consueto ringraziamento sei stato
prezioso come al solito
Grazie scusate se scrivo sempre da web ma Fastweb ,,,,,latita...
Paolo