PDA

View Full Version : Perl CGI (auf OS/400 V4R5M0)



Seiten : [1] 2 3

tommi_011
26-05-16, 14:26
Erst ein mal ein freundliches "Neuling" Hallo in die Runde *ALL,

auf meiner guten alten 9401/150 mit OS/400 V4R5M0, hab ich das Perl gemäß CPAN installiert und ebenfalls als CGI eingerichtet.
Soweit ist erst einmal alles in Ordnung.
Doch das Problem ist die Datenbankanbindung!

Ich kann aus meinen Tabellen außschließlich Felder mit Feldinhalt NUMERIC auslesen, bzw. bekomme aus diesen Feldern die Werte zurück.
Alles was CHAR ist, wird beim verarbeiten "verschluckt".
Nun bin ich auf die Idee gekommen, dass es am CCSID liegen könnte und hab eigens nochmal eine neue Tabelle erzeugt, welche auch den aktuellen System CCSID (37) besitzt.
Aber es wird nicht besser.
Das Besondere allerdings ist, dass ich mittels Perl-CGI in diese Tabelle schreiben kann und die Daten auch vorhanden sind. Ich kanns mit STRSQL prüfen und auch via NetData abrufen. Nur das Perl selbst kann mir diese Feldinhalte nicht darstellen, obwohl die while Schleife alle Zyklen durchläuft, so viele Zeilen wie dei Tabelle besitzt.
Selbst beim Test auf der QSH (perl /../db1.pl) habe ich das gleiche Ergebnis.
Die Schleife läuft alle Zeilen der Tabelle durch, aber angezeigt bekomme ich nur die Numerischen Felder.

Was, außer auf mein geliebtes Perl zu verzichten, kann ich noch tun und beachten?
Gibt es ein besonders SQL Statement, eine Konfiguration die ich noch nicht gelesen habe?

Ich danke schon mal im voraus,
Thomas

B.Hauser
26-05-16, 14:35
Nur mal so eine Idee: Versuch doch mal die Alpha-Felder statt mit CHAR mit VARCHAR zu definieren. Wie sieht es dann aus?

tommi_011
26-05-16, 15:04
Das ist eine ganz klassisch definierte Tabelle (via PDM). Ich hab dort in der Datendefinitionsbeschreibung nur A für alphabetische Zeichen zur Verfügung oder S für die Ziffernwerte.

B.Hauser
26-05-16, 16:45
Auch in DDS kann man alphanumerische Felder mit variabler Länge definieren, durch Schlüssel-Wort VARLEN.
Gib sicherheitshalber noch die Feld-Länge bei VARLEN(Länge) an, damit alle Informationen auch wirklich in der Tabelle gespeichert werden.

Birgitta

Fuerchau
26-05-16, 17:20
Bei Zeichenfeldern brauchst du in der DDS gar nichts anzugeben, lass das "A" mal weg.
Ansonsten schau mal hier:
https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0ahUKEwjTm4LOkfjMAhUDVxQKHRiEBVEQFggmMAA&url=http%3A%2F%2Fwww.texas400.com%2FPERL.ppt&usg=AFQjCNFm6UElSBdyFLZpO74sq9nr3lNbTg&cad=rja

tommi_011
26-05-16, 18:44
Guten Abend und Danke für die schnellen Antworten.
Ich hab mich nach der PPT Folie gerichtet, die DDS Beschreibung geändert und das "A" weg gelassen - leider hilft alles nichts!
Es werden wieder nur die numerischen Felder zurück geliefert aber nicht die Alphabetischen bzw. Alphanumerischen.
VARCHAR als Schlüselwort kennt meine Beschreibung noch nicht.

B.Hauser
27-05-16, 05:55
VARCHAR als Schlüselwort kennt meine Beschreibung noch nicht.

Ich hatte ja auch VARLEN und nicht VARCHAR gesagt. VARCHAR ist der SQL-Datentyp.
A in Verbindung mit VARLEN ist die DDS-Beschreibung für Felder mit variabler Länge

Birgitta

tommi_011
27-05-16, 07:08
Oh, sorry richtig! Da hab ich wohl was falsch gelesen. Ich werde es mal nachher probieren.

Fuerchau
27-05-16, 08:26
Für SQL ist der Typ CHAR und VARCHAR nicht so unterschiedlich. Ich sehe da eher immer noch ein CCSID-Problem.
Bist du sicher, dass die Zeichendaten tatsächlich nicht zurückkommen?
Prüfe mal die Länge des Inhaltes sowie den Hex-Wert.
Als Verbindung wird von Perl, glaube ich, ODBC verwendet.
Somit kannst du z.B. via Excel o.ä. auch per ODBC vom PC Daten abrufen.
Wenn hier die Daten korrekt gelesen werden können, ist das irgendwo ein Problem in PHP.
Ggf. passt die Perl-Version nicht mehr zum V4R5.

Vielleicht ist DBI besser als CGI ?
http://www.tutorialspoint.com/perl/perl_database.htm

tommi_011
27-05-16, 11:10
Ich hab folgende Zwischenstand, aber noch nichts verbessertes:

"VARLEN" hat keinen Einfluss genommen.
Ich hab aber CCSID(500) und CCSID(65535) auf zwei Testfeldern im DDS definiert. Aber auch das hat noch nicht wirklich was gebracht.

Das Perl selbst spricht die Datenbank nicht mit ODBC an (nicht vorhanden) sondern mit DBI::DB2, also dem eigentlichen Treiber für DB2/400

Bei der Auswertung hab ich fetchrow_hashref (wie im Powerpointbeispiel) eingerichtet und mal $data->${DATENFELD} auswerten lassen.
Aufgrund des "$" Zeichens bekomme ich einen Hexadezimalenwert angezeigt (Hashwert?).
Der ist bei allen 3 Felder gleich, auch bei dem numerischen, der mir einen Wert (0x1df710) anzeigt.

Somit bin ich der Meinung das die Daten an sich ausgelesen werden. Da scheint eher Perl das Problem zu haben mir die Zeichenfelder anzuzeigen?