In Bearbeitung Kumulierte Mengen zu markierten Aufträgen (ab JTL-Wawi 1.7)

Manuel Pietzsch

JTL-Wawi
Mitarbeiter
2. Januar 2012
2.863
1.038
Hückelhoven
Hi Freunde,

ab JTL-Wawi 1.7 können sich eigene Übersichten auf mehrere markierte Datensätze beziehen. Ein Video dazu wird in den nächsten Wochen kommen.
Ich möchte das SQL hier aber schonmal bereitstellen, da damit die Lagerpackliste ersetzt werden kann.

Mit folgendem SQL in der Auftragsliste könnt ihr jetzt schon davon profitieren (wenn ihr die 1.7 habt):


SQL:
SELECT Auftragspositionen.Artikelnummer,
  Auftragspositionen.Bezeichnung,
  CONVERT(DECIMAL(26,2), ROUND(SUM(Auftragspositionen.Menge), 2)) AS 'Menge in Aufträgen',
  CONVERT(INT, SUM(ISNULL(VersandgewichtGesamt, 0.0))) AS 'Versandgewicht gesamt',
  CONVERT(INT, MAX(ISNULL(VersandgewichtEinzel, 0.0))) AS 'Versandgewicht einzeln'
FROM
(
 SELECT  tAuftragPosition.cArtNr AS Artikelnummer,                         
   tAuftragPosition.cName AS Bezeichnung,
   tAuftragPosition.fAnzahl AS Menge,
   CASE
    WHEN tAuftragPosition.kAuftragPosition = tAuftragPosition.kAuftragStueckliste THEN 'Stückliste'
    WHEN tAuftragPosition.kAuftragStueckliste > 0 THEN 'Stücklistenkomponente'
    WHEN tAuftragPosition.nType = 0 THEN 'Freiposition'
    WHEN tAuftragPosition.nType = 1 THEN 'Artikel'
   END AS Positionstyp,
   tArtikel.fGewicht AS VersandgewichtEinzel,
   tArtikel.fGewicht * tAuftragPosition.fAnzahl AS VersandgewichtGesamt,
   tArtikel.fArtGewicht AS ArtikelgewichtEinzel,
   tArtikel.fArtGewicht * tAuftragPosition.fAnzahl AS ArtikelgewichtGesamt
 FROM Verkauf.tAuftrag
 JOIN Verkauf.tAuftragPosition ON tAuftrag.kAuftrag = tAuftragPosition.kAuftrag
 LEFT JOIN dbo.tArtikel ON tAuftragPosition.kArtikel = tArtikel.kArtikel
 LEFT JOIN dbo.tSpracheUsed ON tSpracheUsed.nStandard = 1
 LEFT JOIN dbo.tArtikelBeschreibung ON tArtikel.kArtikel = tArtikelBeschreibung.kArtikel
 AND tArtikelBeschreibung.kSprache = tSpracheUsed.kSprache
 AND tArtikelBeschreibung.kPlattform = 1
 WHERE   tAuftragPosition.nType NOT IN (2)
        AND tAuftrag.kAuftrag IN (@Keys)
) AS Auftragspositionen
GROUP BY Auftragspositionen.Artikelnummer,
   Auftragspositionen.Bezeichnung
ORDER BY Auftragspositionen.Artikelnummer;

2023-02-21 15_30_44-.png

Gruß

Manuel

Edit: Probiert es mal aus und schreibt mir hier was euch fehlt.
 
Zuletzt bearbeitet:

Der Basti

Mitglied
7. Februar 2022
7
3
Hey Manuel und alle lesenden,

vielen lieben Dank für diese Abfrage, die hilft dem Kollegen im Lager auf jeden fall schon mal weiter. :)

Da ich SQL zwar halbwegs interpretieren kann, aber leider nie wirklich gelernt habe und mich da dezent wie ein Brot fühle beim Versuch Abfragen zu formulieren, kannst Du, oder jemand anderes aus dem Forum mir sagen, wie diese Abfrage formuliert werden muss, wenn nur Artikelnummer und Menge in Aufträgen ausgegeben werden soll?

