Neu Wie vermeide ich das automatische Einfügen des Angebotsdatums in "Sonstiges" bei Auftragserstellung?

Onkel Tom

Aktives Mitglied
13. September 2008
68
1
Essen
Hallo, ich habe mir im Rahmen regelmäßiger Rechnungserstellung Vorlagen angelegt, die in der WaWi als "Angebote" gespeichert sind. Um daraus eine Rechnung zu erstellen, wandle ich diese in einen Auftrag mit dem Button "Auftrag erstellen". Die Angebote werden dabei nicht gelöscht, sondern bleiben erhalten. Aus dem Auftrag kann ich dann die Rechnung erzeugen, wenn ich die abzurechnenden Werte eingetragen habe.
Soweit alles top, ABER: Bei der Erstellung des Auftrags aus dem Angebot wird automatisch in das Feld "Sonstiges" der Text "Erstellt aus Angebot Nr XXXX vom XXXX" eingetragen. Von mir zuvor erstellte Texte, die ich dort im Angebot hinterlegt habe, sind dann im Auftrag weg und stattdessen steht dort der automatisch erzeugte Text "Erstellt aus Angebot .... blabla" .
Wie kann ich diese automatische Erstellung des Hinweises, aus welchem Angebot der Auftrag erstellt wurde, vermeiden?
Beste Grüße
Thomas
 

gutberle

Sehr aktives Mitglied
29. März 2011
1.268
324
Hallo Thomas,

das läßt sich mit einem einfachen "Schalter" in der Wawi leider nicht vermeiden, man kann das aber recht leicht über über einen Workflow nachrüsten und bei der Gelegenheit kann man auch noch automatisch den Inhalt des Feldes "Sonstiges" aus dem Angebot in den Auftrag übertragen. - Here we go...

1. Leg Dir einen neuen Workflow im Bereich "Aufträge > Erstellt" an.
2. Leg keine Bedingung an, sondern nur eine Aktion "Werte setzen" und für die Variable "Auftrag\Sonstiges\Hinweis"
3. Dann klickst Du bei "Wert" auf "..." und gibst (kopierst...) folgenden Code ein...
Code:
{% capture query %}\
    SELECT cText FROM tBestellHinweis \
    INNER JOIN tBestellung ON tBestellHinweis.kBestellHinweis=tBestellung.kBestellHinweis \
    WHERE tBestellung.cBestellNr='{{ Vorgang.Stammdaten.Auftragsnummer }}'\
{% endcapture -%}
{% assign Auftrag_Anmerkung = query | DirectQueryScalar -%}
{% if Auftrag_Anmerkung != null -%}
{{ Auftrag_Anmerkung }}
{% endif -%}
{% capture query %}\
    SELECT cText FROM tBestellHinweis \
    INNER JOIN tBestellung ON tBestellHinweis.kBestellHinweis=tBestellung.kBestellHinweis \
    WHERE tBestellung.cBestellNr= \
        (SELECT (SELECT REVERSE(SUBSTRING(REVERSE(LTRIM(RTRIM(cText))),1,(CHARINDEX(' ',REVERSE(LTRIM(RTRIM(cText)))+' ')-1)))) FROM tBestellHinweis \
            INNER JOIN tBestellung ON tBestellHinweis.kBestellHinweis=tBestellung.kBestellHinweis \
            WHERE tBestellung.cBestellNr='{{ Vorgang.Stammdaten.Auftragsnummer }}')\
{% endcapture -%}
{% assign Angebot_Anmerkung = query | DirectQueryScalar -%}
{% if Auftrag_Anmerkung != null -%}
{{ Angebot_Anmerkung -}}
{% endif -%}
4. Dann gibst Du dem Workflow am Besten noch einen Namen, OK klicken, Fertig.

Ok und was macht das? - Der Code führt zwei SQL Abfragen durch und liefert dem Workflow die jeweiligen Texte zum aktuellen Inhalt von "Sonstiges" im Auftrag und von "Sonstiges" im zugrundeliegenden Angebot zurück, der sie dann in das Feld "Sonstiges" des neuen Auftrags schreibt. Gibt eine oder beide Abfragen keinen Text zurück, weil keiner existiert, wird auch dem Workflow nichts übergeben, bei einem Sofortauftrag also z.B. "", sprich Nüscht.

