0

Tabelle bereinigen und neu sortieren

hallo liebes Forum, 

ich würde gerne eine Tabelle am Ende des Jahres "bereinigen", soll heißen leere Datensätze zu löschen und den Index (ID) neu aufbauen. Im Endeffekt reduziert sich das Problem auf eine Tabellen (mit verknüpfter Tabelle) neu zu sortieren, also den Datensatz ID=1 mit einen anderen Datensatz zu überschreiben...etc. Wichtig: keine Ansicht, die ursprüngliche Tabelle soll umsortiert werden. Im 1. Bild Nr 1 Auto soll durch die Nr 4 Flugzeug ersetzt werden...(gem. Sortierung1) 

Wenn ich einen Testcode in der Konsole laufen lasse zeigt sie mir das richtige Ergebnis an: 
let c:= 1; 
let x:= select Master; 
for i in x order by Sortierung1 do 
let j:= select Master where(Nr) =c; 
c:=c+1; 
j.Artikel +"-->"+ i.Artikel;
end
Ergebnis: 
Auto-->Flugzeug
Motorrad-->Schiff
Schiff-->Auto
Flugzeug-->Motorrad

wenn ich die Zeile 6 wie folgt ändere (j.Artikel := i.Artikel;) und daher zu einem ausführbaren Code mache passiert folgendes: - siehe 2. Bild

Es scheint, dass die Variable x kein Array im Speicher erzeugt, sondern nur einen Verweis auf die originale Tabelle und wenn diese dann verändert wird, kommt Nonsense raus. 

Habt ihr einen Idee? Eine Möglichkeit wäre eine leere Kopie zu erstellen und dann die Kopie sortiert zu befüllen und dann wieder retour speichern, aber das ist ja wohl super umständlich... 

Anbei eine Kopie der DB zum probieren

lieben Dank 

2 Antworten

null
    • Ninox-Professional
    • planoxpro
    • vor 2 Tagen
    • Gemeldet - anzeigen

    Ich weiß nicht, ob ich dein Anliegen richtig verstehe, aber bei dem Wert in der Spalte 'Nr' handelt es sich um die Datensatznummer als Zahl. Sie ist Teil der Datensatz-ID, wird von Ninox automatisch vergeben und lässt sich nicht verändern. Löscht man einen Datensatz, so wird dessen ID/Nr nicht neu vergeben. Das ist insofern wichtig, als auch Verknüpfungen über die ID verwaltet werden.

    Um also eine Tabelle mit gelöschten Datensätzen neu aufzubauen, so dass 'Nr' wieder bei 1 beginnt und keinerlei Lücken enthält, müsste man die Daten tatsächlich in eine neue Tabelle schreiben.

    Besser ist es aber, statt dessen ein eigenes numerisches Datenfeld - bspw. 'LfdNr' - hinzuzufügen, das dann beliebig manipuliert werden kann. Dieses Feld kann statt der 'Nr' in der Tabellenansicht eingeblendet werden.

    PS: Die beiden Screnshots zeigen übrigens dasselbe Bild.

      • 46wcxg
      • vor 2 Tagen
      • Gemeldet - anzeigen

      hi,  

      danke für deine Antwort. Zu deinen Punkten: 

      a) Screenshots: ja, sorry man sieht daraus nicht, was ich meine.
      b) Datensatz ID: ja, mir ist die Funktionsweise der ID klar, eigentlich geht es genau darum. Beim Arbeiten mit einer DB hat man irgendwann das Problem mit "0" / leeren Datensätzen, die man dann löschen könnte, aber dann eine Lücke in der ID Reihenfolge hat (wenn man Ninox als Buchhaltungs-DB einsetzt - wie ich, und genau daraus kommt mein Anliegen - dann gilt es Datensatz Löschungen oder 0 Datensätze zu vermeiden. Daher würde ich gerne am Ende eines Jahres meine Tabelle "bereinigen". D.h. "0"/leere Datensätze ans Ende zu verschieben um sie dann später weiter zu verwenden und alle Datensätze die auch einen Sortierschlüssel (Monat mit laufender Nummer) haben mit der laufenden Datensatz ID zu synchronisieren/harmonisieren (d.h. eine Buchung zB mit einer laufenden Nummer 202506005 nicht gerade bei der Datenbank ID mit der Nr. 5 aufscheint (was programmtechnisch egal wäre, aber meinen Ansprüchen entgegenläuft). Daraus erstellt sich mir die Frage: 
      1. Wie kann ich eine Tabelle nach einem beliebigen Schlüssel (z.B. Rechnungsnummer) umsortieren und diesen auch mit der DB-ID in Einklang bringen? Sprich Rechnungsnummer Sortierung entspricht aufsteigend auch der ID Sortierung.
      2. und dies auch, wenn die Tabellen eine verknüpfte Tabelle hat.  

      Ich lade eine neuere Version der Testdatenbank "Test 20250503" mit folgendem Inhalt hoch: 
      Tabelle Master: Sortierschlüssel1 und SortierschlüsselA
      Tabelle Slave: verknüpfte Tabelle
      Tabelle Master2: leere Tabelle, dient zum Kopieren von Master
      Es gibt in den Optionen 3 functions: 
      1. function  copy_to_master2 () - funktioniert
      2. function copy_master2_to_master - funktioniert auch
      3. function anpassen_slave - führt zu sehr merkwürdigen Verhalten der gesamten Datenbank und funktioniert nicht. 

      Die Aufgabe der 3 Funktionen wäre: 1. eine Kopie der Tabelle Master in einer neuen Reihenfolge in die Tabelle Master2 zu schreiben. 2. die DS in der Master Tabelle mit den neu sortierten Werten aus Master2 zu überschreiben (und damit eine neue Reihenfolge zu definieren) und 3. die Slave Tabelle entsprechend anzupassen. 
      🙄

      danke