Neu SQL Trigger Problem

Usiu

Aktives Mitglied
20. Mai 2021
26
3
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
200
153
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
3.896
946
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.830
549
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
339
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.538
759
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.830
549
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
26
3
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.830
549
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.830
549
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
26
3
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 JTL_DirectQuery - SQL Abfrage Anzahl der Pakete auf Versandliste (DPD) User helfen Usern - Fragen zu JTL-Wawi 3
Neu Welche SQL Server Version für WaWi 1.0.0.0.0 unter Windows 11 Installation von JTL-Wawi 6
Neu Bilder von Kinderartikeln auf Vaterartikel kopieren via SQL Eigene Übersichten in der JTL-Wawi 2
Neu Täglich SQL Backup vom Shop Allgemeine Fragen zu JTL-Shop 2
Kann ich mit dieser SQL Version die neue WaWi 1.11.1 installieren? JTL-Wawi 1.11 2
Neu Kundengruppe per SQL löschen User helfen Usern - Fragen zu JTL-Wawi 3
Neu Sql Express 2022 - wawi sagt beim Start es ist ein Update bereit - gelöst Installation von JTL-Wawi 3
Neu Extern erstelltes SQL - Angebot falsche Werte User helfen Usern - Fragen zu JTL-Wawi 3
Neu In welcher SQL Tabelle finde ich den Ansprechpartner des Herstellers? User helfen Usern - Fragen zu JTL-Wawi 2
Neu Seriennummern und SQL Abfragen User helfen Usern - Fragen zu JTL-Wawi 1
Update SQL Server Management Studio JTL-Wawi 1.10 1
Neu Einrichtung SQL in neuem Rechner funktioniert nicht Installation von JTL-Wawi 3
Neu SQL Code für GPSR Felder (Kaufland) zeigt Fehler + wird daher nicht übertragen kaufland.de - Anbindung (SCX) 0
Neu SQL für noch nie Verkaufte Artikel auf Marktplätzen. User helfen Usern - Fragen zu JTL-Wawi 3
Stornobeleg als Workflow-Trigger JTL-Wawi 1.10 6
Gelöst Workflow-Trigger für Selbstabholung / FFN-Versand JTL-Workflows - Fehler und Bugs 2
Neu Shopabgleich und McAfee Virenschutz = Problem? User helfen Usern - Fragen zu JTL-Wawi 2
Problem nach dem Update. JTL-Wawi 1.11 2
Neu Erstmals seit Jahren ein FTP-Problem Betrieb / Pflege von JTL-Shop 12
Neu Problem beim Start der manuellen eBay-Synchronisierung User helfen Usern - Fragen zu JTL-Wawi 0
Neu ISO Sprachen Problem - hier: Spanisch JTL-Shop - Fehler und Bugs 1
Neu Problem mit Drucker User helfen Usern - Fragen zu JTL-Wawi 0
Neu WMS Waage Problem seit 1.11.1 JTL-WMS / JTL-Packtisch+ - Fehler und Bugs 6
Jtl-Amz Problem JTL-Wawi 1.9 0
Problem mit API Anbindung JTL-Wawi 1.11 2
Neu JTL-Shop TECHNIK (SalePix) – Problem mit Render Blocking Requests User helfen Usern - Fragen zu JTL-Wawi 2
Neu aktuelles Problem Hosting wurde doppelt gebucht Starten mit JTL: Projektabwicklung & Migration 4
Neu Fehler beim Übertragen von Bildern JTL - Shopware Thumbnail Problem height width dürfen nicht leer sein Shopware-Connector 11

Ähnliche Themen