Die erste SQL Abfrage liefert dabei tatsächlich den "Erstellt aus Angebot XXXXXXXX" Text aus der Datenbank und der Code von oben beläßt diesen Text sogar (entgegen Deinem Wunsch) im "Sonstiges" Feld des Auftrags. Der Grund dafür ist, dass dies die EINZIGE Referenz im Auftrag auf das zugrundeliegende Angebot ist und ich würde das nie löschen wollen. Also habe ich Deinen Wunsch flugs umgemünzt in "Wie bekomme ich meinen Text aus dem Angebot in den Auftrag", sorry... - Falls Du das nicht möchtest, dann löscht Du oben im Code einfach alles bis hin zum ersten {% endif -%}.

Achtung: Ich habe das Ganze jetzt nicht explizit mit allen Formen von Auftragserstellungen durchprobiert, also z.B. nicht mit Umtauschaufträgen, aber schon mit "Sofortaufträgen" und mit Aufträgen, die direkt aus dem Kunden heraus erstellt wurden und auch dann/dort, wo es keine Vortexte gibt, also weder ein "Erstellt aus..." noch ein Vorangebot, funktioniert der Workflow trotzdem wie gewünscht und es gibt (für mich) im Moment auch keinen Hinweis darauf, dass es irgendwelche Auftragstypen geben könnte, bei denen diese Logik nicht funktioniert.

Hinweis: Für Aufträge, die schon erstellt worden sind, funktioniert das natürlich nicht, aber was Du dafür tun kannst, ist Dir einfach den gleichen Workflow auch im Bereich "Auftrag - Manuell" anzulegen. Dann kannst Du in der Auftragsliste einen (oder auch mehrere) Aufträge auswählen und den Workflow über "Workflow ausführen..." weiter unten rechts ausführen. Da der Code übrigens immer den aktuellen Stand des Feldes "Sonstiges" im Auftrag holt, kannst Du das auch dann noch gefahrlos tun, wenn Du schon weiteren Text im Auftrag eingegeben hast.

P.S. Ich habe Dir auch einen Screenshot der Workflow Definition als Referenz angehängt.

Gruß,
Ingmar
 

Anhänge

Zuletzt bearbeitet:

Onkel Tom

Aktives Mitglied
13. September 2008
68
1
Essen
Hallo Ingmar,

vielen Dank für Deine ausführliche Antwort :) Mit einer solchen fachlichen Kompetenz und dieser Ausführlichkeit habe ich nicht gerechnet. Aber ich freue mich sehr, dass Du Dir die Mühe gemacht hast. :) Ich habe es ausprobiert: es funktioniert alles so, wie Du es beschrieben hast. TOP! Aber es ist tatsächlich so, dass ich diesen automatischen Referenztext auf die Angebotsnummer gar nicht gebrauchen kann, dafür aber eventuelle Texte, die ich in der Angebotsvorlage im "Sonstiges" hinterlegt habe, umso mehr. Nun bieten mir Deine Ausführungen zwei Möglichkeiten: entweder ich übernehme den gesamten Code und bekomme dafür den automatischen Referenztext plus meinen eigenen Text, oder ich übernehme nur den Code nach dem ersten "end if" und habe dann das Feld komplett leer - ohne den automatischen Referenztext, aber auch ohne meine eigenen Texte. Magst Du mir den Code so verändern, dass ich NUR meinen eigenen Text vom Angebot in den Auftrag übernehmen kann - ohne den automatischen Referenztext ? Ich habe zwar mal etwas rumprobiert, aber da ich die SQL Sprache nicht verstehe, komme ich mit Probieren leider nicht weit.
Du hast mir schon sehr geholfen, dafür nochmals vielen Dank, wenn es nun noch so funktionieren könnte, dass ich, wenn ich eigenen Text im "Sonstiges" hinterlegt habe, diesen übernehmen kann, und wenn ich nichts eingetragen habe, dann bleibt das Feld auch im Auftrag leer, dann wäre es perfekt :)

Beste Grüße
Thomas
 

gutberle

Sehr aktives Mitglied
29. März 2011
1.268
324
Hallo Thomas,

sorry, da hatte ich ganz unten in der Abfraqe statt abzufragen ob "Angebot_Anmerkung" ungleich NULL (leer) ist, versehentlich gleich noch einmal abgefragt, ob "Auftrag_Anmerkung" ungleich NULL ist und das ist es (immer), wenn man den oberen Teil löscht, ähem ... :confused:

