It seems to me that what you want is to keep the historical account data, rather than lose it when it no longer fits the current budget codes. Keeping historical data unchanged when the business rules change is a fairly common problem, and there are a number of possible solutions:
1. You can logically delete budget codes, rather than physically delete them. You do this by setting a yes/no flag in the Budget Codes table that indicates the code is no longer valid for new accounts. One advantage of this method is that, if you use the Budget Codes table as the Row Source for a list or combo box, you can make a slight modification to the Row Source query so that only currently valid codes are listed when adding transactions, yet the "deleted" codes are still present for historical ones. One disadvantage is that you can't easily reuse a logically deleted code without changing the meaning of your historical data, especially if the Budget Codes table has additional fields. But reusing deleted codes is unwise anyway, because of the risk of confusion.
2. You can move historical data to a parallel table that does NOT have a relationship to the Budget Codes table, or only has a non-RI relationship. Typically, when this is done, you want to denormalize the historical records by replacing foreign keys with the columns from the table they refer to. If you do this, you don't need the relationships any more. This protects you from damage to the historical data caused by changes in the active tables. It also makes the historical data more efficient for searching and reporting, since it's all in one table and no joins are needed. Searching and reporting is what you keep historical data for, after all. Finally, if you have a lot of historical data, removing it from your active tables makes them more efficient, too. On the down side, the history table will tend to use up more disk space, since it typically contains a lot of redundant data.
(BTW, if you still need to see all your transactions--active and historical--together, it's not hard. You just have to create a UNION query that merges the history table with the query you were already using. It won't be updatable, but you shouldn't be trying to update the historical data anyway, and you can still use the original query to update the active data.)
3. You can turn off RI on the relationship, which allows "orphaned" account records (child table has no related row in parent table). This is easy to do, but generally it means you'll have to do extra coding to maintain data integrity where you need it, and it can make your queries a lot more complex because of the need to use outer joins when data may be missing from one table of the join. There's also the risk that people who have direct access to tables or queries in the Database Window might be able to damage your current (non-historical) data, when RI is not in effect.
Rick Sprague