Workflow für Benachrichtigung bei Stammkunden

TobiasN82

Aktives Mitglied
25. Januar 2019
47
5
Hi,
folgendes Problem:
Wir verkaufen auf Amazon-Business an B2B Kunden. Dort steht als Rechnungsempfänger Amazon und die Lieferadresse ist immer die unseres Endkunden.
Also wir haben eine Kundennummer K1000 (Amazon) und unter der sind sehr viele Lieferanschriften der eigentlichen Kunden.

Leider bekomme ich es nicht hin mir einen Workflow zu bauen, der die Lieferadresse mit der von früheren Bestellungen vergleicht um mir dann eine Nachricht schicken zu lassen.
Sobald der Workflow bei einer neuen Bestellung die Lieferadresse bei einer alten Bestellung wieder findet, will ich eine Nachricht bekommen.
Bei einer Erstbestellung möchte ich das nicht.

Was muss ich einstellen?

Ich freue mich auf eure Kommentare und Lösungsvorschläge. Mit ChatGPT bin ich komplett am verzweifeln.

VG
Tobias
 

wawi-dl

Sehr aktives Mitglied
29. April 2008
6.770
828
Auf welche Weise hast du es denn versucht per Workflow?

RA ist also immer gleich, geprüft werden muss aktuelle LA mit allen LA's im Kundenstamm?
Was passiert, wenn LA's im Kundenstamm bereinigt werden, sprich Dubletten gelöscht werden wenn jemand 2x bestellt?

Das Konstrukt / Datenmodell ist mir nicht ganz klar und mit Boardmittel eher schwer zu lösen, da muss man SQL Abfragen bauen.
 

TobiasN82

Aktives Mitglied
25. Januar 2019
47
5
Aktuell habe ich unter Aufträge -> Auftrag -> Erstellt -> Bedingungen -> Erweiterte Eigenschaften -> Größer als 0

SQL:
{% capture query %}
SELECT COUNT(*)
FROM dbo.tAuftrag a
JOIN dbo.tLieferadresse la   ON la.kLieferAdresse = a.kLieferAdresse
JOIN dbo.tAuftrag a0         ON a0.kAuftrag = {{ Vorgang.Stammdaten.InterneAuftragsnummer }}
JOIN dbo.tLieferadresse la0  ON la0.kLieferAdresse = a0.kLieferAdresse
WHERE a.kAuftrag <> a0.kAuftrag
  AND (
       a.dErstellt < a0.dErstellt
       OR (a.dErstellt = a0.dErstellt AND a.kAuftrag < a0.kAuftrag)
      )
  AND REPLACE(UPPER(LTRIM(RTRIM(la.cPLZ)))    , ' ', '') = REPLACE(UPPER(LTRIM(RTRIM(la0.cPLZ)))    , ' ', '')
  AND REPLACE(UPPER(LTRIM(RTRIM(la.cOrt)))    , ' ', '') = REPLACE(UPPER(LTRIM(RTRIM(la0.cOrt)))    , ' ', '')
  AND REPLACE(UPPER(LTRIM(RTRIM(la.cStrasse))), ' ', '') = REPLACE(UPPER(LTRIM(RTRIM(la0.cStrasse))), ' ', '')
{% endcapture %}

{% assign cnt = query | DirectQueryScalar | plus: 0 %}
{% if cnt > 0 %}{{ cnt }}{% endif %}

UND ZUSÄTZLICH
Auftrag\Stammdaten\Kunde\Kundennummer | Gleich | "Kundennummer des Amazon B2B Kunden"


Aktuell bekomme ich bei jeder Bestellung des Kunden eine Nachricht. Und bei der Simulation die folgende Meldung.
 

Anhänge

  • Simulation.png
    Simulation.png
    30,8 KB · Aufrufe: 5

TobiasN82

Aktives Mitglied
25. Januar 2019
47
5
Evtl. habe ich jetzt was passendes.

