The Raiser's Edge does track gift history fields based on the adjustment ID.  Primarily, the dbo.GiftHistoryFields table is joined to the dbo.GiftAdjustment table using the AdjustmentId versus the overall gift ID in order to have a view into the changes the adjustment made.

The below sample illustrates the joins necessary to return historic gift subtype information:
        gift.ID AS 'GIFT.ID', 
        tecurrent.LONGDESCRIPTION AS 'Current GiftSubType', 
        adj.ID AS 'ADJ GIFT.ID', 
        tebefore.LONGDESCRIPTION AS 'Before ADJ GiftSubtype', 
        teafter.LONGDESCRIPTION AS 'After ADJ GiftSubType' 
FROM dbo.GiftAdjustment ga 
        INNER JOIN dbo.GIFT gift ON gift.ID = ga.GiftId 
        INNER JOIN dbo.GIFT adj ON adj.ID = ga.AdjustmentId 
        INNER JOIN dbo.GiftHistoryFields ghf ON ghf.ID = ga.AdjustmentId 
        INNER JOIN dbo.TABLEENTRIES tecurrent ON tecurrent.TABLEENTRIESID = gift.GiftSubType 
        INNER JOIN dbo.TABLEENTRIES tebefore ON tebefore.TABLEENTRIESID = ghf.GiftSubType 
        INNER JOIN dbo.TABLEENTRIES teafter ON teafter.TABLEENTRIESID = adj.GiftSubType 
WHERE gift.ID = 2038 --replace with gift id

Disclaimer: We provide programming examples for illustration only, without warranty either expressed or implied, including, but not limited to, the implied warranties of merchantability and/or fitness for a particular purpose. This article assumes you are familiar with Structured Query Language and the tools used to create and modify SQL statements and Crystal Reports. Our Customer Support may help explain the functionality of a particular procedure, but we will not modify, or assist you with modifying, these examples to provide additional functionality.