Wenn man noch den WMS Lagerplatz an dritter Stelle ausgeben könnte, wäre das ein Traum, aber das ist nicht zwingend erforderlich.

Ich freue mich wirklich über jede Hilfe und bedanke mich recht herzlich im Voraus.

Grüße, Basti
 

Carsten-R

Aktives Mitglied
7. Oktober 2017
11
8
Uns fehlt noch die kumulierte "reservierte Menge" bzw. die kumulierte Menge in den Aufträgen, die auch auf Lager wäre. So hat es die alte Lagerpackliste zumindest auch abgebildet.
 
  • Gefällt mir
Reaktionen: Bernhardbrot

chembaer

Sehr aktives Mitglied
10. Januar 2017
154
25
Hallo,
bei uns ist der Lagerplatz als Eigenes Feld "Lagerplatznummer" definiert. Weiß jemand, wie wir dieses Eigene Feld in die Abfrage einbinden und dann nach diesem eigenem Feld sortieren können? Ich glaube, dass es auch einige andere gibt, die vor diesem Problem stehen. Vielen Dank vorab!
 

MichaelH

Sehr aktives Mitglied
17. November 2008
14.204
1.791
... bei uns ist der Lagerplatz in dem Feld UNNR im Artikelstamm definiert.
Weiß jemand, wie wir dieses Feld in die Abfrage einbinden und danach sortieren können?
 

MirkoWK

Sehr aktives Mitglied
14. März 2022
691
245
Guten Morgen,

an die letzten Beiden - das hier sollte funktionieren:
(Darin dann noch tauschen: Name Spalte und Name eigenes Feld)

SQL:
SELECT
    abposi.Artikelnummer,
    abposi.Bezeichnung,
    CONVERT(DECIMAL(26,2), ROUND(SUM(abposi.Menge), 2)) AS 'Menge in Aufträgen',
    CONVERT(INT, SUM(ISNULL(VersandgewichtGesamt, 0.0))) AS 'Versandgewicht gesamt',
    CONVERT(INT, MAX(ISNULL(VersandgewichtEinzel, 0.0))) AS 'Versandgewicht einzeln',
    aattrs.cWertVarchar AS 'Name Spalte'
FROM
    (
    SELECT
        abpos.cArtNr AS 'Artikelnummer',
        abpos.kArtikel,                         
        abpos.cName AS 'Bezeichnung',
        abpos.fAnzahl AS 'Menge',
        CASE
            WHEN abpos.kAuftragPosition = abpos.kAuftragStueckliste THEN 'Stückliste'
            WHEN abpos.kAuftragStueckliste > 0 THEN 'Stücklistenkomponente'
            WHEN abpos.nType = 0 THEN 'Freiposition'
            WHEN abpos.nType = 1 THEN 'Artikel'
        END AS 'Positionstyp',
        a.fGewicht AS 'VersandgewichtEinzel',
        a.fGewicht * abpos.fAnzahl AS 'VersandgewichtGesamt',
        a.fArtGewicht AS 'ArtikelgewichtEinzel',
        a.fArtGewicht * abpos.fAnzahl AS 'ArtikelgewichtGesamt'
    FROM
        Verkauf.tAuftrag ab
        JOIN Verkauf.tAuftragPosition abpos ON ab.kAuftrag = abpos.kAuftrag
        LEFT JOIN tArtikel a ON abpos.kArtikel = a.kArtikel
        LEFT JOIN tSpracheUsed su ON su.nStandard = 1
        LEFT JOIN tArtikelBeschreibung txt ON a.kArtikel = txt.kArtikel
            AND txt.kSprache = su.kSprache
            AND txt.kPlattform = 1
        WHERE
            abpos.nType NOT IN (2)
            AND ab.kAuftrag IN (@Keys)
    ) abposi
    LEFT JOIN tArtikelAttribut aattr ON aattr.kArtikel = abposi.kArtikel AND aattr.kAttribut = (SELECT kAttribut FROM tAttributSprache WHERE cName = 'Name eigenes Feld')
    LEFT JOIN tArtikelAttributSprache aattrs ON aattrs.kArtikelAttribut = aattr.kArtikelAttribut