SQL:
{% capture query %}
SELECT CASE WHEN EXISTS (
  SELECT 1
  FROM (
    SELECT b.kBestellung,
           MIN(b.dErstellt) AS dErstellt,
           REPLACE(UPPER(LTRIM(RTRIM(la.cPLZ)))    ,' ','') AS p,
           REPLACE(UPPER(LTRIM(RTRIM(la.cOrt)))    ,' ','') AS o,
           REPLACE(UPPER(LTRIM(RTRIM(la.cStrasse))),' ','') AS s
    FROM dbo.tBestellung b
    JOIN dbo.tAdresse la ON la.kAdresse = b.kLieferadresse
    GROUP BY b.kBestellung,
             REPLACE(UPPER(LTRIM(RTRIM(la.cPLZ)))    ,' ',''),
             REPLACE(UPPER(LTRIM(RTRIM(la.cOrt)))    ,' ',''),
             REPLACE(UPPER(LTRIM(RTRIM(la.cStrasse))),' ','')
  ) B
  JOIN (
    SELECT b0.kBestellung,
           MIN(b0.dErstellt) AS dErstellt,
           REPLACE(UPPER(LTRIM(RTRIM(la0.cPLZ)))    ,' ','') AS p,
           REPLACE(UPPER(LTRIM(RTRIM(la0.cOrt)))    ,' ','') AS o,
           REPLACE(UPPER(LTRIM(RTRIM(la0.cStrasse))),' ','') AS s
    FROM dbo.tBestellung b0
    JOIN dbo.tAdresse la0 ON la0.kAdresse = b0.kLieferadresse
    WHERE b0.kBestellung = {{ Vorgang.Stammdaten.InterneAuftragsnummer }}
    GROUP BY b0.kBestellung,
             REPLACE(UPPER(LTRIM(RTRIM(la0.cPLZ)))    ,' ',''),
             REPLACE(UPPER(LTRIM(RTRIM(la0.cOrt)))    ,' ',''),
             REPLACE(UPPER(LTRIM(RTRIM(la0.cStrasse))),' ','')
  ) B0
    ON B.p=B0.p AND B.o=B0.o AND B.s=B0.s
  WHERE (B.dErstellt < B0.dErstellt
     OR (B.dErstellt = B0.dErstellt AND B.kBestellung < B0.kBestellung))
) THEN 1 ELSE NULL END
{% endcapture %}
{{ query | DirectQueryScalar }}

Ist nicht leer -> gibt mir die passende Ausgabe. Ich teste es mal damit
 

kelvin.

Sehr aktives Mitglied
15. Februar 2023
168
65
Frankfurt
Mit ChatGPT bin ich komplett am verzweifeln.
Es gibt ein CustomGPT. Ich selber habe es nicht getestet, aber vielleicht hilft es: https://forum.jtl-software.de/threa...id-erstellen-mit-chatgpt.238902/#post-1300386

Aktuell bekomme ich bei jeder Bestellung des Kunden eine Nachricht. Und bei der Simulation die folgende Meldung.
Bei der Meldung hast du eine Fehlermeldung. Trotz des Fehlers, trifft deine Bedingung zu. Deswegen bekommst du bei jeder Bestellung eine Nachricht. Der Fehler ist, dass die Tabellen dbo.tAuftrag und dbo.tLieferadresse gar nicht existieren.

Nein, weil kLieferadresse kein Schlüssel ist für dbo.tAdresse, sondern eins für dbo.tlieferadresse oder DEPRECATED.vLieferadresse.

Bei der Tabelle dbo.tAdresse solltest du noch bestimmen, dass du nur die Lieferadresse haben möchstest. Derzeit bekommst du die Rechnungs- und Lieferadresse.
Zu dem solltest du stornierte Aufträge ausschließen. Es sei denn es ist gewollt.
Und zudem solltest du dir überlegen, ob ein Kunde ein Stammkunde ist, wenn ein Kunde zwei Bestellungen macht und beide noch nicht ausgeliefert worden sind.
PLZ, Ort und Straße würde mir nicht aussreichen. Es kann nämlich sein, dass es mehrere Unternehmen gibt im gleichen Standort.

Die Herangehensweise ist kompliziert gedacht. Ich würde nur die Anzahl der Aufträge, die nicht storniert und ausgeliefert sind zählen, dessen Firmenname, PLZ, Ort, Straße gleich sind, zählen. Und wenn es größer 1 ist, ist der Kunde ein Stammkunde. Vorrausgesetzt ist, dass der Fimenname mit übergeben wird bei der Amazon Bestellung. Ich habe bei Amazon keine Ahnung, welche Daten übergeben werden.

