No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
Derived attributes use | === What is this? === | ||
* Derived attributes use an OCL expression to calculate the presentation of another attribute. | |||
* Derived '''settable''' attributes use EAL to do the reverse, i.e. setting the source attribute from the entered value. | |||
This opens up special handling of user input and "user shortcuts" in the UI. For example accepting only a number as a time entry. | This opens up special handling of user input and "user shortcuts" in the UI. For example accepting only a number as a time entry. | ||
Revision as of 13:01, 26 November 2017
What is this?
- Derived attributes use an OCL expression to calculate the presentation of another attribute.
- Derived settable attributes use EAL to do the reverse, i.e. setting the source attribute from the entered value.
This opens up special handling of user input and "user shortcuts" in the UI. For example accepting only a number as a time entry.
Example with Time (DateTime) and Decimal
This example uses FromTimeText, HoursText and ToTimeText for user input, but only FromTime and Hours for storing information in the database.
/Date is a derived attribute for easy access to a neighboring class' containing the date in DateTime format.
/EffectiveToTime is a derived attribute used a companion to the FromTime, again for symmetry in access the information.
Support function StringToTime()
To help the other function with conversion, a help function like this was created
if aText.length <= 2 then DateTime.Parse('1900-01-01 ' + aText + ':00') else DateTime.Parse('1900-01-01 ' + aText) endif
Note the addition of :00 to the text if it is short, this help the user out if entering just the hour part.
'1900-01-01' is an ugly hack to prevent storing the current date as part of the time entry. It would work anyhow, but this is slightly better.
Property inspector
Below is the property inspector setting for an derived settable attribute. Note the AttributeMode and then the Ocl and OclSet code.
/FromTimeText: String?
OCL
if self.FromTime.notNull then self.FromTime.formatDateTime('HH:mm') else String.nullValue endif
EAL (OclSet)
self.FromTime := self.StringToTime(vInputParameter)
/HoursText: String?
OCL
In Sweden we use comma, not the dot as a decimal separator. Hard coded replacement.
self.Hours.ToString('N2').Replace('.', ',')
EAL (OclSet)
Enable use of both comma and dot as decimal separator. Round to 2 decimals to avoid fractions from the web browser double type. (JavaScript don't have Decimals, only Float)
self.Hours := Decimal.Parse(vInputParameter.Replace(',', '.')).Round(2)
/ToTimeText: String?
The to-time is all calculated and only exist when showing and entering values.
OCL
if self.FromTime.notNull then self.FromTime.AddHours(self.Hours.Value.ToDouble).formatDateTime('HH:mm') else String.nullValue endif
EAL (OclSet)
Handle both setting Hours or FromTime based on what information is already present.
if self.FromTime.notNull then self.Hours := Decimal.Create(self.StringToTime(vInputParameter).Subtract(self.FromTime).TotalHours) else self.FromTime := self.StringToTime(vInputParameter).AddHours(-self.Hours.ToDouble); 0 endif