GROUP BY
    abposi.Artikelnummer,
    abposi.Bezeichnung,
    aattrs.cWertVarchar
ORDER BY
    abposi.Artikelnummer

Viele Grüße
Mirko
 
  • Ich liebe es
Reaktionen: MichaelH

MichaelH

Sehr aktives Mitglied
17. November 2008
14.204
1.791
Du kannst auch ein Foto machen und in der WhatsApp Gruppe "Lager" versenden.
Es stehen dir also sämtliche moderne Wege offen ... ausgenommen eine Liste zu drucken, denn das ist irgendwie altbacken.
 
  • Haha
Reaktionen: ascsoft

chembaer

Sehr aktives Mitglied
10. Januar 2017
154
25
Danke.
Ich habe aber jetzt doch noch ein Problem:
Gleiche Artikel haben in unseren Aufträgen zwar gleiche Artikelnummern, aber teils unterschiedliche Artikelnamen. Bei der SQL Ausgabe werden dann trotz gleicher Artikelnummer mehrere Zeilen mit der gleichen Artikelnummer, aber unterschiedlichen Artikelnamen erzeugt. Wie kann ich diese zu einer Position mit der gleichen Artikelnummer zusammenfassen und am Besten noch statt des Artikelnamens aus der Bestellung den bei JTL hinterlegten "Standard"-Artikelnamen ausgeben?

Sorry, mag eine dumme Frage sein, aber ich habe von SQL leider keine Ahnung.
 

MirkoWK

Sehr aktives Mitglied
14. März 2022
691
245
versuch es mal damit:

SQL:
SELECT
    abposi.Artikelnummer,
    b.cName,
    CONVERT(DECIMAL(26,2), ROUND(SUM(abposi.Menge), 2)) AS 'Menge in Aufträgen',
    CONVERT(INT, SUM(ISNULL(VersandgewichtGesamt, 0.0))) AS 'Versandgewicht gesamt',
    CONVERT(INT, MAX(ISNULL(VersandgewichtEinzel, 0.0))) AS 'Versandgewicht einzeln',
    aattrs.cWertVarchar AS 'Name Spalte'
FROM
    (
    SELECT
        abpos.cArtNr AS 'Artikelnummer',
        abpos.kArtikel,                         
        abpos.cName AS 'Bezeichnung',
        abpos.fAnzahl AS 'Menge',
        CASE
            WHEN abpos.kAuftragPosition = abpos.kAuftragStueckliste THEN 'Stückliste'
            WHEN abpos.kAuftragStueckliste > 0 THEN 'Stücklistenkomponente'
            WHEN abpos.nType = 0 THEN 'Freiposition'
            WHEN abpos.nType = 1 THEN 'Artikel'
        END AS 'Positionstyp',
        a.fGewicht AS 'VersandgewichtEinzel',
        a.fGewicht * abpos.fAnzahl AS 'VersandgewichtGesamt',
        a.fArtGewicht AS 'ArtikelgewichtEinzel',
        a.fArtGewicht * abpos.fAnzahl AS 'ArtikelgewichtGesamt'
    FROM
        Verkauf.tAuftrag ab
        JOIN Verkauf.tAuftragPosition abpos ON ab.kAuftrag = abpos.kAuftrag
        LEFT JOIN tArtikel a ON abpos.kArtikel = a.kArtikel
        LEFT JOIN tSpracheUsed su ON su.nStandard = 1
        LEFT JOIN tArtikelBeschreibung txt ON a.kArtikel = txt.kArtikel
            AND txt.kSprache = su.kSprache
            AND txt.kPlattform = 1
        WHERE
            abpos.nType NOT IN (2)
            AND ab.kAuftrag IN (@Keys)
    ) abposi
    LEFT JOIN tArtikelAttribut aattr ON aattr.kArtikel = abposi.kArtikel AND aattr.kAttribut = (SELECT kAttribut FROM tAttributSprache WHERE cName = 'Name eigenes Feld')
    LEFT JOIN tArtikelAttributSprache aattrs ON aattrs.kArtikelAttribut = aattr.kArtikelAttribut
    LEFT JOIN tArtikelBeschreibung b ON b.kArtikel = abposi.kArtikel AND b.kPlattform = 1 AND b.kSprache = 1
