Neu SQL Trigger Problem

Usiu

Aktives Mitglied
20. Mai 2021
24
2
Hallo Zusammen,

ich habe folgendes Problem mit einem Trigger:
SQL:
USE [Mandant_1]
GO
/****** Object:  Trigger [dbo].[tr_newOrder]    Script Date: 09.03.2023 08:38:49 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[tr_newOrder] ON [dbo].[tBestellung]
AFTER INSERT
AS
BEGIN
    DECLARE @cBestellNr VARCHAR(20)
    DECLARE @KBestellung INT

    SELECT @cBestellNr = inserted.cBestellNr, @kBestellung = inserted.kBestellung FROM  inserted

    -- Set up the request URL
    DECLARE @url VARCHAR(MAX) ='http://x.x.x.x/?mode=BWAuftragsdaten&orderNo=' + CAST(@cBestellNr AS VARCHAR(MAX)) + '&modus=new'

    -- Get all the items associated with the order and add them to the request URL
    SELECT @url = @url + '&artno' + CAST(ROW_NUMBER() OVER (ORDER BY tbestellpos.kBestellPos ASC) AS VARCHAR(20)) + '=' + tbestellpos.cArtNr
                  + '&artamount' + CAST(ROW_NUMBER() OVER (ORDER BY tbestellpos.kBestellPos ASC) AS VARCHAR(20)) + '=' + CAST(CAST(tbestellpos.nAnzahl AS DECIMAL(7,2)) AS VARCHAR(20))
    FROM tBestellung
    INNER JOIN tbestellpos
        ON tBestellung.kBestellung = tbestellpos.tBestellung_kBestellung
    WHERE tbestellpos.tBestellung_kBestellung = @KBestellung
        AND tbestellpos.cArtNr != ''
        AND fVKNetto != '0.00000000000000'

    INSERT INTO SOA_Schnittstelle (url,status,erfassungsdatum)VALUES(@url,0,GETDATE());
END

Wenn ich es manuell ausführe bekomme ich ein richtiges Ergebnis: x.x.x.x /?mode=BWAuftragsdaten&orderNo=170368&modus=new&artno1=75083000/VE&artamount1=4.00&artno2=79361400/VE&artamount2=4.00
Wenn der Trigger es selber macht bekomme ich nur das: x.x.x.x /?mode=BWAuftragsdaten&orderNo=2023-03-1263337-AU&modus=new da fehlt leider ein gutes Stück.

Es Sieht so us als würde dieser Part nciht funktionieren:
SQL:
  -- Get all the items associated with the order and add them to the request URL
    SELECT @url = @url + '&artno' + CAST(ROW_NUMBER() OVER (ORDER BY tbestellpos.kBestellPos ASC) AS VARCHAR(20)) + '=' + tbestellpos.cArtNr
                  + '&artamount' + CAST(ROW_NUMBER() OVER (ORDER BY tbestellpos.kBestellPos ASC) AS VARCHAR(20)) + '=' + CAST(CAST(tbestellpos.nAnzahl AS DECIMAL(7,2)) AS VARCHAR(20))
    FROM tBestellung
    INNER JOIN tbestellpos
        ON tBestellung.kBestellung = tbestellpos.tBestellung_kBestellung
    WHERE tbestellpos.tBestellung_kBestellung = @KBestellung
        AND tbestellpos.cArtNr != ''
        AND fVKNetto != '0.00000000000000'

Bin schon am verzweifeln, vllt. hat jemand hier eine Idee.
 

Karobube

Sehr aktives Mitglied
23. September 2020
177
139
Remote via AnyDesk
Firma
contact@karobube.com
Hallo Usiu,

in 1.5 oder 1.6/1.7 ?

ab 1.6 sind tBestellung und tBestellpos nur noch Views und die eigentlichen dbo.tBestellungstabellen sind jetzt Verkauf.tAuftragstabellen. Vielleicht scheitert es irgendwo daran.

VG KB
 

John

Sehr aktives Mitglied
3. März 2012
2.916
601
Berlin
Naja, was löst denn den Trigger aus? Und in welcher Reihenfolge macht dieser Prozess seine Inserts/updates auf die einzelnen Tabellen?

Eine Erklärung wäre, daß tBestellung den Insert erfährt, BEVOR die Positionen dieser Bestellung in tbestellpos eingefügt werden. Damit läuft deine Abfrage ins leere.

Rufst Du dagegen manuelle auf, ist tbestellpos längst geschrieben.
 
  • Gefällt mir
Reaktionen: wawi-dl

mh1

Sehr aktives Mitglied
4. Oktober 2020
1.403
396
Wenn ich es manuell ausführe bekomme ich ein richtiges Ergebnis
was meinst du denn mit diesem Satz?
Meinst du, dass du einfach nur den SQL-Code, der dir die URL zusammenbastelt manuell mit Daten aus der Datenbank ausführst?
Oder hast du wirklich den Trigger getestet (z.b. mit dem Profiler Schritt für Schritt...)

Ohne das Setting genauer untersuchen zu können, würd ich als Schuss ins Blaue einfach mal sagen, dass zu dem Zeitpunkt wo dein Trigger läuft tBestellpos noch gar nicht befüllt ist.
SELECT @url = @url + '&artno' + CAST(ROW_NUMBER() OVER (ORDER BY tbestellpos.kBestellPos ASC) AS VARCHAR(20)) + '=' + tbestellpos.cArtNr
+ '&artamount' + CAST(ROW_NUMBER() OVER (ORDER BY tbestellpos.kBestellPos ASC) AS VARCHAR(20)) + '=' + CAST(CAST(tbestellpos.nAnzahl AS DECIMAL(7,2)) AS VARCHAR(20))
Dann wäre ein oder mehrere Felder in dieser langen Verkettung NULL (kannst ja die Werte mal mit isnull() prüfen.)

Zumindest in meiner Version (1.5) steht ja auch, dass eine Bestellung nur mit der spBestellungAnlegen angelegt werden kann und nicht über einen Insert in tBestellung.
Deshalb solltest du falls du auch die 1.5 benutzt die entsprechenden StoredProcedures anschauen, wo beim Bestellungseingang wann was wie eingetragen wird.

Evtl müsste dein Trigger in die tBestellpos (aber ich habs mir wie gesagt nicht genau angeschaut) 🤔
 
Zuletzt bearbeitet:

SebastianB

Moderator
Mitarbeiter
6. November 2012
2.084
338
Also die Reihenfolge ist wie folgt:

1. INSERT auf tBestellung
2. INSERT der tbestellpos
3. ggf. UPDATE der tbestellpos bei Kindartikeln (um den Bezug zur Id des Vaters hinzukriegen)
4. Viele andere Dinge (Bestelleigenschaften usw.)
5. EXEC spAuftragEckdatenAktualisieren

Sprich: erst wenn spAuftragEckdatenAktualisieren aufgerufen wird, ist die Bestellung vollständig. Aus dem Bauch raus: Leg einen WOrkflow an mit einer Custom-SP die ausgeführt wird wenn ein Auftrag angelegt wird (irgendwo hier im Forum gibt es ein Video dazu ("Werte in die DB schreiben bei WOrkflow" oder so)

Da die tBestellung eine Identity-Spalte hat können ja bei der Anlage der tBestellung noch keine Positionen vorhanden sein.
 
  • Gefällt mir
Reaktionen: Marvin D.

wawi-dl

Sehr aktives Mitglied
29. April 2008
6.045
603
Manuel hatte mal einen kleinen Exkurs gezeigt, sollte für Anregung/Tipps reichen, Kenntnisse sind ja vorhanden.

Wie schon erwähnt wurde, sind die Daten zu deinem Zeitpunkt noch nicht komplett vorhanden.


Eigenen Workflow erstellen, dann kannst deinen Task antriggern, wenn Auftrag erstellt wurde.
 
  • Ich liebe es
Reaktionen: Karobube

mh1

Sehr aktives Mitglied
4. Oktober 2020
1.403
396
Irgendwie klingt das alles nach einem XY-Problem ;)

Vielleicht wäre es besser, du beschreibst was du erreichen willst, anstatt konkret nach dem Trigger zu fragen.
Ich persönlich denke ja, dass es der falsche Weg ist, ein neues Datenbankobjekt in einer Datenbank anzulegen, deren Funktionsweise und Zustand du garnicht genau kennst. Der vorgegebene Weg, Daten zu exportieren ist ja über die Ameise bzw. über die von ihr aufgerufenen Funktionen.
Es wäre sicherlich auch eine Herausforderung einen solchen eigenen Trigger dann updatesicher zu machen.

Ich würde dir also vorschlagen, einen Schritt zurückzugehen und nochmals das Endprodukt zu beschreiben. Vielleicht gibts eine ganz andere Möglichkeit das Ziel zu erreichen... 🤔
 
Zuletzt bearbeitet:

Usiu

Aktives Mitglied
20. Mai 2021
24
2
Also erreichen will ich folgendes: Wir haben 2 Warenwirtschaftsprogramme, einemal die WAWI und Programm x. Programm x soll alle Aufträge importiert bekommen, dafür gibt es eine API für Programm x. Die API übernimmt die Information eines Auftrages anhand einer URL. Diese URL soll in der Datenbank durch ein trigger in einer zusätzlichen Tabelle gespeichert werden, dafür brauche ich die Tabelle dbo.tbestellung(hier ist auch der Trigger hinterlegt) und ich brauche dann auch die Info aus dbo.tbestellpos, aus diesen beiden Tabellen wird url generiert. Nun funktioniert das nicht ganz, da beim Auslösen des Triggers die Tabelle tbestellpos noch nicht beschrieben wurde.
Diese Url wird dann von ein Phyton Programm abgefragt und sendet die URL und somit hat Programm X diesen Auftrag.

PS. es handelt sich um die Version 1.5.55.6
 

mh1

Sehr aktives Mitglied
4. Oktober 2020
1.403
396
Aber wieso willst du einen Trigger in der Datenbank?

Wann sollte der denn ausgelöst werden? -> Sinnvollerweise doch erst dann, wenn der Auftrag komplett in der Datenbank abgelegt ist, oder? Und oben hat doch @SebastianB beschrieben, wann die Bestellung komplett in der Datenbank angekommen ist (hast du den Beitrag gelesen?)

Du könntest also jetzt nach dem in #5 beschriebenen Zeitpunkt deine URL erzeugen ODER
was mir viel sinnvoller erscheint: dir den Auftrag per Ameise aus der Datenbank exportieren und diesen Export dann an Programm X übergeben. Warum denke ich dass das sinnvoller ist? Wenn du ein Update der Wawi machst und JTL verändert irgendwas in den Abläufen wie, wann und wo ein Bestellung geschrieben wird, erzeugst du ein falsche URL. Im schlimmsten Fall überträgst du unvollständige Bestelldaten an die API und merkst das gar nicht zeitnah.

Also ich würde es so machen:
Regelmäßig die Bestellung, die noch nicht in ProgrammX sind von der Ameise exportieren lassen und an Programm X übergeben. Wenn die Bestellung dann komplett in Programm X gespeichert ist, erfolgt eine Rückmeldung an die Wawi (somit weiß die Wawi, welche Bestellungen exportiert werden müssen)
 

mh1

Sehr aktives Mitglied
4. Oktober 2020
1.403
396
Wieso nicht die Url per Workflow im Bereich Auftrag > angelegt aufrufen?
Falls der Workflow auf alle benötigten Daten Zugriff hat, wäre das sicherlich auch eine einfache und schnelle Lösung. Abhängig von der Wichtigkeit der Bestelldaten in ProgrammX würde ich aber eine Lösung basteln, die auf Fehler prüft bzw. einen Rückgabewert der API auswertet.
 

Usiu

Aktives Mitglied
20. Mai 2021
24
2
Wenn du bei der Aktion im Workflow "Ausfühen" wählst, kannst du das Programm bzw. Script angeben und in einem zweiten Auswahlfeld einen Parameter angeben, der dann dem Script übergeben wird.
Stimmt, dazu schreibe ich eine kleine Batchdatei, die den Ordner überwacht und die Datei ausführt.
Die Datei wird dann verschoben und mein Phyton Programm sendet die URL.
 
Ähnliche Themen
Titel Forum Antworten Datum
Neu Bild per SQL Query aus lesen aus von Artikel Bildplattform Druck-/ E-Mail-/ Exportvorlagen in JTL-Wawi 0
Neu Umlagerungen - Wie, wo, oder SQL? Arbeitsabläufe in JTL-Wawi 2
Neu SQL Server Update von 2014 auf 2019 oder Neuinstallation? Installation von JTL-Wawi 4
Neu SQL: img alt Tags setzen User helfen Usern - Fragen zu JTL-Wawi 2
[Bug] JTL-Wawi 1.9 | Auftrag: Statustext in Workflow Variablen leer | gelöst: [SQL] JTL-Wawi 1.9 0
Auftrag: Eigene Felder in DotLiquid Vorlage verwenden [Wawi 1.9.4.5] [SQL] JTL-Wawi 1.9 0
Neu Partner für JTL Shop WAWI und MS SQL Server gesucht Dienstleistung, Jobs und Ähnliches 2
Neu Fehler bei SQL-Abfrage durch Aufgabenplanung Gelöste Themen in diesem Bereich 12
Neu SQL Server 2022 Standart auf M.2 NVMe SSD Installation von JTL-Wawi 36
Neu Fehlermeldung "Es wurde im SQL-Server kein Backuppfad hinterlegt" => kein Schemaupdate möglich JTL-Wawi - Fehler und Bugs 8
Neu Nach Update auf SQL 2022 Express keine verbindung mehr mit Client möglich Installation von JTL-Wawi 2
Neu Tabelle aus eigenem SQL in Druckvorlage möglich? Gelöste Themen in diesem Bereich 3
Neu Merkmal eindeutig per SQL zuordnen Druck-/ E-Mail-/ Exportvorlagen in JTL-Wawi 0
Neu Update SQL 2017 Express auf 2022 Standard Installation von JTL-Wawi 7
In Diskussion SQL Update aus Workflow heraus JTL-Workflows - Fehler und Bugs 8
Neu Gewogenes Versandgewicht per SQL exportieren und anschließend in Artikelstammdaten importieren JTL Ameise - Eigene Exporte 0
Neu Gewogenes Versandgewicht per SQL exportieren und anschließend in Artikelstammdaten importieren Gelöste Themen in diesem Bereich 5
Neu Bestandsführung per SQL deaktivieren User helfen Usern - Fragen zu JTL-Wawi 3
Neu Installation von JTL-WaWi auf SQL DB mit AD Account möglich? Installation von JTL-Wawi 7
Minimale Benutzerrechte SQL User für täglichen operativen Betrieb JTL-Wawi 1.9 10
Neu SQL Fehler - Woher stammt diese Abfrage JTL-Shop - Fehler und Bugs 7
Neu SQL Abfrage User helfen Usern - Fragen zu JTL-Wawi 3
Neu Plattform Feld per SQL setzen - mehrere Marken unter einer Firma verkaufen User helfen Usern - Fragen zu JTL-Wawi 6
Neu Workflow - SQL - Frage zur DATEADD()-Funktion User helfen Usern - Fragen zu JTL-Wawi 2
Neu Korrektes Datumsformat in SQL-Abfrage User helfen Usern - Fragen zu JTL-Wawi 2
Neu Probleme beim Abfrage kopieren von SQL Management Studio User helfen Usern - Fragen zu JTL-Wawi 1
Neu Wie kann man Anzahl der VPE per SQL abfragen? User helfen Usern - Fragen zu JTL-Wawi 1
Neu Kundendatenimport via SQL JTL-Wawi 1.6 1
SQL Abfrage für verkaufte Artikel + aktueller Bestand JTL-Wawi 1.8 1
Neu CSS Problem - Galerie - Hilfe gesucht, gerne auch gegen Entgelt Templates für JTL-Shop 8
Problem: Unterschiedliche Rechnungslayouts basierend auf Versandart in JTL-Wawi JTL-Wawi 1.8 5
Problem bei Workflow-Erstellung: Lieferzeit erhöhung" funktioniert nicht JTL-Wawi 1.8 16
Neukunden Problem JTL-Wawi 1.9 2
Neu JTL Connector Woocommerce Problem Kinsta Hosting WooCommerce-Connector 1
Neu Warnung in der Entwicklerkonsole - SameSite-Problem bei JTLSHOP und _gcl_au Cookies JTL-Shop - Fehler und Bugs 0
Neu Warum werden bei gleichem Code Tabellen unterschiedlich eingerückt abgebildet / CSS Problem Templates für JTL-Shop 2
Problem mit neuer countX Schnittstelle - JTL Datenbankverbindung weg JTL-Wawi 1.8 4
Neu Problem Rechnungsversand DUO Gelöste Themen in diesem Bereich 3
Neu am Packplatz ist Cloud nicht aktiv -> Problem sichtbar machen User helfen Usern - Fragen zu JTL-Wawi 0

Ähnliche Themen