-
Instead Of Trigger Variable nicht definiert
Hallo Leute, da wird soviel von Instead-Of-Triggern geredet und nun möchte ich es mal selber probieren:
Gegeben ist folgende View (ja, es ist Infor-XPPS):
CREATE VIEW X410TSTSX/JHLGTP AS (
SELECT TPSART
,TPSTAT
,CAST(DIGITS(TPTPAU) CONCAT DIGITS(TPTPPO)
CONCAT DIGITS(TPTPLF) AS VARCHAR(14)) TPTRID
,TPVLON
,TPNLON
,TPVTRM
,TPNLID
,TPVLID
FROM LGTP
WHERE TPFIRM = '1'
AND TPVWRK = '000'
AND TPSTAT < '80'
AND TPTPAU > 0
AND TPFR03 = ' '
)
und folgender Trigger soll erstellt werden:
CREATE TRIGGER JHLGTP_DEL
INSTEAD OF DELETE
ON X410TSTSX/JHLGTP
REFERENCING OLD AS O
FOR EACH ROW MODE DB2SQL
CALL X410TSTUM/FUEJHDL
(O.TPTRID)
M.a.W: an stelle des Deletes soll eine Prozedur aufgerufen werden.Jedoch wird jeder Variablenname, den ich als Parameter angebe, mit der Meldung:
"Variable TPTRID nicht definiert oder nicht verwendbar"
abgewiesen, obwohl sie ja in der View deklariert ist.
Es ist sogar egal, welche Variable ich überhaupt angebe.
Versuche ich z.B. einen Ausdruck "cast(.....)", kommt die Meldung
"Token CAST ungültig. Gültige Token: DLVALUE D..."
Ist der Aufruf einer Prozedur in Instead of nicht möglich?
Was habe ich dann davon?
Mache ich einen Delete, dann funktioniert es.
-
Nun, es kann am Release liegen und sonstwas, aber so geht es dann im Endeffekt:
CREATE TRIGGER JHLGTP_DEL
INSTEAD OF DELETE
ON X410TSTSX/JHLGTP
REFERENCING OLD AS O
FOR EACH ROW MODE DB2ROW
BEGIN
DECLARE XVAR VARCHAR(14);
SET XVAR = O.TPTRID;
CALL X410TSTUM/FUEJHDL (XVAR);
END;
Ich kann wohl die Variablen der Zeile nicht als Argument an eine Prozedur übergeben, aber so funktioniert es.
-
... das liegt nicht am Trigger, allerdings schon am Release, man hat die Spezifikation beim SQL Call für die Parameter verschärft, da dürfen keine Felder mehr, auch nicht in Ausdrücken, übergeben werden.
D*B
-
Aber das ist inzwischen nicht mehr mein Problem.
Die Instead-Trigger sollen verwendet werden um Daten einem SQL-Server per Linked Server zur Verfügung zu stellen.
D.h., auf der AS/400 gibt es eine View, die per View im SQL-Server zur Verfügung gestellt wird (Schnittstelle zu einem Stapler-System im Lager).
Da diese partuot die Daten löschen wollen die sie verarbeitet haben, haben wir ebenso auf den SQL-Server einen Instead-Of-Trigger definiert, der dann den Delete als Call zur AS/400 durchrouten sollte.
Dies scheitert leider an dem blöden SQL-Server, da der bestimmte Syntax erfordert.
Vom Ablauf macht der SQL-Server erst mal einen Select mit Satzsperre!
Anschließend läuft mein Instead-Of, der einen Status zum Verbergen des Satzes in der View setzen sollte.
Leider läuft der nun auf eine Satzsperre so dass der Update nicht durchgeführt werden kann.
Schaut man sich den Job an, so findet man genau 2 DFTACTGRP's (Id 1 und ID 2).
In ID 1 laufen die Systemprogramme, also auch QSQxxx und die Satzsperre wird von ID 1 gehalten.
In ID 2 laufen alle Nicht-System-Programme, also in einer anderen ACTGRP.
Somit kann ich die Satzsperre nicht umgehen um die Informationen zu schreiben.
Alternativ wollte ich es mit einem Instead-Insert versuchen.
Da allerdings der SQL-Server in einem Trigger bereits eine Transaktion gestartet hat, will er eine "Distributed Transaction" zur AS/400 initiieren, was diese allerdings wiederum ablehnt.
Fazit:
Der Ablauf wird nun über Tabellen im SQL-Server gelöst mit einem Java-Programm, dass eben alle paar Sekunden die Aktionen zwischen SQL-Server und AS/400 synchronisiert.
Eigentlich nicht das, was ich wollte.
-
... wieso ist die View auf der AS read only? Und selbst wenn, dann bleibe doch immer noch das Feld über eine andere linked View zu setzen, oder einen instead Trigger auf der AS400. Wozu soll da der instead Trigger auf dem SQL Server gut sein?
Dieter
-
Weil die Fremdsoftware nur mit a) SQL-Server und b) nur mit Tabellen umgehen kann.
Daher die Idee, auf dem SQL-Server die AS/400-View als View auf dem SQL-Server bereitzustellen.
Zusätzlich will die Fremdsoftware übernommene Aufträge aus der Tabelle löschen, einen Status setzen kann sie nicht, wenn der Auftrag dann erledigt ist, wird die Info in eine Statustabelle geschrieben.
Somit kann ich per Instead-Of auf dem SQL-Server bei Delete einfach ein Abgeholt-Flag setzen, dass den Satz aus der View ausblendet und beim Insert das Erledigtflag.
Nur leider wird eben beim Delete auf die View durch die Where-Klausel der Satz erst gelesen und gesperrt, so dass ein Update auf der AS/400 nicht mehr möglich ist.
Und beim Insert wird eine Distributed Transaction verlangt, beim Delete komischerweise nicht, sonst würde die AS/400-Prozedur ja nicht aufgerufen.
Wie gesagt, über einen Dauerjob wird nun alles alle 5 Sekunden synchronisiert.
Similar Threads
-
By svente in forum NEWSboard Programmierung
Antworten: 8
Letzter Beitrag: 05-12-16, 18:15
-
By mott in forum NEWSboard Programmierung
Antworten: 1
Letzter Beitrag: 10-09-15, 17:33
-
By msost in forum NEWSboard Programmierung
Antworten: 7
Letzter Beitrag: 07-10-14, 13:15
-
By gue_br in forum IBM i Hauptforum
Antworten: 7
Letzter Beitrag: 26-02-14, 15:40
-
By Henrik Motzkus in forum IBM i Hauptforum
Antworten: 4
Letzter Beitrag: 05-03-02, 09:13
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