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]

Antwort per Email an