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 | 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 |