Hallo Marino,
Ich habe nicht den ganzen Thread gelesen, deswegen hier nur ein paar
Anmerkungen.
>
> Beispiel:
>
> 1. Feld ID (Integer / Autowert=Ja / keine Formatierung)
> 2. Feld Text (Text / Länge=10 / kein Defaultwert))
>
> Eingabe: Spalte 1 = <AutoWert> / Spalte 2 = Altr (Schreibfehler)
>
> Korrektur: Altr -> Alter / Rückmeldung Fehler
Kommt an dieser Stelle natürlich darauf an, ob Du die Zelle bereits verlassen
hast. Beim Verlassen der Zelle (ist ja nur eine) springst Du zum nächsten
Datensatz.
> Nächste Zeile jetzt schon ID = 3 ??? Teilweise ist nicht zu erruieren,
> in welcher Zeilennummer man sich gerade befindet.
Vermutlich hast Du dann gerade die Zeile 2 als Korrekturzeile beschreiben
wollen. Ist das Ganze direkt in der Tabelle der Fall?
>
> Wenn die erste Zeile vollständig gelöscht wird und das Editieren
> geschlossen wird. Also es existiert keine Zeile in dieser Tabelle.
> Hernach wird eine neue 1. Eingabe getätigt, ist die Nummer jetzt schon
> auf 3.
Das Zurückstellen auf den kleinstmöglichen Wert geht mit
ALTER TABLE "Tabellenname" ALTER COLUMN "ID" RESTART WITH "Wert"
Ich habe das Ganze einmal in ein Makro gefasst, da ich beim ersten
Ausprobieren von Datenbanken ja recht schnell die IDs fülle und dann mit der
endgültigen Datenbank nicht mehr so schön bei 0 anfangen kann:
Sub Tabellenindex_runter(tablename 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.
REM Zugriff per Frame notwendig, wenn das Makro ohne geöffnetes
Formular
laufen soll
DIM inSequence_Value AS INTEGER
oDatenquelle = ThisComponent.Parent.CurrentController
If NOT (oDatenquelle.isConnected()) Then
oDatenquelle.connect()
End If
oVerbindung = oDatenquelle.ActiveConnection()
oSQL_Anweisung = oVerbindung.createStatement()
stSql = "SELECT MAX(""ID"") FROM """+tablename+""""
oAbfrageergebnis = oSQL_Anweisung.executeQuery(stSql)' Ergebnis
auswerten
IF NOT ISNULL(oAbfrageergebnis) THEN
WHILE oAbfrageergebnis.next
inAnzahl = oAbfrageergebnis.getInt(1)' Erstes Datenfeld
WEND ' naechster Datensatz
IF inAnzahl = "" THEN
inAnzahl = -1
END IF
inSequence_Value = inAnzahl+1
oSQL_Anweisung2 = oVerbindung.createStatement()
oSQL_Anweisung2.executeQuery("ALTER TABLE """+tablename+"""
ALTER
COLUMN ""ID"" RESTART WITH "+inSequence_Value+""
END IF
End Sub
Bei dem Makro fehlt fast die gesamte Variablendeklaration (alle "o...." sind
OBJECT, alle "in...." sind INTEGER, alle "st...." sind STRING), da ich die
Variablen außerhalb des Makros deklariert habe.
Mit
Sub Tabellenstart
REM Hier werden alle Tabellen eingetragen, deren ID nach
Bereinigung auf
den tiefstmöglichen Wert gesetzt werden soll.
Tabellenindex_runter("Mitglied")
Tabellenindex_runter("Ort")
Tabellenindex_runter("Postleitzahl")
Tabellenindex_runter("Strasse")
Tabellenindex_runter("Konto")
End Sub
Werden bei mir alle oben genannten Tabellen auf den niedrigstmöglichen Wert
zurückgestellt. Das Makro muss von einem Formular aus aufgerufen werden ...
Grundlegend kannst Du das Problem mit eventuell nicht genutzten IDs aber nur
in den Griff bekommen, wenn Du die IDs nicht mit einem Autowert hochschreiben
lässt sondern das Ganze so organisierst: Suche von 0 ab den ersten freien
Wert, schreibe diesen in das ID-Feld. Geht natürlich am besten im OpenOffice-
Base-Fall per Makro. So etwas habe ich einmal für eine Bibliotheksdatenbank
gemacht, da die unbedingt mit den vergebenen Nummern auf den Bestand der
Bibliothek zurückschließen wollen. Ist aber eigentlich nicht sinnvoll. Selbst
das Ausbuchen eines Buches (Verlust oder Verkauf auf dem Flohmarkt)
hinterlässt ja gegebenenfalls Datensätze, die sich auf dieses Buch beziehen -
und die müssen dann auch gelöscht werden. Anschließend hat nicht nur das Buch
nie in der Bücherei existiert, sondern es ist eben auch nie ausgeliehen worden
...
Gruß
Robert
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]