MBEW Änderung feststellen

Postby Jonathan698 » Fri Jan 08, 2010 9:23 am

Hallo,

wie / ob aus SAP ein Trigger angelegt werden kann weiß ich nicht. Trigger sind aber eigentlich kein Hexenwerkzeug. Eine kleine Übersicht wäre hier zum Beispiel: http://de.wikibooks.org/wiki/Oracle:_Trigger

Bezüglich der BSIM habe ich noch eine Frage, welche Belegarten können denn überhaupt eine Änderung in der MBEW auslösen? Kann ich dies irgendwie herausfinden?


Mit freundlichen Grüßen
c0lt
Jonathan698
..
..
 
Posts: 67
Joined: Tue Feb 07, 2006 3:50 pm

ORACLE DATENBANK TRIGGER

Postby Tron » Sat Jan 09, 2010 2:13 am

Moin,
also das Anlegen eines DB Triggers für ORACLE habe ich gelöst.
ALLE folgenden Programme sind für SAP-systeme mit ORACLE Datenbank !!!

Ein fehlerhaft implementierter Trigger führt dazu, dass keine Werte mehr in die betroffene Tabelle geschrieben werden kann.
Daher sollte man sich im klaren sein, wie man Trigger wieder löschen kann. (mit DROP TRIGGER xx)
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. REPORT  ztest_trigger1                                               .
  2.  
  3. * Lösche Triggers T00X
  4.  
  5. EXEC SQL.
  6. DROP TRIGGER T00X
GeSHi ©

Zuerst ein kleiner Report zum Auflisten aller vorhandenen Trigger, da man keine wirklich brauchbaren Informationen über das erfolgreiche Anlegen erhält.
(SAP verwendet keine Trigger, zumindest in unserem System)

Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. REPORT  zshow_all_triggers.
  2. CONSTANTS crlf(2) VALUE %_cr_lf.
  3.  
  4.  
  5. DATA: trigger TYPE ddf4dbtrig,
  6.       event TYPE ddtrgevent,
  7.       triggername TYPE ddtrigname,
  8.       tabname TYPE dd02l-tabname,
  9.       code(1024),
  10.       refnames(1024).
  11.  
  12. DATA: BEGIN OF li OCCURS 0,
  13.       li(512),
  14.       END OF li.
  15.  
  16.  
  17. EXEC SQL.
  18.   open c for
  19.     select table_name, trigger_name, triggering_event,
  20.     referencing_names ,trigger_body
  21.     from all_triggers
  22.  
  23.   EXEC SQL.
  24.     fetch next c into :tabname, :triggername, :event, :refnames, :code
  25.  
  26.   IF sy-subrc <> 0.
  27.     EXIT.
  28.   ENDIF.
  29.  
  30.   WRITE: / tabname COLOR COL_GROUP,
  31.            triggername COLOR COL_GROUP,
  32.            event COLOR COL_GROUP,
  33.            refnames COLOR COL_GROUP.
  34.   SPLIT code AT crlf+1(1) INTO TABLE li.
  35.  
  36.   LOOP AT li.
  37.     WRITE: / li-li  COLOR COL_KEY  .
  38.     WRITE  SY-ULINE.
  39.  
  40. EXEC SQL.
  41.   close c
GeSHi ©


Ein DB-Trigger wird an einer Datenbanktabelle als eine Art Prozedur angehängt.
Als ORACLE SQL-Code sieht das u.a. so aus:
Image

Dieser Trigger schreibt einen Timestamp und die Werte der Tabelle Z003 vor deren Änderung in die Tabelle Z004, wenn in Tabelle Z003 ein Wert geändert wird.
(Also genau wie der DBTABLOG-Mechanismus.)

Ich habe zuerst 2 SAP Tabellen angelegt (SE11)
Tabelle Z003:
F1 Keyfeld CHAR10
F2 CHAR10

Tabelle Z004:
TSTAMP Keyfeld CHAR14
F1 CHAR10
F2 CHAR10

Ein NATIVE SQL Ansatz für den Trigger sieht so aus:
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. EXEC SQL.
  2.  
  3. CREATE OR REPLACE TRIGGER JGTEST
  4. AFTER INSERT OR UPDATE ON Z003
  5. REFERENCING NEW AS New OLD AS newRow
  6. FOR EACH ROW
  7. DECLARE
  8. TSTAMP varchar2(14);
  9. BEGIN
  10. IF :newRow.f1 IS NOT NULL THEN
  11. SELECT TO_CHAR(sysdate, 'YYYYMMDDHH24MISS') into TSTAMP FROM dual;
  12.    INSERT INTO Z004 VALUES(TSTAMP,:newRow.f1,:newRow.f2);
  13. END IF;
  14. END JGTEST;
  15.  
  16.  
GeSHi ©

Es gibt hier das Problem, daß ":newRow.f1" ungewollt eine Wertübergabe an das weiterverarbeitende ABAP darstellt !!!
So meldet auch die Syntaxprüfung einen Fehler!

Eine funktionierende Lösung:

Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. REPORT  ztest_trigger3                                               .
  2. DATA t TYPE TABLE OF tab512 WITH HEADER LINE.
  3.  
  4. CONSTANTS crlf(2) VALUE %_cr_lf.
  5.  
  6. DATA: sql_statement(65535) TYPE c,
  7. sql_stmt_length TYPE i,
  8. sql_error_text(300),
  9. sql_error_number LIKE sy-tabix,
  10. record_count LIKE jctab-counter,
  11. lt_error_codes TYPE STANDARD TABLE OF i.
  12.  
  13. APPEND 'CREATE OR REPLACE TRIGGER T003' TO t.
  14. APPEND 'AFTER INSERT OR UPDATE' TO t.
  15. APPEND 'ON Z003' TO t.
  16. APPEND 'REFERENCING NEW AS New OLD AS newRow' TO t.
  17. APPEND 'FOR EACH ROW' TO t.
  18. APPEND 'DECLARE' TO t.
  19. APPEND ' ' TO t.
  20. APPEND 'TSTAMP varchar2(14);' TO t.
  21. APPEND ' ' TO t.
  22. APPEND 'BEGIN' TO t.
  23. APPEND 'IF :newRow.f1 IS NOT NULL THEN' TO t.
  24. 'SELECT TO_CHAR(sysdate, ''YYYYMMDDHH24MISS'') into TSTAMP FROM dual;'
  25.  TO t.
  26. 'INSERT INTO Z004 VALUES(TSTAMP, :newRow.f1, :newRow.f2);' TO t.
  27. APPEND 'END IF;' TO t.
  28. APPEND 'END T003;' TO t.
  29.  
  30. LOOP AT t.
  31.   CONCATENATE sql_statement t-wa INTO sql_statement
  32.   SEPARATED BY crlf+1(1).
  33. SHIFT sql_statement LEFT BY 1 PLACES.
  34.  
  35.  
  36. sql_stmt_length = STRLEN( sql_statement ).
  37. record_count = 1.
  38.  
  39.  
  40. CALL 'C_DB_EXECUTE' ID 'STATLEN' FIELD sql_stmt_length
  41. ID 'STATTXT' FIELD sql_statement
  42. ID 'ROWNUM' FIELD record_count
  43. ID 'SQLERR' FIELD sql_error_number
  44. ID 'ERRTXT' FIELD sql_error_text.
  45.  
GeSHi ©


Resourcen:
http://infolab.stanford.edu/~ullman/fcd ... ggers.html
http://download.oracle.com/docs/cd/B141 ... tm#1007172

gruß Tron
Tron
.....
.....
 
Posts: 1112
Joined: Sat Aug 04, 2007 10:21 pm

NACHTRAG

Postby Tron » Mon Mar 14, 2011 2:32 am

Einrichten eines TRIGGERS mit Klassen/Methodenaufruf
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. *&---------------------------------------------------------------------*
  2. *& Report  ZTEST_TRIGGER                                               *
  3. *&                                                                     *
  4. *&---------------------------------------------------------------------*
  5. *&                                                                     *
  6. *&                                                                     *
  7. *&---------------------------------------------------------------------*
  8.  
  9. REPORT  ztest_trigger4                                               .
  10.  
  11. CLASS cl_sql_statement DEFINITION LOAD.
  12.  
  13. DATA: g_sql TYPE REF TO cl_sql_statement.
  14.  
  15. DATA t TYPE TABLE OF tab512 WITH HEADER LINE.
  16.  
  17. CONSTANTS crlf(2) VALUE %_cr_lf.
  18.  
  19. sql_statement TYPE string,
  20. *sql_statement(65535) TYPE c,
  21. sql_stmt_length TYPE i,
  22. sql_error_text(300),
  23. sql_error_number LIKE sy-tabix,
  24. record_count LIKE jctab-counter,
  25. lt_error_codes TYPE STANDARD TABLE OF i.
  26.  
  27.  
  28.  
  29. CREATE OBJECT g_sql.
  30.  
  31.  
  32. APPEND 'CREATE OR REPLACE TRIGGER T003' TO t.
  33. APPEND 'AFTER INSERT OR UPDATE' TO t.
  34. APPEND 'ON Z003' TO t.
  35. APPEND 'REFERENCING NEW AS New OLD AS newRow' TO t.
  36. APPEND 'FOR EACH ROW' TO t.
  37. APPEND 'DECLARE' TO t.
  38. APPEND ' ' TO t.
  39. APPEND 'TSTAMP varchar2(14);' TO t.
  40. APPEND ' ' TO t.
  41. APPEND 'BEGIN' TO t.
  42. APPEND 'IF :newRow.f1 IS NOT NULL THEN' TO t.
  43. 'SELECT TO_CHAR(sysdate, ''YYYYMMDDHH24MISS'') into TSTAMP FROM dual;'
  44.  TO t.
  45. 'INSERT INTO Z004 VALUES(TSTAMP, :newRow.f1, :newRow.f2);' TO t.
  46. APPEND 'END IF;' TO t.
  47. APPEND 'END T003;' TO t.
  48.  
  49. LOOP AT t.
  50.   CONCATENATE sql_statement t-wa INTO sql_statement
  51.   SEPARATED BY crlf+1(1).
  52. SHIFT sql_statement LEFT BY 1 PLACES.
  53.  
  54.  
  55. *sql_stmt_length = STRLEN( sql_statement ).
  56. *record_count = 1.
  57.  
  58.  
  59. *CALL 'C_DB_EXECUTE' ID 'STATLEN' FIELD sql_stmt_length
  60. *ID 'STATTXT' FIELD sql_statement
  61. *ID 'ROWNUM' FIELD record_count
  62. *ID 'SQLERR' FIELD sql_error_number
  63. *ID 'ERRTXT' FIELD sql_error_text.
  64. *l_element->set_attribute( name  = 'xmlns'
  65. *                          value = xml_ns_uri_ifr ).
  66.  
  67. *TRY.
  68. *CALL METHOD g_sql->execute_ddl
  69. *  EXPORTING
  70. *    statement        = sql_statement
  71. *    .
  72. * CATCH CX_SQL_EXCEPTION .
  73. *ENDTRY.
  74.  
  75.   g_sql->execute_ddl( statement = sql_statement ).
  76.   CATCH cx_sql_exception .
  77.  
  78. FREE g_sql.
  79.  
  80. break sapuser.
GeSHi ©

gruß TRon
Tron
.....
.....
 
Posts: 1112
Joined: Sat Aug 04, 2007 10:21 pm

Previous

Return to Material Management & Produktionsplanung

Who is online

Users browsing this forum: No registered users and 4 guests