Seite 1 von 1

Tabellenindex heruntersetzen

Verfasst: Do 23. Jul 2015, 23:42
von miniaturbuch1
Hallo,
ich möchte den Tabellenindex, der inzwischen ins Uferlose geht heruntersetzen.
Ich benutze dazu das im Handbuch beschriebene Makro, habe ein Formular zur Tabelle 'Buchtabelle' gemacht, das beim Öffnen das Makro ausführt.
Leider kommt dabei sofort folgender Fehler für die erste Zeile des Makros:
BASIC-Laufzeitfehler.
Falscher Wert für Eigenschaft.
Was mache ich falsch?
Zugegebenermassen habe ich weder von Makros noch mit Basic viel Ahnung.

Freundliche Gruße,
Luggi

MAKRO:

SUB Tabellenindex_runter(stTabelle AS STRING)
REM Mit dieser Prozedur wird das automatisch hochgeschriebene Primärschlüsselfeld mit der vorgegebenen Bezeichnung "ID" auf den niedrigst möglichen Wert eingestellt.
DIM inAnzahl AS INTEGER
DIM inSequence_Value AS INTEGER
oDatenquelle = ThisComponent.Parent.CurrentController REM ' Zugriffsmöglichkeit aus dem Formular heraus
IF NOT (oDatenquelle.isConnected()) THEN
oDatenquelle.connect()
END IF
oVerbindung = oDatenquelle.ActiveConnection()
oSQL_Anweisung = oVerbindung.createStatement()
stSql = "SELECT MAX(""ID"") FROM """+stTabelle+"""" REM ' Der höchste in "ID" eingetragene Wert wird ermittelt
oAbfrageergebnis = oSQL_Anweisung.executeQuery(stSql) REM ' Abfrage starten und den Rückgabewert in einer Variablen oAbfrageergebnis speichern
WHILE oAbfrageergebnis.next
inAnzahl = oAbfrageergebnis.getInt(1) REM ' Erstes Datenfeld wird ausgelesen
WEND REM ' nächster Datensatz, in diesem Fall nicht mehr erforderlich, da nur ein Datensatz existiert
IF inAnzahl = "" THEN REM ' Falls der höchste Wert gar kein Wert ist, also die Tabelle leer ist wird der höchste Wert als -1 angenommen
inAnzahl = -1
END IF
inSequence_Value = inAnzahl+1 REM ' Der höchste Wert wird um 1 erhöht
REM Ein neuer Befehl an die Datenbank wird vorbereitet. Die ID wird als neu startend ab inAnzahl+1 deklariert.
REM Diese Anweisung hat keinen Rückgabewert, da ja kein Datensatz ausgelesen werden muss
oSQL_Anweisung1 = oVerbindung.createStatement()
oSQL_Anweisung1.executeQuery("ALTER TABLE """ + stTabelle + """ ALTER COLUMN
""ID"" RESTART WITH " + inSequence_Value + "")
END SUB

Re: Tabellenindex heruntersetzen

Verfasst: Fr 24. Jul 2015, 08:26
von RobertG
Hallo Luggi,

SUB Tabellenindex_runter(stTabelle AS STRING)
→ Du musst das Makro mit einer anderen Prozedur starten:

Code: Alles auswählen

SUB Start
Tabellenindex_runter("Name meiner Tabelle")
END SUB
Um das Ganze aber nur einmal auszuführen brauchst Du natürlich kein Makro. Das Makro ist dafür vorgesehen, so etwas automatisch immer wieder einmal durchzuführen. Was Dir ausreicht steht im Handbuch im Kapitel "Tabellen":

Code: Alles auswählen

ALTER TABLE "Tabellenname" ALTER COLUMN "Feldname" RESTART WITH <neuer_Feldwert>
Du schaust in der Tabelle nach, welches nach dem Löschen vieler Datensätze der zur Zeit höchste Wert für die automatisch erstellte Primärschlüsselnummer ist und trägst dann als <neuer_Feldwert> eine um 1 höhere Zahl ein. Die Eingabe geht über Extras → SQL.

Gruß

Robert

Re: Tabellenindex heruntersetzen

Verfasst: Do 30. Jul 2015, 20:52
von miniaturbuch1
Vielen Dank!
Die direkte Eingabe von SQL macht es viel einfacher und es hat auch funktioniert.
Das Feld ID hat jetzt direkt hintereinander aufsteigende Werte, aber leider beginnt der Index nicht bei 1.
Wie macht man es, wenn das Feld ID mit 1 beginnen soll?
Freundlicher Gruß,
Luggi

Re: Tabellenindex heruntersetzen

Verfasst: Fr 31. Jul 2015, 07:24
von RobertG
Hallo Luggi,

wenn Du die Tabelle leer hast, dann kannst Du doch den Start beliebig festlegen:

Code: Alles auswählen

ALTER TABLE "Tabellenname" ALTER COLUMN "Feldname" RESTART WITH 1
legt den Start auf den Wert '1' fest.

Das klappt natürlich nicht, wenn schon Werte in der Tabelle stehen, die den Primärschlüssel gleich oder größer 1 haben.

Gruß

Robert