PDA

Vollständige Version anzeigen : eingebundene Exceltabelle in DB Tabelle konvertieren


kibit on sight
25.10.2011, 13:56
Hallo alle zusammen,

habe in einer DB eine eingebundene Exceltabelle mit folgenden Spalten:

Name, Datum, Zeit01, Zeit02, Zeit03 bis Zeit20.

In den Zeilen stehen jeweils auf den Namen und ein Datum bezogen in den Feldern Zeit01 bis Zeit20 Uhrzeiten.

In der neuen Access Tabelle möchte ich alle ungeraden Zeitfelder (01,03,05) in einem Feld haben, die geraden Zeitfelder in einem zweiten Feld.

Hintergrund: Es handelt sich um eine Zeiterfassung, die täglich die Exceltabelle neu schreibt. In den ungeraden Feldern ist die 'kommt Uhrzeit' in den geraden Feldern die 'Geht Uhrzeit' gespeichert.

Das ganze soll in Access ausgewertet werden.

Meine Idee ist, beim Staren der DB aus der Exceltabelle mithilfe einer Tabellenerstellungs/Aktualisierungsabfrage eine neue Access Tabelle zu erzeugen und dann mit dieser die Auswertungen durchzuführen.

Kann mit jemand von euch einen Ansatz sagen, wie ich dies realisieren kann?

ebs17
25.10.2011, 14:08
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim i As Long
Set db = CurrentDb
Set rs = db.Openrecordset("Exceltabelle", dbOpenSnapshot)
With rs
For i = 2 To .Fields.Count - 1 Step 2
db.Execute "INSERT INTO Zieltabelle (XName. XDatum, kommt, geht)" & _
" SELECT [Name], [Datum], " & .Fields(i).Name & ", " & .Fields(i + 1).Name & _
" FROM Exceltabelle", dbFailOnError
Next
.Close
End With
Set rs = Nothing
Set db = Nothing

kibit on sight
25.10.2011, 14:52
Danke, das sieht schon ganz gut aus ...

Hab aber noch n kleines Problem: Wahrscheinlich hab ich mich falsch ausgedrückt:

Ich möchte für die Felder kommt/geht jeweils bezogen auf ein Datum mehrere Datensätze erzeugen, d.h. wenn jemand am selben Tag mehrmals kommt und geht brauch ich natürlich dann auch mehrmals in den Feldern kommt/geht die Uhrzeiten ...

ebs17
25.10.2011, 15:04
Hast Du die Anweisung ausprobiert?
Werte sollten da übernommen werden. Unberücksichtigt sind eher Stellen mit Nichtwerten (die es scheinbar gibt).

kibit on sight
25.10.2011, 15:21
yepp, hab ich getestet:


Function test_2()

Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim i As Long
Set db = CurrentDb
Set rs = db.OpenRecordset("anwesenheit", dbOpenSnapshot)
With rs
For i = 3 To .Fields.Count - 1 Step 2
db.Execute "INSERT INTO tbl_import (kurzbez, personalnr, anwesdatum, kommt, geht)" & _
" SELECT [kurzbez], [personalnr], [Datum], " & .Fields(i).Name & ", " & .Fields(i + 1).Name & _
" FROM anwesenheit WHERE (((anwesenheit.personalnr)='130'))", dbFailOnError
Next
.Close
End With
Set rs = Nothing
Set db = Nothing

End Function


Habe natürlich Felder, die leer sind, du hast recht. Es ist aber immer unterschiedlich, manchmal erfasst ein MA seine Zeit mehrmals am Tag, zum Teil nur einmal oder aber gar nicht!

Wie es aussieht muss nur noch abgefangen werden, wenn in den Felder nichts drin steht

ebs17
25.10.2011, 18:14
Im Rahmen einer Abfrage könnte man das ja mit einem zusätzlichen Filter tun:
" WHERE personalnr = '130' AND (" & _
.Fields(i).Name & " >= 0 OR " & _
.Fields(i + 1).Name & " >= 0)"

kibit on sight
26.10.2011, 09:29
yepp, genau:

aber mit fields.value > 0

;)

Danke, hab's geschafft

kibit on sight
26.10.2011, 11:42
Ach ja, hatte ich vergessen zu zeugen wie ich es gemacht habe

With rs

For i = 3 To .Fields.Count - 1 Step 2

db.Execute "INSERT INTO tbl_import (kurzbez, personalnr, anwesdatum, kommt, geht)" & _
" SELECT [kurzbez], [personalnr], [Datum], " & .Fields(i).Name & ", " & .Fields(i + 1).Name & _
" FROM anwesenheit" & _
" WHERE " & _
.Fields(i).Name & " Is Not Null OR " & _
.Fields(i + 1).Name & " Is Not Null", dbFailOnError

Next
.Close

End Wit