Newsgroup: it.comp.appl.access
Titolo: Trasposizione righe colonne

Ho trovato e adattato alla mia situazione il codice di cui sotto che mi esegue la trasposizione dei valori di un campo (CodRep) da colonna a riga.
Vorrei che nella TargetTable (S22) oltre al campo ID ci fosse anche un altro campo (SitoMag) presente nella SouceTable.
Purtroppo nonostante tanti tentativi non ci sono riuscito.
Sarei infinitamente grato se qualcuno vorrà dare un suggerimento
   Gabriele
 
Dim RS1_1 As Recordset, RS1_2 As Recordset, RS2 As Recordset
Dim SQL As String, S As String, SourceTable As String, TargetTable As String
 
'-- Definizioni --
SourceTable = "S11"
TargetTable = "S22"
'------------------
SQL = "SELECT " & SourceTable & ".ID FROM " & SourceTable
SQL = SQL & " GROUP BY " & SourceTable & ".ID;"
Set RS1_1 = CurrentDb.OpenRecordset(SQL, dbOpenDynaset)
Set RS1_2 = CurrentDb.OpenRecordset(SourceTable, dbOpenDynaset)
Set RS2 = CurrentDb.OpenRecordset(TargetTable, dbOpenDynaset)
Do Until RS1_1.EOF
    Do Until RS1_2.EOF
        If RS1_2![ID] = RS1_1![ID] Then
            S = S & RS1_2![CodRep] & "  "
        End If
        RS1_2.MoveNext
    Loop
    RS2.AddNew
    RS2![ID] = RS1_1![ID]
    RS2![CodRep] = S
    RS2.Update
    S = ""
    RS1_2.MoveFirst
    RS1_1.MoveNext
Loop

 dare un suggerimento    Gabriele
 