Hier also noch einmal der komplette Code für den Workflow, damit der einmal komplett und voll funktionsfähig hier im Thread steht ...
Code:
{% capture query %}\
    SELECT cText FROM tBestellHinweis \
    INNER JOIN tBestellung ON tBestellHinweis.kBestellHinweis=tBestellung.kBestellHinweis \
    WHERE tBestellung.cBestellNr='{{ Vorgang.Stammdaten.Auftragsnummer }}'\
{% endcapture -%}
{% assign Auftrag_Anmerkung = query | DirectQueryScalar -%}
{% if Auftrag_Anmerkung != null -%}
{{ Auftrag_Anmerkung }}
{% endif -%}
{% capture query %}\
    SELECT cText FROM tBestellHinweis \
    INNER JOIN tBestellung ON tBestellHinweis.kBestellHinweis=tBestellung.kBestellHinweis \
    WHERE tBestellung.cBestellNr= \
        (SELECT (SELECT REVERSE(SUBSTRING(REVERSE(LTRIM(RTRIM(cText))),1,(CHARINDEX(' ',REVERSE(LTRIM(RTRIM(cText)))+' ')-1)))) FROM tBestellHinweis \
            INNER JOIN tBestellung ON tBestellHinweis.kBestellHinweis=tBestellung.kBestellHinweis \
            WHERE tBestellung.cBestellNr='{{ Vorgang.Stammdaten.Auftragsnummer }}')\
{% endcapture -%}
{% assign Angebot_Anmerkung = query | DirectQueryScalar -%}
{% if Angebot_Anmerkung != null -%}
{{ Angebot_Anmerkung -}}
{% endif -%}
... und Du mußt jetzt wirklich nur so vorgehen, wie oben beschrieben, also alles bis zum Ende der Zeile mit dem ersten {% endif -%} löschen.

P.S. Die Leerzeile, die beim Löschen über dem übrigen Code entsteht mußt Du auch löschen, denn in DotLiquid (so heißt die Sprache hier) gibt man Text nicht nur über Befehle aus, sondern Leerzeilen werden zu Leerzeilen, Einrückungen werden zu Einrückungen, etc.

Gruß,
Ingmar
 
  • Gefällt mir
Reaktionen: Onkel Tom

Arkin

Aktives Mitglied
28. Juli 2017
48
4
Hallo Ingmar,

diese Lösung habe ich ebenfalls vergeblich gesucht und bin froh dass du diese Funktion umgesetzt hast.
Nur leider funktioniert der Workflow bei mir nicht.
Ich habe Ihn sowohl bei Auftrag erstellt als auch bei Auftrag Manuell angelegt.
Habe den Code aus deinem letzten Post übernommen und bin auch der Meinung ich habe alles so angelegt wie von dir beschrieben.

Wo liegt der/mein Fehler?

Wawi Version 1.3.20
Wir nutzen die Funktion: Auftrag aus Angebot immer neu erstellen/nicht wandeln.

Lösche ich den oberen Teil, dann ist das Feld Sonstiges "Leer".
Belasse ich den vollständigen Code. Dann erscheint der Text "Erstellt aus Angebot ..." aber nicht mein Text aus dem Angebot.
Der Cursor springt lediglich eine Zeile nach unten.

Vielen Dank vorab.
 

Anhänge

Zuletzt bearbeitet:

gutberle

Sehr aktives Mitglied
29. März 2011
1.268
324
Hallo Arkin,

kann es sein, dass Du hinter der automatisch angelegten Zeile mit "Erstellt aus Angebot XXXXXXX" noch weitere Zeilen, vielleicht nur Leerzeilen stehen hast? Damit wäre der Workflow in der obenstehenden Form leider überfordert, denn er geht davon aus, dass der Auftrag frisch angelegt wurde und es deshalb nur eine Zeile geben kann. Das beißt sich so ein bißchen mit der Idee, den Workflow auch Manuell auslösen zu können, denn dann ist nicht mehr garantiert, dass in Auftrag > Sonstiges nicht schon mehr Text als bei der Erzeugung steht.

