Smiley1
05-17-02, 01:17
| Well I got a solution but it does not look real pretty. It is also convoluted using 4 temporary tables. Can you see a more efficient way? Here is the code and many thanks for steering me in the correct direction 'Get all records Prior to them being changed MyDb.Execute _ ("SELECT CQ2.* INTO Temp " _ & "From CQ2 WHERE NOT Exists " _ & "(SELECT * FROM [Contractor Qualified] AS CQ WHERE " _ & "((CQ2.Area = CQ.Area) AND " _ & "(CQ2.[Trade Type] = CQ.[Trade Type]) AND " _ & "(CQ2.[Rate Above Par] = CQ.[Rate Above Par]) AND " _ & "(CQ2.[Contractor Id] = CQ.[Contractor Id])))") 'Create a table with all the records that have been added or changed MyDb.Execute _ ("SELECT [Contractor Qualified].* INTO Temp2 " _ & "From [Contractor Qualified] WHERE NOT Exists " _ & "(SELECT * FROM CQ2 WHERE " _ & "((CQ2.Area = [Contractor Qualified].Area) AND " _ & "(CQ2.[Trade Type] = [Contractor Qualified].[Trade Type]) AND " _ & "(CQ2.[Rate Above Par] = [Contractor Qualified].[Rate Above Par]) AND " _ & "(CQ2.[Contractor Id] = [Contractor Qualified].[Contractor Id])))") 'Compare 3 fields in temp against temp2 to find matching records that have been changed 'And add them to temp FROM Temp 3 MyDb.Execute _ ("SELECT Temp2.* INTO Temp3 " _ & "FROM Temp2 INNER JOIN Temp " _ & "ON Temp2.Area = Temp.Area AND " _ & "Temp2.[Trade Type] = Temp.[Trade Type] AND " _ & "Temp2.[Contractor Id] = Temp.[Contractor Id];") MyDb.Execute ("INSERT INTO Temp SELECT * FROM Temp3;") MyDb.Execute _ ("DELETE Temp2.* " _ & "FROM Temp2 INNER JOIN Temp " _ & "ON Temp2.Area = Temp.Area AND " _ & "Temp2.[Trade Type] = Temp.[Trade Type] AND " _ & "Temp2.[Contractor Id] = Temp.[Contractor Id];") 'That leaves changed records before and after in Temp and new records in Temp2 'Add the required fields. Name, Date etc to Temp MyDb.Execute "ALTER TABLE [Temp] ADD COLUMN [When Changed] DATETIME;" MyDb.Execute "ALTER TABLE [Temp] ADD COLUMN [By Whom] TEXT(25);" 'Copy records FROM Temp to Change Transaction Table MyDb.Execute ("INSERT INTO [CQ Changes] SELECT * FROM Temp;") 'Copy records FROM Temp2 to backup table MyDb.Execute ("INSERT INTO [CQ Backup] SELECT * FROM Temp2;") 'Clean up Temporary Tables MyDb.Execute ("DROP TABLE CQ2") MyDb.Execute ("DROP TABLE Temp") MyDb.Execute ("DROP TABLE Temp2") MyDb.Execute ("DROP TABLE Temp3") MyDb.TableDefs.Refresh |