-
UDF V6R1
Hallo *all,
ich bin auf dem Weg eine UDF zu erstellen die mir für einen Eingabewert einen HEX Wert zurückliefert.
Leider ist es so das die Eingabewerte zu groß sind da der Rückgabewert max FFFF sein darf.
Deswegen erstelle ich mir eine Tabelle wo ich die Eingabewerte reinschreiben will, die Anzahl der Sätze zähle und dann den Wert auch wegschreibe. (Für spätere Abfragen)
Leider scheitere ich schon am Anfang.
Beim ersten Aufruf ist es ja so, das die Tabelle leer ist. Also würde ich ein einfaches select count(*) machen und den Wert zurückgeben. Das will er aber nicht.
Code:
CREATE FUNCTION rptrade/zaehler /*10.10.19 14:34*/
( DEBITOR dec(08) ) RETURNS
CHAR(04) LANGUAGE SQL READS SQL DATA BEGIN
DECLARE RETURNVAL CHAR ( 04 ) NOT NULL DEFAULT '0000' ;
set returnval =
case when select count(*) from dat020 = 0 then 'XXXX'
else '0001'
end;
RETURN LTRIM(RETURNVAL);
END;
Für Hinweise dankbar. Werde mal sehen wo ich vernünftige Doku für die UDFs finde
GG 4251
-
Ich denke, du musst die Anzahl erst in eine Variable schieben:
DECLARE anzahl decimal(10);
select count(*) into anzahl from dat020;
set returnval = case when anzahl = 0 then 'XXXX' else '0001'
Gruß,
Dieter
-
Noch eine kleine Optimierung: Du willst ja eigentlich gar nicht wissen, wie viele Sätze in der Datei sind, sondern nur, ob es mehr als 0 sind. Deshalb würde ein "fetch first row only" verhindern, dass alle gezählt werden:
select count(*) into anzahl from dat020 fetch first row only;
-
Hallo,
werde ich morgen mal ausprobieren.
BTW. In der Tabelle sind hinterher Max. 200 Sätze, deswegen passt der Satz „Noch eine kleine Optimierung...“ ;-)
-
Versuch mal bei dem CASE die SELECT-Anweisung in eine Klapper zu packen.
Birgitta
-
UDF stehe auf dem Schlauch
Hallo *all,
mir fehlt jetzt nur noch die Konvertierung von hex nach decimal. Finde es auf Anhieb nicht wie der cast aussehen muß. Weil ohne fällt das Teil ab 000A auf die Nase.
Wie kann man eigentlich solche UDFs debuggen?
Ansonsten sieht meine UDF so aus.
Code:
CREATE FUNCTION rptrade/zaehler /*11.10.19 10:51*/
( DEBITOR dec(08) ) RETURNS
CHAR(04)
LANGUAGE SQL MODIFIES SQL DATA ALLOW DEBUG MODE
DISALLOW PARALLEL
BEGIN
DECLARE RETURNVAL CHAR (04) NOT NULL DEFAULT '0000' ;
DECLARE i_zaehler decimal(04) DEFAULT 0;
select d020werta into i_zaehler
from dat020 where d020key = debitor;
if i_zaehler = 0 then
select d020werta into i_zaehler
from dat020 order by d020werta desc
fetch first row only;
set i_zaehler = i_zaehler + 1;
insert into dat020 (d020key, d020werta)
values(debitor, substr(hex(int(i_zaehler)), 5, 4));
end if;
set returnval = substr(hex(int(i_zaehler)), 5, 4);
RETURN LTRIM(RETURNVAL);
END
Last edited by KingofKning; 11-10-19 at 10:25.
Grund: Noch Fragen offen
-
Wie wäre es mit
select 'J' into :vorhanden from datei where exists (...)
Schließlich enthält der Exists implizit den Fetch first und ist für den Einzelsatzzugriff optimiert.
-
Zitat von KingofKning
Hallo *all,
mir fehlt jetzt nur noch die Konvertierung von hex nach decimal. Finde es auf Anhieb nicht wie der cast aussehen muß. Weil ohne fällt das Teil ab 000A auf die Nase.
Wie kann man eigentlich solche UDFs debuggen?
Ansonsten sieht meine UDF so aus.
Code:
CREATE FUNCTION rptrade/zaehler /*11.10.19 10:51*/
( DEBITOR dec(08) ) RETURNS
CHAR(04)
LANGUAGE SQL MODIFIES SQL DATA ALLOW DEBUG MODE
DISALLOW PARALLEL
BEGIN
DECLARE RETURNVAL CHAR (04) NOT NULL DEFAULT '0000' ;
DECLARE i_zaehler decimal(04) DEFAULT 0;
select d020werta into i_zaehler
from dat020 where d020key = debitor;
if i_zaehler = 0 then
select d020werta into i_zaehler
from dat020 order by d020werta desc
fetch first row only;
set i_zaehler = i_zaehler + 1;
insert into dat020 (d020key, d020werta)
values(debitor, substr(hex(int(i_zaehler)), 5, 4));
end if;
set returnval = substr(hex(int(i_zaehler)), 5, 4);
RETURN LTRIM(RETURNVAL);
END
wenn ich das richtig verstehe, dann schreibst du einen Satz mit '0001' in dem Huddelfeld in die Datei, wenn ein Satz mit einer 0 (mit oder ohne Hierarchie) schon drinsteht.
Im Returnwert gibst Du dann '0001' zurück.
In allen anderen Fällen (kein Satz gefunden, oder schon zwei drin, geht Deine Procedure in die Grütze.
Ist das so gewollt?
D*B
-
Zitat von BenderD
wenn ich das richtig verstehe, dann schreibst du einen Satz mit '0001' in dem Huddelfeld in die Datei, wenn ein Satz mit einer 0 (mit oder ohne Hierarchie) schon drinsteht.
Im Returnwert gibst Du dann '0001' zurück.
In allen anderen Fällen (kein Satz gefunden, oder schon zwei drin, geht Deine Procedure in die Grütze.
Ist das so gewollt?
D*B
Kann ich jetzt nicht so bestätigen
Code:
Anfang auf Zeile . . .
....+....1....+....2..
D020KEY D020WERTA
1 0001
2 0002
3 0003
4 0004
5 0005
6 0006
7 0007
8 0008
9 0009
10 000A
******** Datenende
Vermutlich werde ich mir morgen eine HEX nach DEC Funktion selber schreiben. Habe ich das letzte mal im Informatikunterricht 1982 auf einem CBM 8032 gemacht.
Hätte nicht gedacht das ich das ein paar Tage später mal für ne AS/400 machen muß die die Funktion nicht kennt.
GG 4250
-
Ich frage mich nun allen Ernstes, wozu du denn mit HEX=>Dec oder auch zurück nun arbeiten must.
Das SQL nun mal keine Strukturen kennt und schon gar nicht mit Überlagerungen kannst du in RPGLE durch Overlays von Char mit Int(3), Int(5), int(10) und int(20) Binär nach Dezimal und umgedreht erstellen. Die Hex-Wandlung in SQL ist dann nicht erforderlich.
-
Die Antwort ist simpel: Wir haben leider SAP im Einsatz, und da sind die Kundennummern 8stellig. Weiterhin haben wir unsere Software RP-Trade, und da sind die Kundennummern 5stellig (Preislisten).
Fällt Dir was auf ;-)
Richtig, das passt so nicht. Deswegen die Krücke HEX.
RPG habe ich als COBOL Programmierer nie gemocht und kann es auch nicht. Und da die Aufgabe ja mit SQL lösbar ist, warum nicht. Wobei es mich schon wundert warum man eine HEX-Funktion implementiert aber nicht das Gegenteil davon.
Aber noch ein paar Stunden, und die Aufgabe ist gelöst. Und wenn ich gemein bin, gebe ich das am Montag meinem Azubi......
Wobei mir jetzt beim Schreiben eingefallen ist das ich eigentlich ja nur eine fortlaufende Zahl benötige und noch nicht mal hex brauche. (Hex habe ich damals im COBOL Programm gemacht als die Kundenummer noch sechsstellig war und ich auf 5 Stellen mußte)
Man sieht, drüber diskutieren bringt häufig was.
GG 4250
-
Danke, das hat schon mal funktioniert.
Habe mir das Redbook runtergeladen https://www.redbooks.ibm.com/redbooks/pdfs/sg248326.pdf
Muss jetzt mal schauen wo ich das Teil für V6 bekomme. Werde mich vermutlich nochmals melden ;-)
GG 4250
Similar Threads
-
By KingofKning in forum NEWSboard Programmierung
Antworten: 4
Letzter Beitrag: 05-04-17, 10:36
-
By KingofKning in forum NEWSboard Programmierung
Antworten: 4
Letzter Beitrag: 27-01-16, 09:59
-
By KingofKning in forum IBM i Hauptforum
Antworten: 12
Letzter Beitrag: 11-11-15, 10:40
-
By KingofKning in forum IBM i Hauptforum
Antworten: 2
Letzter Beitrag: 29-10-15, 08:32
-
By KingofKning in forum IBM i Hauptforum
Antworten: 3
Letzter Beitrag: 16-09-15, 18:21
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks