The easiest way would be to use a Pop-up Menu rather than a Drop-down list.
Other than that, you could set validation to only allow data from the value list, although I personally prefer the pop-up since it doesnt produce failed validation dialog boxes.
Consider using OnObjectValidate explained here:
I prefer pop-up also but that does not guarantee protection ... Users can still paste bogus text or make multiple selections by holding shift. Auto-enter ( replace ) with RightValues( field;1 ) accepts only last value and validation tab ( as member of value list ) protects from pasted garbage. But triggers control the User experience, nicely explaining it to User. :-)
If you would indulge me another question. I understand how the OnObjectValidate works, but how would I determine if they selected a value from the values in the lookup table or entered a value that is not in the lookup table?
Well, on field-level validation tab is 'member of value list'. That is most important line of protection.
If you want to know if a value exists in a related child table for scripts or triggers script could test as:
not IsEmpty ( FilterValues ( your value ; List ( child::field ) ) )
Boolean true (1) means the value exists or you can compare to a value list instead, replacing List () with
ValueListItems ( Get ( FileName ) ; "value list name" )
Spell it exactly same as the value list itself ... if it is wrong FM does not warn you. :^)
An additional benefit of using value list (values from field) and all values is that value lists have very small footprint AND their values can be accessed from anywhere without a relationship. But I keep needing to remind myself also that with 12 ExecuteSQL() can easily give you list of values also. However the calculation test would be the same. :-)
Thank you for the incisive information. I will put it to good use. Merry Christmas.