Now that I've looked into this more, I have to say this is more than a pet peeve to me. I would consider it a design flaw as noted below.
Variants let you modify the price and cost of goods. But in the Order Items table, it only updates the price field. Cogs is left at the main product value. This is bad because:
1. It's Inconsistent. We have product.price and product.cogs and variant.price modify and variant.cogs. Adding these "mathematically", we should get orderitem.price = product.price + variant.price and orderitem.cogs = product.cogs + variant.cogs.
But AC says product.cogs + variant.cogs = product.cogs.
2. So let's say you decide to parse the optionlist values and look up the cost of goods for the selected choices. What happens when there's a price increase?
Your orders' cost of goods amounts are now wrong! Isn't that why the order tables store all details of an order - so it is preserved against future changes.
3. This last issue is bad if you are a drop shipper and email orders to your vendors. Let's say you include the wholesale price (cogs) in the email. And say you have to resend the last order to a vendor but you just updated all your cost of goods for their annual price increase. Now your email has the wrong wholesale price (but the retail price hasn't changed).
I can solve this by adding a new table (orderitemchoices?) which is inserted, updated or deleted based on a trigger from ac_orderitems. I'll parse the optionlist and populate the costofgoods for the selected choices. Because the underlying AC code uses @@IDENTITY instead of Scope_Identiry(), I can't use an identity column but will have to roll my own. I shouldn't have to.
Is there a better way to solve this problem? I'm sure someone will tell me to use kits. Perhaps AC should remove the COGS field from the Manage Variants screen if it's not really implemented.