Tabellen in Envision erstellen

Tabellen in Envision erstellen












Startseite » Ressourcen » Hier

Während man in Envision am häufigsten Tabellen erstellt, indem man Tabelle aus Flatfiles liest, bietet Envision auch die Möglichkeit, Tabellen selber zu erstellen. Genauer gesagt, können diese erstellten Tabellen im Skript definiert und instanziiert werden. Die Erstellung von Tabellen kann besonders nützlich sein, wenn keine der Eingabetabellen die gewünschten Eigenschaften für eine bestimmte Berechnung enthält.


Syntax Überblick

Die gewöhnliche Syntax zur Erstellung einer Tabelle beruht auf den table- und extend-Anweisungen, die über folgende Syntax dargestellt werden:
table T = extend.range(Orders.42)
Hier sollte das Schlüsselwort table nicht mit dem Elementtyp verwechselt werden, wie etwa bei show table. Tabelle T kann dann im Skript wie jede andere gewöhnliche Tabelle, die aus einer Datei geladen wurde, verwendet werden.
show table "Number of lines" with sum(T.1)

extend.range()

Die einfachste Art eine Tabelle zu erstellen, ist über die extend.range() Bereichserweiterung: für jede Zeile der ursprünglichen Tabelle, werden N Zeilen erstellt und nummeriert. Die Bereichserweiterung kann nützlich sein, wenn man einer Tabelle neue Zeilen hinzufügen will.

Die Syntax lautet wie folgt:
table T = extend.range(Orders.K)
T.Quantity = Orders.Quantity // implizite Projektion
show table "Line numbers" with T.N, T.Quantity
Das Argument muss ein Integer sein, der sich von einer Zeile der ursprünglichen Tabelle zur nächsten auch ändern kann. Hiermit haben Sie mehr Kontrolle über die Granularität der Anzahl der Zeilen, die einführt werden sollen.

Tabelle T ist als Erweiterung der Tabelle typisiert, die ursprünglich als Argument festgelegt wurde. Daher funktionieren Zuordnungen unter verschiedenen Tabellen, wie man in der zweiten Zeile oben sieht, weil jede Zeile T weiterhin jeder ursprünglichen Entsprechung in Orders zugeordnet wird. Das Feld T.N ist standardmäßig ausgefüllt und stellt jede gewünschte Zeilennummer dar. Dieses Feld beginnt bei 1 und wird um jeweils +1 erhöht.

Beachten Sie, dass die extend.range()-Funktion beliebig große Zeilenanzahl erstellen kann. Dabei ist die Erstellung einer sehr großen Tabelle mit hoher Wahrscheinlichkeit ziemlich langsam. Außerdem kann dies, je nach Bearbeitungsquote in Ihrem Lokad-Konto, fehlschlagen. In der Praxis kann extend.range(), wenn K größer als 10 über den Durchschnitt ist, unter Umständen nicht die richtige Lösung für Ihr Problem sein.

Folgendes Beispiel zeigt, wie genau Zeilen innerhalb von einer Tabelle dupliziert werden können, während der Inhalt der ursprünglichen Tabelle gewahrt wird.
read "/sample" all
expect Grid[*]

table G = extend.range(Grid.Min == 0 ? 2 : 1)
G.Min = Grid.Min // Affinität zwischen 'G' und 'Grid'
G.Max = Grid.Max
G.Probability = Grid.Probability
G.Probability = 0 where G.N == 2
show table "My Grid" with Id, G.Probability, G.Min, G.Max

extend.distrib()

Envision Verteilungen bieten leistungsfähiges Algebra, das Ihnen verworrene Wahrscheinlichkeitsberechnung durch Listen erspart. Doch in manchen Situationen reichen einfache Listen aus, oder sind sogar erwünscht. Die Verteilungserweiterung extend.distrib() macht aus einem Verteilungsvektor eine Tabelle, wie aus folgender Syntax hervorgeht.
table T = extend.distrib(D)
show table "Distribution details" with Id, T.Min, T.Max, T.Probability
Das Argument D muss ein Verteilungsvektor sein, wie er durch Lokads Prognose-Engine gewöhnlich erstellt wird. Tabelle T ist als Erweiterung der Ursprungstabelle typisiert, also der impliziten Items-Tabelle im Skript. Tabelle T verfügt über drei Felder:

  • T.Min: die inklusive ganzzahlige untere Grenze des Segments
  • T.Max: die inklusive ganzzahlige obere Grenze des Segments
  • T.Probability: die Summe der Verteilungen über den inklusiven Bereich

