Liebe/-r Experte/-in,
ich habe eine Access-DB (Access 2002) in der per Makro eine Tabellenerstellungsabfrage durchgeführt wird. In der neu erstellten Tabelle möchte ich nun in der Entwurfsansicht den Eintrag „indiziert“ auf JA - Duplikate möglich setzen.
Allerdings soll dies auch mittels eines Makros geschehen. Ich habe hierzu ein Makro erstellt - hier die Aktion „Ausführen SQL“ ausgewählt und hier unter „SQL-Anweisung“ folgenden BEfehl eingetragen:
CREATE INDEX indkd on MASTER ([Beide])
eingefügt. Die Tabelle heisst Master und das Feld „Beide“ soll indiziert werden. Ich bekomme aber jedes mal die Fehlermeldung „Syntaxfehler in Create Index-Anweisung“. Ich habe schon diverse Umstellungen versucht, aber dieser blöde Fehler erscheint immer wieder. Wie lautet die korrekte Syntax bzw. wie kann ich das oben beschriebene Poblem (setzen eines Index in eine erstellte Tabelle) via Makro lösen?
Für einen Tip wäre ich total dankbar.
Liebe Grüße,
Jochen
z.B.
Function CreateTable()
DoCmd.SetWarnings False
DoCmd.RunSQL „SELECT qryTotalPartsUsed.PartNumber, qryTotalPartsUsed.Ordered INTO tblOnOrder FROM qryTotalPartsUsed“
DoCmd.RunSQL „CREATE INDEX PartNumber ON tblOnOrder(PartNumber) With Primary“
DoCmd.SetWarnings True
End Function
Hi Jochen,
erstmal zu den Makros: Makros solltest Du nicht mehr verwenden. MS unterstützt langfristig keine Makros mehr! Und sind alles Andere als professionell. Ersatzweise solltest Du deine Belange mit VBA-Code abdecken.
Zum SQL-Problem:
Wenn kein Index auf der Spalte vorhanden ist, dann steht in der Entwurfsansicht „Indiziert: Nein“.
Wenn ein einfacher Index auf der Spalte mit create index erstellt wurde, dann steht in der Entwurfsansicht „Indiziert: Ja (Duplikate möglich)“.
Wenn ein eindeutiger Index auf der Spalte mit create UNIQUE index erstellt wurde, dann steht in der Entwurfsansicht „Indiziert: Ja (Ohne Duplikate)“.
Bei mir gibt es kein Syntaxfehler mit „CREATE UNIQUE INDEX indkd on MASTER ([Beide])“
Nicht jeder Datentyp läßt sich idizieren - Memo, Hyperlink, oder OLE-Objekt nicht.
Achso, bevor Du den SQL abschickst prüfe ob in der Tabelle nicht schon der Index angelegt wurde. Ein nochmaliges Anlegen eines gleichen Index geht nicht.
Der SQL darf auch nur laufen wenn die Tabelle geschlossen ist.
Ich hoffe ich konnte Dir helfen. Wenns mit dem neuen Wissen nicht funzzt, wäre eine Fehlernummer/Text hilfreich.
Gruß Erwin
BEfehl eingetragen:
CREATE INDEX indkd on MASTER ([Beide])
Für einen Tip wäre ich total dankbar.
Liebe Grüße,
Jochen
Ich habe Deine Abfrage ausprobiert - sie funktioniert einwandfrei bei mir - auch in einem Makro.
Bist Du sicher, dass Du sie genau so geschrieben hast?
Ansonsten fällt mir nur noch ein, dass ans Ende einer SQL-Anweisung eigentlich ein ; gehört.
Aber das ist Access eigentlich egal.
Hallo,
sorry, derzeit bin ich völlig im Stress, daher keine Antwort von mir.
Nur der Hinweis, sofern die Tabelle eingebunden ist, kann ein Index nicht erzeugt werden. Wenn es sich aber nicht um eine eingebundene Tabelle handelt, dann kann es nur ein Syntax-Problem sein.
Sorry.
Ulrich
oooh jeee… ich würde gerne sagen, setze einfach den und den Parameter und es läuft. Leider hatte ich dasselbe Problem, gar etwas grösser
Ein Anwender kann nun mittels normaler Eingabemaske in der Anwendung eine neue Tabelle erstellen lassen, mit Tabellennamen, eigenen Feldern mit Angabe von Felddatentyp (Kombifelder), Index ja/nein (eindeutig ja/nein), Primary ja/nein usw.
Ein VBA-Konstrukt erstellt aufgrund solcher Angaben komplett die gesamte Tabelle, alle Felder mit den Datentypen, PrimaryKey sowie aller Indizes usw. Das geht gar nicht, dies alles hier zu veröffentlichen. Ich versuche, den Teil mit dem Index hier anzuzeigen, ohne VBA ging’s bei mir aber gar nicht, sorry!!!
Dim db As dao.Database
Dim rstindextdf As TableDef
db.TableDefs.Refresh
Set rstindextdf = db.TableDefs(VarTabName)
With rstindextdf
’ Create new index, create and append Field
’ objects to its Fields collection.
Set idxNew = rstindextdf.CreateIndex(„NewIndex“ & VarIndexFeld) 'Indexname muss eindeutig sein!
With idxNew
If rstUDDetail!FIndex_eindeutig = True Then 'eindeutiger Index nur bei Felder, dessen 2. Häkchen auch aktiv ist.
.Unique = True 'Eindeutiger Index
End If
.Fields.Append .CreateField(VarIndexFeld)
End With
.Indexes.Append idxNew
.Indexes.Refresh
End With
wie gesagt, bei mir werden die zu erstellenden Felder und Indexangaben usw. aus einer Tabelle ausgelesen. Ich hoffe, dass du mit dieser Info weiter kommst… VBA-Kenntnisse sind da ziemlich vorausgesetzt.
ich bin noch bis Ende Woche in den Ferien, schaue dann mal in mein Access rein. Aus dem Gedächtnis würde ich meinen, es funktioniert nicht mit Makro, nur mit VBA da vorher die Tabelle eingelesen werden muss
Also bzgl. SQL-Aufrufe aus Makros kann ich nichts sagen, denn ich verwende Makros NIE.
bzgl. der Syntax sehe ich mal nichts auffaelliges.
Besser ist sowieso das in eine VBA-Funktion zu verpacken, denn dort hat man mehr und bessere Moeglichkeiten der Fehlersuche.
Erstelle einfach folgendermasen eine Function in einem Modul:
Public Function CreateMasterIndex()
Dim sqlString As String
sqlString = „Create index indkd on Master (Beide)“
’ mit ADO Datenzugriffe
CurrentProject.AccessConnection.Execute sqlString
’ mit DAO
CurrentDB.Execute sqlString
End Function
Diese Function kann man dann auch fall notwenig aus einem Makro heraus aufrufen.
Hallo Jochen, Ich musste mir zuerst noch eine Access 2000 DB besorgen damit ich das testen konnte. Dein Code funktioniert bei mir einwandfrei (der SQL Befehl darf allerdings nicht in Anführungszeichen stehen). Es scheint, dass der Code „AusführenSQL“ ab Version 2007 nicht mehr offiziell zugelassen ist, bei einer Konversion funktioniert er aber immer noch. Auf Wunsch kann ich dir meine Test-DB zustellen.
ich habe deine Beschreibung ausprobiert,
und es klappt bei mir ohne Probleme.
Ev liebt das Problem am Inhalt des Feldes „Beide“ (enthält ev NULL oder ähnliches).
Am besten du probiert den SQL Befehl zuerst als Abfrage aus, da bekommt man meistens bessere Fehlermeldungen als bei Makros.