Hallo Steffen,
den Lagerbestand für einen Artikel kriegst Du ja leicht über die Werte bei "Vorgang > Artikel > Bestandsübersicht" raus, und den Wert dann in eine CSV Datei zu schreiben ist eher trivial, aber ich lese oben raus, dass Du dann, wenn
irgendein Artikel seinen Bestand geändert hat, eine Datei mit den Beständen
aller Artikel bekommen möchtest, ist das richtig?
Dazu braucht es dann schon eine SQL Abfrage und die wäre, wenn man hier auf sich allein gestellt wäre, eher ein "SQL Programm", weil das Zusammentragen der Bestandsinformationen aus der
Wawi Datenbank untrivial ist.
Netterweise hat JTL das aber schon für uns erledigt und einen SQL View geschrieben, der genau das macht. Alles, was man also machen muss, ist die Werte aus dem View einzusammeln, für CSV zu formatieren und rauszuschreiben. Hier ist die SQL Abfrage dafür, schon in
Workflow geeigneter Form ...
Code:
{% capture query -%}
SELECT kArtikel, fLagerbestand, fVerfuegbar, fReserviert, fVerfuegbarGesperrt, fZulauf, fZulaufVerfuegbar, fAufEinkaufsliste, fEigenerBestand, fVerfuegbarExtern, fInAuftraegen FROM vLagerbestandEx
{% endcapture -%}
{% assign ArtikelBestand = query | DirectQuery -%}
ArtNr;IntArtNr;LagerBestand;Verfuegbar;Reserviert;VerfuegbarGesperrt;Zulauf;ZulaufVerfuegbar;AufEinkaufsliste;EigenerBestand;VerfuegbarExtern;InAuftraegen
{% for item in ArtikelBestand.Daten -%}
{% capture query2 -%}SELECT cArtNr FROM tArtikel WHERE tArtikel.kArtikel={{ item.kArtikel }}{% endcapture -%}{% assign ArtNr = query2 | DirectQueryScalar %}{{ ArtNr }};{{ item.kArtikel }};{{ item.fLagerbestand | FormatNumber: 'N0', 'de-DE' }};{{ item.fVerfuegbar | FormatNumber: 'N0', 'de-DE' }};{{ item.fReserviert | FormatNumber: 'N0', 'de-DE' }};{{ item.fVerfuegbarGesperrt | FormatNumber: 'N0', 'de-DE' }};{{ item.fZulauf | FormatNumber: 'N0', 'de-DE' }};{{ item.fZulaufVerfuegbar | FormatNumber: 'N0', 'de-DE' }};{{ item.fAufEinkaufsliste | FormatNumber: 'N0', 'de-DE' }};{{ item.fEigenerBestand | FormatNumber: 'N0', 'de-DE' }};{{ item.fVerfuegbarExtern | FormatNumber: 'N0', 'de-DE' }};{{ item.fInAuftraegen | FormatNumber: 'N0', 'de-DE' }}
{% endfor -%}
Hier werden nicht nur Deine Zielvariablen "Artikelnummer" und "Verfügbarer Bestand" geholt, sondern gleich der ganze Schwung an Bestandsdaten, aber Weglassen ist ja immer leichter als Hinzufügen ...
Der dazu passende Workflow wäre dann entweder einer (1) im Bereich "Artikel - Manuell" oder aber jeweils einer (ergo 2) in den Bereichen "Warenlagereingang > Plusbuchung"
und "Warenlagerausgang > Minusbuchung" und der Workflow hätte jeweils KEINE Bedingung und als Aktion "Datei schreiben" und beim Inhalt natürlich die Abfrage von oben. Alle anderen Optionen sind nach Wunsch.
Und falls Du tatsächlich nur den Bestand
des einen Artikels haben willst, der gerade geändert wurde, dann sähe die Abfrage etwas anders aus, nämlich so ...
Code:
{% capture query -%}
SELECT kArtikel, fLagerbestand, fVerfuegbar, fReserviert, fVerfuegbarGesperrt, fZulauf, fZulaufVerfuegbar, fAufEinkaufsliste, fEigenerBestand, fVerfuegbarExtern, fInAuftraegen FROM vLagerbestandEx
WHERE kArtikel={{ Vorgang.Artikel.Allgemein.Stammdaten.InterneArtikelnummer }}
{% endcapture -%}
{% assign ArtikelBestand = query | DirectQuery -%}
ArtNr;IntArtNr;LagerBestand;Verfuegbar;Reserviert;VerfuegbarGesperrt;Zulauf;ZulaufVerfuegbar;AufEinkaufsliste;EigenerBestand;VerfuegbarExtern;InAuftraegen
{% for item in ArtikelBestand.Daten -%}
{{ Vorgang.Artikel.Allgemein.Stammdaten.ArtNrSku }};{{ item.kArtikel }};{{ item.fLagerbestand | FormatNumber: 'N0', 'de-DE' }};{{ item.fVerfuegbar | FormatNumber: 'N0', 'de-DE' }};{{ item.fReserviert | FormatNumber: 'N0', 'de-DE' }};{{ item.fVerfuegbarGesperrt | FormatNumber: 'N0', 'de-DE' }};{{ item.fZulauf | FormatNumber: 'N0', 'de-DE' }};{{ item.fZulaufVerfuegbar | FormatNumber: 'N0', 'de-DE' }};{{ item.fAufEinkaufsliste | FormatNumber: 'N0', 'de-DE' }};{{ item.fEigenerBestand | FormatNumber: 'N0', 'de-DE' }};{{ item.fVerfuegbarExtern | FormatNumber: 'N0', 'de-DE' }};{{ item.fInAuftraegen | FormatNumber: 'N0', 'de-DE' }}
{% endfor -%}
... und alles andere wäre ansonsten gleich.
ERNSTE WARNUNG:
Der obere, automatische Workflow über alle Artikel hat eine SQL Abfrage ohne WHERE Bedingung. Das ist hier zwar Sinn der Übung, eine Datenbank-Tabelle ohne Eingrenzung zu lesen/schreiben gilt aber als schlechter Stil und ist auch gefährlich, z.B. wenn Du nicht wie ich 537 Artikel hast, sondern 126234 Stück. - Wie "performant" das Ganze dann nämlich ist, ist echt fraglich und falls es wirklich Ziel sein sollte, das bei jeder Bestandsänderung irgendeines Artikels auszuführen, dann "gute Nacht Marie" ...
Ich würde deshalb dringend dafür plädieren, diese gefährliche(re) Workflow-Variante ausschließlich über einen manuellen Workflow auszulösen, also einen Artikel mit der Maus markieren, rechts unten unter Workflow diesen Workflow auswählen und schon hast Du den aktuellen Bestand aller Artikel auf der Platte.
Und falls ich Dich falsch verstanden habe und Du wolltest gar nichts anderes, dann mea culpa und um so besser ...
Gruß,
Ingmar