Positionen nummerieren (Trigger)

John1988

Neuer Benutzer
Beiträge
4
Hallo zusammen,

ich bin auf der Suche nach einem Trigger welcher mir folgende Funktion ermöglicht.
In der Tabelle Auftrag_Position gibt es ein Spalte namens Position.
In diesem soll die Positionsnummer der Auftrags bzw. am Ende Rechnungsposition stehen.
Die Positionen sollen pro Auftrag bzw. Pro Rechnung erzeugt bzw. Geändert werden in
Tabelle Auftrag_Position gefiltert nach der Spalte Auftrag_ID.

Wenn eine Position erstellt wird bekommt diese Position 1 die zweite Position 2 die dritte die 3... Usw...

Das ganze würde dann so aussehen unter
Auftrag_ID 10
Position 1 Dienstleistung
Position 2 reifen Wechsel
Position 3 Datenrettung
Position 4 Einlagern
Position 5 Recherche

Wird nun nachträglich Position 3 gelöscht soll sie die Nummerierung der anderen Positionen welche nach Position 3 kommen automatisch ändern.

Auftrag_ID 10
Position 1 Dienstleistung
Position 2 reifen Wechsel

Position 3 Einlagern
Position 4 Recherche

Kann mir jemand sagen wie dieser Trigger unter mssql gebaut werden muss?
Bin da echt komplett unfähig:)

Vielen Dank
 
Werbung:
vielleicht hilft ja auch ein Beispiel...

Code:
test=*# select * from positionen ;
 auftrag |    position   
---------+----------------
      10 | dienstleistung
      10 | reifenwechsel
      10 | datenrettung
      10 | einlagern
      10 | recherche
      11 | färben
      11 | tönen
      11 | kämmen
(8 rows)

test=*# select auftrag, row_number() over (partition by auftrag order by position), position from positionen ;
 auftrag | row_number |    position   
---------+------------+----------------
      10 |          1 | datenrettung
      10 |          2 | dienstleistung
      10 |          3 | einlagern
      10 |          4 | recherche
      10 |          5 | reifenwechsel
      11 |          1 | färben
      11 |          2 | kämmen
      11 |          3 | tönen
(8 rows)

test=*# select row_number() over (partition by auftrag order by position), position from positionen where auftrag = 10 ;
 row_number |    position   
------------+----------------
          1 | datenrettung
          2 | dienstleistung
          3 | einlagern
          4 | recherche
          5 | reifenwechsel
(5 rows)

test=*#
 
Ich benötige das fest in einer Spalte.
Die Datenbank liegt unter einer Software. Ich kann mir leider nur Daten anzeigen lassen welche in den Spalten der Tabelle stehen.
Ich selbst kann da keinen select auf der DB ausführen.
 
Wenn das eine fertige Software ist, und da bereits eine Spalte dafür da ist, dann ist das wohl eindeutig ein Bug in der Software, wenn diese Spalte nicht aktualisiert wird.

Das ganze ist nicht trivial zu realisieren, weil je dieser TRIGGER immer feuern müßte, wenn sich eine Zeile ändert (dazukommt, gelöscht wird, ein Update bekommt). Dies wird recht flott dazu führen, daß der TRIGGER sich immer wieder selbst aufruft. Wenn das, wie im ersten Satz dargelegt, also ein Bug der Software ist, dann ist es weder an Dir noch an uns, das zu fixen.
 
Es ist kein Bug.

Ja der Trigger müsste bei jedem Mal ändern hinzufügen oder löschen loslegen. Aber das wäre okay.
Bzw wäre das Hochzahlen der Positionen beim Anlegen durch die Software möglich.
Dann müsste nur noch beim Löschen der Trigger arbeiten.
Ein verschieben ver Positionen ist nicht möglich.

In top der DB liegt ein FileMaker welche schlichtweg keine Funktion für so etwas bereitstellt.
 
Naja, noch als Hinweis: wenn ich etwas durchnumeriere, dann muß da auch eine Sortierlogig dahinter sein. Siehe auch mein ORDER BY im gezeigten Select. Damit würden sich dann aber auch Verschiebungen ergeben, wenn ich wie im Beispiel gezeigt nach dem Namen sortiere und später eine Position eingefügt wird, die vor bereits vorhandenen Positionen einsortiert wird.

Und mir erschließt sich noch immer nicht der Grund, daß da diese Spalte schon da ist und von der Software nicht befüllt wird.

Wäre ein VIEW eine Lösung?
 
Ich baue die Software selber mit dem Filemaker.
Das Feld Position habe ich geschaffen da es eine Rechnungspostiotn oder Auftragsposition geben muss / sollte auf welche man sich beziehen kann.
Leider ist es so das in dem Regelwerk welches der Filemaker zur Verfügung stellt dann an einer stelle doch Grenzen gesetzt sind.
Ich kann beim erstellen der Datensätze das Feld Position befüllen und auch hoch zählen.
Leider gibt es jedoch keine Aktion welche ermöglich beim Löschen aus der Mitte heraus die Positionsnummern neu zu vergeben.
Eine View ist keine Lösung da ich die Positionsnummer in dieser Tabelle benötige.
 
Werbung:
Zurück
Oben