PDA

View Full Version : SQL Column id ODBC



gwoe
16-04-10, 20:24
Hallo,

eine Windowsanwendung soll über ODBC Daten aus einer mit DDS erstellten Datenbankdatei lesen und auch zurückschreiben. Es handelt sich dabei um eine Software, die mit Progress entwickelt wurde, Version 91C. Beim Versuch über den CA ODBC Treiber auf die AS400 zuzugreifen, bringt die Windows-Seite eine Fehlermeldung : 'kein column id Satz verfügbar'
Jetzt fragen die mich, ob ich in die Tabelle column Ids einfügen kann.
Kann ich ?
Kann ich mit DDS ?
Oder geht das nur mit SQL ?

Vielen Dank für jede Hilfe !

Gerhard Wörlein

andreaspr@aon.at
17-04-10, 06:26
Hi,

Bzgl. Tabellenerweiterung:

1: Ja
2: Ja
3: Auch

Wenn der Source der DDS-Tabelle noch vorhanden ist, kann dort das neue Feld hinzugefügt und die Tabelle erstellt werden.
Vorher sollte jedoch die Original-Tabelle gesichert werden (zB. umbenennen, in eine andere Lib verschieben).
Und dann entweder via Insert Into in SQL oder mit CPYF die alten Daten in die neue Tabelle hinzufügen.

Oder mit Alter Table in SQL die Tabelle erweitern.

Bzgl. des eigentlichen Problems:
Ich würde vorher mal eine Testtabelle anlegen um zu probieren, ob diese Anwendung wirklich eine ID-Column benötigt. Nicht zu vergessen, dass jede Tabelle sowieso eine ID-Column besitzt (RRN).
Select RRN(Tab1), Tab1.* from Tab1

BenderD
17-04-10, 08:16
... die erste zu klärende Frage ist, ob diese Tabelle auch anderweitig benutzt wird, "Wat den einen sin Uhl is den andern sin Nachtigal."
... die zweite zu klärende Frage ist, was die (Postgres) Anwendung an dieser Stelle eigentlich für ein SQL Statement absetzt.

@Andreas: RRN ist mitnichten sowas wie eine Column ID, sondern die physikalische Satznummer im Datensegment; bei anderen (richtigen) Datenbanken kommt man an dieses Teil aus gutem Grund nicht dran.

D*B

KingofKning
17-04-10, 09:06
Hallo,
ist doch schön zu hören das es noch Leute gibt die mit Progress arbeiten.
Hatte in den 90er Jahren lange und intensiv damit gearbeitet, und muß sagen das war eine Datenbank und Programmiersprache die ich wirklich toll fand.
GG

Fuerchau
17-04-10, 12:27
Mit der Erweiterung von Tabellen, insb. DDS, würde ich vorsichtig sein, da ja meistens eine Vielzahl anderer OPM/ILE-Programme darauf zugreifen und bei Änderung auf die Schnautze fallen.
Zusätzlich ist dann das Vergeben der ID nicht unproblematisch, da dies beim WRITE/INSERT in jedem Programm gemacht werden muss.

Es stellt sich daher auch die Frage (wie Dieter schon sagt), was Progress denn da benötigt.
Meist reicht da die Definition einer LF mit UNIQUE-Key. Man muss dann ggf. auf die LF und nicht die PF zugreifen.
Manche Programmierumgebungen kommen auch nicht damit zurecht, wenn mehr als 31 LF's an einer PF hängen und somit der Verweis auf die LF eher Erfolg verspricht (z.B. MS-Access).

UFK
17-04-10, 12:35
'kein column id Satz verfügbar'
Anscheinend ist das nur grausig übersetzt. Oder ?

Wenn eine eindeutige RowId gemeint ist, ok, dann erstellt man mit SQL eben so ein Zusatzfeld, und definiert in den Contraints, daß es automatisch gefüllt und hochgezählt wird. Beim INSERT läßt man dieses Feld einfach weg, denn die Datenbank erzeugt es wirklich selber.

Beim Lesen und Updaten ist es doch ganz vorteilhaft, die Rows damit leicht unterscheiden zu können. Daß das Feld selber aber auch nicht upgedatet werden kann, ist wohl logo.

Leider kenne ich kaum klassische AS400-Anwendungen, die so was benutzen. Um die Java-Programmierer aber glücklich zu machen, habe ich bei meinen Tabellen oft so ein Feld hinten angefügt, und es ansonsten komplett ignoriert.

gwoe
18-04-10, 21:00
Vielen Dank für die Antworten. Es handelt sich hier um eine zusätzliche Identitätsspalte, die von der AS400 selbst gefüllt wird - praktisch einen tabelleninternen Schlüssel.
Jedes numerische Feld kann man als diesen Schlüssel definieren der dann auch bei write Operationen ohne SQL korrekt weitergezählt wird.
Das Feld CID als solche column ID wird z.B. so erstellt :

CID NUMERIC(15, 0) GENERATED ALWAYS AS IDENTITY
(START WITH 1 INCREMENT BY 1
NO MINVALUE NO MAXVALUE
CYCLE NO ORDER
CACHE 20 )
Leider kann man an mit DDS definierten Tabellen solche Spalten nicht hinzufügen, es gibt auch kein DDS Schlüsselwort dafür.

UFK
18-04-10, 21:22
Ja, genau das meinte ich auch.

Es ist übrigens gar nicht schwer, mit DDS definierte Datenbankdateien im interaktiven SQL zu selektieren, und mit F13 eine SQL-Ausgabedatei zu erstellen, die dann nicht mehr die DDS-Merkmale trägt. Bei dieser Kopie kann man dann in einem zweiten Schritt leicht die Identity-Colum mit ALTER TABLE hinzufügen, denke ich.

B.Hauser
19-04-10, 08:14
Mit dem SQL-Befehl Alter Table kann man auch DDS-beschriebene physische Dateien verändern und SQL Informationen integrieren (z.B. Identity columns).

Für ein erneutes Erstellen sollte man sich dann den SQL-Code über den iSeries Navigator (auf die Tabelle positionieren, Rechtsclick und SQL generieren auswählen) und am besten in ein Source Member sichern. Mit RUNSQLSTM könnte dann die Datei (basierend auf dem SQL-Befehl) erneut erstellt werden.

Birgitta

gwoe
19-04-10, 08:39
Wenn die Datei mit DDS erstellt wurde, kann ich mit alter table keine column id einfügen.
Wenn ich die Datei mit SQL neu erstelle, kann ich mit alter table einfügen, was ich will.