Belegnummer Anpassen

Hallo,
ich möchte die automatisch erzeugte Belegnummer durch ein vorangestelltes Kürzel erweitern.
In dem Trigger in der Tabelle dbo.SalesDocuments finde ich folgende Zeilen:
– Daten im Beleg aktualisieren
UPDATE [SalesDocuments]
SET
[TransactionNumber] = @TransactionNumber,
[IssueNumber] = @IncrementedCounter
WHERE [ID] = @SalesDocumentID
Wenn ich hier [IssueNumber] einen String zuweise, bekomme ich einen Fehler obwohl das Feld in der DB nvarchar(10) ist… IncrementedCounter ist im Trigger als int definiert.
Die IssueNumber soll etwa so aussehen: MP12345678

Hallo,

die Variable @IncrementedCounter ist als numerischer Typ deklariert worden. Um diesen mit einem Zeichen-Präfix zu verketten, müssen Sie den Counter zunächst in einen Zeichentyp umwandeln. Im ausgelieferten Trigger-Code wird das bereits so gemacht und wenn ich da dann ganz simpel ein ‚MP‘ davor setze, dann klappt das wunderbar:

Bei Rückfragen gerne hier melden. :slight_smile:

Hallo Björn,
danke für die schnelle Antwort. Das habe ich auch schoin probiert, funktioniert bei mir aber nicht.
Weiter unten im Script wird ja folgendes zugewiesen:
– Daten im Beleg aktualisieren
UPDATE [SalesDocuments]
SET
[TransactionNumber] = @TransactionNumber,
[IssueNumber] = @IncrementedCounter
WHERE [ID] = @SalesDocumentID
Wenn ich hier [IssueNumber] = 12345 eintrage, funktioniert das. Aber nicht mit einer Zeichenkette.

Wie lautet die konkrete Fehlermeldung und wann kommt die?

Die Zeichenkette muss in einfache Anführungszeichen eingeschlossen sein (nicht in doppelte). (Sorry, falls das glasklar ist, aber oft liegt es ja an solchen Kleinigkeiten. :innocent:)

Sie haben es zwar geschrieben, aber können Sie einen Shot reinstellen, welcher Datentyp „IssueNumber“ bei Ihnen konkret hat?

Benutzen Sie den von uns ausgelieferten Original Trigger-Code? Wenn ja, basierend auf welcher cRM Version? Ist es die Large4 Solution von cRM10? Sonst hängen Sie Ihren Trigger-Code mal hier rein.

Hallo Björn,
die Anführungszeichen passen, der Datentyp von IssueNumber ist nvarchar(10) so wie im Screenshot. in dem Script steht :

DECLARE @IncrementedCounter AS int
....
[IssueNumber] = @IncrementedCounter 

Das Sript ist original von Combit, Large4 Solution.

Hier das Script mit der vorgeschlagenen Änderung:

