Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Was mache ich Falsch beim Änden eines Indexes in der Datenbank

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  Was mache ich Falsch beim Änden eines Indexes in der Datenbank (1946 mal gelesen)
Niggemann
Mitglied



Sehen Sie sich das Profil von Niggemann an!   Senden Sie eine Private Message an Niggemann  Schreiben Sie einen Gästebucheintrag für Niggemann

Beiträge: 159
Registriert: 31.10.2003

Win 98 Se, ACAD 2004, XP Prof, ACAD 2004 und ACAD 2010

erstellt am: 13. Apr. 2007 23:49    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von fred_tomke an!   Senden Sie eine Private Message an fred_tomke  Schreiben Sie einen Gästebucheintrag für fred_tomke

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Niggemann 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von Niggemann an!   Senden Sie eine Private Message an Niggemann  Schreiben Sie einen Gästebucheintrag für Niggemann

Beiträge: 159
Registriert: 31.10.2003

Win 98 Se, ACAD 2004, XP Prof, ACAD 2004 und ACAD 2010

erstellt am: 24. Apr. 2007 15:29    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities


Test.mdb.txt

 
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


Sehen Sie sich das Profil von fred_tomke an!   Senden Sie eine Private Message an fred_tomke  Schreiben Sie einen Gästebucheintrag für fred_tomke

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Niggemann 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von fred_tomke an!   Senden Sie eine Private Message an fred_tomke  Schreiben Sie einen Gästebucheintrag für fred_tomke

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Niggemann 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von fred_tomke an!   Senden Sie eine Private Message an fred_tomke  Schreiben Sie einen Gästebucheintrag für fred_tomke

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Niggemann 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von Niggemann an!   Senden Sie eine Private Message an Niggemann  Schreiben Sie einen Gästebucheintrag für Niggemann

Beiträge: 159
Registriert: 31.10.2003

Win 98 Se, ACAD 2004, XP Prof, ACAD 2004 und ACAD 2010

erstellt am: 25. Apr. 2007 19:45    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von Niggemann an!   Senden Sie eine Private Message an Niggemann  Schreiben Sie einen Gästebucheintrag für Niggemann

Beiträge: 159
Registriert: 31.10.2003

Win 98 Se, ACAD 2004, XP Prof, ACAD 2004 und ACAD 2010

erstellt am: 25. Apr. 2007 22:14    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von fred_tomke an!   Senden Sie eine Private Message an fred_tomke  Schreiben Sie einen Gästebucheintrag für fred_tomke

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Niggemann 10 Unities + Antwort hilfreich

Hallo,

nur für mich zum Verständnis:

Wozu können 4 bis 5 Indizes in einer Tabelle hilfreich sein?

VG, Fred

------------------
Fred Tomke
Dipl.-Ing. (FH) Landespflege

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

fred_tomke
Mitglied
Applikationsingenieur


Sehen Sie sich das Profil von fred_tomke an!   Senden Sie eine Private Message an fred_tomke  Schreiben Sie einen Gästebucheintrag für fred_tomke

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Niggemann 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von Niggemann an!   Senden Sie eine Private Message an Niggemann  Schreiben Sie einen Gästebucheintrag für Niggemann

Beiträge: 159
Registriert: 31.10.2003

Win 98 Se, ACAD 2004, XP Prof, ACAD 2004 und ACAD 2010

erstellt am: 26. Apr. 2007 12:39    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von fred_tomke an!   Senden Sie eine Private Message an fred_tomke  Schreiben Sie einen Gästebucheintrag für fred_tomke

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Niggemann 10 Unities + Antwort hilfreich

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

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz