PDA

View Full Version : SQL Datei mit Autoindex Fehler



K_Tippi
02-01-23, 19:26
Hallo ein Gutes neues Jahr allen.

ich habe eine SqL Beschriebene Datei
if not (
exists(select 1 from qsys2.systables
where table_schema='&(OBJLIB)' and table_name='ZEIT_MITARBEITER_TAG')
) then
CREATE TABLE "&(OBJLIB)"."ZEIT_MITARBEITER_TAG"
FOR SYSTEM NAME ZEIMTPF (
GEFOS_MT_ID FOR MTIDMT DECIMAL(11)
NOT null GENERATED ALWAYS
AS IDENTITY
(START WITH 1
INCREMENT BY 1
MINVALUE 1
NO MAXVALUE
NO CYCLE
NO CACHE
ORDER
),

Nun kann seit dem 31.12.2022 kein Satz mehr hinzugefügt werden. Ek kommt die Meldung Doppelter Satzschlüssel. Es sind gerade mal etwas mehr als 27000 Sätze drin?

Hat jemand ne Ahnung woran das liegen könnte
Danke im Voraus
Klaus

Fuerchau
02-01-23, 21:12
Prüfe doch mal die ID's.
Leider kann man per "override system values" den "always" unterlaufen.
Ebenso könnte man beim Update eine ID überschreiben.
Wenn nun die nächste ID belegt ist, kannst du mit einem Alter die Id auf einen höheren Wert setzen.

<code class="hljs language-plaintext-ibm">ALTER TABLE ORDER
ALTER COLUMN ORDERNO
RESTART WITH 27501</code>

K_Tippi
03-01-23, 07:44
Danke Fuerchau, das scheint es gewesen zu sein. Da hat sich ein Module scheinbar überholt ;-)
Aufruf aus PGM1 lesen
Aufruf aus PGM2 lesen
update aus PGM1
updatea aus PGM2 -> Päng

Fuerchau
03-01-23, 08:11
Das geht nicht. Die ID's werden geschützt (Lock, +1, Unlock) hochgezählt.
Aus Performancegründen kann es auch Lücken geben, da u.U. auch Blocks á 20 Nummern geladen werden die nach Jobende verfallen.

Wichtig ist auf jeden Fall beim Update, vor allem bei DS'n, dass "Override Uservalues" (o.ä.) angegeben werden muss. Bei "Override Systemvalues" kann es eben zu Komplikationen führen.

dschroeder
05-01-23, 09:19
Frohes neues Jahr!

Nur ein Hinweis von mir: Es geht geht ganz schnell, einen system generated Key zu "verstellen". Dafür muss man nicht mal RPG und override Systemvalues einsetzen. Es reicht schon, mit SQL einen Datensatz aus einer Backuptabelle in die Originaltabelle zu kopieren und dabei (mit select *) alle Felder (also auch den autogenerated value) zu überschreiben.