Automatically generated numbers
If going down the view approach which would limit disk IO, be more normalized and MAY perform better(depending on the use of the value), it would look something like this;

CREATE VIEW [newviewname] 
AS
    SELECT CAST(RIGHT(Year,2) AS VARCHAR(2)) + Office + ROW_NUMBER() OVER (PARTITION_BY Year, Office ORDER BY Record))
    FROM [your table]


Also, you may want to wrap the concatenated values with ISNULL() if any of those values might actually return NULL.  A NULL value concatenated with anything else will always return NULL.  

A trigger will actually be written very similarly except would need to be updated each time a value in the table is updated.  Unless there's some performance or data structure related need, I would avoid the trigger approach. 
Either way for a "correct" answer we would need to know your objectives. How do you intend to use the generated value.
BTW, this answer assumes you are using MS SQL.