This stored proc merges the records from one supplier to another one.
Note that this also can be used to "delete" suppliers into one "deleted" supplier. <p>Note 2: Don't forget a "recalculate supplier balances" afterwards.
note; this does not handle all Vendor type records depending on usage and implementation, check before usage!
See for customer / client version this page: SQL - Merge Customers
IF EXISTS ( SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'_as_spMergeSuppliers') AND type IN ( N'P', N'PC' ) ) DROP PROCEDURE _as_spMergeSuppliers SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: Asamco BV, Alexander Toufexis -- Create date: 21/02/2017 -- Description: Merge supplier into other supplier account. (no job costing supported currently!), Note; no balances are moved on GL accounts. -- ============================================= CREATE PROCEDURE _as_spMergeSuppliers -- Add the parameters for the stored procedure here @FromSupplier varchar(100), @ToSupplier varchar(100) AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; -----DECLARES------ DECLARE @FromSupplierID int DECLARE @ToSupplierID int DECLARE @FromSupplierCurrencyID int DECLARE @ToSupplierCurrencyID int -----FETCH BASIC DATA----- SELECT @FromSupplierID = DCLink, @FromSupplierCurrencyID = iCurrencyID FROM Vendor V WHERE V.Account = @FromSupplier SELECT @ToSupplierID = DCLink, @ToSupplierCurrencyID = iCurrencyID FROM Vendor V WHERE V.Account = @ToSupplier -----CHECKS & VALIDATIONS----- --Existing accounts IF COALESCE(@FromSupplierID,0) = 0 GOTO EarlyOut IF COALESCE(@ToSupplierID,0) = 0 GOTO EarlyOut --Matching currency IF COALESCE(@FromSupplierCurrencyID,0) != COALESCE(@ToSupplierCurrencyID,0) BEGIN PRINT 'Currencies do not match between supplier ' + @FromSupplier + '(Currency ID: ' + CAST(COALESCE(@FromSupplierCurrencyID,0) as varchar(200)) + ') into supplier ' + @ToSupplier + '(Currency ID: ' + CAST(COALESCE(@ToSupplierCurrencyID,0) as varchar(200)) + ')'; GOTO EarlyOut END -----Merge Supplier Records----- PRINT 'Merging supplier ' + @FromSupplier + '(ID: ' + CAST(@FromSupplierID as varchar(200)) + ') into supplier ' + @ToSupplier + '(ID: ' + CAST(@ToSupplierID as varchar(200)) + ')'; --PostAP & audit UPDATE PostAP SET AccountLink = @ToSupplierID WHERE AccountLink = @FromSupplierID; IF OBJECT_ID(N'dbo.PostAP_Audit', N'U') IS NOT NULL BEGIN UPDATE PostAP_Audit SET AccountLink = @ToSupplierID WHERE AccountLink = @FromSupplierID; END --PostGL (DrCrAccount) & audit. UPDATE PostGL SET DrCrAccount = @ToSupplierID WHERE DrCrAccount = @FromSupplierID AND PostGL.Id IN ('APTx', 'Grv', 'OGrv', 'Rts', 'CBAP', 'TaxAP') IF OBJECT_ID(N'dbo.PostGL_Audit', N'U') IS NOT NULL BEGIN UPDATE PostGL_Audit SET AccountLink = @ToSupplierID WHERE AccountLink = @FromSupplierID; END --InvNum UPDATE InvNum SET AccountID = @ToSupplierID WHERE AccountID = @FromSupplierID AND DocType IN (2,3,5) -- -----DELETE Supplier Records----- DELETE FROM Vendor WHERE DCLink = @FromSupplierID GOTO ExitNow EarlyOut: DECLARE @msg nvarchar(300) SET @msg = 'Cancelling merge between supplier ' + @FromSupplier + '(ID: ' + CAST(COALESCE(@FromSupplierID,0) as varchar(200)) + ') into supplier ' + @ToSupplier + '(ID: ' + CAST(COALESCE(@ToSupplierID,0) as varchar(200)) + ')'; RaisError(@msg,11,1) ExitNow: END