PDA

View Full Version : Wie erstelle ich ein SEU UserExit Programm?



ExAzubi
12-02-06, 18:30
Hallo zusammen,

ich bräuchte mal Hilfe von Vollprofis ;-)

Ich möchte ein UserExit Programm schreiben, welches mir gewisse Codeblöcke automatisch in die RPGLE Quelle einfügt (Kommantarbloc bei KOM, eine KeyList bei KEY etc).
Leider habe ich absolut keinen Plan wie ich das angehen soll. Muss das dahinterligende Programm einen speziellen Aufbau haben (*Entry Parms... )?
Das zweite Problem es sollen ja mehrere Sachen generiert werden, ich kann aber ja nur ein ExitProgramm hinterlegen, schreibe ich das ein Sammelprogramm für alles was anhand des Zeilenbefehls unterscheidet, oder hinterlege ich dort mehrere Programme?

Danke an alle Helfenden.

Bruno Jakob
13-02-06, 08:28
Beschreibung und Beispiele gibt es im SEU-Handbuch:

http://publib.boulder.ibm.com/infocenter/iseries/v5r3/topic/books/c0926050.pdf

Bruno

holly
14-02-06, 09:45
Halo ExAzubi,
Ein nettes Beispiel, welches ich auch selbst einsetze, findest Du hier:
http://www.mcpressonline.com/mc/.5bfadc7d

Gruß Holger

ExAzubi
14-02-06, 12:51
Danke für die Hinweise, besonder die Bsp. von Hollly haben mir geholfen und das PDF war auch sehr Hilfreich.

Allerdings habe ich ein Problem, ich kann keine Zeilen einfügen, da knallt mir der SEU. Kann mir vielleicht jemand noch zu diesem Problem ein Tipp geben?

Bruno Jakob
14-02-06, 14:43
Beim Einfügen von Zeilen musst du SEU noch mitteilen, wieviele Zeilen vom Exit-Programm zurückkommen. Hast du das in deinem Programm?

Bruno

ExAzubi
14-02-06, 18:40
Also der Code-Block sieht folgendermaßen aus.


D RETINF DS BASED(P2)
D RRETC 1 1
D RRSV2 2 4
D RRECO 5 8B 0
D RSEQN 9 15
D RRSV3 16 37

Paramterds für den 2 Parameter

Und der Codeblock (Jetzt nur testweise, soll bei Funktionieren noch verschönert werden.


C SKOMB BEGSR
*
C 1 DO 3
C IF HRLEN<100
C MOVEL *ALL'*' LTXT1
C ELSE
C MOVEL *ALL'*' LTXT2
C ENDIF
*
C MOVEL '0000001' RSEQN
C EVAL RRECO = 1
C EVAL RRETC = '0'
C ENDDO
C EVAL LCMD1 = *BLANK
*
C EKOMB ENDSR


Was muss ich anders machen?

Trotzdem Danke für alle bisherigen Tipps.

AS400.lehrling
14-02-06, 23:39
Und der Codeblock (Jetzt nur testweise, soll bei Funktionieren noch verschönert werden.


C SKOMB BEGSR
*
C 1 DO 3
C IF HRLEN<100
C MOVEL *ALL'*' LTXT1
C ELSE
C MOVEL *ALL'*' LTXT2
C ENDIF
*
C MOVEL '0000001' RSEQN
C EVAL RRECO = 1
C EVAL RRETC = '0'
C ENDDO
C EVAL LCMD1 = *BLANK
*
C EKOMB
ENDSR



Bist du dir Sicher das die SR zu Begin SKOMB und am Ende EKOMB heißt ?:confused:

Was muss ich anders machen?

Trotzdem Danke für alle bisherigen Tipps.

Gruß AS400.lehrling

ExAzubi
15-02-06, 07:06
Bist du dir Sicher das die SR zu Begin SKOMB und am Ende EKOMB heißt ?:confused:

Gruß AS400.lehrling

Ja warum nicht?

Die Benennung der SR ist nun doch ganz egal, und die des Ende TAG's ja auch!?!

Bruno Jakob
15-02-06, 07:34
Versuch doch mal Folgendes:

Vor der Schleife
MOVEL 'A000001' RSEQN
Damit teilst du SEU mit, dass du nach Zeile 1 was einfügen willst. Statt der 1 kannst du aus der Eingabestruktur auslesen, in welcher Zeile der Befehl eingegeben wurde und das entsprechend setzen, damit nicht nach Zeile 1 sondern nach der aktuellen Zeile eingefügt wird.

In der Schleife
die Zeilen mit dem einzufügenden Text füllen. Den Pointer auf die Zeile dabei jeweils erhöhen.

Nach der Schleife
EVAL RRECO = Anzahl der eingefügten Zeilen
EVAL RRETC = '0'

Ich mache das in einem Cobol-Programm und das funktioniert so.

Bruno

ExAzubi
16-02-06, 12:47
Danke Bruno für den Tipp, der hat geholfen.