USE [combit_Large5] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO /****** Object: StoredProcedure [dbo].[cmbt_sp_RecalcSalesDocument] ******/ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ -- combit Relationship Manager -- Funktion: Stored Procedure zum Berechnen von Summen in einem Beleg -- Name: cmbt_sp_RecalcSalesDocument -- Produkt: combit Relationship Manager / Microsoft SQL Server -- combit macht keine Angaben zu einer bestimmten Eignung der Information in diesem Code -- Irrtümer und Fehler bleiben ausdrücklich vorbehalten und die Angaben erfolgen ohne Gewähr. -- Die Angaben stellen nur Einzelfallszenarien dar und enthalten keine Garantie der Beschaffenheit -- der Produkte. -- Weitergabe des Codes nicht gestattet! -- Copyright (c) by combit GmbH. Alle Rechte vorbehalten. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ -- Erstellen der Stored Procedure CREATE PROCEDURE [dbo].[cmbt_sp_RecalcSalesDocument] ( @SalesDocumentID [uniqueidentifier] ,@TotalExisting [numeric](18,2) ,@TotalWithTaxExisting [numeric](18,2) ) AS BEGIN -- Meldung bezüglich der betroffenen Zeilen nicht mehr als Teil des Resultsets zurückgegeben IF [dbo].[cmbt_fct_GetSQLDebugMode](1) = 1 SET NOCOUNT ON; ELSE SET NOCOUNT OFF; -- Variablen deklarieren DECLARE @Nestlevel [nvarchar](2) ,@NextLine [nvarchar](100) -- NESTLEVEL-Situation auslesen SET @Nestlevel = CONVERT([nvarchar](2), @@NESTLEVEL) SET @NextLine = CHAR(13) + REPLICATE('-', 99) -- Debug-Ausgabe IF [dbo].[cmbt_fct_GetSQLDebugMode](3) = 1 PRINT 'NESTLEVEL: ' + @Nestlevel + ' - [dbo].[cmbt_sp_RecalcSalesDocument]: Start' + @NextLine -- Nur, wenn überhaupt ein Beleg zugeordnet ist IF @SalesDocumentID IS NOT NULL BEGIN -- Variablen deklarieren DECLARE @TotalNew [numeric](18,2) ,@TotalWithTaxNew [numeric](18,2) ,@UpdateString [nvarchar](4000) ,@UpdateStringParams [nvarchar](4000) ,@UpdateStringPrint [nvarchar](max) -- Parameter definieren SET @UpdateStringParams = N'@TotalNew NUMERIC(18,2) ,@TotalWithTaxNew NUMERIC(18,2) ,@SalesDocumentID UNIQUEIDENTIFIER' -- Summen aus den Belegposten ermitteln SELECT @TotalNew = SUM(ISNULL([ItemTotal], 0)), @TotalWithTaxNew = SUM(ISNULL([ItemTotalWithVAT], 0)) FROM [dbo].[SalesDocumentItems] WHERE [dbo].[SalesDocumentItems].[SalesDocumentID] = @SalesDocumentID AND [dbo].[SalesDocumentItems].[RecycleBinID] IS NULL -- AND [SalesDocumentItems].[ArchivedOn] IS NULL -- UPDATE-Statement vorbelegen SET @UpdateString = 'UPDATE [dbo].[SalesDocuments] SET ' -- UPDATE-Statement erweitern IF (ISNULL(@TotalExisting, 0) <> @TotalNew) SET @UpdateString = @UpdateString + ',[dbo].[SalesDocuments].[Total] = @TotalNew' IF (ISNULL(@TotalWithTaxExisting, 0) <> @TotalWithTaxNew) SET @UpdateString = @UpdateString + ',[dbo].[SalesDocuments].[TotalWithTax] = @TotalWithTaxNew' IF @UpdateString <> 'UPDATE [dbo].[SalesDocuments] SET ' BEGIN -- UPDATE-Statement abschließen SET @UpdateString = @UpdateString + ' WHERE [dbo].[SalesDocuments].[ID] = @SalesDocumentID' SET @UpdateString = REPLACE(@UpdateString, 'SET ,[dbo].[', 'SET [dbo].[') -- Parameter definieren SET @UpdateStringParams = N'@TotalNew NUMERIC(18,2) ,@TotalWithTaxNew NUMERIC(18,2) ,@SalesDocumentID UNIQUEIDENTIFIER' -- Debug-Ausgabe IF [dbo].[cmbt_fct_GetSQLDebugMode](5) = 1 BEGIN -- UPDATE-Statement für die Protokollierung aufbereiten SET @UpdateStringPrint = REPLACE(@UpdateString, '@TotalNew', CASE WHEN @TotalNew IS NULL THEN 'NULL' ELSE CONVERT([nvarchar](18), @TotalNew) END) SET @UpdateStringPrint = REPLACE(@UpdateStringPrint, '@TotalWithTaxNew', CASE WHEN @TotalWithTaxNew IS NULL THEN 'NULL' ELSE CONVERT([nvarchar](18), @TotalWithTaxNew) END) SET @UpdateStringPrint = REPLACE(@UpdateStringPrint, '@SalesDocumentID', '0x' + [dbo].[cmbt_fct_UnformatGUID](CONVERT([nvarchar](36), @SalesDocumentID))) SET @UpdateStringPrint = REPLACE(@UpdateStringPrint, ',[dbo].[', CHAR(13) + ',[dbo].[') SET @UpdateStringPrint = REPLACE(@UpdateStringPrint, 'WHERE [dbo].[', CHAR(13) + 'WHERE [dbo].[') SET @UpdateStringPrint = REPLACE(@UpdateStringPrint, CHAR(9), '') -- Tabulatoren in der Ausgabe entfernen -- Protokollierung vornehmen PRINT 'NESTLEVEL: ' + @Nestlevel + ' - [dbo].[cmbt_sp_RecalcSalesDocument]:' + CHAR(13) + @UpdateStringPrint + @NextLine END -- "Eigenen" Datensatz aktualisieren EXEC sp_executesql @UpdateString, @UpdateStringParams, @TotalNew, @TotalWithTaxNew, @SalesDocumentID END END END GO /****** Object: StoredProcedure [dbo].[cmbt_sp_RecalcSalesTaxTotals] ******/ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ -- combit Relationship Manager -- Funktion: Stored Procedure zum Berechnen von Umsatzsteuersummen zu einem Beleg -- Name: cmbt_sp_RecalcSalesTaxTotals -- Produkt: combit Relationship Manager / Microsoft SQL Server -- combit macht keine Angaben zu einer bestimmten Eignung der Information in diesem Code -- Irrtümer und Fehler bleiben ausdrücklich vorbehalten und die Angaben erfolgen ohne Gewähr. -- Die Angaben stellen nur Einzelfallszenarien dar und enthalten keine Garantie der Beschaffenheit -- der Produkte. -- Weitergabe des Codes nicht gestattet! -- Copyright (c) by combit GmbH. Alle Rechte vorbehalten. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ -- Erstellen der Stored Procedure CREATE PROCEDURE [dbo].[cmbt_sp_RecalcSalesTaxTotals] ( @SalesDocumentID [uniqueidentifier] ,@VATTypeID [int] ) AS BEGIN -- Meldung bezüglich der betroffenen Zeilen nicht mehr als Teil des Resultsets zurückgegeben IF [dbo].[cmbt_fct_GetSQLDebugMode](1) = 1 SET NOCOUNT ON; ELSE SET NOCOUNT OFF; -- Variablen deklarieren DECLARE @Nestlevel [nvarchar](2) ,@NextLine [nvarchar](100) -- NESTLEVEL-Situation auslesen SET @Nestlevel = CONVERT([nvarchar](2), @@NESTLEVEL) SET @NextLine = CHAR(13) + REPLICATE('-', 99) -- Debug-Ausgabe IF [dbo].[cmbt_fct_GetSQLDebugMode](3) = 1 PRINT 'NESTLEVEL: ' + @Nestlevel + ' - [dbo].[cmbt_sp_RecalcSalesTaxTotals]: Start' + @NextLine -- Nur, wenn überhaupt ein Beleg und eine ID zu einer Umsatzsteuernummer zugeordnet sind IF (@SalesDocumentID IS NOT NULL) AND (@VATTypeID IS NOT NULL) BEGIN -- Variablen deklarieren DECLARE @TotalNew [numeric](18,2) = 0 ,@SQLString [nvarchar](4000) ,@SQLStringParams [nvarchar](4000) ,@SQLStringPrint [nvarchar](max) -- Prüfen, ob es zu diesem Beleg Belegposten mit einer Umsatzsteuer gibt... IF EXISTS ( SELECT 1 FROM [dbo].[SalesDocumentItems] WHERE [dbo].[SalesDocumentItems].[SalesDocumentID] = @SalesDocumentID AND [dbo].[SalesDocumentItems].[RecycleBinID] IS NULL AND [dbo].[SalesDocumentItems].[VATType] = @VATTypeID ) BEGIN -- Summe der Umsatzsteuer neu berechnen... SELECT @TotalNew = ISNULL(SUM([dbo].[SalesDocumentItems].[ItemTotalVATOnly]), 0) FROM [dbo].[SalesDocumentItems] WHERE [dbo].[SalesDocumentItems].[SalesDocumentID] = @SalesDocumentID AND [dbo].[SalesDocumentItems].[RecycleBinID] IS NULL AND [dbo].[SalesDocumentItems].[VATType] = @VATTypeID END -- Prüfen, ob es zu diesem Umsatzsteuersatz bereits einen Umsatzsteuersummen-Datensatz gibt... IF EXISTS ( SELECT 1 FROM [dbo].[SalesTaxTotals] WHERE [dbo].[SalesTaxTotals].[SalesDocumentID] = @SalesDocumentID AND [dbo].[SalesTaxTotals].[RecycleBinID] IS NULL AND [dbo].[SalesTaxTotals].[VATTypeID] = @VATTypeID ) BEGIN -- wenn zu diesem Umsatzsteuersatz KEINE Umsatzsteuer fällig ist... IF @TotalNew = 0 BEGIN -- DELETE-Statement vorbereiten SET @SQLString = ' DELETE FROM [dbo].[SalesTaxTotals] WHERE [dbo].[SalesTaxTotals].[SalesDocumentID] = @SalesDocumentID AND [dbo].[SalesTaxTotals].[RecycleBinID] IS NULL AND [dbo].[SalesTaxTotals].[VATTypeID] = @VATTypeID' END -- wenn zu diesem Umsatzsteuersatz Umsatzsteuer fällig ist... ELSE BEGIN -- Variablen deklarieren DECLARE @SalesTaxTotalID [uniqueidentifier] ,@TotalExisting [numeric](18,2) SELECT TOP 1 @SalesTaxTotalID = [dbo].[SalesTaxTotals].[ID] ,@TotalExisting = ISNULL([dbo].[SalesTaxTotals].[Total], 0) FROM [dbo].[SalesTaxTotals] WHERE [dbo].[SalesTaxTotals].[SalesDocumentID] = @SalesDocumentID AND [dbo].[SalesTaxTotals].[RecycleBinID] IS NULL AND [dbo].[SalesTaxTotals].[VATTypeID] = @VATTypeID -- Prüfen, ob es zu diesem Umsatzsteuersatz noch weitere Umsatzsteuersummen-Datensätze gibt > dies wäre ein Fehler! IF EXISTS ( SELECT 1 FROM [dbo].[SalesTaxTotals] WHERE [dbo].[SalesTaxTotals].[SalesDocumentID] = @SalesDocumentID AND [dbo].[SalesTaxTotals].[RecycleBinID] IS NULL AND [dbo].[SalesTaxTotals].[VATTypeID] = @VATTypeID AND [dbo].[SalesTaxTotals].[ID] != @SalesTaxTotalID ) BEGIN -- DELETE-Statement vorbereiten SET @SQLString = ' DELETE FROM [dbo].[SalesTaxTotals] WHERE [dbo].[SalesTaxTotals].[SalesDocumentID] = @SalesDocumentID AND [dbo].[SalesTaxTotals].[RecycleBinID] IS NULL AND [dbo].[SalesTaxTotals].[VATTypeID] = @VATTypeID AND [dbo].[SalesTaxTotals].[ID] != @SalesTaxTotalID' -- Parameter definieren SET @SQLStringParams = N'@SalesDocumentID UNIQUEIDENTIFIER ,@VATTypeID INT ,@SalesTaxTotalID UNIQUEIDENTIFIER' -- Debug-Ausgabe IF [dbo].[cmbt_fct_GetSQLDebugMode](5) = 1 BEGIN -- SQL-Statement für die Protokollierung aufbereiten SET @SQLStringPrint = REPLACE(@SQLString, '@SalesDocumentID', '0x' + [dbo].[cmbt_fct_UnformatGUID](CONVERT([nvarchar](36), @SalesDocumentID))) SET @SQLStringPrint = REPLACE(@SQLStringPrint, '@VATTypeID', CONVERT([nvarchar], @VATTypeID)) SET @SQLStringPrint = REPLACE(@SQLStringPrint, '@SalesTaxTotalID', '0x' + [dbo].[cmbt_fct_UnformatGUID](CONVERT([nvarchar](36), @SalesTaxTotalID))) -- Protokollierung vornehmen PRINT '[dbo].[cmbt_sp_RecalcSalesTaxTotals]:' + CHAR(13) + REPLACE(@SQLStringPrint, CHAR(9), '') + @NextLine -- Tabulatoren entfernen END -- SQL-Abfrage ausführen, die sich um den Umsatzsteuerdatensatz kümmert EXEC sp_executesql @SQLString, @SQLStringParams, @SalesDocumentID, @VATTypeID, @SalesTaxTotalID -- SQL-String auf NULL zurücksetzen SET @SQLString = NULL END -- Wenn der vorhandene Umsatzsteuersummen-Datensatz nicht korrekt ist... IF @TotalExisting != @TotalNew BEGIN -- UPDATE-Statement vorbereiten SET @SQLString = ' UPDATE [dbo].[SalesTaxTotals] SET [dbo].[SalesTaxTotals].[Total] = @TotalNew WHERE [dbo].[SalesTaxTotals].[SalesDocumentID] = @SalesDocumentID AND [dbo].[SalesTaxTotals].[RecycleBinID] IS NULL AND [dbo].[SalesTaxTotals].[VATTypeID] = @VATTypeID' END END END -- Wenn es zu diesem Umsatzsteuersatz noch KEINEN Umsatzsteuersummen-Datensatz gibt... ELSE BEGIN -- wenn zu diesem Umsatzsteuersatz Umsatzsteuer fällig ist... IF @TotalNew != 0 BEGIN -- INSERT-Statement vorbereiten SET @SQLString = ' INSERT INTO [dbo].[SalesTaxTotals] ([ID], [SalesDocumentID], [VATTypeID], [Total]) VALUES (NEWID(), @SalesDocumentID, @VATTypeID, @TotalNew)' END END -- Wenn es etwas auszuführen gibt... IF @SQLString IS NOT NULL BEGIN -- Parameter definieren SET @SQLStringParams = N'@TotalNew NUMERIC(18,2) ,@SalesDocumentID UNIQUEIDENTIFIER ,@VATTypeID INT' -- Debug-Ausgabe IF [dbo].[cmbt_fct_GetSQLDebugMode](5) = 1 BEGIN -- SQL-Statement für die Protokollierung aufbereiten SET @SQLStringPrint = REPLACE(@SQLString, '@TotalNew', CONVERT([nvarchar], @TotalNew)) SET @SQLStringPrint = REPLACE(@SQLStringPrint, '@SalesDocumentID', '0x' + [dbo].[cmbt_fct_UnformatGUID](CONVERT([nvarchar](36), @SalesDocumentID))) SET @SQLStringPrint = REPLACE(@SQLStringPrint, '@VATTypeID', CONVERT([nvarchar], @VATTypeID)) -- Protokollierung vornehmen PRINT '[dbo].[cmbt_sp_RecalcSalesTaxTotals]:' + CHAR(13) + REPLACE(@SQLStringPrint, CHAR(9), '') + @NextLine -- Tabulatoren entfernen END -- SQL-Abfrage ausführen, die sich um den Umsatzsteuerdatensatz kümmert EXEC sp_executesql @SQLString, @SQLStringParams, @TotalNew, @SalesDocumentID, @VATTypeID END END END GO /****** Object: StoredProcedure [dbo].[cmbt_sp_RecalcSalesDocumentItemPosNo] ******/ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ -- combit Relationship Manager -- Funktion: Stored Procedure zum Neuberechnen der Positionsnummern bei Belegposten -- Name: cmbt_sp_RecalcSalesDocumentItemPosNo -- Produkt: combit Relationship Manager / Microsoft SQL Server -- combit macht keine Angaben zu einer bestimmten Eignung der Information in diesem Code -- Irrtümer und Fehler bleiben ausdrücklich vorbehalten und die Angaben erfolgen ohne Gewähr. -- Die Angaben stellen nur Einzelfallszenarien dar und enthalten keine Garantie der Beschaffenheit -- der Produkte. -- Weitergabe des Codes nicht gestattet! -- Copyright (c) by combit GmbH. Alle Rechte vorbehalten. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ -- Erstellen der Stored Procedure CREATE PROCEDURE [dbo].[cmbt_sp_RecalcSalesDocumentItemPosNo] ( @SalesDocumentItemID [uniqueidentifier] ,@SalesDocumentID [uniqueidentifier] ,@Reason [tinyint] ,@RecycleBinID [uniqueidentifier] ,@ItemNoMovedDown [bit] ) AS BEGIN -- Meldung bezüglich der betroffenen Zeilen nicht mehr als Teil des Resultsets zurückgegeben IF [dbo].[cmbt_fct_GetSQLDebugMode](1) = 1 SET NOCOUNT ON; ELSE SET NOCOUNT OFF; -- Variablen deklarieren DECLARE @Nestlevel [nvarchar](2) ,@NextLine [nvarchar](100) -- NESTLEVEL-Situation auslesen SET @Nestlevel = CONVERT([nvarchar](2), @@NESTLEVEL) SET @NextLine = CHAR(13) + REPLICATE('-', 99) -- Debug-Ausgabe IF [dbo].[cmbt_fct_GetSQLDebugMode](3) = 1 PRINT 'NESTLEVEL: ' + @Nestlevel + ' - [dbo].[cmbt_sp_RecalcSalesDocumentItemPosNo]: Start' + @NextLine -- Nur, wenn überhaupt ein Beleg zugeordnet ist IF @SalesDocumentID IS NOT NULL BEGIN -- Variablen deklarieren DECLARE @Counter [int] = 1 ,@SalesDocumentItemRecCursorID [uniqueidentifier] -- Wenn der Belegposten nicht gelöscht wird IF (@Reason <> 3) AND (@RecycleBinID IS NULL) BEGIN -- Belegposten Markierung zurücksetzten UPDATE [dbo].[SalesDocumentItems] SET [dbo].[SalesDocumentItems].[ItemNoRecalc] = NULL WHERE [dbo].[SalesDocumentItems].[SalesDocumentID] = @SalesDocumentID AND [dbo].[SalesDocumentItems].[ItemNoRecalc] IS NOT NULL -- Belegposten markieren, bei dem die ItemNo geändert wurde... UPDATE [dbo].[SalesDocumentItems] SET [dbo].[SalesDocumentItems].[ItemNoRecalc] = 1 WHERE [dbo].[SalesDocumentItems].[ID] = @SalesDocumentItemID END IF @ItemNoMovedDown = 1 BEGIN -- Deklarieren eines SQL-Servercursors, um durch alle Belegposten des Belegs zu gehen DECLARE [cmbt_sp_RecalcItemPos_RecCursor] CURSOR LOCAL FAST_FORWARD FOR SELECT [dbo].[SalesDocumentItems].[ID] FROM [dbo].[SalesDocumentItems] WHERE [dbo].[SalesDocumentItems].[SalesDocumentID] = @SalesDocumentID AND [dbo].[SalesDocumentItems].[RecycleBinID] IS NULL ORDER BY [dbo].[SalesDocumentItems].[ItemNo] ASC, [dbo].[SalesDocumentItems].[ItemNoRecalc] ASC END ELSE BEGIN -- Deklarieren eines SQL-Servercursors, um durch alle Belegposten des Belegs zu gehen DECLARE [cmbt_sp_RecalcItemPos_RecCursor] CURSOR LOCAL FAST_FORWARD FOR SELECT [dbo].[SalesDocumentItems].[ID] FROM [dbo].[SalesDocumentItems] WHERE [dbo].[SalesDocumentItems].[SalesDocumentID] = @SalesDocumentID AND [dbo].[SalesDocumentItems].[RecycleBinID] IS NULL ORDER BY [dbo].[SalesDocumentItems].[ItemNo] ASC, [dbo].[SalesDocumentItems].[ItemNoRecalc] DESC END -- Öffnet den SQL-Servercursor OPEN [cmbt_sp_RecalcItemPos_RecCursor] -- Ruft die nächste Zeile aus dem SQL-Servercursor ab FETCH NEXT FROM [cmbt_sp_RecalcItemPos_RecCursor] INTO @SalesDocumentItemRecCursorID WHILE @@FETCH_STATUS = 0 BEGIN -- Prüfen, ob überhaupt Datensätze überhaupt akualisiert werden müssen... IF EXISTS( SELECT 1 FROM [dbo].[SalesDocumentItems] WHERE [dbo].[SalesDocumentItems].[ID] = @SalesDocumentItemRecCursorID AND ISNULL([dbo].[SalesDocumentItems].[ItemNo], 0) <> @Counter ) BEGIN -- Debug-Ausgabe IF [dbo].[cmbt_fct_GetSQLDebugMode](4) = 1 PRINT 'NESTLEVEL: ' + @Nestlevel + ' - [dbo].[cmbt_sp_RecalcSalesDocumentItemPosNo]: UPDATE [dbo].[SalesDocumentItems] SET [dbo].[SalesDocumentItems].[ItemNo] = ' + CONVERT([nvarchar](10), @Counter) + ' ,[dbo].[SalesDocumentItems].[ItemNoRecalc] = NULL WHERE [dbo].[SalesDocumentItems].[ID] = 0x' + [dbo].[cmbt_fct_UnformatGUID](CONVERT([nvarchar](36), @SalesDocumentItemRecCursorID)) + @NextLine -- neue Positionsnummer in den Belegposten schreiben UPDATE [dbo].[SalesDocumentItems] SET [dbo].[SalesDocumentItems].[ItemNo] = @Counter, [dbo].[SalesDocumentItems].[ItemNoRecalc] = NULL WHERE [dbo].[SalesDocumentItems].[ID] = @SalesDocumentItemRecCursorID END -- Counter inkrementieren SET @Counter = @Counter + 1 -- Ruft die nächste Zeile aus dem SQL-Servercursor ab FETCH NEXT FROM [cmbt_sp_RecalcItemPos_RecCursor] INTO @SalesDocumentItemRecCursorID END -- Schließt den geöffneten SQL-Servercursor CLOSE [cmbt_sp_RecalcItemPos_RecCursor] -- Entfernt den SQL-Servercursorhinweis DEALLOCATE [cmbt_sp_RecalcItemPos_RecCursor] END END GO /****** Object: Trigger [dbo].[cmbt_Trigger_Solution_SalesDocumentItems] ******/ ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- combit Relationship Manager -- Funktion: Bereitstellen eines Triggers zum Berechnen von Werten in Belegposten und Belegen -- Name: cmbt_Trigger_Solution_SalesDocumentItems -- Produkt: combit Relationship Manager / Microsoft SQL Server -- combit macht keine Angaben zu einer bestimmten Eignung der Information in diesem Code -- Irrtümer und Fehler bleiben ausdrücklich vorbehalten und die Angaben erfolgen ohne Gewähr. -- Die Angaben stellen nur Einzelfallszenarien dar und enthalten keine Garantie der Beschaffenheit -- der Produkte. -- Weitergabe des Codes nicht gestattet! -- Copyright (c) by combit GmbH. Alle Rechte vorbehalten. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ -- Erstellen des Triggers CREATE TRIGGER [dbo].[cmbt_Trigger_Solution_SalesDocumentItems] ON [dbo].[SalesDocumentItems] -- Auslösen nach dem Einfügen und Löschen eines Datensatzes AFTER INSERT, UPDATE, DELETE -- Trigger soll nicht ausgeführt werden, wenn ein Replikations-Agent die vom Trigger betroffene Tabelle ändert NOT FOR REPLICATION AS BEGIN -- Meldung bezüglich der betroffenen Zeilen nicht mehr als Teil des Resultsets zurückgegeben IF [dbo].[cmbt_fct_GetSQLDebugMode](1) = 1 SET NOCOUNT ON; ELSE SET NOCOUNT OFF; -- Variable deklarieren DECLARE @Nestlevel [nvarchar](7) = 'unknown' ,@Trigger_Nestlevel [int] ,@Trigger_Nestlevel_WithObjectID [int] ,@NextLine [nvarchar](100) = CHAR(13) + REPLICATE('-', 99) -- Debug-Ausgabe IF [dbo].[cmbt_fct_GetSQLDebugMode](2) = 1 PRINT 'NESTLEVEL: ' + @Nestlevel + ' - [dbo].[cmbt_Trigger_Solution_SalesDocumentItems] ON [dbo].[SalesDocumentItems]: Start' + @NextLine -- Debug-Ausgabe IF [dbo].[cmbt_fct_GetSQLDebugMode](6) = 1 BEGIN -- NESTLEVEL-Situation auslesen SET @Nestlevel = CONVERT([nvarchar](2), @@NESTLEVEL) SET @Trigger_Nestlevel = TRIGGER_NESTLEVEL() SET @Trigger_Nestlevel_WithObjectID = TRIGGER_NESTLEVEL(OBJECT_ID('dbo.cmbt_Trigger_Solution_SalesDocumentItems')) -- Debug-Ausgabe PRINT REPLACE('[dbo].[cmbt_Trigger_Solution_SalesDocumentItems] ON [dbo].[SalesDocumentItems]: NESTLEVEL Situation > @@NESTLEVEL: ' + @Nestlevel + ' > TRIGGER_NESTLEVEL(): ' + CASE WHEN @Trigger_Nestlevel IS NULL THEN 'NULL' ELSE CONVERT([nvarchar], @Trigger_Nestlevel) END + ' > TRIGGER_NESTLEVEL(OBJECT_ID(''dbo.cmbt_Trigger_Solution_SalesDocumentItems'')): ' + CASE WHEN @Trigger_Nestlevel_WithObjectID IS NULL THEN 'NULL' ELSE CONVERT([nvarchar], @Trigger_Nestlevel_WithObjectID) END, CHAR(9), '') + @NextLine -- Tabulatoren entfernen END -- Variablen deklarieren DECLARE @InsertedCount [bigint] ,@DeletedCount [bigint] ,@Reason [tinyint] ,@ReasonText [nvarchar](6) -- Auslesen der Anzahl der Datensätze in der [inserted] und [deleted] - Tabelle SELECT @InsertedCount = COUNT([ID]) FROM [inserted] SELECT @DeletedCount = COUNT([ID]) FROM [deleted] -- Prüfen, ob ein INSERT-Statement ausgeführt wurde... IF @DeletedCount = 0 AND @InsertedCount > 0 BEGIN SET @Reason = 1 SET @ReasonText = 'INSERT' END -- Prüfen, ob ein UPDATE-Statement ausgeführt wurde... IF @DeletedCount = @InsertedCount BEGIN SET @Reason = 2 SET @ReasonText = 'UPDATE' END -- Prüfen, ob ein DELETE-Statement ausgeführt wurde... IF @DeletedCount > 0 AND @InsertedCount = 0 BEGIN SET @Reason = 3 SET @ReasonText = 'DELETE' END -- Debug-Ausgabe IF [dbo].[cmbt_fct_GetSQLDebugMode](7) = 1 PRINT 'NESTLEVEL: ' + @Nestlevel + ' - [dbo].[cmbt_Trigger_Solution_SalesDocumentItems] ON [dbo].[SalesDocumentItems]: Reason: ' + @ReasonText + @NextLine -- Variablen deklarieren DECLARE @SalesDocumentItemID [uniqueidentifier] ,@SalesDocumentID [uniqueidentifier] ,@VATTypeID [int] ,@Total [numeric](18,2) ,@TotalWithTax [numeric](18,2) ,@UpdateSalesDocumentID [bit] ,@UpdateItemNo [bit] ,@UpdateQuantity [bit] ,@UpdateUnitPrice [bit] ,@UpdateDiscount [bit] ,@UpdateUnitPriceIsGross [bit] ,@UpdateVATTypeID[bit] ,@UpdateItemTotal [bit] ,@UpdateItemTotalVATOnly [bit] ,@UpdateItemTotalWithVAT [bit] ,@UpdateItemTaxRate1 [bit] ,@UpdateItemTaxRate2 [bit] ,@UpdateRecycleBinID [bit] -- Nur, wenn es um ein UPDATE geht... IF @Reason = 2 BEGIN -- Update-Bits setzen IF UPDATE([SalesDocumentID]) SET @UpdateSalesDocumentID = 1 IF UPDATE([ItemNo]) SET @UpdateItemNo = 1 IF UPDATE([Quantity]) SET @UpdateQuantity = 1 IF UPDATE([UnitPrice]) SET @UpdateUnitPrice = 1 IF UPDATE([Discount]) SET @UpdateDiscount = 1 IF UPDATE([UnitPriceIsGross]) SET @UpdateUnitPriceIsGross = 1 IF UPDATE([VATType]) SET @UpdateVATTypeID = 1 IF UPDATE([ItemTotal]) SET @UpdateItemTotal = 1 IF UPDATE([ItemTotalVATOnly]) SET @UpdateItemTotalVATOnly = 1 IF UPDATE([ItemTotalWithVAT]) SET @UpdateItemTotalWithVAT = 1 IF UPDATE([RecycleBinID]) SET @UpdateRecycleBinID = 1 END -- Nur wenn ein neuer Datensatz erstellt wird oder ein bestimmtes Feld aktualisiert wird... IF @Reason = 1 OR (@Reason = 2 AND ((@UpdateSalesDocumentID = 1) OR (@UpdateItemNo = 1) OR (@UpdateQuantity = 1) OR (@UpdateDiscount = 1) OR (@UpdateUnitPrice = 1) OR (@UpdateUnitPriceIsGross = 1) OR (@UpdateVATTypeID = 1) OR (@UpdateItemTotal = 1) OR (@UpdateItemTotalVATOnly = 1) OR (@UpdateItemTotalWithVAT = 1) OR (@UpdateRecycleBinID = 1))) BEGIN -- Nur, wenn es um ein UPDATE geht... IF @Reason = 2 BEGIN -- Debug-Ausgabe IF [dbo].[cmbt_fct_GetSQLDebugMode](7) = 1 BEGIN IF @UpdateSalesDocumentID = 1 PRINT 'NESTLEVEL: ' + @Nestlevel + ' - [dbo].[cmbt_Trigger_Solution_SalesDocumentItems] ON [dbo].[SalesDocumentItems]: UPDATE([SalesDocumentID])' + @NextLine IF @UpdateItemNo = 1 PRINT 'NESTLEVEL: ' + @Nestlevel + ' - [dbo].[cmbt_Trigger_Solution_SalesDocumentItems] ON [dbo].[SalesDocumentItems]: UPDATE([ItemNo])' + @NextLine IF @UpdateQuantity = 1 PRINT 'NESTLEVEL: ' + @Nestlevel + ' - [dbo].[cmbt_Trigger_Solution_SalesDocumentItems] ON [dbo].[SalesDocumentItems]: UPDATE([Quantity])' + @NextLine IF @UpdateUnitPrice = 1 PRINT 'NESTLEVEL: ' + @Nestlevel + ' - [dbo].[cmbt_Trigger_Solution_SalesDocumentItems] ON [dbo].[SalesDocumentItems]: UPDATE([UnitPrice])' + @NextLine IF @UpdateDiscount = 1 PRINT 'NESTLEVEL: ' + @Nestlevel + ' - [dbo].[cmbt_Trigger_Solution_SalesDocumentItems] ON [dbo].[SalesDocumentItems]: UPDATE([Discount])' + @NextLine IF @UpdateUnitPriceIsGross = 1 PRINT 'NESTLEVEL: ' + @Nestlevel + ' - [dbo].[cmbt_Trigger_Solution_SalesDocumentItems] ON [dbo].[SalesDocumentItems]: UPDATE([UnitPriceIsGross])' + @NextLine IF @UpdateVATTypeID = 1 PRINT 'NESTLEVEL: ' + @Nestlevel + ' - [dbo].[cmbt_Trigger_Solution_SalesDocumentItems] ON [dbo].[SalesDocumentItems]: UPDATE([VATType])' + @NextLine IF @UpdateItemTotal = 1 PRINT 'NESTLEVEL: ' + @Nestlevel + ' - [dbo].[cmbt_Trigger_Solution_SalesDocumentItems] ON [dbo].[SalesDocumentItems]: UPDATE([ItemTotal])' + @NextLine IF @UpdateItemTotalVATOnly = 1 PRINT 'NESTLEVEL: ' + @Nestlevel + ' - [dbo].[cmbt_Trigger_Solution_SalesDocumentItems] ON [dbo].[SalesDocumentItems]: UPDATE([ItemTotalVATOnly])' + @NextLine IF @UpdateItemTotalWithVAT = 1 PRINT 'NESTLEVEL: ' + @Nestlevel + ' - [dbo].[cmbt_Trigger_Solution_SalesDocumentItems] ON [dbo].[SalesDocumentItems]: UPDATE([ItemTotalWithVAT])' + @NextLine IF @UpdateRecycleBinID = 1 PRINT 'NESTLEVEL: ' + @Nestlevel + ' - [dbo].[cmbt_Trigger_Solution_SalesDocumentItems] ON [dbo].[SalesDocumentItems]: UPDATE([RecycleBinID])' + @NextLine END END -- Variablen deklarieren DECLARE @SalesDocumentItemColumnUpdate [bit] ,@SalesDocumentColumnUpdate [bit] ,@SalesDocumentItemPosNoUpdate [bit] ,@ItemNoMovedDown [bit] = 0 ,@Quantity [numeric](18, 2) ,@UnitPrice [numeric](18,2) ,@Discount [numeric](18, 0) ,@UnitPriceIsGross [bit] ,@TaxRate [numeric](18,1) ,@ItemTotalExisting [numeric](18,2) ,@ItemTotal [numeric](18,2) ,@ItemTotalWithVATExisting [numeric](18,2) ,@ItemTotalWithVAT[numeric](18,2) ,@ItemTotalVATOnlyExisting [numeric](18,2) ,@ItemTotalVATOnly [numeric](18,2) ,@RecycleBinID [uniqueidentifier] ,@ItemNoInserted [int] ,@ItemNoDeleted [int] ,@ItemTaxRate1Existing [numeric](18,2) ,@ItemTaxRate1New [numeric](18,2) ,@ItemTaxRate2Existing [numeric](18,2) ,@ItemTaxRate2 [numeric](18,2) ,@UpdateString [nvarchar](4000) ,@UpdateStringParams [nvarchar](4000) ,@UpdateStringPrint [nvarchar](max) -- Prüfen, ob relevante Felder rund um den Belegposten aktualisiert wurden IF @Reason = 1 OR (@UpdateQuantity = 1) OR (@UpdateUnitPrice = 1) OR (@UpdateDiscount = 1) OR (@UpdateUnitPriceIsGross = 1) OR (@UpdateVATTypeID = 1) OR (@UpdateItemTotal = 1) OR (@UpdateItemTotalWithVAT = 1) OR (@UpdateItemTotalVATOnly = 1) OR (@UpdateRecycleBinID = 1) SET @SalesDocumentItemColumnUpdate = 1 -- Prüfen, ob relevante Felder rund um den Beleg aktualisiert wurden IF @Reason = 1 OR (@UpdateSalesDocumentID = 1) OR (@UpdateQuantity = 1) OR (@UpdateUnitPrice = 1) OR (@UpdateDiscount = 1) OR (@UpdateUnitPriceIsGross = 1) OR (@UpdateVATTypeID = 1) OR (@UpdateItemTotal = 1) OR (@UpdateItemTotalWithVAT = 1) OR (@UpdateItemTotalVATOnly = 1) OR (@UpdateRecycleBinID = 1) SET @SalesDocumentColumnUpdate = 1 -- Prüfen, ob relevante Felder rund um die Positionsnummern bei den Belegposten aktualisiert wurden IF @Reason = 1 OR (@UpdateSalesDocumentID = 1) OR (@UpdateItemNo = 1) OR (@UpdateRecycleBinID = 1) SET @SalesDocumentItemPosNoUpdate = 1 -- Deklarieren eines SQL-Servercursors, um durch alle Datensätze zu gehen DECLARE [cmbt_Trigger_Solution_SalesDocumentItems_RecCursor] CURSOR LOCAL FAST_FORWARD FOR SELECT [inserted].[ID], [inserted].[SalesDocumentID], ISNULL([inserted].[Quantity], 0), ISNULL([inserted].[UnitPrice], 0), ISNULL([inserted].[Discount], 0), ISNULL([inserted].[UnitPriceIsGross], 0), ISNULL([inserted].[VATType], 0), [inserted].[ItemTotal], [inserted].[ItemTotalVATOnly], [inserted].[ItemTotalWithVAT], [inserted].[RecycleBinID], [inserted].[ItemNo], [deleted].[ItemNo] FROM [inserted] LEFT JOIN [deleted] ON [inserted].ID = [deleted].ID -- Öffnet den SQL-Servercursor OPEN [cmbt_Trigger_Solution_SalesDocumentItems_RecCursor] -- Ruft die nächste Zeile aus dem SQL-Servercursor ab FETCH NEXT FROM [cmbt_Trigger_Solution_SalesDocumentItems_RecCursor] INTO @SalesDocumentItemID, @SalesDocumentID, @Quantity, @UnitPrice, @Discount, @UnitPriceIsGross, @VATTypeID, @ItemTotalExisting, @ItemTotalVATOnlyExisting, @ItemTotalWithVATExisting, @RecycleBinID, @ItemNoInserted, @ItemNoDeleted WHILE @@FETCH_STATUS = 0 BEGIN -- Wenn Felder rund um den Belegposten aktualisiert werden IF (@SalesDocumentItemColumnUpdate = 1) AND (@RecycleBinID IS NULL) BEGIN -- Umsatzsteuersatz ermitteln SET @TaxRate = (SELECT ISNULL([dbo].[TaxRates].[Rate],0) FROM [dbo].[TaxRates] WHERE [dbo].[TaxRates].[No] = @VATTypeID AND [dbo].[TaxRates].[RecycleBinID] IS NULL) -- Wenn der Stückpreis Netto ist... IF @UnitPriceIsGross = 0 BEGIN -- Netto-PostenGesamt = Nettobetrag pro Stück x Anzahl x Rabatt (Produkt gerundet) SET @ItemTotal = ROUND(@UnitPrice * @Quantity * ((100-@Discount) / 100),2) -- USt-PostenGesamt = Nettobetrag pro Stück x Anzahl x Rabatt x UStSatz (Produkt gerundet) SET @ItemTotalVATOnly = ROUND((@UnitPrice * @Quantity * ((100-@Discount) / 100) * @TaxRate / 100), 2) -- Brutto-PostenGesamt = Netto-PostenGesamt + USt-PostenGesamt (jeweils gerundet) SET @ItemTotalWithVAT = @ItemTotal + @ItemTotalVATOnly END -- Wenn der Stückpreis Brutto ist... ELSE BEGIN -- Brutto-PostenGesamt = Bruttobetrag pro Stück x Anzahl x Rabatt (Produkt gerundet) SET @ItemTotalWithVAT = ROUND(@UnitPrice * @Quantity * ((100-@Discount) / 100),2) -- USt-PostenGesamt = (Bruttobetrag pro Stück x Anzahl x Rabatt) - (Nettobetrag pro Stück x Anzahl x Rabatt x UStSatz) (Differenz gerundet) SET @ItemTotalVATOnly = ROUND((@UnitPrice * @Quantity * ((100-@Discount) / 100)) - (@UnitPrice * @Quantity * ((100-@Discount) / 100) / (1 + (@TaxRate/100))),2) -- Netto-PostenGesamt = Brutto-PostenGesamt - USt-PostenGesamt (jeweils gerundet) SET @ItemTotal = @ItemTotalWithVAT - @ItemTotalVATOnly END -- UPDATE-Statement vorbelegen SET @UpdateString = 'UPDATE [dbo].[SalesDocumentItems] SET ' -- UPDATE-Statement erweitern IF (ISNULL(@ItemTotalExisting, 0) <> ISNULL(@ItemTotal, 0)) SET @UpdateString = @UpdateString + ',[dbo].[SalesDocumentItems].[ItemTotal] = @ItemTotal' IF (ISNULL(@ItemTotalVATOnlyExisting, 0) <> ISNULL(@ItemTotalVATOnly, 0)) SET @UpdateString = @UpdateString + ',[dbo].[SalesDocumentItems].[ItemTotalVATOnly] = @ItemTotalVATOnly' IF (ISNULL(@ItemTotalWithVATExisting, 0) <> ISNULL(@ItemTotalWithVAT, 0)) SET @UpdateString = @UpdateString + ',[dbo].[SalesDocumentItems].[ItemTotalWithVAT] = @ItemTotalWithVAT' IF @UpdateString <> 'UPDATE [dbo].[SalesDocumentItems] SET ' BEGIN -- UPDATE-Statement abschließen SET @UpdateString = @UpdateString + ' WHERE [dbo].[SalesDocumentItems].[ID] = @SalesDocumentItemID' SET @UpdateString = REPLACE(@UpdateString, 'SET ,[dbo].[', 'SET [dbo].[') -- Parameter definieren SET @UpdateStringParams = N'@ItemTotal NUMERIC(18,2) ,@ItemTotalVATOnly NUMERIC(18,2) ,@ItemTotalWithVAT NUMERIC(18,2) ,@SalesDocumentItemID UNIQUEIDENTIFIER' -- Debug-Ausgabe IF [dbo].[cmbt_fct_GetSQLDebugMode](5) = 1 BEGIN -- UPDATE-Statement für die Protokollierung aufbereiten SET @UpdateStringPrint = REPLACE(@UpdateString, '@ItemTotal', CASE WHEN @ItemTotal IS NULL THEN 'NULL' ELSE '''' + CONVERT([nvarchar](18), @ItemTotal) + '''' END) SET @UpdateStringPrint = REPLACE(@UpdateStringPrint, '@ItemTotalVATOnly', CASE WHEN @ItemTotalVATOnly IS NULL THEN 'NULL' ELSE '''' + CONVERT([nvarchar](18), @ItemTotalVATOnly) + '''' END) SET @UpdateStringPrint = REPLACE(@UpdateStringPrint, '@ItemTotalWithVAT', CASE WHEN @ItemTotalWithVAT IS NULL THEN 'NULL' ELSE '''' + CONVERT([nvarchar](18), @ItemTotalWithVAT) + '''' END) SET @UpdateStringPrint = REPLACE(@UpdateStringPrint, '@SalesDocumentItemID', '0x' + [dbo].[cmbt_fct_UnformatGUID](CONVERT([nvarchar](36), @SalesDocumentItemID))) SET @UpdateStringPrint = REPLACE(@UpdateStringPrint, ',[dbo].[', CHAR(13) + ',[dbo].[') SET @UpdateStringPrint = REPLACE(@UpdateStringPrint, 'WHERE [dbo].[', CHAR(13) + 'WHERE [dbo].[') SET @UpdateStringPrint = REPLACE(@UpdateStringPrint, CHAR(9), '') -- Tabulatoren in der Ausgabe entfernen -- Protokollierung vornehmen PRINT 'NESTLEVEL: ' + @Nestlevel + ' - [dbo].[cmbt_Trigger_Solution_SalesDocumentItems] ON [dbo].[SalesDocumentItems]:' + CHAR(13) + @UpdateStringPrint + @NextLine END -- "Eigenen" Datensatz aktualisieren EXEC sp_executesql @UpdateString, @UpdateStringParams, @ItemTotal, @ItemTotalVATOnly, @ItemTotalWithVAT, @SalesDocumentItemID END END -- Wenn Felder rund um den Beleg aktualisiert werden IF @SalesDocumentColumnUpdate = 1 BEGIN SELECT @Total = ISNULL([dbo].[SalesDocuments].[Total], 0) ,@TotalWithTax = ISNULL([dbo].[SalesDocuments].[TotalWithTax], 0) FROM [dbo].[SalesDocuments] WHERE [dbo].[SalesDocuments].[ID] = @SalesDocumentID AND [dbo].[SalesDocuments].[RecycleBinID] IS NULL -- gespeicherte Prozedur ausführen, um die Summen im Beleg neu zu berechnen EXECUTE [cmbt_sp_RecalcSalesDocument] @SalesDocumentID, @Total, @TotalWithTax -- gespeicherte Prozedur ausführen, um die Umsatzsteuersummen im Beleg neu zu berechnen EXECUTE [cmbt_sp_RecalcSalesTaxTotals] @SalesDocumentID, @VATTypeID END -- Wenn Felder rund um die Positionsnummern bei den Belegposten aktualisiert werden IF @SalesDocumentItemPosNoUpdate = 1 BEGIN IF ISNULL(@ItemNoDeleted, 0) < ISNULL(@ItemNoInserted, 0) SET @ItemNoMovedDown = 1 ELSE SET @ItemNoMovedDown = 0 -- gespeicherte Prozedur ausführen, um die Positionsnummern bei den Belegposten neu zu berechnen EXECUTE [cmbt_sp_RecalcSalesDocumentItemPosNo] @SalesDocumentItemID, @SalesDocumentID, @Reason, @RecycleBinID, @ItemNoMovedDown END -- Ruft die nächste Zeile aus dem SQL-Servercursor ab FETCH NEXT FROM [cmbt_Trigger_Solution_SalesDocumentItems_RecCursor] INTO @SalesDocumentItemID, @SalesDocumentID, @Quantity, @UnitPrice, @Discount, @UnitPriceIsGross, @VATTypeID, @ItemTotalExisting, @ItemTotalVATOnlyExisting, @ItemTotalWithVATExisting, @RecycleBinID, @ItemNoInserted, @ItemNoDeleted END -- Schließt den geöffneten SQL-Servercursor CLOSE [cmbt_Trigger_Solution_SalesDocumentItems_RecCursor] -- Entfernt den SQL-Servercursorhinweis DEALLOCATE [cmbt_Trigger_Solution_SalesDocumentItems_RecCursor] END -- Nur wenn ein neuer Datensatz gelöscht wird oder ein bestimmtes Feld aktualisiert wird... IF @Reason = 3 OR (@Reason = 2 AND ((@UpdateSalesDocumentID = 1) OR (@UpdateVATTypeID = 1))) BEGIN -- Deklarieren eines SQL-Servercursors, um durch alle Datensätze zu gehen DECLARE [cmbt_Trigger_Solution_SalesDocumentItems_RecCursor] CURSOR LOCAL FAST_FORWARD FOR SELECT [ID], [SalesDocumentID], ISNULL([VATType], 0), [RecycleBinID] FROM [deleted] -- Öffnet den SQL-Servercursor OPEN [cmbt_Trigger_Solution_SalesDocumentItems_RecCursor] -- Ruft die nächste Zeile aus dem SQL-Servercursor ab FETCH NEXT FROM [cmbt_Trigger_Solution_SalesDocumentItems_RecCursor] INTO @SalesDocumentItemID, @SalesDocumentID, @VATTypeID, @RecycleBinID WHILE @@FETCH_STATUS = 0 BEGIN -- wenn die SalesDocumentID im Belegposten aktualisiert wurde oder der Belegposten gelöscht wird... IF @Reason = 3 OR (@Reason = 2 AND (@UpdateSalesDocumentID = 1)) BEGIN SELECT @Total = ISNULL([dbo].[SalesDocuments].[Total], 0) ,@TotalWithTax = ISNULL([dbo].[SalesDocuments].[TotalWithTax], 0) FROM [dbo].[SalesDocuments] WHERE [dbo].[SalesDocuments].[ID] = @SalesDocumentID AND [dbo].[SalesDocuments].[RecycleBinID] IS NULL -- gespeicherte Prozedur ausführen, um die Summen im Beleg neu zu berechnen EXECUTE [cmbt_sp_RecalcSalesDocument] @SalesDocumentID, @Total, @TotalWithTax -- gespeicherte Prozedur ausführen, um die Positionsnummern bei den Belegposten neu zu berechnen EXECUTE [cmbt_sp_RecalcSalesDocumentItemPosNo] @SalesDocumentItemID, @SalesDocumentID, @Reason, @RecycleBinID, @ItemNoMovedDown END -- gespeicherte Prozedur ausführen, um die Umsatzsteuersummen im Beleg neu zu berechnen EXECUTE [cmbt_sp_RecalcSalesTaxTotals] @SalesDocumentID, @VATTypeID -- Ruft die nächste Zeile aus dem SQL-Servercursor ab FETCH NEXT FROM [cmbt_Trigger_Solution_SalesDocumentItems_RecCursor] INTO @SalesDocumentItemID, @SalesDocumentID, @VATTypeID, @RecycleBinID END -- Schließt den geöffneten SQL-Servercursor CLOSE [cmbt_Trigger_Solution_SalesDocumentItems_RecCursor] -- Entfernt den SQL-Servercursorhinweis DEALLOCATE [cmbt_Trigger_Solution_SalesDocumentItems_RecCursor] END END GO ALTER TABLE [dbo].[SalesDocumentItems] ENABLE TRIGGER [cmbt_Trigger_Solution_SalesDocumentItems] GO