Indexer properties (or weakly-typed properties as they are sometimes referred to - I can see Cathy, our doc writer, cringing on the mention of this term which she passionately abhors) are present on almost all the common Orders classes in CS 2007 such as OrderGroup (which is the base type for Basket, PurchaseOrder and OrderTemplate classes), OrderForm, LineItem etc. One common operation that customers typically have done is to store certain values in an indexer property and store it to the database. This is still the case and all you need to do is save the OrderGroup class containing everything to the database to have this persisted.
E.g. (pseudo code):
myOrder.OrderForms[0].LineItems[0]["myCustomData"] = "Some biz data";myOrder.Save();
Now when myOrder is reload from the database the "myCustomData" property on the LineItem on which it was set, will still be present.
By default these properties are all saved to the marshalled_data column in their respective tables and this should suffice for most purposes. However if you wish to persist these indexer properties to an explicit column of their own, you can do this in 2 steps:
Now when you run your site code which populates these indexer properties, you should be able to see the indexer property values getting persisted into their own SQL columns. Not too hard is that?
And if you like that, wait till you try out the full fledged extensibility story in Commerce Server 2007 - it not only allows you to map all PurchaseOrder data to explicit columns but also allows you to inherit from all the Orders runtime class and extend it in order to define a much richer and fine-tuned-to-your-business Order system for use in your site code.