Lade...
 

CX_RATE_TABLE::UnitCrossConvert

CX_RATE_TABLE::UnitCrossConvert

Beschreibung:

Diese Funktion konvertiert ähnlich der Funktion UnitConvert

eine Einheit in eine andere. Dabei wird zunächst versucht, die Ausgangs- direkt in die Zieleinheit zu konvertieren. Ist dieses nicht möglich, so wird überprüft, ob die Ausgangseinheit über andere enthaltene Einheiten-Verhältnisse (indirekt) in die Zieleinheit konvertiert werden kann. Eine Einheiten-Tabelle könnte z.B. folgendermaßen aussehen:

Ausgangseinheit Zieleinheit Umrechnungsart (conversionRuleEnum) 
2 Dosen 1 Beutel In beide Richtungen, mit Rest
5 Dosen 1 Karton In beide Richtungen, mit Rest
3 Karton 1 Kiste In beide Richtungen, mit Rest
1 Platte 2,4 m² In beide Richtungen, mit Rest
5 kg/m² - In beide Richtungen, ohne Rest

Bei einer Konvertierung von "Dosen" in "Kisten" würde

zunächst ein entsprechender Eintrag in der Tabelle gesucht werden. Da dieser nicht vorhanden ist, wird daraufhin ein indirekter Weg gesucht. "Sackgassen", wie der erste Eintrag der Tabelle eine darstellt, werden dabei erkannt und außer acht gelassen. In diesem Fall würde also die Anzahl an "Dosen" über den Umweg "Kartons" nach "Kisten" konvertiert werden. Im Zusammenhang mit der Umrechnung von Einheiten existieren noch die sogenannten Faktoren, die an sich keinen Umrechnungskurs darstellen. In der Tabelle ist als Beispiel "5 kg/m²" angegeben. Dieser Eintrag erlaubt also keine Umrechnung von Kilogramm in Quadratmeter, sondern bekommt nur in Zusammenhang mit dieser Funktion eine Bedeutung. So kann beispielsweise eine Umrechnung von "5 Platten" in kg erfolgen. D.h. mit Faktoren können typischerweise Wichte- und Dichte-Angaben abgebildet werden.

Der Rückgabewert dieser Funktion ist ein Vektor von Resten, die während der

Konvertierung entstanden sind. Werden für die oben aufgeführte Beispieltabelle z.B. "26 Dosen" in "Kisten" umgerechnet, so erhält man nach der ersten Umrechnung "5 Kartons und 1 Dose" und nach der zweiten "1 Kiste, 2 Kartons und 1 Dose", d.h. der Rest beträgt "2 Kartons und 1 Dose". Um die Rückgabewerte auf die kleinste enthaltene Einheit runterzubrechen steht die Funktion ConvertIntoSmallestUnit

zur Verfügung.

Code-Beispiel:

In dem Beispiel-Programm wird versucht, eine Konvertierung von "5

Dosen" in Beutel durchzuführen, wobei angenommen wird, das ein Einheiten-Verhältnis von "3 Dosen = 1 Sack" definiert wurde. 

Var(unitTable, fromValue, toValue, converted) 

... // Definition der Einheiten-Verhältnisse, die in unitTable gespeichert

werden 

CreateTransObject(CX_VALUE) -> fromValue 
"5 Dosen" fromValue Put
CreateTransObject(CX_VALUE) -> toValue 
"0 Beutel" toValue Put
CreateTransObject(CX_BOOLEAN) -> converted 

fromValue toValue converted unitTable Call(UnitCrossConvert) 

In diesem Beispiel ist eine Konvertierung von Dosen in Beutel nicht möglich,

allerdings eine von Dosen in Säcke. In dem Wahrheitswert converted wird FALSE zurückgeliefert, da eine Konvertierung nicht möglich war. 

Stack
Stack Position Objekttyp Kurzbeschreibung
Stack(In) Top CX_RATE_TABLE die Tabelle der Einheiten-Verhältnisse
Top-1 CX_BOOLEAN der Wahrheitswert, der anzeigt, ob die Konvertierung in die Zieleinheit erfolgreich war
Top-2 CX_VALUE die Zieleinheit; nach Konvertierung ist der Nummernanteil des Wertes neu gesetzt, ansonsten bleibt er unverändert
Top-3 CX_VALUE die Ausgangseinheit
Stack(Out) Top VECTOR die Liste der bei der Konvertierung übrig bleibenden Reste
Funktionsaufruf: Call(UnitCrossConvert)