diff --git a/SWESQL/SQL-Server/Prozeduren/[PRCUST_SET_JSON_INVOICE_DATA].sql b/SWESQL/SQL-Server/Prozeduren/[PRCUST_SET_JSON_INVOICE_DATA].sql index bda272e..5413a7f 100644 --- a/SWESQL/SQL-Server/Prozeduren/[PRCUST_SET_JSON_INVOICE_DATA].sql +++ b/SWESQL/SQL-Server/Prozeduren/[PRCUST_SET_JSON_INVOICE_DATA].sql @@ -3,13 +3,15 @@ GO SET QUOTED_IDENTIFIER ON GO --- [PRCUST_SET_JSON_INVOICE_DATA] +-- [FNCUST_GET_JSON_INVOICE_DATA] -- ================================================================= -- Reads invoice data from relational tables and returns a normalized -- JSON response matching the CreateInvoice_Request structure. -- -- 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 -- @@ -18,229 +20,169 @@ GO -- ================================================================= -- Creation Date / Author: 26.02.2026 / MK -- Version Date / Editor: 26.02.2026 / MK --- Version Number: 2.0.0.0 +-- Version Number: 3.0.0.0 -- ================================================================= -- History: -- 26.02.2026 / MK - Initial version based on JSON invoice import -- 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 - 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 ) +RETURNS TABLE AS -BEGIN TRY +RETURN +( + SELECT + --==== success ====-- + success = CAST(IIF(v.status = 0, 1, 0) AS BIT) - SET NOCOUNT ON; + --==== 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)) - -- 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 - JSON_QUERY( - COALESCE( - ( - SELECT - [documentType] = pd.DocumentType - , [no] = pd.No_ - , [noSeries] = pd.NoSeries - , [processIDTransfer] = pd.ProcessIDTransfer - , [buyFromVendorNo] = pd.BuyFromVendorNo - , [payToVendorNo] = pd.PayToVendorNo - , [postingDate] = pd.PostingDate - , [paymentTermsCode] = pd.PaymentTermsCode - , [paymentTermsCodeIR] = pd.PaymentTermsCodeIR - , [dueDate] = pd.DueDate - , [pmtDiscountDate] = pd.PmtDiscountDate - , [paymentDiscount] = pd.PaymentDiscount - , [paymentDiscountIR] = pd.PaymentDiscountIR - , [currencyCode] = pd.CurrencyCode - , [invoiceDiscCode] = pd.InvoiceDiscCode - , [postingDescription] = pd.PostingDescription - , [paymentMethodCode] = pd.PaymentMethodCode - , [vendorInvoiceNo] = pd.VendorInvoiceNo - , [vendorCrMemoNo] = pd.VendorCrMemoNo - , [phrVendorBankAccountCode] = pd.PhrVendorBankAccountCode - , [phrBankBranchNo] = pd.PhrBankBranchNo - , [phrBankAccountNo] = pd.PhrBankAccountNo - , [phrIBAN] = pd.PhrIBAN - , [phrSWIFTCode] = pd.PhrSWIFTCode - , [phrBankName] = pd.PhrBankName - , [phrBankAccountEntryPriority] = pd.PhrBankAccountEntryPriority - , [phrRMCashDiscountReceived] = pd.PhrRMCashDiscountReceived - , [phrRMAmountIncludingVAT] = pd.PhrRMAmountIncludingVAT - , [phrRMAmountLessDiscount] = pd.PhrRMAmountLessDiscount - , purchaseLines = JSON_QUERY( - COALESCE( - ( - SELECT - [attachedToLineNo] = pl.AttachedToLineNo - , [type] = pl.Type - , [no] = pl.No_ - , [description] = pl.Description - , [description2] = pl.Description2 - , [locationCode] = pl.LocationCode - , [variantCode] = pl.VariantCode - , [quantity] = pl.Quantity - , [unitOfMeasureCode] = pl.UnitOfMeasureCode - , [directUnitCost] = pl.DirectUnitCost - , [lineDiscount] = pl.LineDiscount - , [ableToDiscount] = pl.AbleToDiscount - , [discountCalculated] = pl.DiscountCalculated - , [workOrderNo] = pl.WorkOrderNo - , [genBusPostingGroup] = pl.GenBusPostingGroup - , [genProdPostingGroup] = pl.GenProdPostingGroup - , [vatBusPostingGroup] = pl.VatBusPostingGroup - , [vatProdPostingGroup] = pl.VatProdPostingGroup - , [applToItemEntry] = pl.ApplToItemEntry - , [postingWithoutApply] = pl.PostingWithoutApply - , [anticipatedPayment] = pl.AnticipatedPayment - , [receiptNo] = pl.ReceiptNo - , [receiptLineNo] = pl.ReceiptLineNo - , [irOrderNo] = pl.IrOrderNo - , [irOrderLineNo] = pl.IrOrderLineNo - , dimSetEntries = JSON_QUERY( - COALESCE( - ( - SELECT - [dimensionCode] = d.DimensionCode - , [dimensionValueCode] = d.DimensionValueCode - FROM dbo.DimSetEntry d - WHERE d.LineID = pl.LineID - FOR JSON PATH, INCLUDE_NULL_VALUES + --==== data ====-- + , data = CAST( + CASE WHEN v.status > 0 THEN NULL + ELSE ( + --===============================================-- Build output JSON result --===============================================-- + SELECT + JSON_QUERY( + COALESCE( + ( + SELECT + [documentType] = pd.DocumentType + , [no] = pd.No_ + , [noSeries] = pd.NoSeries + , [processIDTransfer] = pd.ProcessIDTransfer + , [buyFromVendorNo] = pd.BuyFromVendorNo + , [payToVendorNo] = pd.PayToVendorNo + , [postingDate] = pd.PostingDate + , [paymentTermsCode] = pd.PaymentTermsCode + , [paymentTermsCodeIR] = pd.PaymentTermsCodeIR + , [dueDate] = pd.DueDate + , [pmtDiscountDate] = pd.PmtDiscountDate + , [paymentDiscount] = pd.PaymentDiscount + , [paymentDiscountIR] = pd.PaymentDiscountIR + , [currencyCode] = pd.CurrencyCode + , [invoiceDiscCode] = pd.InvoiceDiscCode + , [postingDescription] = pd.PostingDescription + , [paymentMethodCode] = pd.PaymentMethodCode + , [vendorInvoiceNo] = pd.VendorInvoiceNo + , [vendorCrMemoNo] = pd.VendorCrMemoNo + , [phrVendorBankAccountCode] = pd.PhrVendorBankAccountCode + , [phrBankBranchNo] = pd.PhrBankBranchNo + , [phrBankAccountNo] = pd.PhrBankAccountNo + , [phrIBAN] = pd.PhrIBAN + , [phrSWIFTCode] = pd.PhrSWIFTCode + , [phrBankName] = pd.PhrBankName + , [phrBankAccountEntryPriority] = pd.PhrBankAccountEntryPriority + , [phrRMCashDiscountReceived] = pd.PhrRMCashDiscountReceived + , [phrRMAmountIncludingVAT] = pd.PhrRMAmountIncludingVAT + , [phrRMAmountLessDiscount] = pd.PhrRMAmountLessDiscount + , purchaseLines = JSON_QUERY( + COALESCE( + ( + SELECT + [attachedToLineNo] = pl.AttachedToLineNo + , [type] = pl.Type + , [no] = pl.No_ + , [description] = pl.Description + , [description2] = pl.Description2 + , [locationCode] = pl.LocationCode + , [variantCode] = pl.VariantCode + , [quantity] = pl.Quantity + , [unitOfMeasureCode] = pl.UnitOfMeasureCode + , [directUnitCost] = pl.DirectUnitCost + , [lineDiscount] = pl.LineDiscount + , [ableToDiscount] = pl.AbleToDiscount + , [discountCalculated] = pl.DiscountCalculated + , [workOrderNo] = pl.WorkOrderNo + , [genBusPostingGroup] = pl.GenBusPostingGroup + , [genProdPostingGroup] = pl.GenProdPostingGroup + , [vatBusPostingGroup] = pl.VatBusPostingGroup + , [vatProdPostingGroup] = pl.VatProdPostingGroup + , [applToItemEntry] = pl.ApplToItemEntry + , [postingWithoutApply] = pl.PostingWithoutApply + , [anticipatedPayment] = pl.AnticipatedPayment + , [receiptNo] = pl.ReceiptNo + , [receiptLineNo] = pl.ReceiptLineNo + , [irOrderNo] = pl.IrOrderNo + , [irOrderLineNo] = pl.IrOrderLineNo + , dimSetEntries = JSON_QUERY( + COALESCE( + ( + SELECT + [dimensionCode] = d.DimensionCode + , [dimensionValueCode] = d.DimensionValueCode + FROM dbo.DimSetEntry d + WHERE d.LineID = pl.LineID + FOR JSON PATH, INCLUDE_NULL_VALUES + ) + , '[]' + ) ) - , '[]' - ) - ) - , itemChargeAssignmentLines = JSON_QUERY( - COALESCE( - ( - SELECT - [itemChargeNo] = ia.ItemChargeNo - , [unitCost] = ia.UnitCost - , [appliesToDocType] = ia.AppliesToDocType - , [appliesToDocNo] = ia.AppliesToDocNo - , [appliesToDocLineNo] = ia.AppliesToDocLineNo - , [itemNo] = ia.ItemNo - , [description] = ia.Description - , [qtyToAssign] = ia.QtyToAssign - , [qtyAssigned] = ia.QtyAssigned - , [amountToAssign] = ia.AmountToAssign - , [appliesToDocLineAmount] = ia.AppliesToDocLineAmount - FROM dbo.ItemChargeAssignment ia - WHERE ia.LineID = pl.LineID - FOR JSON PATH, INCLUDE_NULL_VALUES + , itemChargeAssignmentLines = JSON_QUERY( + COALESCE( + ( + SELECT + [itemChargeNo] = ia.ItemChargeNo + , [unitCost] = ia.UnitCost + , [appliesToDocType] = ia.AppliesToDocType + , [appliesToDocNo] = ia.AppliesToDocNo + , [appliesToDocLineNo] = ia.AppliesToDocLineNo + , [itemNo] = ia.ItemNo + , [description] = ia.Description + , [qtyToAssign] = ia.QtyToAssign + , [qtyAssigned] = ia.QtyAssigned + , [amountToAssign] = ia.AmountToAssign + , [appliesToDocLineAmount] = ia.AppliesToDocLineAmount + FROM dbo.ItemChargeAssignment ia + WHERE ia.LineID = pl.LineID + FOR JSON PATH, INCLUDE_NULL_VALUES + ) + , '[]' + ) ) - , '[]' - ) + FROM dbo.PurchaseLine pl + WHERE pl.DocumentID = pd.DocumentID + FOR JSON PATH, INCLUDE_NULL_VALUES ) - FROM dbo.PurchaseLine pl - WHERE pl.DocumentID = pd.DocumentID - FOR JSON PATH, INCLUDE_NULL_VALUES + , '[]' + ) ) - , '[]' - ) + FROM dbo.PurchaseDocument pd + WHERE @DocumentID IS NULL OR pd.DocumentID = @DocumentID + ORDER BY pd.DocumentID + FOR JSON PATH, INCLUDE_NULL_VALUES ) - FROM dbo.PurchaseDocument pd - WHERE @DocumentID IS NULL OR pd.DocumentID = @DocumentID - ORDER BY pd.DocumentID - FOR JSON PATH, INCLUDE_NULL_VALUES - ) - , '[]' - ) - ) AS purchaseDocuments - FOR JSON PATH, WITHOUT_ARRAY_WRAPPER - ); - ----------------------------------------------------------------------------------------------------------------------------------- + , '[]' + ) + ) AS purchaseDocuments + FOR JSON PATH, WITHOUT_ARRAY_WRAPPER + ----------------------------------------------------------------------------------------------------------------------------------- + ) + END + AS NVARCHAR(MAX)) - 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; + 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 +); GO