Da das Thema auch für mich noch immer wichtig ist, habe ich den Workflow von oben jetzt so umgeschrieben, dass diese Einschränkung nicht mehr gilt, here we go ...
SQL:
{% capture query %}\
    SELECT LTRIM(RTRIM(cText)) FROM tBestellHinweis\
    INNER JOIN tBestellung ON tBestellHinweis.kBestellHinweis=tBestellung.kBestellHinweis\
    WHERE tBestellung.cBestellNr='{{ Vorgang.Stammdaten.Auftragsnummer }}'\
{% endcapture -%}
{% assign Auftrag_Anmerkung = query | DirectQueryScalar -%}
{% if Auftrag_Anmerkung != null -%}
{{ Auftrag_Anmerkung }}
{% endif -%}
{% capture query %}\
    DECLARE @AngebotsNummer VARCHAR(Max)\
    SET @AngebotsNummer=\
        (SELECT SUBSTRING(cText,1, CASE WHEN CHARINDEX(CHAR(13),cText)>0 THEN CHARINDEX(CHAR(13),cText)-1 ELSE CASE WHEN CHARINDEX(CHAR(10),cText)>0 THEN CHARINDEX(CHAR(10),cText)-1 ELSE LEN(cText) END END)  FROM tBestellHinweis\
        INNER JOIN tBestellung ON tBestellHinweis.kBestellHinweis=tBestellung.kBestellHinweis\
        WHERE tBestellung.cBestellNr='{{ Vorgang.Stammdaten.Auftragsnummer }}')\
    SELECT cText FROM tBestellHinweis\
        INNER JOIN tBestellung ON tBestellHinweis.kBestellHinweis=tBestellung.kBestellHinweis\
        WHERE tBestellung.cBestellNr=REVERSE(SUBSTRING(REVERSE(LTRIM(RTRIM(@AngebotsNummer))),1,CHARINDEX(' ',@AngebotsNummer)+1))\
{% endcapture -%}
{% assign Angebot_Anmerkung = query | DirectQueryScalar -%}
{% if Angebot_Anmerkung != null -%}
{{ Angebot_Anmerkung -}}
{% endif -%}
Was aber nach wie vor gilt ist, dass der Text nur dann aus dem Angebot geholt werden kann, wenn die Angebotsnummer auch gefunden werden kann und deshalb gilt hier die Einschränkung, dass die Angebotsnummer das letzte "Wort" in der ersten (1.) Zeile im Feld "Sonstiges" des Auftrags sein muss.

Das ist beim automatisch erzeugten Standardtext "Erstellt aus Angebot XXXXXXX" automatisch der Fall und falls Du den Text schon editiert hast, musst Du einfach nur darauf achten, dass die Angebotsnummer in Zeile 1 verbleibt, sie kann aber auch gerne das einzige "Wort" sein, das dort steht.

Gruß,
Ingmar
 
Zuletzt bearbeitet:

Arkin

Aktives Mitglied
28. Juli 2017
48
4
Hallo Ingmar,

ich habe auch gesucht an welcher Stelle man diesen automatischen Text ändern könnte, allerdings finde ich diesen Standardbaustein nirgends xD

Ich habe nun folgendes gemacht.
Ich habe den neuen Code von gestern Abend von dir in beide Workflows bei Auftrag erstellt und Auftrag erstellt manuell hinterlegt, keine Bedingung, Werte setzen für Auftrag/Sonstiges/Hinweis.

Ich habe ein neues Angebot erstellt, und dort im Feld Sonstiges Hinweis angeklickt und "Hallo Sonstiges." hinterlegt.
Ich habe das Angebot gespeichert. Danach habe ch das Angebot erneut geöffnet und "Auftrag erstellen" geklickt.
Im nun erzeugten Auftrag steht erneut: "Erstellt aus Angebot #Angebotsnr#" und der Cursor ist in einer Zeile nach unten gesprungen.
Deaktiviere ich den Workflow und wiederhole den Vorgang, kommt der Standardtext aber ohne den Cursorsprung in die nächste Zeile.
D.h. für mich der Workflow macht etwas, aber er übernimmt nicht den Text aus dem Angebot.. in diesem Falle übernimmt der Workflow nicht "Hallo Sonstiges." sondern fügt einen Zeilenumbruch/Leerzeile ein.

Anbei nochmal Screenshots vom Feld Sonstiges aus dem Angebot, das Feld Sonstiges im frisch erzeugten Auftrag sowie vom Code als auch von der Workflow Übersicht.
Liebe Grüße und vielen Dank für deine schnelle Rückmeldung!
 

Anhänge

gutberle

Sehr aktives Mitglied
29. März 2011
1.268
324
Das sieht für mich so aus, als ob Deine Angebotsnummern aus zwei Worten bestehen würden, einmal "AG", dann ein Leerzeichen und dann Datum und Nummer "20180041". Falls dem so ist, dann würde der Workflow das Angebot nie finden können, die Angebotsnummer muss *ein* Wort sein. - Schau mal ....
 

Arkin

Aktives Mitglied
28. Juli 2017
48
4
Hallo Ingmar,

