Derived settable attributes
No edit summary
No edit summary
Line 4: Line 4:


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.
[[File:TimeSpent class example.png|left|thumb]]


=== 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.
This example uses ''FromTimeText'', ''HoursText'' and ''ToTimeText'' for user input, but only '''FromTime''' and '''Hours''' for storing information in the database.
[[File:TimeSpent class example.png|thumb|none]]


'''/Date''' is a derived attribute for easy access to a neighboring class' containing the date in DateTime format.  
'''/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.
'''/EffectiveToTime''' is a derived attribute used a companion to the FromTime, again for symmetry in access the information.
Line 16: Line 17:
To help the other function with conversion, a help function like this was created
To help the other function with conversion, a help function like this was created


  if  aText.length <= 2 then
  if aText.length <= 2 then
   DateTime.Parse('1900-01-01 ' + aText + ':00')
   DateTime.Parse('1900-01-01 ' + aText + ':00')
  else
  else
   DateTime.Parse('1900-01-01 ' + aText)
   DateTime.Parse('1900-01-01 ' + aText)
  endif
  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 =====
===== Property inspector =====
Line 45: Line 49:
  self.Hours.ToString('N2').Replace('.', ',')
  self.Hours.ToString('N2').Replace('.', ',')


EAL
EAL (OclSet)
 
Enable use of both comma and dot as decimal seperator. 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)
  self.Hours := Decimal.Parse(vInputParameter.Replace(',', '.')).Round(2)


'''/ToTimeText: String?'''
'''/ToTimeText: String?'''
The to-time is all calculated and only exist when showing and entering values.


OCL
OCL
Line 59: Line 67:
  endif
  endif


EAL
EAL (OclSet)


  if self.FromTime.notNull then
  if self.FromTime.notNull then

Revision as of 12:45, 26 November 2017

Derived attributes use and 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.

TimeSpent class example.png

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

DerivedSettable property inspector.png
/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

self.Hours.ToString('N2').Replace('.', ',')

EAL (OclSet)

Enable use of both comma and dot as decimal seperator. 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)

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
This page was edited 47 days ago on 03/26/2024. What links here