Hi Robert,
Am 03.04.2010 10:25, schrieb Robert Großkopf:
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?
Ja, wobei ich je länger je weniger nachvollziehen kann, was da
eigentlich geschah.
Mechtilde hat darauf hingewiesen, das bei Ihr auch mit zwei Spalten
alles korrekt liefe.
Jetzt habe ich eine neue Datei mit einer Tabelle im gleichen Schema
erstellt und - oh Wunder es geht....alles läuft einwandfrei ab, und ich
kann den Text korrigieren, ohne dass inkrementiert wird.
Nun kann ich das Fehlverhalten nicht mehr erzeugen... was war da bloss
loos???
Dummerweise habe ich die Fehlerhafte Datei gelöscht. Wäre in diesem Fall
wirklich gut gewesen die zu erhalten, um dem Sachverhalt auf den Grund
zu kommen.
Ich werde das auf jeden Fall im Auge behalten und versuchen das wieder
zu erzeugen. Sollte ich wieder darauf stossen werde ich die dann sicher
abspeichern und es melden.
Kann durchaus sein, dass ich irgendwo, beim Erzeugen oder Befüllen, eine
Fehleingabe gemacht hatte die das verursachte - nur was?
Wäre gut zu wissen, um das unterbinden zu können.
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:
Genau da liegt ja das Problem. Deshalb mein Wunsch, eine "Nullung"
durchführen zu können. Sonst muss immer die Tabelle nach den Tests
gelöscht und neu erstellt werden.
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 ->
Richtig, mit dem <AutoWert> wird das Ganze nicht richtig zu
kontrollieren sein, da beim Löschen einer Zeile diese Nummer jetzt fehlt
und der Zähler unter der letzt- erzeugen Zeilennummer steht; da ja beim
Schliessen der Zeile inkrementiert wurde.
¦> 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
...
Ich wollte dabei sicherstellen, dass Auswahltabellen immer in der
gewünschten Reihenfolge erscheinen. Insbesondere ist das dann notwendig,
wenn eine Sortierung weder alphanumerischen noch mathematischen Regeln
gehorcht. Dann ist ja auch eine Sortierung in einer Abfrage nicht mehr
möglich. Z.B. Bahnstationen im Ablauf der Geographischen Abfolge. So
folgen bei uns in der Schweiz beispielsweise die Postleitzahlen diesem
Schema.
Vielen Dank für Dein Makro, werde das mal mit einigen Versuchen laufen
lassen, und sicher auch Anwendungen finden, wo mir das gut dienen wird.
Gruss Marino
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]