ja das ist korrekt.
Die Angebotsnummer/Aufträge/ etc. bekommen lt. Nummernkreis-Einstellungen Präfixe aus Buchstabe und Leerzeichen zugewiesen.
Aber andersherum kann ich mir das nicht vorstellen, dass der Workflow dann mit dem Präfix nicht funktionieren würde,
denn dann würde ja im Auftrag überhaupt gar kein Text erscheinen. Aber die Ausgabe "Erstellt aus #Präfix#Leerzeichen#Angebotsnummer" wird ja durch den Workflow
in den Auftrag geschrieben. Siehe Screenshot.
Zusätzlich mit dem Zeilenumbruch.
Deaktiviere ich den Worflow, dann kommt dieser Zeilenumbruch des Cursors nicht zustande.

Der Workflow findet den Standardtext, wo auch immer der definiert ist. Ich habe diesen Standardtext nicht verändert, denn ich kann ihn gar nicht finden trotz intensiver Recherche :D
Der Workflow ignoriert leider mein zuvor im Angebot gespeicherten Text, der Workflow selbst scheint allem Anschein nach, aber zumindest das Angebot zu erkennen denn in der Workflow Queue stehen ja alle Parameter, nur eben nicht der aus dem Angebot zu übernehmende Text.

Ich habe die Präfixe zum Test gelöscht, ein neues Angebot erstellt, und einen Hinweistext eingefügt, gespeichert, erneut das Angebot geöffnet, Auftrag daraus erstellt.
Ergebnis bleibt unverändert, außer dass die Präfixe sowohl für das Angebot und den Auftrag entfernt sind und den "neuen" Nummernkreis nun verwendet.
So lautet nun das Angebot mit der Nummer "120180042" und der Auftrag "220120081".
Es steht nach wie vor im Auftrag "Erstellt aus Angebot 120180042" und der Cursor springt in die nächste Zeile. Der Text aus Sonstiges ist noch immer nicht dabei.
Der Hinweistext war in diesem Falle ein einzelnes Wort aus Großbuchstaben/Kleinbuchstaben/Zahlen.
 

Anhänge

Zuletzt bearbeitet:

gutberle

Sehr aktives Mitglied
29. März 2011
1.268
324
Nein, das interpretierst Du falsch. Dass der Text "Erstellt aus ...." Erscheint heißt nicht, dass der Workflow das Angebot findet, denn dieser Text steht schon im Auftrag drin. Und nein, der ist keine Variable Funktion, sondern im Source Code der Wawi verankert.

Der Workflow holt sich zuerst den Text, der sowieso schon in Auftrag > Sonstiges steht, das klappt immer. Dann isoliert er aus der ersten Zeile dieses Textes das letzte Wort, denn das ist (aka muss sein) die Angebotsnummer.

Dabei ist es völlig egal, ob diese Angebotsnummer einen Präfix oder Suffix hat, nur Leerzeichen gehen nicht, weil es dann nicht mehr ein Wort sondern mehrere Worte sind, die die Angebotsnummer ausmachen und woher soll der Workflow das wissen?

Dieses letzte (eine!) Wort wird dann in der Spalte mit den Angebotsnummern in der Datenbank gesucht und dann aus dem Angebot, das dazu passt, der Text aus Angebot > Sonstiges geholt. Falls das nicht klappt, das Angebot aber existiert, dann kann das nur bedeuten, dass das letzte Wort in der ersten Zeile von Auftrag > Sonstiges noch weitere Zeichen enthält, vor allem wären hier weitere Leerzeichen "tödlich".

Dagegen könnte ich auch nichts ausrichten, denn der zweite Teil des Workflows sucht nach dem letzten Wort, indem er nach dem ersten Leerzeichen im invertierten Text sucht und wenn da noch weitere Leerzeichen sind, z.B. ganz am Ende, tja dann ist das letzte Wort hält ein Leerzeichen...
 
Zuletzt bearbeitet:

Arkin

Aktives Mitglied
28. Juli 2017
48
4
Hallo Ingmar,

absolut verständlich. Danke für die genaue Erklärung wie der Workflow arbeitet.

Ich habe nun folgendes gemacht:
Ich habe bei Auftrag und Angebot die Nummerkreise überprüft, dort sind definitiv keine Leerzeichen vorhanden. Es geht aber dennoch nicht.
Ich habe also um Leerzeichen definitiv auszuschließen die Nummernkreise wie folgt belegt:
Angebot: Präfix / Kreis / Suffix -> 2018/10001/AG
Auftrag: 2018/10020/A
(die Slashs nur zur Darstellung hier)

wieder neues Angebot erstellt, mit Sonstiges Hinweis versehen "Hallo."
Auftrag erstellt -> wieder nur der Standardtext.

