AW: Benutzerdefinierter Lieferschein mit verschiedenen Auftragsabhängigen Variablen
Ich führe gerade JTL
Wawi bei uns ein, welche die preisintensive aber mächtige Software Sage Office Line ablöst. Wir haben ähnliche Anforderungen wie du und ich habe dazu ein paar Workarounds erstellt. Ich rate vom produktiven Einsatz ab, sofern du nicht über SQL Kenntnisse besitzt. Du musst auch mit jedem Patch überprüfen ob die betroffenen Datenbankfelder ggf. umbenannt oder in andere Tabellen verschoben worden. Die manuelle Eingabe und Pflege von benutzerdefinierten Feldern empfehle ich nicht, da kannst du auch gleich eine eigene Datenbank entwerfen und dir die passende Software schreiben (lassen). Lies auch mein ergänzenden Hinweise am Ende.
Vorgangsbezogene (= Auftrags- oder Belegbezogen) Parameter:
Mögliche vorgangsbezogene Parameter:
Auftragsnummer des B2B Kunden
Lieferantennummer des eigenen Unternehmens beim B2B Kunden
...
Eine Lösung: Bestellattribute
Definiere die Bezeichner für diese Attribute. Du musst sicherstellen, dass keine Anwender die Bestellattribute nachträglich löschen oder umbenennen.
Hier ein Beispiel:
Einstellungen -> Allgemeine Einstellungen -> Bestellattribute
Dort erstellst du ein Attribut "Referenz", welches später für die Auftragsnummer des B2B Kunden verwendet wird.
Bei der Erstellung des Auftrags kannst du nun dieses Attribut mit einem Wert belegen. (Das Feld "Attribute" findest du neben der Sprachwahl in der Auftragsbearbeitung)
Damit diese Angabe auch auf den jeweiligen Belegen (Auftragsbestätigung, Lieferschein, Rechnung usw.) erscheint fügst du die entsprechenden Felder per JTL_DirectQuery ein.
JTL_DirectQuery("SELECT Attribut.cValue FROM tBestellungAttribute AS Attribut LEFT JOIN tBestellung AS Bestellung ON Bestellung.kBestellung = Attribut.kBestellung WHERE Attribut.cName =
'Referenz' AND Bestellung.cBestellNr = '"+
JTL.WaWi.Vorgang.BestellNr + "'")
Wie du jetzt feststellen wirst, sind Grundlagen in SQL jetzt extrem hilfreich. Wenn du diese nicht hast, suche dir jemanden der sie hat oder fahre auf eigenes Risiko fort. Die oben genannte Abfrage verbindet die Tabellen Bestellungen und Bestellattribute und liefert uns ein eindeutiges Ergebnis zur genannten Bestellung (Variable orange markiert) und Bestellattribut. Der Bezeichner cName (rot markiert) muss dabei zu 100% mit dem Wert übereinstimmen, welchen du vorher unter Bestellattribute angelegt hast.
Nun kannst du mit dem dargestellten Wert weiterarbeiten. Eine kleines Bezeichner ("Referenznummer: ") voranstellen oder die Ausgabe unterdrücken, falls der Wert leer ist. Ich setze voraus das du mit dem Formulardesigner bereits Erfahrungen gesammelt hast.
Wiederhole diesen Schritt für alle vorgangsbezogenen Attribute und Belege.
--------------
Artikelbezogene Attribute:
Nun wird es anspruchsvoller.
1) Preise
Wir haben mehrere B2B Kunden, welche individuelle Preise pro Artikel haben. Eine Lösung über Rabatt ist nicht möglich, da die Preisnachlässe individuell pro Artikel erstellt werden.
Eine Lösung ist, welche auch schon im Forum dokumentiert wurde, das für jeden betroffenen B2B Kunden eine eigene Kundengruppe erstellt wird. Diese benennst du vorzugsweise auch nach dem Kunden.
2a) kundenbezogene Artikelnummer pro Artikel - Aufgabenstellung
Damit du nun auch für jeden Artikel eine Bestellnummer in JTL hinterlegen kannst sind weitere Schritte nötig. Manche werden sich fragen, wieso dieser Aufwand, hier die Erklärung:
Der B2B Kunde führt von tausenden Lieferanten mehrere Millionen Artikel und eine entsprechend groß dimensionierte Logistik. Damit seine eigene Lagerführung nicht nach 10 Minuten im Chaos versinkt, erstellt er sogenannte "Lieferantenverträge" welche bestimmten Vorgaben beinhalten, welche wiederum vom Lieferant (uns) erfüllt werden müssen. Eine schreibt uns z.B. vor, dass in allen Belegen zu jeder Position nicht nur unsere, sondern auch die hauseigene Artikelnummer festgehalten wird.
2b) kundenbezogene Artikelnummer pro Artikel - Lösung
Die Lösung nennt sich "Produktattribute" und lässt sich bis zu einer gewissen Anzahl von Kunden praktikabel lösen. Es wird vorausgesetzt, das diese Kunden eine eigene Kundengruppe haben (siehe 1.)
Du definierst für jeden B2B Kunden, für welchen du kundenbezogene Artikelnummern hinterlegen willst, wieder einen Bezeichner, welcher 1:1 mit dem Namen der jeweiligen Kundengruppe übereinstimmt. Stelle sicher dass die betroffenen Mitarbeiter (Produktmanager, Contentmitarbeiter, Vertriebsassistenten) für den sicheren Umgang mit diesem Feld ausreichend geschult bzw. sensibilisiert werden. Berücksichtige auch Datenschutzaspekte bei der Verwendung des Kundennamens als Attributsbezeichner. Kläre das mit deinem DSB, der nebenbei erwähnt die oben geforderten SQL Kenntnisse besitzen sollte.
Anschließend erstellst du für jeden Artikel, welchem du einen individuellen Preis hinterlegen willst ein entsprechendes Attribut.
Hier ein Beispiel:
Du hast den Kunden "Sockenshop Online" und belieferst diesen mit verschiedenen Artikel wie z.B. "Strumpf lang braun Typ 1". Wie bereits besprochen, haben wir eine Kundengruppe "Sockenshop Online" erstellt und die Preise hinterlegt.
Anschließend erstellst du eine Attribut unter Artikel->Artikeldetails->Attribute/Merkmale->Hinzufügen
Attributart: Kurztext (damit stellst du sicher, das führende Nullen erkannt werden bzw. falls der Kunde alphanumerische Artikelnummern hat ist es eh Pflicht).
Name: Sockenshop Online (muss zu 100% mit der Bezeichnung der Kundengruppe übereinstimmen)
Kurztext: Artikelnummer des Kunden eintragen
"Im Internet anzeigen" abwählen und mit OK speichern.
Das wiederholst du für alle Artikel und Kunden, bei denen du eigene Preise bzw. Artikelnummern hinterlegen willst.
Kommen wir wieder zur Darstellung dieses Werts auf den Belegen.
Füge der Positionsliste eine weitere Zeile pro Position hinzu. Diese Zeile kann z.B. zwischen dem Variantenfeld und dem Beschreibungsfeld eingefügt werden.
Wir bedienen uns wieder der Funktion JTL-DirectQuery und verknüpfen nun die Tabellen Kunden, Kundengruppen, Attribute und Zeichenketten.
JTL_DirectQuery ("SELECT AttributWert.cValue FROM tkunde AS Kunde LEFT JOIN tKundenGruppe AS Gruppe ON Gruppe.kKundenGruppe = Kunde.kKundenGruppe LEFT JOIN tattribut AS Attribut ON Attribut.cName = Gruppe.cName LEFT JOIN tString AS AttributWert ON AttributWert.kString = Attribut.kString WHERE Kunde.cKundenNr = " + JTL.WaWi.Kunde.Kundennummer + " AND Attribut.kArtikel = "+ ToString$(Positionen.ArtikelID))
Es wird ermittelt welcher Kundengruppe der Kunde (JTL.WaWi.Kunde.Kundenummer) zugeordnet ist und sucht dazu in der Tabelle Attribute einen möglichen Eintrag, welcher den Bezeichner (cName) mit der Kundengruppe besitzt und gleichzeitig für den Artikel (Positionen.ArtikelID) hinterlegt ist. Das eindeutige Ergebnis wird anschließend aus der Tabelle "tString" (=Kurztext) gelesen und zurückgegeben. Eigentlich ganz einfach oder?
Damit kannst du dann wieder weiter arbeiten und die Ausgabe ergänzen mit einem vorangestellten Bezeichner "Ihre Artikelnummer lautet: " oder unterdrücken, falls zu diesem Artikel und Kunde kein Wert hinterlegt wurde. Natürlich lässt sich die Artikelnummer auch als eigene Spalte darstellen oder sonstwie anzeigen. Das kannst du wie immer alles im Formulardesigner nach Belieben weiterverarbeiten.
---------
Bei beiden Workarounds gibt es leider kaum eine Möglichkeit nach diesen Werten innerhalb der JTL-Dialoge zu suchen. Z.b. suche Artikel mit Kundenartikelnummer "Socke 033920" oder das man innerhalb der Rechnungsübersicht Bestellattribute in der Listenansicht darstellen kann. Auch die
Ameise profitiert davon nicht bzw. nur über Umwege. Die Workarounds dienen in erster Linie dazu, die gewünschte Attribute auf den Belegen darzustellen, welche später bei deinem Kunden im Wareneingang oder Buchhaltung bearbeitet werden.
Beide Workarounds setzen auch den sicheren Umgang mit den Attributen voraus. Werden selbige nicht exakt angegeben, nachträglich gelöscht oder sonstwie manipuliert, dann ist Chaos vorprogrammiert. Daher wird alles nachträglich nochmal als Workaround und nicht als Lösung definiert. Ich kann es nur wiederholen. Kenntnisse und Erfahrung vorausgesetzt und vor allem die nötige Schulung der Mitarbeiter muss berücksichtigt werden, sonst geht es nicht.
Hinweis ans JTL-Team: Eine entsprechende Integration dieser Funktionen wäre wünschenswert, aber ich sehe ein, das die JTL-Anwendergruppe nicht sehr viele B2B Händler umfasst und damit keine Priorität erhalten. Ein kostenpflichtiges B2B Upgrade wäre natürlich eine Überlegung wert. Gerne erstellt die Community einen entsprechenden Anforderungskatalog.