Ermitteln von Userexits – Teil 1

Häufig steht man vor der Frage: Gibt es für eine Transaktion Userexits und wenn ja, welche. Meist sind diese jedoch nicht dokumentiert und man muss mühselig die SMOD durchsuchen. Dann weiß man moch nicht, ob eine Erweiterung deren Namen vielversprechend klingt, auch wirklich vom Programm nachher durchlaufen wird. Auch das ist häufig eher weniger gut dokumentiert. Seit Jahren nutze ich hier einen kleinen Report, um mehr wenigstens einen Überblick zu verschaffen, welche SMOD-Erweiterungen in einer Transaktion zum Tragen kommen. Auf dem Selektionsbild gibt man einfach den T-Code ein und anschließend bekommt man eine Liste mit den relevanten SMOD-Erweiterungen. Per Doppelklick gelangt man übrigens direkt in die Transaktion SMOD. Hinweis: Ich habe dieses Programm vor Jahren mal auf einer Webseite gefunden. Leider weiß ich nicht mehr welche und ich habe sie auch nicht wiedergefunden. Deswegen kann ich den Urheber hier nicht entsprechende würdigen.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
*&---------------------------------------------------------------------* 
*& Report ZUSEREXIT 
*& 
*&---------------------------------------------------------------------* 
*& 
*& 
*&---------------------------------------------------------------------* 
REPORT zuserexit NO STANDARD PAGE HEADING. 
 
TABLES : tstc, tadir, modsapt, modact, trdir, tfdir, enlfdir. 
TABLES : tstct. 
 
DATA : jtab LIKE tadir OCCURS 0 WITH HEADER LINE. 
DATA : field1(30). 
DATA : v_devclass LIKE tadir-devclass. 
 
PARAMETERS : p_tcode LIKE tstc-tcode OBLIGATORY. 
 
SELECT SINGLE * FROM tstc WHERE tcode EQ p_tcode. 
 
IF sy-subrc EQ 0. 
  SELECT SINGLE * FROM tadir WHERE pgmid = 'R3TR' 
                               AND object = 'PROG' 
                               AND obj_name = tstc-pgmna. 
 
  MOVE : tadir-devclass TO v_devclass. 
 
  IF sy-subrc NE 0. 
    SELECT SINGLE * FROM trdir WHERE name = tstc-pgmna. 
 
    IF trdir-subc EQ 'F'. 
      SELECT SINGLE * FROM tfdir WHERE pname = tstc-pgmna. 
 
      SELECT SINGLE * FROM enlfdir WHERE funcname = tfdir-funcname. 
 
      SELECT SINGLE * FROM tadir WHERE pgmid = 'R3TR' 
                                   AND object = 'FUGR' 
                                   AND obj_name EQ enlfdir-area. 
 
      MOVE : tadir-devclass TO v_devclass. 
 
    ENDIF. 
 
  ENDIF.
 
  SELECT * FROM tadir INTO TABLE jtab WHERE pgmid = 'R3TR' 
                                        AND object = 'SMOD' 
                                        AND devclass = v_devclass. 
 
  SELECT SINGLE * FROM tstct WHERE sprsl EQ sy-langu 
                               AND tcode EQ p_tcode. 
 
  FORMAT COLOR COL_POSITIVE INTENSIFIED OFF. 
  WRITE:/(19) 'Transaction Code - ', 20(20) p_tcode, 45(50) tstct-ttext. 
  SKIP. 
  IF NOT jtab[] IS INITIAL. 
    WRITE:/(95) sy-uline. 
    FORMAT COLOR COL_HEADING INTENSIFIED ON. 
    WRITE:/1 sy-vline, 2 'Exit Name', 21 sy-vline , 22 'Description', 95 sy-vline. 
    WRITE:/(95) sy-uline. 
 
    LOOP AT jtab. 
      SELECT SINGLE * FROM modsapt WHERE sprsl = sy-langu 
                                    AND name = jtab-obj_name. 
      FORMAT COLOR COL_NORMAL INTENSIFIED OFF. 
      WRITE:/1 sy-vline, 2 jtab-obj_name HOTSPOT ON, 21 sy-vline , 22 modsapt-modtext, 95 sy-vline. 
    ENDLOOP. 
    WRITE:/(95) sy-uline. 
    DESCRIBE TABLE jtab. 
    SKIP. 
    FORMAT COLOR COL_TOTAL INTENSIFIED ON. 
    WRITE:/ 'No of Exits:' , sy-tfill. 
  ELSE. 
    FORMAT COLOR COL_NEGATIVE INTENSIFIED ON. WRITE:/(95) 'No User Exit exists'. 
  ENDIF.
 
ELSE.
  FORMAT COLOR COL_NEGATIVE INTENSIFIED ON. 
  WRITE:/(95) 'Transaction Code Does Not Exist'. 
ENDIF. 
 
AT LINE-SELECTION. 
  GET CURSOR FIELD field1. 
  CHECK field1(4) EQ 'JTAB'. 
  SET PARAMETER ID 'MON' FIELD sy-lisel+1(10). 
  CALL TRANSACTION 'SMOD' AND SKIP FIRST SCREEN.

Noch eine Anmerkung: Natürlich ist die Suche nach Exits in den Zeiten von Enhancement Points nicht mehr arg so dringend. Dennoch bevorzuge ich die Userexits und Badis, weil ich hier in meinen Augen in einer für die Programmstabilität sicherer Umgebung eingreife.

1 Trackback / Pingback

  1. Ermitteln von Userexits – Teil 2 – Luxusvariante – Laufzeitfehler

Teil mir was mit