Soll ich aufgeben? Ich will dir nicht die Nerven rauben.
Ich verstehe es einfach nicht wo der Fehler sich einschleicht, offenbar findet der Workflow ein Leerzeichen in der Angebotsnummer, ich weiß aber nicht wie das da hinkommen soll,
der Nummernkreis müsste so ok sein. und den Standardtext der DB habe ich nicht angefasst.
Hat unsere Datenbank vielleicht einen weg?
 

Arkin

Aktives Mitglied
28. Juli 2017
48
4
Hier noch Screenshots:
ich lasse nun auf dem Auftrag selbst, folgendes zum Test ausgeben/drucken:
"."+Vorgang.Hinweis.Text+"."

Workflow deaktiviert ergibt:
.Erstellt aus Angebot 201810052AG.

Worflow aktiviert ergibt:
.Erstellt aus Angebot 201810052AG
.

"Erstellt aus Angebot " ist ja der Standardtext bei dem der Workflow nach dem Leerzeichen hinter dem Wort "Angebot" sucht und isoliert diesen "Text".
Diesen "Text" sucht der Workflow dann in der DB Spalte "Angebot" und dies sollte die Nummer "201810052AG" sein, korrekt?
Wieso findet er dieses Angebot nicht? Es sind doch gar keine Leerzeichen vorhanden?
Jedenfalls gehe ich davon aus, dass keine Leerzeichen mehr da sind, da der ausgegebene Text mit den von mir zusätzlich eingefügten Zeichen direkt vor und hinter dem Standardtext mir dies so verdeutlicht, wenn der Workflow deaktiviert ist.
Der Workflow fügt wiedererwartend vor dem Letzten "." einen Zeilenumbruch ein und setzt dann Am Anfang der Zeile "." ein.

Eigentlich müsste ich mit dem Workflow erstmal die Ausgabe der Isolierung aus dem Standardtext überprüfen, Quasi was findet der Workflow wirklich.
Theoretisch soll er ja die Angebotsnummer finden. Jetzt müsste quasi der Workflow so umgeschrieben werden, dass nur die Angebotsnummer ausgegeben werden soll ohne Standardtext und ohne den einzufügenden Text aus Angebot.

Da kommt mir da gleich die Idee, wäre dieser umgeschriebene Workflow nicht für das allzeitbestehende Problem die Lösung "ich will die Angebotsnummer auf Auftrag/Lieferschein/Rechnung" drucken anstelle des Standardtextes im Freitextfeld o.ä.?
Nur wie könnte man dann die Ausgabe des Workflows in eine Vorlage drucken ohne die Variablen Sonstiges / Anmerkungen / Status etc. dafür zu "blockieren"? Oder könnte man die Datenbankabfrage so auch direkt in eine Vorlage einbringen?
 

Anhänge

Zuletzt bearbeitet:

gutberle

Sehr aktives Mitglied
29. März 2011
1.268
324
Hallo Arkin,

