-
Welche PGM's ändern Daten
Hallo zusammen,
wir haben bei ein paar verschiedene Artikel Bestandsprobleme.
Deshalb möchte ich einen SQL-Trigger an die Bestandsdatei hängen, der immer dann einen Satz in eine Logdatei schreibt, wenn sich die Menge einer dieser Artikel ändert.
Ist so erstmal kein Problem. Aber wie finde ich eigentlich den Programmnamen des Programmes heraus, welches die Änderung ausgelöst hat? (Vielleicht ist es sogar ein Externes Programm wie Access oder ähnliches)
Gruß Heinfried
-
Hallo Heinfried,
über den Call Stack.
Select * From table(qsys2.stack_info())
Da musst du halt nach der Reihenfolge sortieren und deinen Trigger wegfiltern.
Ist etwas eine spielerei, aber geht.
lg Andreas
-
Man muss da sogar mehr tun, ins besonders wenn man SQL verwendet.
Durch den Callstack wandern und das 1. Programm nehmen, dass nicht aus einer Q-Lib kommt.
Bei der Verwendung von Serviceprogrammen für Dateiverarbeitung muss man auch diese überlesen um an den Aufrufer zu kommen.
Wurde hier schon mal diskutiert unter "wer hat den Trigger ausgelöst".
-
(Vielleicht ist es sogar ein Externes Programm wie Access oder ähnliches)
Finde ich aber schon bedenklich wenn andere per ODBC Dir die Daten ändern können.
Vielleicht sollte man das nochmal diskutieren und es verbieten bzw. schauen das die Leute nur lesend auf die Daten zugreifen können.
GG 3084
-
... warum der Umstand? STRJRNPF => im Journal kann man dann die Änderungen mit Programmname und einiges mehr anschauen.
D*B
-
"Select * From table(qsys2.stack_info())" habe ich probiert. Ist scheinbar irgendwie ein Glücksspiel hier den richtigen Datensatz zu treffen wenn eine kette von Programmen (CL RPG ) aufgerufen wurde.
Bei externen Programmen ist so gut wie nichts vorhanden.
Leider gibt es bei uns einige externe Anwendungen die auch teilweise über Access oder auch MSSQL laufen. Also nicht nur ODBC :-(
An Journal habe ich auch schon gedacht. Aber leider ist die Datenflut hier so groß, das nur wenige Receiver vorgehalten werden können. Außerdem ist es sehr müßig die gesamten Sätze zu prüfen, ob auch gerade das Mengenfeld verändert wurde, um das es geht.
HB
-
Zitat von HEBORA
[COLOR=#333333]Außerdem ist es sehr müßig die gesamten Sätze zu prüfen, ob auch gerade das Mengenfeld verändert wurde, um das es geht.
HB
... genau das eben nicht! Man kann die Receiver automatisch durchsuchen: DSPJRN in outfile und über Before und After image kann man sich die Kandidaten scharf raussuchen. Auch das Transaktionsvolumen muss nicht zum Problem werden, die Analyse könnte auch automatisch beim umhängen der Receiver vor dem löschen stattfinden. Im übrigen ist Platte nicht mehr so teuer und ich empfehle generell alles zu journalisieren, mit before und after image und open/close Einträgen. Das ist bei jeglicher Fehlerabklärung Gold wert und öffnet auch die Möglichkeit commit einzusetzen, was bei SQL Verwendung ohnehin dringend geboten ist!
D*B
-
Der Stack ist streng nach Aufrufebene sortiert. Da ist es kein Zufall, welches Programm den Trigger ausgelöst hat. Du musst also alle Einträge sortiert bearbeiten und SQL und Filehandler überlesen.
Und Access/MSSQL können auch nur via ODBC auf die IBM i zugreifen. Da ist dann ein Job QZDASOINIT im Spiel. Hier wird es schwieriger zu erkennen, ob per Access oder SQL-Server zugegriffen wurde.
Ein Journal ist zwar OK, es kann dir aber nur das Programm nennen, dass die Operation vornimmt.
Bei Verwendung von Services (kann auch OPM sein) benötigst du aber durchaus den Aufrufer des Service.
-
Hallo,
ich habe es nun so gelöst:
INSERT INTO lib.jrnDatei (
SELECT SEQUENCE_NUMBER, object, USER_NAME, JOB_NAME, JOB_USER, JOB_NUMBER, PROGRAM_NAME, JOURNAL_ENTRY_TYPE,
INTERPRET(SUBSTRING(ENTRY_DATA, 6, 7) AS CHAR(7) CCSID 1141) AS AB1,
INTERPRET(SUBSTRING(ENTRY_DATA, 13, 2) AS DECIMAL(2,0) ) AS AB2,
INTERPRET(SUBSTRING(ENTRY_DATA, 15, 2) AS DECIMAL(3,0) ) AS Pos,
INTERPRET(SUBSTRING(ENTRY_DATA, 38, 10) AS CHAR(7) CCSID 1141) AS Artikel,
INTERPRET(SUBSTRING(ENTRY_DATA, 66, 2) AS DECIMAL(2,0) ) AS Bewegungsart,
INTERPRET(SUBSTRING(ENTRY_DATA, 68, 20) AS CHAR(20) CCSID 1141) AS Text,
INTERPRET(SUBSTRING(ENTRY_DATA, 111, 5) AS DECIMAL(9,3) ) AS MENGE,
ENTRY_TIMESTAMP AS ZEITPUNKT
FROM TABLE ( QSYS2.DISPLAY_JOURNAL( 'JRNLIB', 'JRN',
STARTING_RECEIVER_NAME => '*CURCHAIN',
OBJECT_LIBRARY=>'LIB',
OBJECT_NAME =>'Datei',
OBJECT_OBJTYPE=>'*FILE', OBJECT_MEMBER =>'Datei'
) ) AS X
WHERE JOURNAL_ENTRY_TYPE <> ' '
AND CAST(SUBSTR(ENTRY_DATA, 38, 10) AS VARCHAR(10)) IN ('xxxxx')
AND SEQUENCE_NUMBER NOT IN (SELECT SEQUENCE_NUMBER FROM BKL.jrndatei)
)
Das ganze in ein CL und dann mit SBMJOB über WRKREGINF angestoßen.
Läuft.
HB
Similar Threads
-
By inchic in forum NEWSboard Programmierung
Antworten: 14
Letzter Beitrag: 16-04-10, 18:38
-
By puddschini in forum NEWSboard Programmierung
Antworten: 7
Letzter Beitrag: 23-05-08, 09:52
-
By HJM in forum NEWSboard Windows
Antworten: 3
Letzter Beitrag: 25-02-02, 22:27
-
By Burgy Zapp in forum Archiv NEWSblibs
Antworten: 1
Letzter Beitrag: 16-12-01, 20:22
-
By Joker in forum IBM i Hauptforum
Antworten: 4
Letzter Beitrag: 25-10-01, 15:02
Tags for this Thread
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