Trotz seines Namens, bezieht sich das Probability-Wahrscheinlichkeitsfeld auf die Summe der Verteilung über den Bucket-Bereich, die zurückgegeben wird.

Für relativ kompakte Verteilungen, besitzen Segmente die Länge 1 und somit T.Min == T.Max. Doch wenn die Verteilung über höhere Werte geht, würden Segmente gleich 1 möglicherweise Millionen Zeilen generieren, was unüberschaubar wäre. Daher generiert Envision bei solchen Verteilungen mit hohen Werten automatisch Verteilungen um längere Segmente. Darauf sind die Algorithmen abgestimmt, sodass die Länge der generierten Tabellen überschaubar bleibt.

Standardmäßig mustert extend.distrib() immer Null-Segmente aus. Daher erhält das [0;0] Segment immer eine eigene Zeile in der generierten Tabelle. Dieses Verhalten ist in der Tat in vielen Unternehmensfällen nützlich, bei denen Null Bedarf einen Grenzfall darstellt, wie etwa unendliche Bestandsdeckung, die einer bestimmten Logik bedarf.

Dann werden auch drei zusätzliche Überladung für extend.distrib() bereitgestellt, um mehr Kontrolle über die spezifische Granularität der erstellten Tabelle zu gewährleisten.

Lücke

Die erste Überladung soll dabei helfen, eine Einkaufs-Prioritätenliste zu erstellen, bei der der aktuelle Lagerbestand berücksichtigt wird. Die Syntax lautet wie folgt:
table T = extend.distrib(D, S)
Das erste Argument D ist wie oben definiert wird. Vom zweiten Argument S wird erwartet, dass es eine ganze Zahl ist. Wenn dieses zweite Argument vorhanden ist, enthält die erstellte Tabelle immer zwei Zeilen, die jeweils Segment [0;0] und [1;S] gewidmet sind. Die weiteren Segmente werden, wie oben beschrieben ab S+1 automatisch generiert. Der Standardwert, wenn dieses Argument nicht angegeben wird, ist Null.

In der Praxis wird das Argument S häufig als die Summe des bestehenden Bestands und des bestellten Bestands definiert. So sollte bei Nachbestellungen nur die Bedarfswahrscheinlichkeit, die über den derzeitigen Bestand liegt, berücksichtigt werden.

Multiplikator

Die zweite Überladung ist für Fälle gedacht, in denen Multiplikatoren für Losgrößen auftreten. In diesen Fällen sollte die Tabelle in Segmenten bestimmter Länge durchlaufen werden. Die relevante Syntax lautet:
table T = extend.distrib(D, S, M)
Die Argumente D und S wie oben definiert. Das dritte Argument M soll eine ganze Zahl sein. Es stellt die gewünschte Segmentlänge dar. Daher enthält die Tabelle die Liste der Segmente [0;0], [1;S], [S+1;S+M] [S+M+1;S+2M] … Ist M gleich null, legt die Funktion die Länge der Segmente automatisch fest.

In der Praxis könnte das Erzwingen von Segmenten mit Längen größer als 1 zu Leistungsproblemen führen, da die Größe der Tabelle dann beliebig lang werden kann. Daher kann Envision stattdessen auf ein Vielfaches von M ausweichen. Die Nutzung von Vielfachen gewährleistet, dass die Logik von Multiplikatoren von Losgrößen weiterfunktioniert, während eine überschaubare Zahlenbegrenzung von zu erstellenden Zeilen erreicht wird.

Als Faustregel empfehlen wir, diese Überladung nur zu benutzen, wenn Multiplikatoren von Losgrößen im Spiel sind. Wenn dies der Fall ist, wird empfohlen, M für alle Artikel, die keine bestimmten Multiplikatoren für Losgrößen besitzen, auf null zu halten.