was Du zeigst und schreibst, kann ich leider alles nicht nachvollziehen, ich kann aber auch nicht wirklich sagen, ob Du nicht vielleicht irgendwo doch einen Unterschied in dem *aktuell* von Dir verwendeten Workflow Code zu meinem aktuellen Code (siehe oben) hast. Und dann habe ich gerade auch noch entdeckt, dass JTL seit der 1.3.21.0 hinter den Standardtext "Erstellt aus Angebot XXXXX" noch SELBST einen Zeilenumbruch einfügt, was nirgends dokumentiert ist, also auch nicht in den ChangeLogs ... :(

Damit wird mir das alles ein wenig zu unübersichtlich und ich poste hier noch einmal einen Code, der keine Verbesserung oder Veränderung des eigentlich angedachten Workflow-Codes darstellt, denn der funktioniert ja bei mir überall und immer.

Stattdessen ist der hier drunter stehende Code eher ein Debugging-Code, denn er isoliert aus dem Standardtext die Angebotsnummer und sucht dann in der Datenbank danach und gibt unterhalb des Standardtextes in Auftrag > Sonstiges und bei Dir dann auch im Auftrag selbst aus, welche Angebotsnummer er aus dem Standardtext isoliert hat und und OB er unter diese Nummer auch ein Angebot in der Datenbank gefunden hat. Zusätzlich gibt er dann dahinter auch noch den Text aus, den er in der Datenbank für das Angebot gefunden hat.
SQL:
{{% capture query -%}\
    SELECT LTRIM(RTRIM(cText)) FROM tBestellHinweis\
    INNER JOIN tBestellung ON tBestellHinweis.kBestellHinweis=tBestellung.kBestellHinweis\
    WHERE tBestellung.cBestellNr='{{ Vorgang.Stammdaten.Auftragsnummer }}'\
{% endcapture -%}
{% assign Auftrag_Anmerkung = query | DirectQueryScalar -%}
{% if Auftrag_Anmerkung != null -%}
#{{ Auftrag_Anmerkung -}}#
{% endif -%}
{% capture query -%}\
    DECLARE @AngebotsNummer VARCHAR(Max)\
    SET @AngebotsNummer=\
    (SELECT SUBSTRING(cText,1, CASE WHEN CHARINDEX(CHAR(13),cText)>0 THEN CHARINDEX(CHAR(13),cText)-1 ELSE CASE WHEN CHARINDEX(CHAR(10),cText)>0 THEN CHARINDEX(CHAR(10),cText)-1 ELSE LEN(cText) END END)  FROM tBestellHinweis\
        INNER JOIN tBestellung ON tBestellHinweis.kBestellHinweis=tBestellung.kBestellHinweis\
        WHERE tBestellung.cBestellNr='{{ Vorgang.Stammdaten.Auftragsnummer }}')\
    SELECT 'Angebot #' + LTRIM(RTRIM(REVERSE(SUBSTRING(REVERSE(LTRIM(RTRIM(@AngebotsNummer))),1,CHARINDEX(' ',@AngebotsNummer)+1))))+\
        ISNULL((SELECT '# wurde gefunden, Text: |' FROM tBestellung WHERE cBestellNr = LTRIM(RTRIM(REVERSE(SUBSTRING(REVERSE(LTRIM(RTRIM(@AngebotsNummer))),1,CHARINDEX(' ',@AngebotsNummer)+1))))),'# wurde nicht gefunden.')+\
        ISNULL((SELECT cText FROM tBestellHinweis JOIN tBestellung ON tBestellHinweis.kBestellHinweis=tBestellung.kBestellHinweis\
            WHERE tBestellung.cBestellNr=LTRIM(RTRIM(REVERSE(SUBSTRING(REVERSE(LTRIM(RTRIM(@AngebotsNummer))),1,CHARINDEX(' ',@AngebotsNummer)+1))))),'')+\
        ISNULL((SELECT '|' FROM tBestellung WHERE cBestellNr = LTRIM(RTRIM(REVERSE(SUBSTRING(REVERSE(LTRIM(RTRIM(@AngebotsNummer))),1,CHARINDEX(' ',@AngebotsNummer)+1))))),'')\
{% endcapture -%}
{% assign Angebot_Anmerkung = query | DirectQueryScalar -%}
{% if Angebot_Anmerkung != null -%}
@{{ Angebot_Anmerkung -}}@
{% endif -%}}
Achtung: Ich habe noch allerlei Abgrenzungszeichen um die eigentlichen Texte herumgestellt, damit man exakt sehen kann, wo welcher Text beginnt und endet. Um den Text des Standardtextes stehen ##, um die gesamte weitere Ausgabe herum stehen @@ und um die Angebotsnummer selbst stehen §§ Zeichen. Falls das Angebot gefunden wurde, wird ja nach dem Text aus Sonstiges gesucht und der wird dann mit ||, also je einem senkrechten Strich rechts und links umrahmt und zwei Solo-Strich bedeuten dann natürlich, dass zwar das Angebot, aber kein Text gefunden wurde. - All diese Abgrenzungszeichen musst du Dir natürlich "wegdenken", aber zum Debuggen sind die wichtig.

P.S. Falls ein "SQL Kundiger" beim Anblick des obigen Spaghetti-Codes das K***** kriegt, das kann ich verstehen, hier geht es aber schon lange nicht mehr um Schönheit, sondern um "Effekt". Also bitte Nachsicht walten lassen ... ;)

Gruß,
Ingmar
 
Zuletzt bearbeitet:

gutberle

Sehr aktives Mitglied
29. März 2011
1.268
324
Hi,

nach einer Runde "Besinnung" habe ich mich dazu entschieden, das Konstrukt von oben aufzugeben, da es zwar "sicher" war, weil es keine Annahmen machte, außer dass die Angebotsnummer das letzte Wort in der ersten Zeile sein muss, aber dadurch und durch die "beschränkten" Befehle in SQL einfach viel zu komplex für die ja eigentlich klitzekleine Aufgabe geworden war.

