| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY präsentiert die neue NVIDIA RTX A400 und die A1000 Grafikkarte, eine Pressemitteilung
|
Autor
|
Thema: Was mache ich Falsch beim Änden eines Indexes in der Datenbank (1970 mal gelesen)
|
Niggemann Mitglied
Beiträge: 165 Registriert: 31.10.2003 Win 98 Se, ACAD 2004, XP Prof, ACAD 2004 und ACAD 2010
|
erstellt am: 13. Apr. 2007 23:49 <-- editieren / zitieren --> Unities abgeben:
Hallo, habe folgendes Problem, ich möchte aus einem Lisp raus eine Tabelle in einer Access Datenbank kopieren. Es ist eine Tabelle mit Leerfeldern, wo jedoch die Spaltenbreite, der Primärschlüssel und 2 Spalten mit einem Vorgabewert belegt ist. Mit folgenden Aufruf wird eine neue Tabelle erstellt: (setq SQLStatement (strcat "SELECT * INTO " (strcat (get_tile "K_BEZ") "_STUECKLISTEN") " FROM LEER_STUECKLISTEN")) wenn ich jedoch die Tabelle anschließend öffne sind die Werte für die Spaltenbreite kopiert worden aber nicht die von mir vorgenommenen Einstellungen. Damit könne ich leben, wenn der Folgende Aufruf funktioniert. (setq SQLStatement (strcat "CREATE INDEX ART_NR ON TEST_ARTIKEL (ART_NR) TEST_ARTIKEL WITH {PRIMARY DISALLOW NULL IGNORE NULL}")) leider kommt dann diese Meldung: Last SQL statement: "CREATE INDEX ART_NR ON TEST_ARTIKEL (ART_NR) TEST_ARTIKEL WITH {PRIMARY DISALLOW NULL IGNORE NULL}" Visual LISP message Automatisierungsfehler [Microsoft][ODBC Microsoft Access Driver] Syntaxfehler in CREATE INDEX-Anweisung.
Description [Microsoft][ODBC Microsoft Access Driver] Syntaxfehler in CREATE INDEX-Anweisung. HelpContext 0 HelpFile NativeError -3552 Number -2147217900 SQLState 37000 Source Microsoft OLE DB Provider for ODBC Drivers Am liebsten währe mir natürlich eine Komplette Kopie der Tabelle, da die Tabelle aber über 30 Spalten hat ist es wohl der einfachste Weg nur die drei Felder zubearbeiten wo ich Vorgaben erstellen möchte als 30 Felder in einem Lisp komplett zu erstellen. Wer weis eine Rat? Grüsse Niggemann Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fred_tomke Mitglied Applikationsingenieur
Beiträge: 156 Registriert: 14.06.2004 Map 2015 x64 Win7 x64 12 GB RAM ADN OpenDCL
|
erstellt am: 24. Apr. 2007 12:43 <-- editieren / zitieren --> Unities abgeben: Nur für Niggemann
Hallo, ich würde Dir gern helfen. Besteht das Problem noch? Ich muss aber noch ein bisschen was wissen: Im Titel heißt es "Änden eines Indexes in der Datenbank". Im ersten Satz heißt es eine "Tabelle in einer Access Datenbank kopieren" und dann wiederum "CREATE INDEX ART_NR ON TEST_ARTIKEL". Das sind aber nun 3 komplett verschiedene Dinge. Damit ich weiß, was Du genau erreichen willst, wären genauere Informationen hilfreich. Mit dem SELECT * INTO erzeugst Du eine neue Tabelle mit den Datensätzen, die die Bedingung erfüllen. Die Datenfelder der neuen Tabelle sind vom Datentyp aus dem Recordset-Object der Abfrage. Willst Du eine leere Tabelle (ohne Daten) aus einer bestehenden machen und hat die bestehende einen PrimaryKey, wird der meiner Kenntnis nach automatisch übernommen. Tipp: Vielleicht ist manches einfacher, wenn Du statt ODBC-Treiber den Jet-Treiber ansprichst. Außerdem komme ich an verschiedene Tabelleneigenschaften besser über das ADOX-Connection-Object besser rann (ADOC-Catalog). Auch wäre es hilfreich, würdest Du eine Beispieltabelle anhängen. Ich teste komplexe Operationen erst über die Access-SQL-Eingabeaufforderung und dann sehe ich, ob ich einen Syntax-Fehler habe und wo. Über dialektische Probleme zwischen Access und AutoCAD kümmere ich mich dann meist später. HINWEIS: Unter www.w3schools.com gibt es für meine Begriffe hilfreiche Informationen über SQL, z.B. http://www.w3schools.com/sql/sql_create.asp. VG, Fred ------------------ Fred Tomke Dipl.-Ing. (FH) Landespflege Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Niggemann Mitglied
Beiträge: 165 Registriert: 31.10.2003 Win 98 Se, ACAD 2004, XP Prof, ACAD 2004 und ACAD 2010
|
erstellt am: 24. Apr. 2007 15:29 <-- editieren / zitieren --> Unities abgeben:
Hallo Fred, vorweg muß ich allerdings gestehen das ich so gut wie keine Ahnung von Datenbanken habe und muß mich gezwungenermassen mit dem Problem beschäftigen. Meine Idee war folgende: Eine Leere Tabelle in der Datenbank mit allen nötigen Werten zu erstellen, diese dann zu kopieren um sie anschließend mit Daten zu füllen. Das Kopieren geht wohl nicht also bin ich auf die Idee gekommen mit SELECT * INTO eine neue Tabelle zu erstellen. Dabei viel mir auf das der Primärschlüssel und die eingestellten Wert weg waren. Also kam ich auf CREATE INDEX um eine Index zu erzeugen, was dann zu meiner Frage im Forum führte. 1) Ja Problem besteht immer noch. 2) Der Titel ist Ünglücklich gewählt es müßte so heißen: "Ändern eines Indexes in einer Tabelle". 3) Ja ich möchte eine Leere Tabelle ohne Daten aus einer bestehenden Tabelle erstellen. 4) Den Unterschied zwischen ODBC-Treiber und Jet-Treiber kenne ich nicht. 5) Anhang meiner Leer Tabelle als Datenbank ist dabei. Grüße Niggemann Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fred_tomke Mitglied Applikationsingenieur
Beiträge: 156 Registriert: 14.06.2004 Map 2015 x64 Win7 x64 12 GB RAM ADN OpenDCL
|
erstellt am: 25. Apr. 2007 12:47 <-- editieren / zitieren --> Unities abgeben: Nur für Niggemann
Hi, sorry für die späte Antwort. Wenn ich dich richtig verstehe, willst Du bei Bedarf eine neue Tabelle anlegen mit einer kompletten Struktur. Und das mit dem Index machst Du nur, weil der offenbar beim Kopieren flöten geht. Letzteres war mir bis heute auch nicht bekannt. Du siehst, ich weiß auch nicht alles. Ok, es gibt zwei Möglichkeiten: A) Tabelle per SQL neu erzeugen incl. Felder und Index "CREATE TABLE MyTableName (ID autoincrement NOT NULL CONSTRAINT PRIMARYKEY PRIMARY KEY, OV text(250), O1 text(250), O2 text(250), AREA float)" wobei MyTableName der Tabellenname ist ID das Feld mit dem PrimaryKey ist OV, O1, O2 und AREA weitere Felder sind. Vorteil: am einfachten Nachteil: ist hardcoded B) Erst mit SELECT TOP 1 AlteTabelle.* INTO NeueTabelle FROM AlteTabelle. Dann "DELETE * FROM NeueTabelle". Dann "ALTER TABLE NeueTabelle ADD PRIMARY KEY ( ID ) " Dann "ALTER TABLE NeueTabelle ALTER COLUMN ID COUNTER(1,1)" Vorteil: Tabelle bleibt vergleichsweise variabel (bis auf Schlüsselfeld, aber das sollte nie variabel sein). Nachteil: aufwändiger Das ganze am besten mal im Access oder MySQL (phpMyAdmin) testen! Am allereinfachsten wäre die CopyObject-Methode. Ich habe 'ne ganze Weile danach gesucht - war aber nicht fündig geworden, zu welchem Objekt die Methode konkret gehört und wie ich da ran komme. Bis dahin musst Du mit obigen Ansätzen leben (müssen), bis dass ein anderer mehr weiß. http://www.google.de/search?hl=de&q=copyobject+struktur+kopieren&meta= VG, Fred ------------------ Fred Tomke Dipl.-Ing. (FH) Landespflege [Diese Nachricht wurde von fred_tomke am 25. Apr. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fred_tomke Mitglied Applikationsingenieur
Beiträge: 156 Registriert: 14.06.2004 Map 2015 x64 Win7 x64 12 GB RAM ADN OpenDCL
|
erstellt am: 25. Apr. 2007 12:51 <-- editieren / zitieren --> Unities abgeben: Nur für Niggemann
Hi, noch zum Thema Jet. Ich öffne meine DB so: (setq oDbv (vlax-get-or-Create-Object "ADODB.Connection")) (vl-catch-all-error-p (setq err (vl-catch-all-apply 'vlax-invoke-method (list oDbv "Open" (strcat "Provider=Microsoft.Jet.OLEDB.4.0;" "Data Source=" file ); strcat user pass adok-adConnectUnspecified ); vlax-invoke-method ))) Das sollte bei den SQL-Anweisungen von vorhin aber egal sein. VG, Fred ------------------ Fred Tomke Dipl.-Ing. (FH) Landespflege [Diese Nachricht wurde von fred_tomke am 25. Apr. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fred_tomke Mitglied Applikationsingenieur
Beiträge: 156 Registriert: 14.06.2004 Map 2015 x64 Win7 x64 12 GB RAM ADN OpenDCL
|
erstellt am: 25. Apr. 2007 12:55 <-- editieren / zitieren --> Unities abgeben: Nur für Niggemann
Hi, weils mir grad einfällt: ein primary key ist was anderes als ein Index. Für einen Index auf ein anderes Feld als das Schlüsselfeld wäre dann ALTER TABLE NeueTabelle ADD INDEX ( Feldname ) zu verwenden. VG, Fred ------------------ Fred Tomke Dipl.-Ing. (FH) Landespflege [Diese Nachricht wurde von fred_tomke am 25. Apr. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Niggemann Mitglied
Beiträge: 165 Registriert: 31.10.2003 Win 98 Se, ACAD 2004, XP Prof, ACAD 2004 und ACAD 2010
|
erstellt am: 25. Apr. 2007 19:45 <-- editieren / zitieren --> Unities abgeben:
Hallo Fred, ich werden wohl die 2. Lösung probieren müssen da bei mir sich alles um mein erstes Feld die "ART_NR" dreht diese aber auch Buchstaben Beinhalten kann. So wie ich es verstanden habe kann ein primary key keine doppelten Einträge zulassen, deshalb habe ich nach einer Lösung gesucht. Mit dem Index verfahre ich bereits so da ich nur 4 - 5 Spalten mit einem Index versehen muß ist das der einfachste Weg. für mich ist nur Wichtig das das Feld "ART_NR" nicht doppelt vorhanden ist. Grüße Niggemann Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Niggemann Mitglied
Beiträge: 165 Registriert: 31.10.2003 Win 98 Se, ACAD 2004, XP Prof, ACAD 2004 und ACAD 2010
|
erstellt am: 25. Apr. 2007 22:14 <-- editieren / zitieren --> Unities abgeben:
Hallo Fred, ich danke dir du hast mir super weiter geholfen deine unities sind schon Unterwegs. Die Zauberzeile hieß: "ALTER TABLE NeueTabelle ADD PRIMARY KEY ( ID ) " ich kopiere mir meine leere Tabelle mit SELECT INTO "neueTabelle" FROM "leereTabelle", danach rufe ich ALTER TABLE auf und habe meinen "PRIMARY KEY" genau wie ich es wollte. Trotzdem habe ich noch eine Frage bevor ich mir wieder alles abschiese Kann ich mit ALTER TABLE auch mehrere Indexe auf einmal vergeben? "ALTER TABLE NeueTabelle ADD INDEX ( Feldname1, Feldname2, Feldname3, Feldname4, ). Dann könnte ich mir wieder ein paar Zeilen sparen. Grüße Niggmann Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fred_tomke Mitglied Applikationsingenieur
Beiträge: 156 Registriert: 14.06.2004 Map 2015 x64 Win7 x64 12 GB RAM ADN OpenDCL
|
erstellt am: 26. Apr. 2007 08:27 <-- editieren / zitieren --> Unities abgeben: Nur für Niggemann
|
fred_tomke Mitglied Applikationsingenieur
Beiträge: 156 Registriert: 14.06.2004 Map 2015 x64 Win7 x64 12 GB RAM ADN OpenDCL
|
erstellt am: 26. Apr. 2007 08:35 <-- editieren / zitieren --> Unities abgeben: Nur für Niggemann
Hi, da scheint es einen Unterschied zu geben ob du alles gleichzeitig machst oder einzeln nacheinander. Diese Variante erzeugt zumindest keinen Fehler: Ihr SQL-Befehl wurde erfolgreich ausgeführt. (die Abfrage dauerte 0.1597 sek) SQL-Befehl:ALTER TABLE `colloquium06` ADD INDEX ( NAME, ANZ ) Allerdings habe ich hier EINEN Index erstellt, der über 2 Felder geht. Da müsste ich mich mal selbst schlau machen. Übrigens, ein Tipp noch: bei solchen Datenbank-Angelegenheiten guck ich meist noch unter www.ms-office-forum.de nach. Und noch ein Tipp: Vergiß nicht im Zweifelsfall ALTER TABLE NeueTabelle ALTER COLUMN ID COUNTER(1,1) auszuführen, damit werden die Auto-Werte zurückgesetzt (natürlich nur bei leeren Tabellen). VG, Fred ------------------ Fred Tomke Dipl.-Ing. (FH) Landespflege Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Niggemann Mitglied
Beiträge: 165 Registriert: 31.10.2003 Win 98 Se, ACAD 2004, XP Prof, ACAD 2004 und ACAD 2010
|
erstellt am: 26. Apr. 2007 12:39 <-- editieren / zitieren --> Unities abgeben:
Hallo Fred, mit den mehren Indexen war meine Überlegung das dann nur in diesen Spalten gesucht wird, das kann aber auch ein Irrtum meinerseits sein. Wie ich ja schon sagte befasse ich mich erst seit Anfang des Jahres mit Datenbanken bin also ein Neuling. Mit deinen Tipp auf das Office Forum hast du ja recht, aber deren Mittglieder kennen meist kein LISP oder sagen: "I was ist das den" "lehrn doch ne Richtige Sprache" . Das diese nicht so ganz das richtige forum ist weiß ich auch, aber hier kennt man wenigsten LISP. Mit LISP habe ich immer meine Probleme lösen können egal ob in oder ausserhalb von ACAD. Grüße Niggemann Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fred_tomke Mitglied Applikationsingenieur
Beiträge: 156 Registriert: 14.06.2004 Map 2015 x64 Win7 x64 12 GB RAM ADN OpenDCL
|
erstellt am: 26. Apr. 2007 14:27 <-- editieren / zitieren --> Unities abgeben: Nur für Niggemann
Hi, dass die dort kein LISP kennen bzw. können ist klar. Du verwendest aber ebenfalls SQL, genau wie sie. Deshalb wende ich mich - nur so als Beispiel - mit Fragen an sie, ohne dass sie wissen müssen, dass ich es in Lisp einbaue. Beispiel: http://www.ms-office-forum.de/forum/showthread.php?t=191328 Noch was ganz wichtiges zum Thema Indizes: Chef sagt, Indizes dienen ja dazu, die Suchen zu beschleunigen. Ein Index über mehrere Datenfelder kann hilfreich sein, wenn die Bedingung alle diese Felder enthält. Bei Suchen innerhalb eines Feldes (z.B. WHERE UCASE(NAME) LIKE "%NEMO%") sollte es ein einzelner Index sein. VG, Fred VG, Fred ------------------ Fred Tomke Dipl.-Ing. (FH) Landespflege Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |