MBEW Änderung feststellen

Postby Jonny2227 » Tue Oct 27, 2009 10:03 am

Hallo,

also mir ist diesbezüglich nichts bekannt - denn das eine ist ja SAP Standard - eine Append Struktur und das andere ist ja DB Standard ein Trigger einzustellen - na und was dieser dann tut kann ja SAP egal sein, denn SAP ist ja "DB Interface unabhängig" ;-) . Aber wie gesagt - genaueres kann ich dazu nicht sagen - wäre aber interessant zu hören warum das dann so wäre von Seiten SAP ?!

Gruss Jens
Jonny2227
....
....
 
Posts: 605
Joined: Wed Mar 01, 2006 3:16 pm

Postby Tron » Tue Oct 27, 2009 9:31 pm

Moin,
wie wäre es mit einem "Kompromiss" und zwar die Tabellenaufzeichnug mit Transaktion SE11 zu aktivieren (und mit SE14 noch mal nachgenerieren !), dann könnte man die Änderungen der MBEW in der Tabelle DBTABLOG sehen ?

@Jens: ich habe vor längerer Zeit mal mit Triggern an einer Oracle Datenbank experimentiert. Dabei ist mir der Trigger am Anfang aber nicht gelungen( war inkonsistent). Dieses hatte dann zur Folge, dass in die Tabelle, wo der Trigger angesiedelt war, keine Daten mehr abgespeichert werden konnten.
Wie sieht eigentlich so ein NATIVE SQL script für einen Trigger aus ?
z.B. Ich möchte einen Zeitstempel in eine Tabelle X speichern, wenn sich ein Datensatz in der USR41 ändert ?

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

Postby Jonathan698 » Wed Oct 28, 2009 8:49 am

Moin,

ich werde nun erst einmal ein paar SELECT Tests ohne Änderung machen, mal sehen was für Zeiten es werden (Einschränkung per DAtum Belegart, und Belegnummer > gemerkter Nummer etc.)

Vielen Dank für die vielen Tipps!
mfg
c0lt
Jonathan698
..
..
 
Posts: 67
Joined: Tue Feb 07, 2006 3:50 pm

Postby Jonny2227 » Wed Oct 28, 2009 9:30 am

Hallo Tron,

nun ich habe da ein kleinen Report, mit dem ich zum einen den Trigger erstelle, aktiviere, deaktiviere, lösche oder anzeige. Bis dato hatte ich da keine Probleme mit der DB oder so - kann aber auch sein das es bis dato "Glück" war - aber eigentlich ist so ein DB Trigger ja Standard für die meisten DB's. Wir haben eine Oracle DB im einsatz und fürs anlegen schaut das bei mir so aus: (Repot Auszug)
...
DATA: str_trigger_name TYPE string VALUE 'TR1_B_IU_%TAB%',

data:str_create TYPE string VALUE 'create trigger %NAME% ' &
'before insert or update ' &
'on %TAB% for each row ' &
'begin ' &
'select to_char sysdate, ''dd.mm.yyyy'') into :new.%FIELD% from dual; ' &
'select to_char(sysdate, ''hh24:mi:ss'') into :new.%FIELD_1% from dual; ' &
'end;',

.....

case abap_true.
....
WHEN create.
PERFORM exec USING str_create.
WRITE: / 'Trigger created.'.
....
endcase.
den Tabellen Namen gebe ich dem Report im elections Bild mit und auch die Namen der beiden Felder. Ich habe z.Bsp. 2 Felder - change_date & change_time angehängt (denn ich brauchte für eine Selektion ganz genaue Daten) und dann den Trigger angelegt und aktiviert. Zusätzlich habe ich noch einen Index dann der Tabelle spendiert für einen schnelleren Zugriff auf meine beiden neuen Felder. Na und bis jetzt läuft das ganz gut so ;-)

Gruss Jens
Jonny2227
....
....
 
Posts: 605
Joined: Wed Mar 01, 2006 3:16 pm

Postby Lavinia3875 » Sat Oct 31, 2009 3:00 pm

jensschladitz hat geschrieben:Und ein DB Trigger - ist ausserhalb von SAP - eine ganz normale Möglichkeit auf DB Änderungen auf DB Ebene zu reagieren(bietet jede gute DB an). Kann mit einem SAP Programm auch recht flott erstellt werden oder aber der DB Admin macht es für dich - (das ist wohl die schnellste Variante). Und alles andere passiert dann ganz automatisch - sobald ein update auf DB Ebene erkannt wird - werden vor dem Schreiben der Daten auf die DB die 2 Felder mit befüllt - das ist alles.


Oha, sowas kenn ich noch gar nicht. Wer kann mir denn darüber mehr erzählen? Wie mach ich das rein mit ABAP-Mitteln?


Ralf
Lavinia3875
.....
.....
 
Posts: 1274
Joined: Sat Sep 18, 2004 2:07 pm

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 11 guests