PDA

View Full Version : laufende Nummer in DB mit SQL aktualisieren



Seiten : [1] 2

XMan
04-03-14, 14:26
Hallo,

ich möchte gerne in eine DB eine laufende Nr. mit SQL einfügen.
Mit "select ROW_Number() over(partition by myfeld) from mylib.mydb" funtkioniert das ja für die Anzeige.
Gibts da auch was für UPDATE?

Konkret erstelle ich in einer DB Sätze (für mehrere Firmen), nach einem zweiten Aufbau können Sätze hinzukommen oder entfernt werden.
Danach sollte die Laufende Nr. wieder aktualisert werden, mit der Bedingung einer Gruppierung auf Firmenebene.
D.H. ich möchte einfach pro Firma wieder eine aufsteigene Laufende Nr. beginnend bei 1 haben.

Gibt es da eine Möglichkeit?

Vielen Dank!
XMan

Fuerchau
04-03-14, 16:55
Stichwort "Identity"-Spalte.
Die kann automatisch eine Nummer vergeben. Hierzu wird eine sog. "Sequence" automatisch verwendet.
Alternativ kannst du das auch selber machen:

create sequence MySeq

insert into myfile (f1, SeqFld) values(xx, next value for MySeq)

B.Hauser
04-03-14, 17:54
Weder eine Identity Column, noch eine Sequence No berücksichtigen Gruppen-Wechsel.
Einen laufenden Zähler automatisch abhängig von einer Gruppierung zu generieren geht nur mit einem Before-Update Trigger.

Birgitta

XMan
05-03-14, 08:12
Guten Morgen!

Danke für die Antworten!

Und wie sieht so ein Before-Update Trigger für einen frei definierten Gruppenwechsel aus wenn bereits Daten in der DB sind?
Ich habe leider noch nie etwas mit Triggern gemacht auf SQL.

Thx

Fuerchau
05-03-14, 08:23
Ein Updatetrigger hilft dir da wohl auch nicht, da dieser ja nur den aktuellen Satz betrachtet.
Hier kannst du nur selber eine Prozedur (egal ob embedded SQL oder SQL-Procedure) schreiben, die per Select die Daten nebst Schlüssel sammelt und dann den Update je Schlüssel mit der neuen Nummer durchführt.
Warum denn die Nummer immer neu vergeben?
Bei ggf. Millionen von Sätzen ist das ein zeitraubender Vorgang.
Sind Lücken denn relevant bzw. dürfen nicht vorkommen?
Du kannst dir doch eine Mandantentabelle (die gibts meist ja schon) mit einem Zähler erstellen, der bei jedem Insert (before-Insert-Trigger) die neue Nummer beschafft.

XMan
05-03-14, 08:51
Danke für die Info!

Dann bleibt mir ein Nachlaufprogramm nicht erspart.

Grund hierfür ist das ich Daten für eine Behörde (Summendatei) aus zwei Umgebungen (Lohn & Gehalt) aufbauen muss.
In beiden Umgebungen Lohn & Gehalt gibt es teilweise gleiche Firmen mit Personensätzen.
z.B. Lohn hat Firma A, B, D und Gehalt hat Firma A, C, D, E
Die Behörde will aber nichts wissen von Lohn & Gehalt und somit pro Firma eine durchgehende Nummerierung der Personendaten haben.
Nun zu meinem Problem, wenn die Daten im Lohn aufgebaut wurden und dann die Gehaltsdaten einfließen könnte ich ja bei der höchsten lfd.Nr. vom Lohn fortsetzen. Aber wenn die Lohndaten nochmals aufgebaut werden (weil nachträgliche Korrektur) dann kann es sein das es mehr oder weniger Sätze gibt und somit die Nummerierung nicht mehr stimmt.
Das Spiel kann öfters vorkommen, somit muss ich am Ende über beide Umgebungen eine eindeutige Nummer für die Behörde erstellen.

Wäre halt schön gewesen wenn es hier eine einfache SQL Lösung gegeben hätte.

Danke dennoch für Euer bemühen!

BenderD
05-03-14, 09:11
... was in der Anzeige geht, kann man mit einem einfachen QMQRY in eine Ausgabedatei brettern, wo ist das Problem?

XMan
05-03-14, 09:36
... was in der Anzeige geht, kann man mit einem einfachen QMQRY in eine Ausgabedatei brettern, wo ist das Problem?

Und wie geht das?

Thx

BenderD
05-03-14, 09:46
du packst dein SQL Statement in eine Textdatei, erstellst das QMQRY mit CRTQMQRY und führst es mit STRQMQRY aus, letzteres hat einen Parameter OUTPUT, der *outfile erlaubt.

D*B

Fuerchau
05-03-14, 09:50
Wenn du deine Daten für die Behörde aufbereitest musst du doch die Nummer nicht zurückschreiben, da sie sich doch sowieso jedesmal ändern kann.
Also mach einen SQL fertig (select blabla) und bette diesen in einen QMQRY ein (STRQM).
Per STRQMQRY kannst du dann eine Ausgabedatei erstellen.

Alternativ mache:
create table as (
select ....
) with data
Und bearbeite die Ausgabe dann z.B. per CPYFRMIMPF.