Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: Zeed am März 01, 2012, 23:04:47

Titel: Access2010: Tabelle mit 106 Spalten in 4 Spalten datensatzkonform umbauen?
Beitrag von: Zeed am März 01, 2012, 23:04:47
Hallo zusammen,

ich muesste eine in Access2010 importierte Umsatz-Tabelle in ein 'Datensatzkonformes Layout' bringen:


! Produkt  ! Land    ! 2010KW01 ! 2010KW02 !   ....   ! 2011KW52 !
------------------------------------------------------------------
! Tisch    ! Belgien !      212 !      356 !   ....   !      260 !
! Tisch    ! Tuerkei !      412 !      584 !   ....   !      376 !
! Stuhl    ! Luxemb  !       26 !       35 !   ....   !       17 !


Und das Ergebnis soll wie folgt aussehen:

! Produkt  ! Land    ! Jahr/KW  !     Wert !
--------------------------------------------
! Tisch    ! Belgien ! 2010KW01 !      212 !
! Tisch    ! Belgien ! 2010KW02 !      356 !
!   .      !   .     !   .      !   .      !
!   .      !   .     !   .      !   .      !
!   .      !   .     !   .      !   .      !
! Tisch    ! Belgien ! 2011KW52 !      26o !
! Tisch    ! Tuerkei ! 2010KW01 !      412 !
! Tisch    ! Tuerkei ! 2010KW02 !      584 !
!   .      !   .     !   .      !   .      !
!   .      !   .     !   .      !   .      !
!   .      !   .     !   .      !   .      !
! Tisch    ! Tuerkei ! 2011KW52 !      376 !
! Stuhl    ! Luxemb  ! 2010KW01 !       26 !
! Stuhl    ! Luxemb  ! 2010KW02 !       35 !
!   .      !   .     !   .      !   .      !
!   .      !   .     !   .      !   .      !
!   .      !   .     !   .      !   .      !
! Stuhl    ! Luxemb  ! 2011KW52 !       17 !


Ich recherchiere schon seit Tagen...; kann aber nichts finden. Hat hier jemand eine Idee? Makro, VBA, Abfrage oder Kreuztabelle, Pivot, SQL ?
Vielen Dank
Gruß
Jan

Titel: Re: Access2010: Tabelle mit 106 Spalten in 4 Spalten datensatzkonform umbauen?
Beitrag von: ebs17 am März 02, 2012, 00:20:03
Etwa so:
Sub umformung()
   Dim db As DAO.Database
   Dim rs As DAO.Recordset
   Dim i As Long
   Set db = CurrentDb
   Set rs = db.OpenRecordset("Quelltabelle", dbOpenSnapshot)
   With rs
      For i = 2 To .Fields.Count - 1
         db.Execute "INSERT INTO Zieltabelle (Produkt, Land, [Jahr/KW], [Wert])" & _
               " SELECT Produkt, Land, '" & .Fields(i).Name & "', " & .Fields(i).Name & _
               " FROM Quelltabelle", dbFailOnError
      Next
      .Close
   End With
   Set rs = Nothing
   Set db = Nothing
End Sub

Wenn Du aber von datenbankkonform sprichst, solltest Du statt so etwas wie "2010KW01" besser ein richtiges Datum, z.B. den Wochenersten 03.01.2010 speichern. Das hätte eine Menge Vorteile in der weiteren Verarbeitung.

MfGA
ebs
Titel: Re: Access2010: Tabelle mit 106 Spalten in 4 Spalten datensatzkonform umbauen?
Beitrag von: Zeed am März 03, 2012, 18:05:46
Hallo EBS,

Die Umformung lief zwar im ersten Moment nicht, aber nachdem ich die Zeile:
ALT:  " SELECT Produkt, Land, '" & .Fields(i).Name & "', " & .Fields(i).Name & _
NEU: " SELECT Produkt, Land, '" & .Fields(i).Name & "', " & .Fields(i) & " " & _
geändert habe, funktioniert das Ganze schon relativ gut.

Allerdings stimmt das Ergebnis noch nicht, die Routine nimmt immer wieder nur die Werte aus Zeile-1 der Quelltabelle:

Produkt   Land    Jahr/KW    Wert
Tisch   Belgien   2010KW01   212
Tisch   Tuerkei   2010KW01   212
Stuhl   Luxemb    2010KW01   212
Tisch   Belgien   2010KW02   356
Tisch   Tuerkei   2010KW02   356
Stuhl   Luxemb    2010KW02   356
Tisch   Belgien   2011KW52   260
Tisch   Tuerkei   2011KW52   260
Stuhl   Luxemb    2011KW52   260


Irgendeine Idee, womit man die Routine dazu bewegt, die darauffolgenden Werte der nächsten Spalten der Quelltabelle auszulesen?

@ EBS, aber bis hierher schon mal ein ganz grosses DANKE für deine Antwort und dem Code!!!
Gruß
Jan
Titel: Re: Access2010: Tabelle mit 106 Spalten in 4 Spalten datensatzkonform umbauen?
Beitrag von: ebs17 am März 03, 2012, 18:47:46
ZitatDie Umformung lief zwar im ersten Moment nicht ...
Was war das Problem genau? Fehlermeldung?

Vermutlich müssen die Feldbezeichnungen in eckige Klammern gesetzt werden, führende Ziffern in der Bezeichnung könnten ein Problem sein.

Zitatwomit man die Routine dazu bewegt, die darauffolgenden Werte der nächsten Spalten der Quelltabelle auszulesen?
Halte Dich an das Original. Du hast in der Anfügeanfrage den Feldnamen (stellvertretend für die ganze Spalte) durch einen Feldwert (ersten Feldwert) ersetzt.

        db.Execute "INSERT INTO Zieltabelle (Produkt, Land, [Jahr/KW], [Wert])" & _
              " SELECT Produkt, Land, '" & .Fields(i).Name & "', [" & .Fields(i).Name & _
              "] FROM Quelltabelle", dbFailOnError


Testweise kann man sich die erzeugte SQL-Anweisung ins Direktfenster ausgeben lassen und auf Plausibilität prüfen:
Dim sSQL As String
sSQL = "INSERT INTO ..."
Debug.Print sSQL
db.Execute sSQL, dbFailOnError

Damit kannst Du Dir auch verdeutlichen, was Deine Korrektur erzeugt.

MfGA
ebs
Titel: Re: Access2010: Tabelle mit 106 Spalten in 4 Spalten datensatzkonform umbauen?
Beitrag von: Zeed am März 03, 2012, 19:06:01
Hallo ebs17,

Jupieeeeeee - es funktioniert ... Die Einsetzung von eckigen Klammern sind "der Bringer"!

1. Fehlermeldung vorher: Laufzeitfehler '3075': Syntaxfehler (fehlender Operator) in Abfrageausdruck '2010KW01'.

2. Wie das mit dem Debug.Print funktioniert, weiss ich noch nicht - dieser Befehl wird aber in meinem VBA-Excel-Buch erklärt. Das werde ich mir dann jetzt einmal zu Gemüte führen.

Also, vielen vielen Dank ebs17
Gruß
Jan
Titel: Re: Access2010: Tabelle mit 106 Spalten in 4 Spalten datensatzkonform umbauen?
Beitrag von: ebs17 am März 03, 2012, 19:18:54
Debug.Print bewirkt eine Ausgabe ins Direktfenster.

Mit Strg + G kannst Du das Direktfenster öffnen und die Ausgabe betrachten.

MfGA
ebs