Reichweite

Die dritte Überladung ist für Fälle gedacht, in denen MOQs vorkommen. In solchen Fällen sollte die Tabelle lang genug iteriert werden, um bestimmte erwünschte Werte zu erreichen. Die relevante Syntax lautet, wie folgt:
table T = extend.distrib(D, S, M, R)
Die Argumente D, S und M sind wie oben definiert. Es wird erwartet, dass das vierte Argument R eine nicht negative ganze Zahl ist. Diese stellt den max Höchstwert dar, der über das Raster erreicht werden soll. Also ist in einer bestimmten Zeile T.Max größer oder gleich R. Der Standardwert für dieses Argument ist Null, wenn es nicht angegeben wird.

In der Praxis wird dieses Argument benutzt, um große Bedingungen bei Mindestbestellmengen (MOQs) zu berücksichtigen, die nur über die iterierte Tabelle, die generiert wurden, erreicht wird, sodass jedes die MOQ-Werte deckt.

Als Faustregel empfehlen wir, diese Überladung nicht zu nutzen, es sei denn, es müssen bestimmte MOQs berücksichtigt werde. Und sollte dies der Fall sein, ist es sinnvoll, R so niedrig wie möglich zu halten. Ein niedriger R-Wert verhindert nicht, dass Tabelle T höhere Werte erreicht. Es versichert nur, dass größere Werte erreicht werden.

extend.billOfMaterials()

Die Stückliste dient Fällen, in denen das Interesse nicht an den verkauften oder gelieferten Artikeln liegt, sondern an deren Teilen oder Zusammensetzung. In solchen Fällen, ist es erwünscht, die Bestandshistorie aus der „Artikelebene“ in eine Bestandshistorie auf „Teilebene“ zu verwandeln. Diese Umstellung wird durch die Stückliste kontrolliert, in der die Zusammensetzung aller Artikel festgelegt wird.

Die Aufruffunktion extend.billOfMaterials() ist genau für solche Fälle gedacht:
table T = extend.billOfMaterials(
  Item: J.Id
  Part: B.PartId
  Quantity: B.Quantity
  DemandId: O.OrderId
  DemandValue: O.Quantity)

T.DemandDate by T.DemandId = same(O.Date) by O.OrderId // veranschaulicht, wie man das Datum erhält

show table "Details" with Id, T.DemandDate, T.Quantity
Es wird erwartet, drei Tabellen zu erhalten - J, B und O. Tabelle J ist gewöhnlich die Artikeltabelle, doch dies ist nicht zwingend erforderlich. Tabelle B soll die Stücklistetabelle sein, wobei erwartet wird, dass diese eine Erweiterung von Tabelle J ist, d.h. des Typs (Id, *), wenn J die Artikeltabelle sein sollte. Es wird erwartet, dass Tabelle O die Bedarfshistorie ist, die sich gewöhnlich auf die Bestelltabelle bezieht. Außerdem wird erwartet, dass Tabelle O eine Erweiterung von Tabelle J ist.

Die entstehende Tabelle ist eine Erweiterung von Tabelle J mit passenden Affinitäten. Tabelle T enthält zwei Felder, die bereits ausgefüllt sind:
  • T.DemandId, die einen Weg bieten soll, in Tabelle T die Ursprungszeile in O festzustellen.
  • T.Quantity, das durch die Stückliste entsteht.

Oft ist es nützlich, die Tabelle T mit einem Datum zu versehen. Dies können Sie mit einer left-by Anweisung vornehmen, wie Sie weiter oben in der Zeile unter dem Block billOfMaterials() erkennen können.

Die extend.billOfMaterials()-Funktion unterstützt rekursive Zusammensetzung, das heißt, dass ein Artikel sowohl als Teil, als auch als Paket in Tabelle B erscheinen kann. Diese Funktion schlägt natürlich fehl, wenn zyklische Abhängigkeiten in der Tabelle der Stückliste festgestellt werden.

Das Quantity-Argument stellt die Anzahl von Einheiten von B.PartId dar, die bei Verkauf oder Bereitstellung einer Baugruppe, die nach J.Id festgestellt wird, mit einbezogen werden.