Neu Custom Workflow Aufträge nach Artikelnummer sortieren

  • Ersteller des Themas Ersteller des Themas drafty
  • Erstellungsdatum Erstellungsdatum

drafty

Aktives Mitglied
13. April 2018
5
0
Ich möchte gerne die Artikelpositiones Auftrag nach Erstellung über einen Custom Workflow neu sortieren.
Leider sind die Aufträge danach "Fehlerhaft" obwohl ich sowohl tbestellpos als auch Verkauf.tAuftragPosition korrigieren.

Hat jemand eine Idee?

SQL:
USE [eazybusiness]
GO
/****** Object:  StoredProcedure [CustomWorkflows].[spAuftragSortieren]    Script Date: 26.06.2024 07:22:16 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [CustomWorkflows].[spAuftragSortieren] @kAuftrag INT AS
BEGIN
    -- Temporäre Tabelle erstellen, um die sortierten Daten zu speichern
    CREATE TABLE #AuftragSortiert (
        kBestellPos INT,
        kBestellung INT,
        cArtNr VARCHAR(255),
        nType INT,
        SortOrder INT
    );

    -- Daten in die temporäre Tabelle einfügen, sortiert nach Artikelnummer, wobei nType = 1 bevorzugt wird
    INSERT INTO #AuftragSortiert (kBestellPos, kBestellung, cArtNr, nType, SortOrder)
    SELECT
        kBestellPos,
        tBestellung_kBestellung,
        cArtNr,
        nType,
        CASE
            WHEN nType = 1 THEN ROW_NUMBER() OVER (ORDER BY cArtNr ASC)
            ELSE 0
        END AS SortOrder
    FROM
        tbestellpos
    WHERE
        tBestellung_kBestellung = @kAuftrag;

    -- Zusätzliche temporäre Tabelle für Positionen mit nType = 0 erstellen
    CREATE TABLE #AuftragSortiert_0 (
        kBestellPos INT,
        SortOrder INT
    );

    DECLARE @MaxSortOrder INT;
    SELECT @MaxSortOrder = MAX(SortOrder) FROM #AuftragSortiert WHERE nType = 1;

    -- SortOrder für Positionen mit nType = 2 berechnen und in die temporäre Tabelle einfügen
    INSERT INTO #AuftragSortiert_0 (kBestellPos, SortOrder)
    SELECT
        kBestellPos,
        @MaxSortOrder + ROW_NUMBER() OVER (ORDER BY kBestellPos)
    FROM
        #AuftragSortiert
    WHERE
        nType <> 1;

    -- SortOrder in der ursprünglichen temporären Tabelle für nType = 2 aktualisieren
    UPDATE a
    SET a.SortOrder = b.SortOrder
    FROM
        #AuftragSortiert a
    INNER JOIN
        #AuftragSortiert_0 b
    ON
        a.kBestellPos = b.kBestellPos;

    -- Ursprüngliche Sortierreihenfolge aktualisieren
    UPDATE bp
    SET bp.nSort = ass.SortOrder
    FROM
        tbestellpos bp
    INNER JOIN
        #AuftragSortiert ass
    ON
        bp.kBestellPos = ass.kBestellPos;

    
    UPDATE ap
    SET ap.nSort = ass.SortOrder
    FROM
        Verkauf.tAuftragPosition ap
    INNER JOIN
        #AuftragSortiert ass
    ON
        ap.kAuftragPosition = ass.kBestellPos;


    -- Temporäre Tabellen löschen
    DROP TABLE #AuftragSortiert;
    DROP TABLE #AuftragSortiert_0;
END
 

John

Sehr aktives Mitglied
3. März 2012
4.215
1.088
Berlin
Ich rate davon ab, direkt in der tabelle zu schreiben. Da hängt zu viel undokumentiert dran.
 

John

Sehr aktives Mitglied
3. März 2012
4.215
1.088
Berlin
Wofür brauchst Du die Sortierung denn?
Muß das wirklich Wawi intern im Auftrag geändert werden oder reicht es vielleicht, eine Ausgabe (Druckvorlage) sortiert auszugeben oder so?
 

drafty

Aktives Mitglied
13. April 2018
5
0
Wofür brauchst Du die Sortierung denn?
Muß das wirklich Wawi intern im Auftrag geändert werden oder reicht es vielleicht, eine Ausgabe (Druckvorlage) sortiert auszugeben oder so?

In den Vorlagen haben wir es schon geändert.

Es handelt sich leider um sehr viele Farb/Größen Kombinationen. Wenn man keine automatische Sortierung hat, hat man keine Überblick mehr, welche Größe/Farbe bestellt wurde, und welche nicht.
 

John

Sehr aktives Mitglied
3. März 2012
4.215
1.088
Berlin
OK, wenn du es unbedingt hinbekommen möchtest, nimm JTL Diag und schau Dir an, was die Wawi beim Umsortieren per SQL macht.
 

drafty

Aktives Mitglied
13. April 2018
5
0
OK, wenn du es unbedingt hinbekommen möchtest, nimm JTL Diag und schau Dir an, was die Wawi beim Umsortieren per SQL macht.

Vielen Dank @John . Das hat mir sehr weitergeholfen.

Hier das ganze Skript für jemand, der es benötigen könnte:


SQL:
USE [eazybusiness]
GO
/****** Object:  StoredProcedure [CustomWorkflows].[spAuftragSortieren]    Script Date: 26.06.2024 07:22:16 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [CustomWorkflows].[spAuftragSortieren] @kAuftrag INT AS
BEGIN
    -- Temporäre Tabelle erstellen, um die sortierten Daten zu speichern
    CREATE TABLE #AuftragSortiert (
        kBestellPos INT,
        kBestellung INT,
        cArtNr VARCHAR(255),
        nType INT,
        SortOrder INT
    );
    
    -- Daten in die temporäre Tabelle einfügen, sortiert nach Artikelnummer, wobei nType = 1 bevorzugt wird
    INSERT INTO #AuftragSortiert (kBestellPos, kBestellung, cArtNr, nType, SortOrder)
    SELECT
        kBestellPos,
        tBestellung_kBestellung,
        cArtNr,
        nType,
        CASE
            WHEN nType = 1 THEN ROW_NUMBER() OVER (ORDER BY cArtNr ASC)
            ELSE 0
        END AS SortOrder
    FROM
        tbestellpos
    WHERE
        tBestellung_kBestellung = @kAuftrag;

    -- Zusätzliche temporäre Tabelle für Positionen mit nType = 0 erstellen
    CREATE TABLE #AuftragSortiert_0 (
        kBestellPos INT,
        SortOrder INT
    );

    DECLARE @MaxSortOrder INT;
    SELECT @MaxSortOrder = MAX(SortOrder) FROM #AuftragSortiert WHERE nType = 1;

    -- SortOrder für Positionen mit nType = 2 berechnen und in die temporäre Tabelle einfügen
    INSERT INTO #AuftragSortiert_0 (kBestellPos, SortOrder)
    SELECT
        kBestellPos,
        @MaxSortOrder + ROW_NUMBER() OVER (ORDER BY kBestellPos)
    FROM
        #AuftragSortiert
    WHERE
        nType <> 1;

    -- SortOrder in der ursprünglichen temporären Tabelle für nType = 2 aktualisieren
    UPDATE a
    SET a.SortOrder = b.SortOrder
    FROM
        #AuftragSortiert a
    INNER JOIN
        #AuftragSortiert_0 b
    ON
        a.kBestellPos = b.kBestellPos;

    -- Ursprüngliche Sortierreihenfolge aktualisieren
    UPDATE ap
    SET ap.nSort = ass.SortOrder
    FROM
        Verkauf.tAuftragPosition ap
    INNER JOIN
        #AuftragSortiert ass
    ON
        ap.kAuftragPosition = ass.kBestellPos;


    -- Temporäre Tabellen löschen
    DROP TABLE #AuftragSortiert;
    DROP TABLE #AuftragSortiert_0;

    
    declare @p1 Verkauf.TYPE_spAuftragEckdatenBerechnen
    insert into @p1 values(@kAuftrag)
    EXEC Verkauf.spAuftragEckdatenBerechnen @auftrag = @p1
END
 

Ähnliche Themen