---
title: "A: Anatomy of a Script Event"
description: "OnInform and the Trestle Repository. The following e.Info strings that are available for an onInform(sender, e) event: // /* namespace Trestle.Data { /// <summary> /// Convenience enum to call the Ra…"
url: "https://support.wheelhousemfg.com/article/bi9en7mc3n-a-anatomy-of-a-script-event"
category: "Appendix A: Trestle®/Dino Script® Integration"
updated_at: "2020-06-24T19:40:04Z"
---

# A: Anatomy of a Script Event

### OnInform and the Trestle Repository

The following [e.Info](http://e.info/) strings that are available for an onInform(sender, e) event:

```
//
/*
namespace Trestle.Data
{
	/// <summary>
	/// Convenience enum to call the RaiseInform() method of IHandleInfo
	/// implementers. NEVER change these names, because IHandleInfo expects
	/// a string value, so event handlers will convert this value to a
	/// string before deciding on a course of action.
	/// </summary>

	public enum RepositoryOperation
	{
		/// <summary>
		/// The item was created by the repository using the standard
		/// <see cref="IRepository.Create(StringKey)"/> method.
		/// </summary>
                CreatedNew,		

                /// <summary>
		/// The item was created by the repository using either the
		/// standard <see cref="IRepository.Create(StringKey)"/> method
		/// or <see cref="IRepository.CreateFrom(string)"/> method.
		/// </summary>
		Created,		

                /// <summary>
		/// The item was created by the repository using the non-
		/// standard <see cref="IRepository.CreateFrom(string)"/>
                //  method.
		/// </summary>
		CreatedFrom,		

                /// <summary>
		/// Raised when ownership keys are navigated to a child record.
		/// </summary>
		KeysNavigated,

                /// <summary>
		/// The item will be edited in some way.
		/// </summary>
		Editing,

		/// <summary>
		/// The item will possibly be saved to the data store.
		/// </summary>
		Saving,

		/// <summary>
		/// The record will possibly be saved, and has been validated.
		/// This is the last operation before the record is enlisted in
		/// a transaction. NOTE: No side-effects from the repository
		/// are allowed after this. If the record was not going to be
		/// saved, but a change here makes it so that it will be, it is
		/// the responsibility of the implementer to also set things
		/// like modification date, etc.
		/// </summary>
		Validated,

		/// <summary>
		/// The item was permanently saved to the data store for the
		/// first time.
		/// </summary>
		SavedNew,

		/// <summary>
		/// The item was permanently saved to the data store. Note that
		/// this is always raised, whether the item was new or not.
		/// </summary>
		Saved,

		/// <summary>
		/// The existing item was permanently saved to the data store.
		/// </summary>
		SavedExisting,

		/// <summary>
		/// The item will be deleted from the data store.
		/// </summary>
		Deleting,

		/// <summary>
		/// The item was permanently deleted from the data store.
		/// </summary>
		Deleted,

		/// <summary>
		/// An unknown or invalid operation.
		/// </summary>
		Invalid
	}
}

*/

// This example is for: OpenSale to intercept and change the SaleNumber.
def onInform(sender, e) {
    // this could almost be onRepositoryOperation(...)
    if e.Info == 'Created' {
        sender.SaleNumber = sender.SaleNumber.Replace('S-01-', 'S');
    }
}
```

### Avoid OnPropertyChanged

Properties are accessible on the sender but this method is not recommended. Use OnDataChanged instead.

```
// This function checks for a due date change and adds to the notes
// field if it has.


// IMPORTS

from System import Environment, DateTime;

// HELPER FUNCTION

//Truncate DateTime to Day
def TruncToDay(dt)
{
    return DateTime(dt.Year, dt.Month, dt.Day);
}

// PRIMARY FUNCTIONS

def onInform(sender, e) {
    if e.Info == 'Saving' {
        var trk = sender.GetTracker();
        if not trk.IsNew {
            if trk.ChangedProperties.ContainsKey('DateDue') {
                var oldValue = trk.ChangedProperties['DateDue'];
                if oldValue {
                    var newValue = sender.DateDue;
                    
                    // verify date (ie. month/day/year) has actually
                    // changed and then add a note to the note field
                    if TruncToDay(newValue) != TruncToDay(oldValue){
                        var notes = sender.Notes ?? '';
                        notes += string.Format("On {0:yyyy-MM-dd}, the due date
                             was changed from {1:yyyy-MM-dd} to {2:yyyy-MM-dd}
                             by {3}{4}", DateTime.Today, oldValue, newValue,
                             host.user().Identity.Name, Environment.NewLine);
                        sender.Notes = notes;
                    }
                }
            }
        }
    }
}
```

### How to Use OnDataChanged

We'll be expanding the documentation in this section soon. Please contact us if you have questions.

### Raising a Custom Inform Event on Another Object

We'll be expanding the documentation in this section soon. Please contact us if you have questions.