REPLACE(UPPER(LTRIM(RTRIM(la.cPLZ))) ,' ',''),
Statt LTRIM und RTRIM zu nutzen, kannst du auch nur TRIM nutzen: https://learn.microsoft.com/de-de/sql/t-sql/functions/trim-transact-sql?view=sql-server-ver17
 

TobiasN82

Aktives Mitglied
25. Januar 2019
47
5
Vielen Dank für die Unterstützung, aber ich komme einfach nicht weiter. Gefühlt versucht chatgpt oder das CustomGPT (Danke für den Hinweis hab ich mir gleich gespeichert) immer noch mehr zu vereinfachen und die Adressen zu Verallgemeinern, aber nie mit einem passenden Ergebnis.
Wenn ich in der Simulation einen Auftrag wähle der eindeutig die gleiche Straße, PLZ und Ort hat (ohne irgendwelche Abweichungen) findet es die zweite Bestellung nicht.
Ich glaube es ist ein grundlegender Fehler beim Suchen in der vllt. falschen Tabelle oder ähnliches und weniger am Code zum Vergleichen der beiden Adressen.

Das ist mein aktueller Stand: (Ich habe bewusst nicht den Firmennamen mit einbezogen, weil ich da häufig das Problem habe, dass Amazon den nicht an JTL übermittelt. s. https://forum.jtl-software.de/threa...radresse-firma-nicht-vollstaendig-fbm.223765/)

SQL:
{% capture q %}
SELECT CASE WHEN (
  SELECT COUNT(*)
  FROM dbo.tBestellung b
  JOIN dbo.tLieferAdresse la ON la.kLieferAdresse = b.kLieferAdresse
  JOIN dbo.tBestellung b0     ON b0.kBestellung     = {{ Vorgang.Stammdaten.InterneAuftragsnummer }}
  JOIN dbo.tLieferAdresse la0 ON la0.kLieferAdresse = b0.kLieferAdresse
  WHERE b.nStorno = 0
    -- optional streng: nur bereits ausgelieferte Aufträge zählen
    -- AND EXISTS (SELECT 1 FROM dbo.tLieferschein ls WHERE ls.tBestellung_kBestellung = b.kBestellung AND ls.nStorno = 0)

    AND REPLACE(UPPER(TRIM(la.cPLZ))    ,' ','') = REPLACE(UPPER(TRIM(la0.cPLZ))    ,' ','')
    AND REPLACE(UPPER(TRIM(la.cOrt))    ,' ','') = REPLACE(UPPER(TRIM(la0.cOrt))    ,' ','')
    AND REPLACE(UPPER(TRIM(la.cStrasse)),' ','') = REPLACE(UPPER(TRIM(la0.cStrasse)),' ','')
    AND b.kBestellung <> b0.kBestellung   -- aktuellen Auftrag ausschließen
) > 0 THEN 1 ELSE 0 END
{% endcapture %}
{% assign cnt = q | DirectQueryScalar | ToDouble %}
{% if cnt > 0 %}true{% else %}false{% endif %}
 

frankell

Sehr aktives Mitglied
9. September 2019
2.685
840
Flensburg
Hallo @TobiasN82,

eigentlich widerstrebt es mir, das auszubügeln, was eine KI so von sich gibt. Und ich rate auch keinesfalls dazu zu glauben, dass man weiß, was man tut, nur weil man weiß, wie man einer KI eine Frage stellt. Aber mal so eben aus der Hüfte geschossen, könnte man es rein codetechnisch so machen:

SQL:
WITH CTE AS(
    SELECT
        REPLACE(UPPER(TRIM(cPLZ)),' ','') + '|' + REPLACE(UPPER(TRIM(cStrasse)),' ','') + '|' + REPLACE(UPPER(TRIM(cOrt)),' ','') AS 'Auftragsadresse'
    FROM
        Verkauf.tAuftragAdresse
    WHERE
        kAuftrag = {{ Vorgang.Stammdaten.InterneAuftragsnummer }}
        AND nTyp = 0
)
SELECT
    CASE WHEN EXISTS (
        SELECT
            1
        FROM
            Verkauf.tAuftragAdresse
        WHERE
            kAuftrag <> {{ Vorgang.Stammdaten.InterneAuftragsnummer }}
            AND nTyp = 0
            AND (REPLACE(UPPER(TRIM(cPLZ)),' ','') + '|' + REPLACE(UPPER(TRIM(cStrasse)),' ','') + '|' + REPLACE(UPPER(TRIM(cOrt)),' ','')) = (
                SELECT
                    Auftragsadresse
                FROM
                    CTE
            )
    )
    THEN 1
    ELSE 0
    END;

Gibt natürlich auch andere Wege.
 

TobiasN82

Aktives Mitglied
25. Januar 2019
47
5
Hallo @TobiasN82,

eigentlich widerstrebt es mir, das auszubügeln, was eine KI so von sich gibt. Und ich rate auch keinesfalls dazu zu glauben, dass man weiß, was man tut, nur weil man weiß, wie man einer KI eine Frage stellt. Aber mal so eben aus der Hüfte geschossen, könnte man es rein codetechnisch so machen:

SQL:
WITH CTE AS(
    SELECT
        REPLACE(UPPER(TRIM(cPLZ)),' ','') + '|' + REPLACE(UPPER(TRIM(cStrasse)),' ','') + '|' + REPLACE(UPPER(TRIM(cOrt)),' ','') AS 'Auftragsadresse'
    FROM
        Verkauf.tAuftragAdresse
    WHERE
        kAuftrag = {{ Vorgang.Stammdaten.InterneAuftragsnummer }}
        AND nTyp = 0
)
SELECT
    CASE WHEN EXISTS (
        SELECT
            1
        FROM
            Verkauf.tAuftragAdresse
        WHERE
            kAuftrag <> {{ Vorgang.Stammdaten.InterneAuftragsnummer }}
            AND nTyp = 0
            AND (REPLACE(UPPER(TRIM(cPLZ)),' ','') + '|' + REPLACE(UPPER(TRIM(cStrasse)),' ','') + '|' + REPLACE(UPPER(TRIM(cOrt)),' ','')) = (
                SELECT
                    Auftragsadresse
                FROM
                    CTE
            )
    )
    THEN 1
    ELSE 0
    END;

Gibt natürlich auch andere Wege.
Vielen Dank für deine Hilfe.
Ich habe das so umschreiben lassen, damit ich es in JTL in Erweiterte Eigenschaften eingeben kann:

SQL:
{% capture q %}
WITH CTE AS (
    SELECT
        REPLACE(UPPER(TRIM(cPLZ)),' ','') + '|' +
        REPLACE(UPPER(TRIM(cStrasse)),' ','') + '|' +
        REPLACE(UPPER(TRIM(cOrt)),' ','') AS Auftragsadresse
    FROM Verkauf.tAuftragAdresse
    WHERE kAuftrag = {{ Vorgang.Stammdaten.InterneAuftragsnummer }}
      AND nTyp = 0   -- 0 = Lieferadresse
)
SELECT CASE WHEN EXISTS (
    SELECT 1
    FROM Verkauf.tAuftragAdresse
    WHERE kAuftrag <> {{ Vorgang.Stammdaten.InterneAuftragsnummer }}
      AND nTyp = 0
      AND (
        REPLACE(UPPER(TRIM(cPLZ)),' ','') + '|' +
        REPLACE(UPPER(TRIM(cStrasse)),' ','') + '|' +
        REPLACE(UPPER(TRIM(cOrt)),' ','')
      ) = (SELECT Auftragsadresse FROM CTE)
) THEN 1 ELSE 0 END
{% endcapture %}

{% assign hit = q | DirectQueryScalar | ToDouble %}
{% if hit > 0 %}true{% else %}false{% endif %}

Leider kommt jetzt folgender Fehler:
Liquid error: Das Objekt mit dem Typ "System.Int32" kann nicht in den Typ "System.String" konvertiert werden.
Und ich komme schon wieder nicht weiter =(
 

frankell

Sehr aktives Mitglied
9. September 2019
2.685
840
Flensburg
Die letzten beiden Zeilen:

Code:
{% assign hit = q | DirectQueryScalar -%}
{% if hit == 1 -%}True{% else -%}False{% endif -%}
 

Ähnliche Themen