Anmelden

View Full Version : Datensatz per Embedded SQL in Tabelle schreiben mit autogenerated Key



Seiten : [1] 2

dschroeder
17-06-15, 12:12
Hallo,

ich habe eine SQL beschriebene Tabelle mit einem autogenerated key:


create table eddatlib/siszakop (
zk_rec_id decimal(15) generated always as identity,
...


Den Datensatz der Datei habe ich als externe Datenstruktur im Programm deklariert. Die Variable heißt ZAKOPSatz. Ich möchte gerne den kompletten Satz in die Datei schreiben, also nicht alle Felder einzeln. Das mache ich so:


exec sql insert into siszakop values :ZAKOPSatz;




Ich bekomme beim insert den SQL-Fehler


Wert kann nicht für GENERATED-ALWAYS-Spalte ZK_REC_ID angegeben werden.
Unerwarteter SQLCOD: -798 in Routine SIS99ZKF01.




Das liegt sicher daran, dass das RPG-Programm den gesamten Datensatz, also auch das Record-ID Feld schreiben will. Beim SQL müsste man aber genau dieses Feld weglassen, da es ja automatisch generiert wird.
Hat vielleicht jemand eine Idee, wie man das hinkriegt? Wenn es keine Lösung gibt, muss ich die Datei wieder so ändern, dass ich die Record-ID selber vergebe.


Dieter

B.Hauser
17-06-15, 12:33
Leg eine View an, mit allen Spalten außer der Identity Column.
Definiere den Satz als externe Datenstruktur, fülle die entsprechenden Felder und mach dann den insert gegen die View.

Birgitta

dschroeder
17-06-15, 12:46
Danke Birgitta. Das ist zwar eine gute Idee (muss ich mir merken), aber in diesem Fall möchte ich das lieber nicht machen. Dann hätte ich 2 Stellen, an denen ich bei einer Dateierweiterung Änderungen vornehmen muss. Ich suche eine Lösung, bei der ich den einmal deklarierten Datensatz in die Datei schreiben kann.
Ich hatte gehofft, dass es bei der Definition der Tabelle noch irgendeine Möglichkeit gibt, die dafür sorgt, dass bei Insert immer eine Record-ID automatisch vergeben wird, egal was in der übergebenen Struktur steht. (Bitte jetzt keinen Trigger vorschlagen :-) )

Ich werde die Tabelle dann wohl auf "manuell" zu vergebende Record-ID umstellen.

Vielen Dank.

Dieter

BenderD
17-06-15, 12:57
... das müsste eigentlich auch mit Nullbyte map gehen

D*B

dschroeder
17-06-15, 13:20
Kann ich die Nullbyte map denn zu einem Bestandteil der Datenstruktur machen? Oder wie sollte man das deklarieren?

Dieter

BenderD
17-06-15, 13:28
... das sind dann zwei Bestandteile ohne komma dazwischen
insert into ... values(:record :nullb)

D*B

Fuerchau
17-06-15, 13:31
Eine Array, also dim(nn) in der Anzahl Felder der DS:
exec sql insert into siszakop values :ZAKOPSatz :ZNullArray;
Das richtige Feld dann mit "-1" als NULL definieren.

dschroeder
17-06-15, 13:37
Welchen Datentyp muss das Array denn haben? Ich dachte, so ein Nullbyte Array bestände aus Indikatoren.

Ein weiteres Problem ist, dass ich die Dimension des Arrays ja zur Compilezeit festlegen muss. Das heißt, beim Hinzufügen eines Feldes in die Dateistruktur ist es mit dem Durchwandeln des Programms nicht getan. Oder darf das Array mehr Elemente beinhalten als Felder in der Datei stehen? Dann könnte man es ja relativ groß machen.

Vielen Dank.

Fuerchau
17-06-15, 13:44
Letzteres ist korrekt.
D MyNullArr 5I 0 dim(512)

dschroeder
17-06-15, 14:03
Vielen Dank für die Hilfe!

Dieter