GROUP BY
    abposi.Artikelnummer,
    b.cName,
    aattrs.cWertVarchar
ORDER BY
    abposi.Artikelnummer
 
  • Gefällt mir
Reaktionen: chembaer

chembaer

Sehr aktives Mitglied
10. Januar 2017
154
25
versuch es mal damit:

SQL:
SELECT
    abposi.Artikelnummer,
    b.cName,
    CONVERT(DECIMAL(26,2), ROUND(SUM(abposi.Menge), 2)) AS 'Menge in Aufträgen',
    CONVERT(INT, SUM(ISNULL(VersandgewichtGesamt, 0.0))) AS 'Versandgewicht gesamt',
    CONVERT(INT, MAX(ISNULL(VersandgewichtEinzel, 0.0))) AS 'Versandgewicht einzeln',
    aattrs.cWertVarchar AS 'Name Spalte'
FROM
    (
    SELECT
        abpos.cArtNr AS 'Artikelnummer',
        abpos.kArtikel,                       
        abpos.cName AS 'Bezeichnung',
        abpos.fAnzahl AS 'Menge',
        CASE
            WHEN abpos.kAuftragPosition = abpos.kAuftragStueckliste THEN 'Stückliste'
            WHEN abpos.kAuftragStueckliste > 0 THEN 'Stücklistenkomponente'
            WHEN abpos.nType = 0 THEN 'Freiposition'
            WHEN abpos.nType = 1 THEN 'Artikel'
        END AS 'Positionstyp',
        a.fGewicht AS 'VersandgewichtEinzel',
        a.fGewicht * abpos.fAnzahl AS 'VersandgewichtGesamt',
        a.fArtGewicht AS 'ArtikelgewichtEinzel',
        a.fArtGewicht * abpos.fAnzahl AS 'ArtikelgewichtGesamt'
    FROM
        Verkauf.tAuftrag ab
        JOIN Verkauf.tAuftragPosition abpos ON ab.kAuftrag = abpos.kAuftrag
        LEFT JOIN tArtikel a ON abpos.kArtikel = a.kArtikel
        LEFT JOIN tSpracheUsed su ON su.nStandard = 1
        LEFT JOIN tArtikelBeschreibung txt ON a.kArtikel = txt.kArtikel
            AND txt.kSprache = su.kSprache
            AND txt.kPlattform = 1
        WHERE
            abpos.nType NOT IN (2)
            AND ab.kAuftrag IN (@Keys)
    ) abposi
    LEFT JOIN tArtikelAttribut aattr ON aattr.kArtikel = abposi.kArtikel AND aattr.kAttribut = (SELECT kAttribut FROM tAttributSprache WHERE cName = 'Name eigenes Feld')
    LEFT JOIN tArtikelAttributSprache aattrs ON aattrs.kArtikelAttribut = aattr.kArtikelAttribut
    LEFT JOIN tArtikelBeschreibung b ON b.kArtikel = abposi.kArtikel AND b.kPlattform = 1 AND b.kSprache = 1
GROUP BY
    abposi.Artikelnummer,
    b.cName,
    aattrs.cWertVarchar
ORDER BY
    abposi.Artikelnummer

@ MirkoWK:​

