Hendrik_1971
Aktives Mitglied
Hallo an alle,
ich hätte gerne beim Kunden eine Information ( Eigene Felder) wieviele Paletten er bekommen hat.
Die Idee war einfach eine Palette als Artikel anlegen und per Workflow (wenn im Auftrag enthalten) diesen Wert + 1) setzen.
Dazu habe ich ein eigenes Feld bei Kunden angelegt und wollte dieses benutzen.
Es funktioniert auch soweit wenn ich den Workflow aufrufe. Leider aber nicht wenn dieses Feld bei einem Kunden leer ist. Sobald ich es händisch auf 1 setzen zählt er schön weiter.
Vielleicht kann mal jemand drüber schauen und mir helfen bitte
Mein Customworkflow sieht so aus:
-- Workflow SP anlegen
/* 1) UDT nur anlegen, wenn er fehlt */
IF NOT EXISTS (
SELECT 1
FROM sys.types t
JOIN sys.schemas s ON s.schema_id = t.schema_id
WHERE t.name = 'Parameter_spPalette_Anzahl'
AND s.name = 'CustomWorkflows'
)
EXEC('CREATE TYPE CustomWorkflows.Parameter_spPalette_Anzahl FROM INT;');
GO
/* 2) Anzeigename für den Parameter */
EXEC CustomWorkflows._SetActionParameterDisplayName
@parameterName = 'Parameter_spPalette_Anzahl',
@displayName = 'Anzahl';
GO
/* 3) Prozedur – robustes Inkrement auch bei leer/NULL/Text */
IF OBJECT_ID('CustomWorkflows.spPalette', 'P') IS NULL
EXEC('CREATE PROCEDURE CustomWorkflows.spPalette AS RETURN 0;');
GO
ALTER PROCEDURE CustomWorkflows.spPalette
@kKunde INT,
@Anzahl CustomWorkflows.Parameter_spPalette_Anzahl = 1 -- Default = 1
AS
BEGIN
SET NOCOUNT ON;
DECLARE @inc INT = ISNULL(@Anzahl, 1);
/* a) fehlenden Datensatz anlegen */
IF NOT EXISTS (
SELECT 1
FROM kunde.tkundeEigenesfeld WITH (UPDLOCK, HOLDLOCK)
WHERE kKunde = @kKunde
)
BEGIN
INSERT INTO kunde.tkundeEigenesfeld (kKunde, nWertInt)
VALUES (@kKunde, 0);
END;
/* b) sauber inkrementieren – leer/NULL/nicht-numerisch -> 0 */
;WITH Norm AS (
SELECT
k.kKunde,
-- Rohwert immer als Text behandeln
LTRIM(RTRIM(CONVERT(VARCHAR(50), k.nWertInt))) AS RawTxt
FROM kunde.tkundeEigenesfeld AS k
WHERE k.kKunde = @kKunde
),
BaseVal AS (
SELECT
kKunde,
CASE
WHEN RawTxt IS NULL OR RawTxt = '' THEN 0
WHEN RawTxt LIKE '%[^0-9-]%' THEN 0 -- enthält Nicht-Ziffern -> 0
WHEN RawTxt = '-' THEN 0 -- nur Minuszeichen -> 0
ELSE CONVERT(INT, RawTxt) -- sicher numerisch
END AS Basis
FROM Norm
)
UPDATE k
SET nWertInt =
-- Ergebnis wieder als Zahl setzen; falls Spalte VARCHAR ist,
-- konvertiert SQL Server implizit zu Text.
(SELECT Basis FROM BaseVal) + @inc
FROM kunde.tkundeEigenesfeld AS k
WHERE k.kKunde = @kKunde;
END
GO
/* 4) Aktion prüfen */
EXEC CustomWorkflows._CheckAction @actionName = 'spPalette';
GO
/* 5) Anzeigename für die Aktion */
EXEC CustomWorkflows._SetActionDisplayName
@actionName = 'spPalette',
@displayname = 'Palettenkonto';
GO
ich hätte gerne beim Kunden eine Information ( Eigene Felder) wieviele Paletten er bekommen hat.
Die Idee war einfach eine Palette als Artikel anlegen und per Workflow (wenn im Auftrag enthalten) diesen Wert + 1) setzen.
Dazu habe ich ein eigenes Feld bei Kunden angelegt und wollte dieses benutzen.
Es funktioniert auch soweit wenn ich den Workflow aufrufe. Leider aber nicht wenn dieses Feld bei einem Kunden leer ist. Sobald ich es händisch auf 1 setzen zählt er schön weiter.
Vielleicht kann mal jemand drüber schauen und mir helfen bitte
Mein Customworkflow sieht so aus:
-- Workflow SP anlegen
/* 1) UDT nur anlegen, wenn er fehlt */
IF NOT EXISTS (
SELECT 1
FROM sys.types t
JOIN sys.schemas s ON s.schema_id = t.schema_id
WHERE t.name = 'Parameter_spPalette_Anzahl'
AND s.name = 'CustomWorkflows'
)
EXEC('CREATE TYPE CustomWorkflows.Parameter_spPalette_Anzahl FROM INT;');
GO
/* 2) Anzeigename für den Parameter */
EXEC CustomWorkflows._SetActionParameterDisplayName
@parameterName = 'Parameter_spPalette_Anzahl',
@displayName = 'Anzahl';
GO
/* 3) Prozedur – robustes Inkrement auch bei leer/NULL/Text */
IF OBJECT_ID('CustomWorkflows.spPalette', 'P') IS NULL
EXEC('CREATE PROCEDURE CustomWorkflows.spPalette AS RETURN 0;');
GO
ALTER PROCEDURE CustomWorkflows.spPalette
@kKunde INT,
@Anzahl CustomWorkflows.Parameter_spPalette_Anzahl = 1 -- Default = 1
AS
BEGIN
SET NOCOUNT ON;
DECLARE @inc INT = ISNULL(@Anzahl, 1);
/* a) fehlenden Datensatz anlegen */
IF NOT EXISTS (
SELECT 1
FROM kunde.tkundeEigenesfeld WITH (UPDLOCK, HOLDLOCK)
WHERE kKunde = @kKunde
)
BEGIN
INSERT INTO kunde.tkundeEigenesfeld (kKunde, nWertInt)
VALUES (@kKunde, 0);
END;
/* b) sauber inkrementieren – leer/NULL/nicht-numerisch -> 0 */
;WITH Norm AS (
SELECT
k.kKunde,
-- Rohwert immer als Text behandeln
LTRIM(RTRIM(CONVERT(VARCHAR(50), k.nWertInt))) AS RawTxt
FROM kunde.tkundeEigenesfeld AS k
WHERE k.kKunde = @kKunde
),
BaseVal AS (
SELECT
kKunde,
CASE
WHEN RawTxt IS NULL OR RawTxt = '' THEN 0
WHEN RawTxt LIKE '%[^0-9-]%' THEN 0 -- enthält Nicht-Ziffern -> 0
WHEN RawTxt = '-' THEN 0 -- nur Minuszeichen -> 0
ELSE CONVERT(INT, RawTxt) -- sicher numerisch
END AS Basis
FROM Norm
)
UPDATE k
SET nWertInt =
-- Ergebnis wieder als Zahl setzen; falls Spalte VARCHAR ist,
-- konvertiert SQL Server implizit zu Text.
(SELECT Basis FROM BaseVal) + @inc
FROM kunde.tkundeEigenesfeld AS k
WHERE k.kKunde = @kKunde;
END
GO
/* 4) Aktion prüfen */
EXEC CustomWorkflows._CheckAction @actionName = 'spPalette';
GO
/* 5) Anzeigename für die Aktion */
EXEC CustomWorkflows._SetActionDisplayName
@actionName = 'spPalette',
@displayname = 'Palettenkonto';
GO