[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Feb 2001
    Beiträge
    20.236

    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... 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
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  5. #5
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... 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
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

Similar Threads

  1. SQL Fehlermeldung : Spalte oder globale Variable nicht gefunden!!!
    By svente in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 05-12-16, 18:15
  2. Antworten: 1
    Letzter Beitrag: 10-09-15, 17:33
  3. RPGLE Trigger before insert übernimmt neue Werte nicht
    By msost in forum NEWSboard Programmierung
    Antworten: 7
    Letzter Beitrag: 07-10-14, 13:15
  4. SQL0314, Host-Variable nicht eindeutig
    By gue_br in forum IBM i Hauptforum
    Antworten: 7
    Letzter Beitrag: 26-02-14, 15:40
  5. Variable
    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
  •