Jetzt gibt es doch noch ein Problem: Stücklistenartikel werden im Vaterartikel aufaddiert und zusätzlich als eigener Artikel summiert. Wenn also z.B. 2 Aufträge über Artikel a = 2 x 1 Kugelschreiber und and Artikel b 3 x 5 Kugelschreiber im Set (also 5xStück
versuch es mal damit:

SQL:
SELECT
    abposi.Artikelnummer,
    b.cName,
    CONVERT(DECIMAL(26,2), ROUND(SUM(abposi.Menge), 2)) AS 'Menge in Aufträgen',
    CONVERT(INT, SUM(ISNULL(VersandgewichtGesamt, 0.0))) AS 'Versandgewicht gesamt',
    CONVERT(INT, MAX(ISNULL(VersandgewichtEinzel, 0.0))) AS 'Versandgewicht einzeln',
    aattrs.cWertVarchar AS 'Name Spalte'
FROM
    (
    SELECT
        abpos.cArtNr AS 'Artikelnummer',
        abpos.kArtikel,                        
        abpos.cName AS 'Bezeichnung',
        abpos.fAnzahl AS 'Menge',
        CASE
            WHEN abpos.kAuftragPosition = abpos.kAuftragStueckliste THEN 'Stückliste'
            WHEN abpos.kAuftragStueckliste > 0 THEN 'Stücklistenkomponente'
            WHEN abpos.nType = 0 THEN 'Freiposition'
            WHEN abpos.nType = 1 THEN 'Artikel'
        END AS 'Positionstyp',
        a.fGewicht AS 'VersandgewichtEinzel',
        a.fGewicht * abpos.fAnzahl AS 'VersandgewichtGesamt',
        a.fArtGewicht AS 'ArtikelgewichtEinzel',
        a.fArtGewicht * abpos.fAnzahl AS 'ArtikelgewichtGesamt'
    FROM
        Verkauf.tAuftrag ab
        JOIN Verkauf.tAuftragPosition abpos ON ab.kAuftrag = abpos.kAuftrag
        LEFT JOIN tArtikel a ON abpos.kArtikel = a.kArtikel
        LEFT JOIN tSpracheUsed su ON su.nStandard = 1
        LEFT JOIN tArtikelBeschreibung txt ON a.kArtikel = txt.kArtikel
            AND txt.kSprache = su.kSprache
            AND txt.kPlattform = 1
        WHERE
            abpos.nType NOT IN (2)
            AND ab.kAuftrag IN (@Keys)
    ) abposi
    LEFT JOIN tArtikelAttribut aattr ON aattr.kArtikel = abposi.kArtikel AND aattr.kAttribut = (SELECT kAttribut FROM tAttributSprache WHERE cName = 'Name eigenes Feld')
    LEFT JOIN tArtikelAttributSprache aattrs ON aattrs.kArtikelAttribut = aattr.kArtikelAttribut
    LEFT JOIN tArtikelBeschreibung b ON b.kArtikel = abposi.kArtikel AND b.kPlattform = 1 AND b.kSprache = 1
GROUP BY
    abposi.Artikelnummer,
    b.cName,
    aattrs.cWertVarchar
ORDER BY
    abposi.Artikelnummer

@ MirkoWK:​

Jetzt gibt es doch noch ein Problem: Stücklistenartikel werden im Vaterartikel und im Stücklistenartikel angezeigt und aufaddiert. Also z.B. wenn 2 Aufträge für den Artikel a (1 Kugelschreiber) und 3 Aufträge für den Artikel b (5 Kugelschreiber, bestehend aus 5x Artikel a) vorliegen, dann ist die Ausgabe 17 x Artikel a plus 3 mal Artikel b. Kann man dies noch so hinbiegen, dass nur die 17x Artikel a ausgegeben werden?
 

MirkoWK

Sehr aktives Mitglied
14. März 2022
691
245
Hi,

pack mal nach das

...
AND ab.kAuftrag IN (@Keys)

noch ein
AND a.kStueckliste = 0

Damit werden alle Artikel ausgenommen, welche eine Stückliste sind. Die Komponenten bleiben in der Übersicht dabei erhalten.

Viele Grüße
Mirko
 
  • Gefällt mir
Reaktionen: chembaer

ascsoft

Sehr aktives Mitglied
3. Oktober 2010
306
35
Danke @MichaelH

Das funktioniert mit der Liste ja bei offenen Aufträgen. Aber bei schon versendeten Aufträgen funktioniert das SQL nicht. Da bleibt die Liste leer.