Der Code hier drunter macht das anders und nimmt explizit an, dass die Angebotsnummer all das ist, was in der ersten Zeile hinter "Erstellt aus Angebot " bis zum Ende der Zeile kommt. Dabei müssen dann nur noch eventuell auftretende Zeilenendezeichen, also "Returns" berücksichtigt werden und das ist einfach. - Ändert JTL aber irgendwann einmal den "Erstellt ..." Text, läuft dieser Code natürlich ins Leere.
SQL:
{% capture query -%}
    SELECT LTRIM(RTRIM(SUBSTRING(cText,1, CASE WHEN CHARINDEX(CHAR(13),cText)>0 THEN CHARINDEX(CHAR(13),cText)-1 ELSE
        CASE WHEN CHARINDEX(CHAR(10),cText)>0 THEN CHARINDEX(CHAR(10),cText)-1 ELSE LEN(cText) END END))) FROM tBestellHinweis
    INNER JOIN tBestellung ON tBestellHinweis.kBestellHinweis=tBestellung.kBestellHinweis
    WHERE tBestellung.cBestellNr='{{ Vorgang.Stammdaten.Auftragsnummer }}'
{% endcapture -%}
{% assign Auftrag_Anmerkung = query | DirectQueryScalar -%}
{% capture query -%}
    DECLARE @AngebotsNummer VARCHAR(Max)
    SET @AngebotsNummer=
    (SELECT LTRIM(RTRIM(SUBSTRING(cText,LEN('Erstellt aus Angebot ')+2, CASE WHEN CHARINDEX(CHAR(13),cText)>0 THEN CHARINDEX(CHAR(13),cText)-22 ELSE
    CASE WHEN CHARINDEX(CHAR(10),cText)>0 THEN CHARINDEX(CHAR(10),cText)-22 ELSE LEN(cText)-21 END END))) FROM tBestellHinweis
        INNER JOIN tBestellung ON tBestellHinweis.kBestellHinweis=tBestellung.kBestellHinweis
        WHERE tBestellung.cBestellNr='{{ Vorgang.Stammdaten.Auftragsnummer }}')
    SELECT cText FROM tBestellHinweis
        INNER JOIN tBestellung ON tBestellHinweis.kBestellHinweis=tBestellung.kBestellHinweis
        WHERE tBestellung.cBestellNr=@AngebotsNummer
{% endcapture -%}
{% assign Angebot_Anmerkung = query | DirectQueryScalar -%}
{% if Auftrag_Anmerkung != null -%}
{% if Angebot_Anmerkung != null -%}
{{ Auftrag_Anmerkung }}
{{ Angebot_Anmerkung -}}
{% else -%}
{{ Auftrag_Anmerkung -}}
{% endif -%}
{% endif -%}
Und falls man z.B. zur besseren Verdeutlichung, welcher Text von wo kommt, eine extra Leerzeile zwischen Auftrag>Sonstiges und Angebot>Sonstiges haben möchte, dann fügt man die einfach so ...
SQL:
{{ Auftrag_Anmerkung }}

{{ Angebot_Anmerkung -}}
... zwischen den beiden Ausgabezeilen weiter unten im Code ein. Die Leerzeile wird durch das geschachtelte {% if %} {% endif %} Konstrukt auch nur dann eingefügt, wenn auch wirklich sowohl ein Text in Auftrag>Sonstige und in Angebot>Sonstiges steht.

P.S. Vielen Dank an Tobias für's Gegentesten, das war sehr hilfreich!

Gruß,
Ingmar
 
  • Gefällt mir
Reaktionen: Arkin
Habe mir den gesamten Thread durchgelesen und untersten Code verwendet. Allerdings steht dann "Erstellt aus Angebot 1223456" im Feld Sonstiges sowie auch unter Anmerkung.
Habe nun den zweiten Code aus dem Thread verwendet, damit scheint es so zu klappen wie ich mir das ungefähr gewünscht habe.

@gutberle Hast du eventuell auch eine Lösung, um die Externe Auftragsnummer bei der Umwandlung von Angebot zu Auftrag mitzunehmen?
 

Über uns

  • In unserem moderierten JTL-Forum könnt Ihr Euch themenbezogen mit der JTL-Community rund um die Produkte von JTL, passende Erweiterungen und den E-Commerce im Allgemeinen austauschen, Tipps und Tricks teilen sowie Verbesserungswünsche und Fehler diskutieren.

    Unsere Forumsnutzer helfen sich untereinander auch gerne weiter, wenn Sie mal nicht weiterkommen oder einen Ratschlag benötigen.

Schnell-Navigation

Benutzer Menü