FNCUST_GET_JSON_INVOICE_DATA: Erste Tabellenfunktion

This commit is contained in:
2026-02-26 14:24:18 +01:00
parent 1477da92ac
commit 1f4d919a0f

View File

@@ -3,13 +3,15 @@ GO
SET QUOTED_IDENTIFIER ON SET QUOTED_IDENTIFIER ON
GO GO
-- [PRCUST_SET_JSON_INVOICE_DATA] -- [FNCUST_GET_JSON_INVOICE_DATA]
-- ================================================================= -- =================================================================
-- Reads invoice data from relational tables and returns a normalized -- Reads invoice data from relational tables and returns a normalized
-- JSON response matching the CreateInvoice_Request structure. -- JSON response matching the CreateInvoice_Request structure.
-- --
-- Parameter: @DocumentID INT = NULL (NULL = alle Dokumente) -- Parameter: @DocumentID INT = NULL (NULL = alle Dokumente)
-- Returns: RESULTSET; success/message/data -- Returns: TABLE (success BIT, message NVARCHAR(MAX), data NVARCHAR(MAX))
-- Usage: SELECT * FROM dbo.FNCUST_GET_JSON_INVOICE_DATA(NULL)
-- SELECT * FROM dbo.FNCUST_GET_JSON_INVOICE_DATA(42)
-- ================================================================= -- =================================================================
-- Copyright (c) 2026 by Digital Data GmbH -- Copyright (c) 2026 by Digital Data GmbH
-- --
@@ -18,79 +20,40 @@ GO
-- ================================================================= -- =================================================================
-- Creation Date / Author: 26.02.2026 / MK -- Creation Date / Author: 26.02.2026 / MK
-- Version Date / Editor: 26.02.2026 / MK -- Version Date / Editor: 26.02.2026 / MK
-- Version Number: 2.0.0.0 -- Version Number: 3.0.0.0
-- ================================================================= -- =================================================================
-- History: -- History:
-- 26.02.2026 / MK - Initial version based on JSON invoice import -- 26.02.2026 / MK - Initial version based on JSON invoice import
-- 26.02.2026 / MK - Style harmonized to PRDEX convention -- 26.02.2026 / MK - Style harmonized to PRDEX convention
-- 26.02.2026 / MK - #3 CAST(NULL AS NVARCHAR(MAX)) for consistent data type
-- 26.02.2026 / MK - #4 RETURN @RETURN_STATUS for proper return codes
-- 26.02.2026 / MK - #12 Extended error diagnostics in CATCH
-- 26.02.2026 / MK - #16 success column as BIT
-- 26.02.2026 / MK - Umstellung auf Export-Prozedur (Tabellen → JSON) -- 26.02.2026 / MK - Umstellung auf Export-Prozedur (Tabellen → JSON)
-- 26.02.2026 / MK - JSON-Ausgabe: camelCase, INCLUDE_NULL_VALUES, CreateInvoice_Request-Vorlage -- 26.02.2026 / MK - JSON-Ausgabe: camelCase, INCLUDE_NULL_VALUES, CreateInvoice_Request-Vorlage
-- 26.02.2026 / MK - Umbau zu Inline-Tabellenwertfunktion (ITVF)
CREATE OR ALTER PROCEDURE [dbo].[PRCUST_SET_JSON_INVOICE_DATA]( CREATE OR ALTER FUNCTION [dbo].[FNCUST_GET_JSON_INVOICE_DATA](
@DocumentID INT = NULL @DocumentID INT = NULL
) )
RETURNS TABLE
AS AS
BEGIN TRY RETURN
SET NOCOUNT ON;
-- declare runtime vars
DECLARE @MY_PROCEDURE_NAME NVARCHAR(128) = OBJECT_NAME(@@PROCID),
@RETURN_STATUS INT = 0,
@RETURN_STATUS_TEXT NVARCHAR(MAX) = CONCAT('START PROCEDURE [',OBJECT_NAME(@@PROCID),'] @ ',CONVERT(VARCHAR(50),GETDATE(),120)),
@RETURN_ERROR_TEXT NVARCHAR(MAX) = N'';
DECLARE @output NVARCHAR(MAX);
PRINT '====================================================================================================';
PRINT @RETURN_STATUS_TEXT;
PRINT '';
--==========================================-- Validate: Document exists --==========================================--
IF @DocumentID IS NOT NULL AND NOT EXISTS (SELECT 1 FROM dbo.PurchaseDocument WHERE DocumentID = @DocumentID) BEGIN
SET @RETURN_STATUS = 40001;
SET @RETURN_STATUS_TEXT = N'Document not found.';
SET @RETURN_ERROR_TEXT = N'Kein PurchaseDocument mit DocumentID = ' + CAST(@DocumentID AS NVARCHAR(20)) + N' gefunden.';
PRINT 'ERROR: ' + @RETURN_ERROR_TEXT;
SELECT
success = CAST(0 AS BIT)
, message = @RETURN_ERROR_TEXT
, data = CAST(NULL AS NVARCHAR(MAX));
RETURN @RETURN_STATUS;
END;
-----------------------------------------------------------------------------------------------------------------------------------
--========================================-- Validate: Any documents available --========================================--
IF NOT EXISTS (SELECT 1 FROM dbo.PurchaseDocument WHERE @DocumentID IS NULL OR DocumentID = @DocumentID) BEGIN
SET @RETURN_STATUS = 40002;
SET @RETURN_STATUS_TEXT = N'No documents available.';
SET @RETURN_ERROR_TEXT = N'Keine PurchaseDocuments vorhanden.';
PRINT 'ERROR: ' + @RETURN_ERROR_TEXT;
SELECT
success = CAST(0 AS BIT)
, message = @RETURN_ERROR_TEXT
, data = CAST(NULL AS NVARCHAR(MAX));
RETURN @RETURN_STATUS;
END;
-----------------------------------------------------------------------------------------------------------------------------------
PRINT 'INFO: Erzeuge JSON-Ausgabe...';
--===============================================-- Build output JSON result --===============================================--
SELECT @output =
( (
SELECT
--==== success ====--
success = CAST(IIF(v.status = 0, 1, 0) AS BIT)
--==== message ====--
, message = CAST(
CASE v.status
WHEN 1 THEN N'Kein PurchaseDocument mit DocumentID = ' + CAST(@DocumentID AS NVARCHAR(20)) + N' gefunden.'
WHEN 2 THEN N'Keine PurchaseDocuments vorhanden.'
ELSE N'Daten erfolgreich verarbeitet.'
END
AS NVARCHAR(MAX))
--==== data ====--
, data = CAST(
CASE WHEN v.status > 0 THEN NULL
ELSE (
--===============================================-- Build output JSON result --===============================================--
SELECT SELECT
JSON_QUERY( JSON_QUERY(
COALESCE( COALESCE(
@@ -205,42 +168,21 @@ BEGIN TRY
) )
) AS purchaseDocuments ) AS purchaseDocuments
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
-----------------------------------------------------------------------------------------------------------------------------------
)
END
AS NVARCHAR(MAX))
FROM (VALUES (1)) AS src(x)
CROSS APPLY (
SELECT status = CASE
WHEN @DocumentID IS NOT NULL
AND NOT EXISTS (SELECT 1 FROM dbo.PurchaseDocument WHERE DocumentID = @DocumentID)
THEN 1
WHEN NOT EXISTS (SELECT 1 FROM dbo.PurchaseDocument WHERE @DocumentID IS NULL OR DocumentID = @DocumentID)
THEN 2
ELSE 0
END
) AS v
); );
-----------------------------------------------------------------------------------------------------------------------------------
SET @RETURN_STATUS = 0;
SET @RETURN_STATUS_TEXT = CONCAT('END PROCEDURE [',@MY_PROCEDURE_NAME,'] @ ',CONVERT(NVARCHAR(50),GETDATE(),120));
PRINT '';
PRINT @RETURN_STATUS_TEXT;
PRINT '====================================================================================================';
SELECT
success = CAST(1 AS BIT)
, message = N'Daten erfolgreich verarbeitet.'
, data = @output;
RETURN @RETURN_STATUS;
END TRY BEGIN CATCH
--====================================================-- exception / error --====================================================--
SET @RETURN_STATUS = 50000;
SET @RETURN_STATUS_TEXT = CONCAT('END PROCEDURE [',OBJECT_NAME(@@PROCID),'] @ ',CONVERT(NVARCHAR(50),GETDATE(),120));
SET @RETURN_ERROR_TEXT = CONCAT('ERR ',ERROR_NUMBER(),' SEV ',ERROR_SEVERITY(),' STATE ',ERROR_STATE(),' LINE ',ERROR_LINE(),': ',ERROR_MESSAGE());
PRINT 'ERROR IN PROCEDURE: [' + OBJECT_NAME(@@PROCID) + ']' + CHAR(13) + @RETURN_ERROR_TEXT;
PRINT @RETURN_STATUS_TEXT;
PRINT '====================================================================================================';
-----------------------------------------------------------------------------------------------------------------------------------
SELECT
success = CAST(0 AS BIT)
, message = ERROR_MESSAGE()
, data = CAST(NULL AS NVARCHAR(MAX));
RETURN @RETURN_STATUS;
END CATCH;
GO GO