PDA

Vollständige Version anzeigen : Code überprüfen


TOKO
13.05.2001, 11:01
Hallo Leute,

ich habe eine Datenbank entwickelt, die auf 3 verschiedenen Rechnern läuft. Wenn ich nun irgendwelche Objekte ändere, dann sollen per VBA die anderen beiden Datenbanken ebenfalls aktualisiert werden. Hierzu habe ich eine Funktion geschrieben. Bei der Ausführung kommt allerdings jedesmal die Fehlermeldung "Typen unverträglich" und stoppt bei der Zeile:

Set dokumentx = ContainerX.Documents(I)

Was habe ich falsch gemacht?


Public Function Update_Import(Quelle As String, Urtabelle As String)

Dim wsp As Workspace
Dim QuellDB As Database
Dim ZielDB As Database
Dim tdef As TableDef
Dim qdef As QueryDef
Dim Formular As Form
Dim bericht As Report
Dim modul As Module
Dim idx As Integer
Dim I As Integer
Dim J As Integer
Dim Status As Long
Dim ContainerX As Container
Dim dokumentx As Document


'Verweis auf Standardarbeitsbereich holen.
Set wsp = DBEngine.Workspaces(0)
'Verweis auf zu behandelnde Datenbanken holen.
Set ZielDB = CurrentDb
Set QuellDB = wsp.OpenDatabase(Quelle)
'----------------------------------------------------------------------------------------
' Importieren aller Objekte
'----------------------------------------------------------------------------------------

DoCmd.Hourglass True

'Abfragen
idx = 0
Status = SysCmd(acSysCmdInitMeter, "importiere Abfragen...", QuellDB.QueryDefs.Count)
For Each qdef In QuellDB.QueryDefs
DoCmd.DeleteObject acQuery, qdef.Name
DoCmd.TransferDatabase acImport, "Microsoft Access", Quelle, acQuery, qdef.Name, qdef.Name
Status = SysCmd(acSysCmdUpdateMeter, idx)
idx = idx + 1
Next qdef
Status = SysCmd(acSysCmdRemoveMeter)

'DoCmd.Hourglass False

For J = 0 To QuellDB.Containers.Count - 1
Set ContainerX = QuellDB.Containers(J)
For I = 0 To ContainerX.Documents.Count - 1
Set dokumentx = ContainerX.Documents(I)
Select Case ContainerX.Name
Case "Forms":
DoCmd.TransferDatabase acImport, "Microsoft Access", Quelle, acForm, dokumentx.Name, dokumentx.Name
Case "Reports":
DoCmd.TransferDatabase acImport, "Microsoft Access", Quelle, acReport, dokumentx.Name, dokumentx.Name
Case "Modules":
DoCmd.TransferDatabase acImport, "Microsoft Access", Quelle, acModule, dokumentx.Name, dokumentx.Name
End Select
Next I
Next J

DoCmd.Hourglass False

Exit Function
ExportError:
MsgBox "Beim Import sind Fehler aufgetreten. Bitte fragen Sie den Entwickler des Programmes.", vbCritical

Exit Function

End Function

Stefan Kulpa
13.05.2001, 12:21
<font face="Verdana" size="2">Hallo Toko,

arbeitest Du mit DAO? Falls ja, auf welche Version hast Du einen
expliziten Verweis gesetzt?

Bei der Deklaration ist es dann empfehlenswert, die referenzierte
Bibliothek zu benennen; Beispiel:</font>