Così modificata la procedura può comprendere quanti campi
vuoi oltre al primo campo ID.
A condizione che l'ID sia proprio il primo campo (il suo
numero d'ordine nella tabella sarà 0).
Gli altri campi non hai nemmeno bisogno di indicarli per
nome, è sufficiente ne sia indicato il numero complessivo
nella variabile NumCampi (nell'esempio = 4).
 
==================================
Private Sub Transpose_Click()
Dim RS1_1 As Recordset, RS1_2 As Recordset, RS2 As Recordset
Dim SQL As String, SourceTable As String, TargetTable As String
Dim S() As String, NumCampi As Integer, i As Integer
 
'-- Definizioni --
SourceTable = "S11"
TargetTable = "S22"
NumCampi = 4
'------------------
 
ReDim S(1 To NumCampi)
 
SQL = "SELECT " & SourceTable & ".ID FROM " & SourceTable
SQL = SQL & " GROUP BY " & SourceTable & ".ID;"
Set RS1_1 = CurrentDb.OpenRecordset(SQL, dbOpenDynaset)
Set RS1_2 = CurrentDb.OpenRecordset(SourceTable, dbOpenDynaset)
 
Set RS2 = CurrentDb.OpenRecordset(TargetTable, dbOpenDynaset)
 
Do Until RS1_1.EOF
    Do Until RS1_2.EOF
        If RS1_2![ID] = RS1_1![ID] Then
            For i = 1 To NumCampi
                S(i) = S(i) & RS1_2(i) & " "
            Next
        End If
        RS1_2.MoveNext
    Loop
    RS2.AddNew
    RS2![ID] = RS1_1![ID]
    For i = 1 To NumCampi
        RS2(i) = S(i)
    Next
    RS2.Update
    ReDim S(1 To NumCampi)
    RS1_2.MoveFirst
    RS1_1.MoveNext
Loop
 
End Sub
=========================================
 
Bruno

Il giorno martedì 11 agosto 2015 21:39:32 UTC+2, 
garo...@virgilio.it
 ha scritto:
 
Grazie Bruno per la risposta
Ho provato il tuo suggerimento e la procedura si blocca sulla seguente riga
  S(i) = S(i) & RS1_2(i) & " "
Purtroppo non sono in grado di capire come intervenire.
 
Ti riporto sotto il codice che funziona adattato alla mia situazione.
Con questo codice il campo NumSta viene trasformato da colonna a riga e va bene.
Io vorrei vedere nello stesso record della TargetTable qualche altro campo che è presente nella SourceTable.
Spero di essere stato chiaro.
 Ringrazio di nuovo per la disponibilità
   Gabriele
 
 
Dim RS1_1 As Recordset, RS1_2 As Recordset, RS2 As Recordset
Dim SQL As String, S As String, SourceTable As String, TargetTable As String
 
'-- Definizioni --
SourceTable = "S11"
TargetTable = "S22"
'------------------
 
SQL = "SELECT " & SourceTable & ".CodUni FROM " & SourceTable
SQL = SQL & " GROUP BY " & SourceTable & ".CodUni;"
Set RS1_1 = CurrentDb.OpenRecordset(SQL, dbOpenDynaset)
Set RS1_2 = CurrentDb.OpenRecordset(SourceTable, dbOpenDynaset)
 
Set RS2 = CurrentDb.OpenRecordset(TargetTable, dbOpenDynaset)
 
Do Until RS1_1.EOF
    Do Until RS1_2.EOF
        If RS1_2![CodUni] = RS1_1![CodUni] Then
            S = S & RS1_2![NumSta] & "  "
        End If
        RS1_2.MoveNext
    Loop
    RS2.AddNew
    RS2![CodUni] = RS1_1![CodUni]
    RS2![NumSta] = S


 Purtroppo non sono in grado di capire come intervenire.
 
L'unica cosa che devi fare è non intervenire.
Se i campi che vuoi trasporre sono 2, correggi solo nelle
Definizioni: NumCampi = 2, nient'altro!
 
Se non funzionasse... qual è la struttura record
delle due tabelle?
 
Bruno

Il giorno martedì 11 agosto 2015 21:39:32 UTC+2, 
garo...@virgilio.it
 ha scritto:

Ho provato di nuovo e si blocca sulla riga seguente
RS2(i) = S(i)
Scusa la mia ignoranza ma nel tuo codice non vedo da nessuna parte il nome del campo (NumSta) che si dovrebbe trasformare da colonna a riga. 
Per quanto riguarda la struttura:
la SourceTable è una query ed il campo CodUni è costituito da due campi (a & b) in più ci sono altri 4 campi di ci uno di questi è il campo NumSta (che si deve trasformare da colonna a riga.
Nella TargetTable il campo CodUni è un campo testo; ed anche gli altri sono campi testo.
Ti ripeto che il codice che ho inviato io funziona. Solo che nella TargetTable vorrei vedere oltre ai campi CodUni e NumSta anche altri campi.
Ti ringrazio di nuovo e saluto
  Gabriele
 
 

 del campo (NumSta) che si dovrebbe trasformare da colonna a riga.
[...]
Le due tabelle debbono contenere lo stesso numero di campi
e nello stesso ordine.
Il primo campo deve essere ID, a seguire quelli che
devono essere trasposti.
Se questi ultimi sono 2 (come nel tuo caso) indicherai nella
procedura NumCampi = 2, se fossero 44 indicheresti
nella procedura NumCampi = 44, etc.
 
Nient'altro!
Non cercare nella procedura i nomi dei campi: così come
è stata impostata non li prevede.
 
Bruno

 e nello stesso ordine.
Mi correggo:
con riferimento all'ID e a quelli che debbono essere trasposti.
 
Nel senso che potresti avere ad esempio 7 campi nella source
table e voler trasporre, con riferimento al primo (ID),
il secondo e il terzo campo.
Allora nella target table dovresti avere tre campi: il primo
sarà l'ID, il secondo e il terzo quelli trasposti.
 
I nomi del secondo e terzo campo, in ambedue le tabelle,
non hanno alcuna importanza, possono anche essere diversi;
il primo, per ambedue, deve chiamarsi ID.
 
Bruno

Il giorno martedì 11 agosto 2015 21:39:32 UTC+2, 
garo...@virgilio.it
 ha scritto:

Vediamo se riusciamo a combinare:
Le due tabelle contengono lo stesso numero di campi
Il primo campo che tu chiami ID l'ho chiamato CodUni
Soltanto un campo (NumSta) deve essere trasposto; gli altri tre NON devono essere trasposti ma devono rimanere come sono
Ti ringrazio ancora 
  Gabriele

 essere trasposti ma devono rimanere come sono Ti ringrazio ancora 
 
Uno sì e gli altri no!
E me lo dici adesso?!
 
Capitano tutti a me!
 
Bruno

Il giorno martedì 11 agosto 2015 21:39:32 UTC+2, 
garo...@virgilio.it
 ha scritto:

Caro Bruno
Scusami tanto se a causa della mia imprecisione ti ho fatto perdere del tempo.
Davo quasi per scontato che a partire dal primo post la mia intenzione fosse chiara (anche perché avevo chiesto che volevo aggiungere uno o più campi al record)
Comunque, anche se non trovo soluzione, ringrazio lo stesso.
Cordialmente
   Gabriele