I'd like to know exactly how you have set up your value list if you are getting a list of zip codes in the city field. That seems like a needlessly complex way to set up a conditional value list given that there are simpler alternatives.
The fact that a list of values deploy and the user can select an value before the OnObjectEnter trigger performs its script is a known limitation of this script trigger. You may need to try this approach:
Put a field in front of the drop down list field--it can even be a copy of the same field. Remove the drop down list field from the tab order and replace it with this field placed in front of it. Remove the "arrow" option if you have specified it. Now set up your script trigger on this new field object to set your global field, then use go to field or go to object to put the focus in the field with the drop down list format to deploy it.
Thanks for responding to me again, your workaround sounds smoother than mine.
The reason I am basing the value lists on a global value is it allows the single relationship on the bottom of the attached screenshot to do all the work of the top four. This also means I have one value list, rather than four.
It seems that reducing table occurrences and overall schema should be a good thing, however perhaps there isn't any benefit to what I'm doing given that it requires an added script step every time you change fields.
Do you really need any table occurrences at all for your value list?
If the only match field needed is the one that identifies whether the data is for a zipcode or a city name, then you don't need any relationships to support your value list function--if you define a different value list for each field. The only way a relationship would be used for your value list function is if you specify an additional value list for filtering the values--such as seeing a list of all zipcodes for a selected city.
And if you mean that you need to reference or lookup data in the value list based table on your layout, then a much simpler data model can be setup that reduces the number of table occurrences and there are also ways to use ExecuteSQL to access the related data that reduce the number of table occurrences needed.