WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   Excel nach Access ... (http://www.wcm.at/forum/showthread.php?t=139737)

Montafon 19.07.2004 13:52

Excel nach Access ...
 
hallo wieder mal bin ich auf eure Hilfe angewiesen

Folgendes Problem

eine bestehende Tabelle soll mittels Script um diverse Feldnamen erweitert werden, die immer mittels Excel File definiert werden

mit VBA Code bin ich auf Kriegsfuß, dennoch habe eine Lösung für mein Problem - zumindest zum Teil gebastelt

Private Sub StartImport(FileName As String)
On Error GoTo fehler

Dim xls As Object
Dim fld As Field

Set xls = GetObject(FileName)


Dim i As Integer
Dim fldName As String
i = 2
fldName = xls.Application.sheets("Felder für Import").range("A" & i)

While Nz(fldName, "") <> ""

Set fld = CurrentDb.TableDefs("Element").CreateField(fldName , dbText, 50)

CurrentDb.TableDefs("Element").Fields.Append fld

i = i + 1
fldName = xls.Application.sheets("Felder für Import").range("A" & i)
Wend


xls.Close
Set xls = Nothing

fehler:
If Err.Description = "" Then
MsgBox "Daten erfolgreich importiert"
Else
MsgBox "Fehler: " & Err.Description
End If
End Sub

zumindest werden die Feldnamen importiert - aber es gelingt mir nicht die dazu passendes Beschreibungen (2. Spalte im Excel File) unter Beschreibung zu importieren

Kann mir jemand von euch helfen???

Danke

wbendl 19.07.2004 15:06

Hi!

Falls du die Beschreibung zu einem Feld, die in der Entwurfsansicht der Tabelle angezeigt und bearbeitet wird, per Code erstellen willst, solltest du dir CreateProperty und Description ansehen.

mfg

WB

Montafon 19.07.2004 15:26

danke für die Hilfe

komme allerdings auch damit nicht weiter

hab irgendwie ein Knopf im Hirn sorry

wbendl 19.07.2004 16:21

Was willst du genau machen?

mfg

WB

Montafon 19.07.2004 16:29

ich möchte als Ergebnis nicht nur die neuen Felder mit den Feldnamen aus der 1.Spalte im Excel, sondern zudem noch die Beschreibungen der neu eingefügten Felder in der Access-Datenbank aus der 2. spalte im Excel nach Access übernehmen

also zB

Excelspalte
1 2
Bemerkung enthält Bemerkungen über Anwender
. .
. .

im Access sollte das ganze dann so aussehen

Feldname "Bemerkung"
Beschreibung "enthält Bemerkungen über Anwender"

...

powerman 19.07.2004 16:33

hi,
und wieso erstellt das ganze nicht gleich in access.. wäre sehr viel einfacher.

Montafon 19.07.2004 16:36

wollte ich auch

ABER es muss über Excel funktionieren da immer verschiedene Felder deklariert werden müssen

und für jedesmal 30 bis 50 Feldnamen eintippen g'freut mich nicht :-)

nein im ernst

es muss über Excel laufen

wbendl 19.07.2004 16:37

Dann hab ich's eh richtig erkannt.

Diese Beschreibung ist in der Description-Eigenschaft gespeichert.
Um die zu Erstellen braucht man CreateProperty.

Das ist in der Hilfe ziemlich umfangreich beschrieben.

Ein paar Fehlversuche werden dir aber erfahrungsgemäß nicht erspart bleiben. (Da bin ich wieder froh, daß ich kein Access mehr verwende.)

mfg

WB

Montafon 20.07.2004 10:28

hattest recht - Dank

damit gehts einwandfrei

nun zur Krönung des ganzen sollten noch die Formate mit übernommen werden, bzw. es würde Text, Zahl, Ja/Nein genügen

Ideen?
Danke

wbendl 20.07.2004 10:46

Meinst du jetzt den Datentyp oder das Ein- Ausgsbeformat für das Feld?

Montafon 20.07.2004 10:51

den Datentyp damit ich die Tabelle komplett definiert habe

Feldname
Format
Beschreibung

wbendl 20.07.2004 10:59

Der Typ kann bereits bei der Erstellung mit CreateField festgelegt werden.
Wenn das Feld mit Append zu Auflistung hinzugefügt wurde, ist die Type-Eigenschaft schreibgeschützt.

mfg

WB

Montafon 20.07.2004 11:07

genau dieses Problem - schreibgeschützt

nun ist guter Rat teuer

mein Code

Do Until rs.EOF
Set fld = tbl.CreateField(rs.Fields(0), dbText, 255)

tbl.Fields.Append fld
rs.MoveNext
Loop
db.TableDefs.Append tbl
rs.MoveFirst
Set tbl = db.TableDefs("neue Felder")

Do Until rs.EOF
Set fld = tbl.Fields(rs.AbsolutePosition)
If Not IsNull(rs.Fields(1)) Then
fld.Properties.Append fld.CreateProperty("Description", dbText, rs.Fields(1))
End If
rs.MoveNext
Loop

Do Until rs.EOF
Set fld = tbl.Fields(rs.AbsolutePosition)
If Not IsNull(rs.Fields(1)) Then
fld.Properties.Append fld.CreateProperty("Felddatentyp", dbText, rs.Fields(2))
End If
rs.MoveNext
Loop

rs.Close
Set db = Nothing

End Sub


die 2. Schleife kann ich mir sparen denn ab der 1. Schleife das neue Feld einen Schreibschutz



wbendl 20.07.2004 11:25

Wie ich schon sagte:
Der Typ kann bereits bei der Erstellung mit CreateField festgelegt werden.

Oder du änderst den Typ bevor das Feld zu Auflistung hinzugefügt wird.

mfg

WB

Montafon 20.07.2004 14:17

so nun hats geklappt

für die's interessiert

Private Sub StartImport(FileName As String)

Dim db As DAO.Database
Dim tbl As DAO.TableDef
Dim fld As DAO.Field
Dim rs As DAO.Recordset
Dim Format As Byte

Set db = CurrentDb

Set rs = db.OpenRecordset("Felder für RC-Plant", dbOpenDynaset)
'zuerst die neuen Felder inkl. Beschreibung nach Access importieren - Felder für RC-Plant


Set tbl = db.CreateTableDef("neue Felder für RC-Plant")
'in der Datenbank sind die neuen Feldnamen inkl. Beschreibungen enthalten und können dann
'mittels kopieren einfügen direkt in die Tabelle Element übernommen werden

Do Until rs.EOF

Select Case rs.Fields(2)
Case "Text"
Format = 10
Case "Zahl"
Format = 3
Case "Ja/Nein"
Format = 1
Case Else
Format = 10
End Select

Set fld = tbl.CreateField(rs.Fields(0), Format)

tbl.Fields.Append fld
rs.MoveNext
Loop
db.TableDefs.Append tbl
rs.MoveFirst
Set tbl = db.TableDefs("neue Felder")
Do Until rs.EOF
Set fld = tbl.Fields(rs.AbsolutePosition)
If Not IsNull(rs.Fields(1)) Then
fld.Properties.Append fld.CreateProperty("Description", dbText, rs.Fields(1))
End If
rs.MoveNext
Loop

'Do Until rs.EOF
' Set fld = tbl.Fields(rs.AbsolutePosition)
' If Not IsNull(rs.Fields(1)) Then
' fld.Properties.Append fld.CreateProperty("Format", dbText, rs.Fields(2))
' End If
'rs.MoveNext
'Loop

rs.Close
Set db = Nothing

MsgBox ("Fertig!")

End Sub

und anschließend kopieren und einfügen im Entwurfsmodus

vielleicht nicht elegant aber es löst mein Problem

Danke

wbendl 20.07.2004 15:06

Gratulation!

Ich kann mir nicht vorstellen, daß das Anfügen dieser Felder an die "echte" Tabelle nicht funktioniert.

Entscheidend ist wahrscheinlich die Reihenfolge der Operationen.

Wahrscheinlich läßt sich alles in einem Schleifendurchlauf erledigen.
Jetzt bin ich echt neugierig. Ich glaube ich muß das mal ausprobieren.

EDIT:

Wie ich's mir dachte. Es funktioniert tadellos.


mfg

WB

wbendl 20.07.2004 15:40

Die Zeit zum Editieren war leider schon abgelaufen

Hier der Code mit dem ich's probiert habe. Tabelle1 ehält vorher bereits 3 Felder.

Set tbl = db.TableDefs("Tabelle1")

Do Until rs.EOF

Select Case rs.Fields(1)
Case "Text"
Format = 10
Case "Zahl"
Format = 3
Case "Ja/Nein"
Format = 1
Case Else
Format = 10
End Select

Set fld = tbl.CreateField(rs.Fields(0), Format)


tbl.Fields.Append fld
fld.Properties.Append fld.CreateProperty("Description", dbText, rs.Fields(2))

rs.MoveNext
Loop

Mit der kleinen Änderung ersparst du dir kopieren/einfügen.

mfg

WB

Montafon 20.07.2004 16:10

danke

was ein db.CreateTablDef so alles ausmacht

nun steht db.TableDefs und es funktioniert


es gibt nur noch einen Hacken

es kommt der Fehler "zuviele Felder definiert"

hängt aber vielleicht mit der Länge der Feldnamen zusammen


Alle Zeitangaben in WEZ +2. Es ist jetzt 17:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag