scambia righe e colonne

Anonimo
2014-04-27T08:13:19+00:00

Salve,

da una queri che persca dati da una tabella di circa 4-500000 records, necessito di 

  • creare una maschera per filtrare la query con i dati desiderati( e a questo ci penserò oltre) e da questa
  • scambiare i campi e valori tra righe e colonne: come una sorta di trasposizione in excel.

Con la tabella a campi incrociati non sono riuscito a realizzare il risultato sperato

A titolo informativo, i campi "art" sono circa 230, quindi un inserimento manuale sarebbe troppo lungo, visto che è un lavoro che dovrò fare tutti i giorni.

Di seguito un esempio:

Query originale:

etich numero1 nome giorno art1 art2 art3 art4
1 102560 pippo 05/04/2014 2 4 5 1
2 102560 pippo 06/04/2014 4 3 - 6
3 102560 pippo 08/04/2014 8 - 4 -
4 102560 pippo 09/04/2014 7 2 - 9
5 153451 mario 05/04/2014 6 6 3 -
6 153451 mario 06/04/2014 3 8 1 -
7 153451 mario 08/04/2014 9 4 5 -
8 153451 mario 09/04/2014 1 4 7 2

Query finale/desiderata:

etich 1 2 3 4 5 6 7 8
numero1 102560 102560 102560 102560 153451 153451 153451 153451
nome pippo pippo pippo pippo mario mario mario mario
giorno 05/04/2014 06/04/2014 08/04/2014 09/04/2014 05/04/2014 06/04/2014 08/04/2014 09/04/2014
art1 2 4 8 7 6 3 9 1
art2 4 3 - 2 6 8 4 4
art3 5 - 4 - 3 1 5 7
art4 1 6 - 9 - - - 2

Grazie per il prezioso supporto.

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2014-04-27T20:33:27+00:00

Ciao Andrea,

forse il seguente codice puo' esserti utile (devi variare il nome della tabella Table2):

Tieni presente che se come dici la tabella origine ha 500000 records non potrai ottenere una tabella con così tante colonne!!!!

Se l'input al presente codice è una query, allora sostituisci:

Set myRstIn = CurrentDb.OpenRecordset("Select * from Table2")

con

Set myRstIn = CurrentDb.OpenRecordset("NomeQuery")


Option Compare Database

Option Explicit

Function Transpose()

Dim myRstIn As Recordset

Dim myRstOut As Recordset

Dim myTd As TableDef

Dim iR As Double

Dim iC As Double

Dim iFld As Double

Dim Matrice() As String

   Set myRstIn = CurrentDb.OpenRecordset("Select * from Table2")

   myRstIn.MoveLast

   ReDim Matrice(myRstIn.Fields.Count - 1, myRstIn.RecordCount - 1)

   myRstIn.MoveFirst

   On Error Resume Next

   Set myRstOut = CurrentDb.OpenRecordset("Table3")

   If Err.Number = 0 Then

      DoCmd.SetWarnings False

      myRstOut.Close

      DoCmd.RunSQL ("Drop Table Table3")

      If Err.Number > 0 Then

         MsgBox "Tabella non eliminabile!"

         Exit Function

      End If

      DoCmd.SetWarnings True

   End If

   Err.Clear

   Set myTd = CurrentDb.CreateTableDef("Table3")

   On Error GoTo 0

   For iFld = 0 To myRstIn.RecordCount - 1

       myTd.Fields.Append myTd.CreateField("Col" & Format(iFld + 1, "##"), dbText)

   Next iFld

   For iC = 0 To myRstIn.RecordCount - 1

       For iR = 0 To myRstIn.Fields.Count - 1

           Matrice(iR, iC) = myRstIn(iR)

       Next iR

       If iC = 0 Then

          CurrentDb.TableDefs.Append myTd

       End If

       myRstIn.MoveNext

       If myRstIn.EOF Then

          GoTo Scrivi

       End If

   Next iC

Scrivi:

   Set myRstOut = CurrentDb.OpenRecordset("Table3")

   For iR = 0 To myRstIn.Fields.Count - 1

       myRstOut.AddNew

       For iC = 0 To myRstIn.RecordCount - 1

           myRstOut(iC) = Matrice(iR, iC)

       Next iC

       myRstOut.Update

   Next iR

   myRstOut.Close

   myRstIn.Close

   Set myRstOut = Nothing

   Set myRstIn = Nothing

End Function

Ciao Mimmo

La risposta è stata utile?

0 commenti Nessun commento

6 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2014-05-03T08:46:01+00:00

    Grazie!

    Non solo ho risolto il problema ma ho anche imparato molto.

    I più cordiali saluti.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Eliminata

    Questa risposta è stata eliminata a causa di una violazione del codice di comportamento. La risposta è stata segnalata manualmente o identificata tramite il rilevamento automatizzato prima dell'esecuzione dell'azione. Per ulteriori informazioni, fai riferimento al codice di comportamento.


    I commenti sono stati disattivati. Ulteriori informazioni