Here's a good way to handle this, Karen, which will work. If we pretend that you have four values coming in, instead of 28, it will make it easier to describe. Here are the values I'm using in my example and what I want to filter them to:
9010 ==> 100
890 ==> 101
9201 ==> 102
391 ==> 103
This can be done with nested POS() and TBL() functions. It's a little messy looking but it works. First, assume that the original column value is stored in TEMP001$ and it is a maximum of 4 characters. Create a calculated field and put this in the calculation text:
TBL(MAX((POS(PAD(TEMP001$,4)+""|""=""bad |9010|890 |9201|391 |"")-1)/5,0),""BAD!"",""100"",""101"",""102"",""103"")
As I said, it's messy looking. The PAD() simply insures that the string we've got is padded to four characters. I added a pipe ""|"" after it to make sure we have a unique pattern to match.
The POS() function looks for where the match string (TEMP001$ plus pipe) occurs in the longer string that follows it and it returns that position. So it TEMP001$ contains ""391"", the POS() function will return 21, because that's the number of characters over that ""391 |"" occurs in the string.
We take that number and subtract one because we need to arrive an index that starts at 0 and increments by 1. Since each possible match value in our long string is exactly five characters long (very important) we divide by 5. So the position of 21 becomes (21-1)/5 or 4.
The reason I put the MAX() function there is in case TEMP001$ contains something that does match anything in the possible values. In that case the POS will return 0 and we'll subtract one and divide by 5 and end up with a negative fraction which will cause an error. The MAX will make it come out to zero, instead.
The list of arguments immediately after the MAX() are the converted values, in the exact same order that the original values show up in the search string. for my example, ""391"" would return ""103"".