<FONT SIZE=1 FACE=Courier New> <FONT COLOR=#000080>Dim</FONT> wsp <FONT COLOR=#000080>As</FONT> DAO.Workspace
<FONT COLOR=#000080>Dim</FONT> QuellDB <FONT COLOR=#000080>As</FONT> DAO.Database
<FONT COLOR=#000080>Dim</FONT> ZielDB <FONT COLOR=#000080>As</FONT> DAO.Database
<FONT COLOR=#000080>Dim</FONT> tdef <FONT COLOR=#000080>As</FONT> DAO.TableDef
<FONT COLOR=#000080>Dim</FONT> qdef <FONT COLOR=#000080>As</FONT> DAO.QueryDef
<FONT COLOR=#000080>Dim</FONT> ContainerX <FONT COLOR=#000080>As</FONT> DAO.Container
<FONT COLOR=#000080>Dim</FONT> dokumentx <FONT COLOR=#000080>As</FONT> DAO.Document

</FONT></PRE>

<font face="Verdana" size="2">Bei der Schleife wäre vielleicht folgende Alternative nützlich:</font>

<PRE><FONT SIZE=1 FACE=Courier New> <FONT COLOR=#008000>'statt:</FONT>
<FONT COLOR=#000080>For</FONT> J = 0 <FONT COLOR=#000080>To</FONT> QuellDB.Containers.Count - 1
<FONT COLOR=#000080>Set</FONT> ContainerX = QuellDB.Containers(J)
<FONT COLOR=#000080>For</FONT> I = 0 <FONT COLOR=#000080>To</FONT> ContainerX.Documents.Count - 1
<FONT COLOR=#008000>'alternativ:</FONT>
<FONT COLOR=#000080>For</FONT> <FONT COLOR=#000080>Each</FONT> ContainerX <FONT COLOR=#000080>In</FONT> QuellDB.Containers</FONT>

<font face="Verdana" size="2">
HTH,</font>

TOKO
16.05.2001, 20:54
Hallo Stefan,

danke für deinen Beitrag. Es kommt allerdings immer noch eine Fehlermeldung. Ich denke mal, dass irgendetwas mit den Variablen nicht stimmt. Bin aber leider in VB keine große Leuchte. Übrigens habe ich einen Verweis auf DAO 3.6 gesetzt.

Tschau

TOKO

TOKO
16.05.2001, 21:10
Hurra, ich habe es doch noch geschafft.

Habe einfach bei der Deklaration die referenzierte Bibliothek benannt und meine Schleife so gelassen.

Cio

TOKO

Dan
17.05.2001, 09:14
Hab noch was für Dich gefunden von www.donkarl.com (http://www.donkarl.com)
--

7.11 DIM DB AS DATABASE IN A00 BRINGT FEHLER


P r o b l e m
Du bekommst in A00 bei Code wie
Dim db As database oder Dim rs as recordset
einen Kompilierfehler - "Benutzerdefinierter Typ nicht definiert" o.ä.

U r s a c h e
Standardmäßig ist bei der Neuanlage von Datenbanken in A00 ADO als Bibliothek für Datenzugriffe eingestellt. Die meisten Access-Programmierer arbeiten aber weiterhin mit DAO. http://support.microsoft.com/support/kb/articles/Q225/9/62.asp
Der Verweis auf DAO fehlt also oder die Priorität des Verweises auf ADO ist höher.

L ö s u n g e n

1. Lösungsvariante
Modul öffnen, Menü Extras/Verweise, Verweis auf DAO 3.6 setzen, die Priorität des Verweises mit Hilfe der Pfeiltasten höher setzen als die des ADO-Verweises. Bei Nichtverwendung von ADO kann der Verweis darauf auch rausgenommen werden.

2. und gründlichere Lösungsvariante
Wie o.a. Verweis auf DAO 3.6 setzen und explizit deklarieren, auf welche Bibliothek du dich berufst. Höchstwahrscheinlich auf DAO, also

Dim db as DAO.Database
Dim rs as DAO.Recordset
etc.

Dann ist die Reihenfolge der Verweise egal.

schlarb
17.05.2001, 19:25
Hallo TOKO;
Das ist genau das was ich suche.
Wäre es möglich mir dem Code über Mail zukommen zu lassen. Oder ein kleines Prog.
Wäre echt prima.
Gruß Michael.