USE [combit_Large4]
GO
/****** Object:  Trigger [dbo].[cmbt_Trigger_TransferSalesDocument]    Script Date: 09.04.2021 10:16:28 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- combit Relationship Manager
-- Funktion: Bereitstellen eines Triggers zum Wandeln eines Beleges
-- Name: cmbt_Trigger_TransferSalesDocument
-- 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
ALTER TRIGGER [dbo].[cmbt_Trigger_TransferSalesDocument] ON [dbo].[SalesDocuments]

-- Auslösen nur nach dem Einfügen oder Aktualisieren eines Datensatzes
AFTER INSERT, UPDATE

-- Trigger soll nicht ausgeführt werden, wenn ein Replikations-Agent die vom Trigger betroffene Tabelle ändert
NOT FOR REPLICATION

AS

BEGIN
			
	-- Bewirkt, dass die Meldung bezüglich der Anzahl der von einer Transact-SQL-Anweisung oder gespeicherten Prozedur betroffenen Zeilen nicht mehr als Teil des Resultsets zurückgegeben wird
	SET NOCOUNT ON
	
	-- Variablen deklarieren
	DECLARE @InsertedCount bigint
	DECLARE @DeletedCount bigint
	DECLARE @Reason int

	DECLARE @SalesDocumentID AS uniqueidentifier
	DECLARE @SourceDocumentID AS uniqueidentifier
	DECLARE @TransactionNumber AS nvarchar(10)
	DECLARE @IssueNumber AS nvarchar(10)
	DECLARE @Type AS int
	
	DECLARE @IncrementedCounter AS int
	DECLARE @IncrementedTransactionCounter AS int
	
	-- 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 UPDATE-Statement ausgeführt wurde...
	IF @DeletedCount = @InsertedCount
		SET @Reason = 1

	-- Prüfen, ob ein INSERT-Statement ausgeführt wurde...
	IF @DeletedCount = 0 AND @InsertedCount > 0
		SET @Reason = 2

	-- Deklarieren eines SQL-Servercursors, um durch alle Datensätze zu gehen
	DECLARE [RecCursorTransferSalesDocument] CURSOR STATIC FORWARD_ONLY READ_ONLY FOR
	SELECT [ID], [SourceDocumentID], [TransactionNumber], [IssueNumber], [Type]
	FROM [inserted]

	-- Öffnet den SQL-Servercursor
	OPEN [RecCursorTransferSalesDocument]
	  
	-- Ruft die nächste Zeile aus dem SQL-Servercursor ab
	FETCH NEXT FROM [RecCursorTransferSalesDocument] INTO @SalesDocumentID, @SourceDocumentID, @TransactionNumber, @IssueNumber, @Type
	WHILE @@FETCH_STATUS = 0
	BEGIN
			-- Nur, wenn ein neuer Datensatz angelegt wird...
		IF @Reason = 2
		BEGIN
			-- Wenn es noch keine Vorgangsnummer gibt...
			IF (@TransactionNumber IS NULL) OR (LEN(@TransactionNumber) = 0)
			BEGIN
				
				-- neue Vorgangsnummer über Zähler ermitteln
				EXEC cmbt_sp_IncrementCounterOutput @sCounterName = '221393660d174c5a93dd06c8e2053ff4', @nIncrement = 1, @Output = @IncrementedTransactionCounter OUTPUT

				-- neue Vorgangsnummer für das Schreiben in die Belege-Ansicht vorbereiten
				SET @TransactionNumber = CONVERT(nvarchar(10), @IncrementedTransactionCounter)
	
			END
			
			-- Wenn es noch keine Belegnummer gibt...
			IF (@IssueNumber IS NULL) OR (LEN(@IssueNumber) = 0)
			BEGIN

				-- Bei einem Angebot neue Angebotsnummer über Zähler ermitteln
				IF @Type = 1
					EXEC cmbt_sp_IncrementCounterOutput @sCounterName = '73474394b06a4ec6a69003252004883f', @nIncrement = 1, @Output = @IncrementedCounter OUTPUT

				-- Bei einem Auftrag neue Auftragsnummer über Zähler ermitteln
				ELSE IF	@Type = 2
					EXEC cmbt_sp_IncrementCounterOutput @sCounterName = '277291c9e3b646b9a907546947cdcc98', @nIncrement = 1, @Output = @IncrementedCounter OUTPUT

				-- Bei einer Rechnung neue Rechnungsnummer über Zähler ermitteln
				ELSE IF	@Type = 3
					EXEC cmbt_sp_IncrementCounterOutput @sCounterName = '0a1b57342a9a4f73bd691db63f29e9ad', @nIncrement = 1, @Output = @IncrementedCounter OUTPUT

				-- Bei einem Lieferschein neue Lieferscheinnummer über Zähler ermitteln
				ELSE IF	@Type = 4
					EXEC cmbt_sp_IncrementCounterOutput @sCounterName = 'c2b8ffcf05144045bec4c43b50a5cc04', @nIncrement = 1, @Output = @IncrementedCounter OUTPUT

				-- neue Belegnummer für das Schreiben in die Belege-Ansicht vorbereiten
				 SET @IssueNumber = N'MP' + CONVERT(nvarchar(1000), @IncrementedCounter)
				
			
			END

			-- Wenn es einen Ursprungs-Beleg gibt...
			IF @SourceDocumentID IS NOT NULL
			BEGIN
					
				-- Belegposten in den neuen Beleg kopieren
				INSERT INTO [SalesDocumentItems]
				(
					[ID],
					[SalesDocumentID],
					[ProductID],
					[ItemNo],
					[Description],
					[Specification],
					[Quantity],
					[StorageUnitID],
					[UnitPrice],
					[VATType],
					[ItemTotal],
					[ItemTotalVATOnly],
					[ItemTaxRate1],
					[ItemTaxRate2],
					[ItemTotalWithVAT],
					[CreatedOn],
					[CreatedBy],
					[ModifiedOn],
					[ModifiedBy]
				)
				SELECT
					NEWID(),
					@SalesDocumentID,
					[SalesDocumentItems].[ProductID],
					[SalesDocumentItems].[ItemNo],
					[SalesDocumentItems].[Description],
					[SalesDocumentItems].[Specification],
					[SalesDocumentItems].[Quantity],
					[SalesDocumentItems].[StorageUnitID],
					[SalesDocumentItems].[UnitPrice],
					[SalesDocumentItems].[VATType],
					[SalesDocumentItems].[ItemTotal],
					[SalesDocumentItems].[ItemTotalVATOnly],
					[SalesDocumentItems].[ItemTaxRate1],
					[SalesDocumentItems].[ItemTaxRate2],
					[SalesDocumentItems].[ItemTotalWithVAT],
					[SalesDocumentItems].[CreatedOn],
					[SalesDocumentItems].[CreatedBy],
					[SalesDocumentItems].[ModifiedOn],
					[SalesDocumentItems].[ModifiedBy]
				FROM [SalesDocumentItems]
				WHERE [SalesDocumentID] = @SourceDocumentID

			END

			-- Daten im Beleg aktualisieren
			UPDATE [SalesDocuments]
			SET
				[TransactionNumber] = @TransactionNumber,
				[IssueNumber] = @IncrementedCounter
			WHERE [ID] = @SalesDocumentID
	
		END
		
		-- Nur, wenn ein neuer Datensatz angelegt wird oder bestimmte Felder manipuliert werden...
		IF (@Reason = 2) OR (@Reason = 1 AND (UPDATE([Total]) OR UPDATE([TotalTaxRate1]) OR UPDATE([TotalTaxRate2]) OR UPDATE([TotalWithTax])))
		
			-- gespeicherte Prozedur ausführen, um die Summen im Beleg neu zu berechnen
			EXECUTE [cmbt_sp_RecalcSalesDocument] @SalesDocumentID

		-- Ruft die nächste Zeile aus dem SQL-Servercursor ab
		FETCH NEXT FROM [RecCursorTransferSalesDocument] INTO @SalesDocumentID, @SourceDocumentID, @TransactionNumber, @IssueNumber, @Type

	END

	-- Schließt den geöffneten SQL-Servercursor
	CLOSE [RecCursorTransferSalesDocument]

	-- Entfernt den SQL-Servercursorhinweis
	DEALLOCATE [RecCursorTransferSalesDocument]

END

Sorry die Antwort hat sich etwas verzögert. Eine kleine Knobelaufgabe war dann auch noch der Name Ihres Trigger-Codes. Denn den gibt es in der Large4 so nicht. Der Trigger Code scheint irgendwie aus der alten Large3 Solution zu stammen.

Probieren Sie einmal aus, dass Sie
image
beim Setzen der Belegnummer die @IssueNumber zuweisen (und nicht den @IncrementCounter). Sie haben schließlich oben ja die @IssueNumber mit dem ‚MP‘ Präfix versehen. :blush:

Wenn es weiterhin „nicht geht“, dann müssen Sie mal die genaue Fehlermeldung zitieren.