Index per Makro setzen

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

Hallo Jochen,

Die Syntax deines Befehls ist korrekt und funktioniert, deshalb würde ich vermuten das du vielleicht einfach das Semikolon am Ende vergessen hast

CREATE INDEX indkd on MASTER([Beide]);

Ist aber nur eine Vermutung

Gruß
Marco

Hallo Jochen,

also deine Syntax des SQL-Befehls ist korrekt und dass sollte eigentlich funktionieren.
Das Problem muss also wo anders liegen.

Möglicherweise hat das Oberflächeninterface mal wieder eine Macke… Nimm doch mal alternativ den Befehl „AusführenCode“ und erstell den Index per VBA.

Einfach eine Funktion anlegen und den SQL-Befehl mal im VBA testen:

DoCmd.RunSQL „CREATE INDEX indkd ON Master ([Beide])“

Sollte dann genauso klappen.

Wenns nicht geht, kannst du dich gerne nochmal melden…

Gruß
Proteus

Hallo Jochen,

soweit ich das sehe, hast Du nur den ‚Abfragefehler‘ mit den beiden eckigen Klammern in Deiner Lösung…

Der Aufbau des SQL ist : CREATE INDEX on (, , …, )

Indexname = belibiger Name für den Index
Tabelle = die Tabelle
Feld n = Feldliste (wenn Anzahl n>1 dann durch Komma getrennt)

Meint, das Du mit :

CREATE INDEX indTabMaster on MASTER (Beide)

Dein Ziel erreichen solltest.

LG,
Burkhard

Moin Moin,

CREATE INDEX indkd on MASTER ([Beide])

lese hier um den Syntax der SQl-Anweisung zu verstehen:
http://office.microsoft.com/de-at/access-help/create…
http://infogoal.com/sql/sql-create-index.htm

Tipp: vergiss Makros und nutze gleich VBA

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

Grüße aus Rostock
Wolfgang
(Netwolf)

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

Moin!

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

Hallo Ptonka

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 :wink:

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.

Gruss, Damuen

Hallo Jochen

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

Gruss

Werner

Hallo,

komme leider erst etwas verspaetet zum antworten.

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.

Tschau
Peter

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.

Freundlichen Grüsse
fonti46

Hallo Jochen

Bitte sende doch die DB. Dann kann ich mir vorstellen, was Du genau tun möchtest resp. welcher SQL-Fehler da auftritt und warum.

LG, Henri

mailto: [email protected]

Lieber Jochen,

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.

Alois

Hallo Jochen,

ist Deine Frage noch aktuell?

Gruß
Manfred