ساخت و مدیریت قالبهای سند در SQL Server: راهنمای گام به گام برای ذخیرهسازی و تولید پویا
مدیریت قالبهای سند در SQL Server برای برنامههایی که نیاز به تولید خروجیهای فرمتبندی شده و تکراری دارند، یک چالش رایج است. این راهنما نحوه ایجاد، ذخیره و استفاده از این قالبها را در پایگاه داده SQL Server به منظور تولید اسناد پویا آموزش میدهد. با این روش، میتوانیم فرآیند تولید سند را بهینهسازی کرده و انعطافپذیری بیشتری در مدیریت قالبهای سازمانی به دست آوریم.
سناریو: ذخیره و تولید قالبهای سند
فرض کنید نیاز به ذخیره قالبهای مختلف سند (مانند فاکتورها، سفارشات خرید، قراردادها و غیره) در یک پایگاه داده SQL Server دارید. هدف این است که این قالبها را از پایگاه داده بازیابی کرده و به صورت پویا مقادیر خاصی را در آنها جایگزین کنیم تا سند نهایی تولید شود. برای این کار، میتوانیم یک جدول برای نگهداری قالبها ایجاد کرده و یک رویه ذخیره شده (Stored Procedure) برای پردازش و تولید این اسناد توسعه دهیم.
ایجاد جدول برای ذخیره قالبهای سند
اولین گام در پیادهسازی یک سیستم مدیریت قالب سند در SQL Server، ایجاد یک جدول مناسب برای نگهداری این قالبها است. این جدول شامل ستونهایی برای یک شناسه منحصر به فرد (TemplateID)، نام قالب (TemplateName) و محتوای واقعی قالب (TemplateContent) خواهد بود. برای ذخیره محتوای متنی قالب که میتواند شامل متن، تگهای جایگزین و حتی ساختارهای ساده HTML باشد، از نوع داده `NVARCHAR(MAX)` استفاده میکنیم. این نوع داده فضای کافی برای ذخیره قالبهای طولانی را فراهم میکند.
CREATE TABLE dbo.DocumentTemplates
(
TemplateID INT IDENTITY(1,1) PRIMARY KEY,
TemplateName NVARCHAR(255) NOT NULL UNIQUE,
TemplateContent NVARCHAR(MAX) NOT NULL
);
این کد یک جدول به نام `DocumentTemplates` در شمای `dbo` ایجاد میکند. ستون `TemplateID` به عنوان کلید اصلی عمل کرده و به صورت خودکار افزایش مییابد. `TemplateName` نام منحصر به فرد قالب را نگهداری میکند و `TemplateContent` نیز محتوای کامل متن قالب را ذخیره میکند.
وارد کردن قالبهای نمونه
پس از ایجاد جدول، میتوانیم چند قالب سند نمونه را به جدول `dbo.DocumentTemplates` وارد کنیم. برای تعریف متغیرهایی که باید به صورت پویا جایگزین شوند، از یک الگوی خاص مانند `[[نام_متغیر]]` استفاده میکنیم. این الگو به ما امکان میدهد تا به راحتی مکانهایی را که نیاز به جایگزینی دارند، شناسایی کنیم و سپس مقادیر واقعی را در زمان تولید سند، جایگزین آنها کنیم. این رویکرد به انعطافپذیری و نگهداری آسانتر قالبها کمک میکند.
INSERT INTO dbo.DocumentTemplates (TemplateName, TemplateContent) VALUES
('Invoice', 'Dear [[CustomerName]],
Thank you for your business. Your invoice number is [[InvoiceNumber]] for the amount of [[AmountDue]].
Please make payment by [[PaymentDueDate]].
Sincerely,
[[CompanyName]]'),
('PurchaseOrder', 'Purchase Order from [[VendorName]] for item [[ItemName]] at quantity [[Quantity]] for [[Price]].
Order Date: [[OrderDate]]
Please ship to: [[ShippingAddress]]
Regards,
[[BuyerName]]');
در این مثال، ما دو قالب (‘Invoice’ و ‘PurchaseOrder’) را با جایگزینهای متنی مشخص (`[[CustomerName]]`, `[[InvoiceNumber]]` و غیره) وارد کردیم. این متغیرها بعداً توسط رویه ذخیره شده با دادههای واقعی جایگزین خواهند شد.
ایجاد رویه ذخیره شده برای تولید سند
برای بازیابی و پردازش قالبها و جایگزینی متغیرها، یک رویه ذخیره شده (Stored Procedure) ایجاد میکنیم. این رویه، نام قالب را به عنوان ورودی دریافت کرده و سپس لیستی از جفتهای کلید-مقدار (Key-Value) را برای جایگزینی پارامترها میگیرد. از تابع `REPLACE` SQL Server برای جایگزینی تمام نمونههای متغیرهای تعریف شده در قالب استفاده میشود. ما از ورودی JSON برای پارامترهای جایگزینی استفاده خواهیم کرد که در SQL Server 2016 و نسخههای جدیدتر به خوبی پشتیبانی میشود.
CREATE PROCEDURE dbo.GenerateDocumentFromTemplate
@TemplateName NVARCHAR(255),
@Replacements NVARCHAR(MAX) -- JSON or XML for key-value pairs
AS
BEGIN
SET NOCOUNT ON;
DECLARE @DocumentContent NVARCHAR(MAX);
-- Get the template content based on the provided name
SELECT @DocumentContent = TemplateContent
FROM dbo.DocumentTemplates
WHERE TemplateName = @TemplateName;
IF @DocumentContent IS NULL
BEGIN
RAISERROR('Template not found.', 16, 1);
RETURN;
END
-- Assuming @Replacements is a JSON array of objects like [{"Key":"[[CustomerName]]", "Value":"John Doe"}]
-- This requires SQL Server 2016+ for JSON functions.
-- It iterates through each key-value pair in the JSON and replaces occurrences in the document content.
SELECT @DocumentContent = REPLACE(@DocumentContent, JSON_VALUE(T.value, '$.Key'), JSON_VALUE(T.value, '$.Value'))
FROM OPENJSON(@Replacements) AS T;
-- If you were using XML for @Replacements (e.g., ......):
-- DECLARE @xml_replacements XML = @Replacements;
-- SELECT @DocumentContent = REPLACE(@DocumentContent, T.Key.value('(Key/text())[1]', 'NVARCHAR(255)'), T.Key.value('(Value/text())[1]', 'NVARCHAR(MAX)'))
-- FROM @xml_replacements.nodes('/Replacements/Replacement') AS T(Key);
-- Return the generated document content
SELECT @DocumentContent AS GeneratedDocument;
END;
این رویه ذخیره شده دو پارامتر میگیرد: `TemplateName` برای شناسایی قالب و `Replacements` که یک رشته JSON حاوی جفتهای کلید-مقدار (مثلاً `{“Key”:”[[CustomerName]]”, “Value”:”John Doe”}`) برای جایگزینی است. رویه ابتدا محتوای قالب را بازیابی کرده، سپس با استفاده از تابع `REPLACE` و توابع JSON (برای SQL Server 2016 به بالا)، تمام متغیرها را با مقادیر مربوطه جایگزین میکند. در نهایت، سند تولید شده را برمیگرداند. این روش امکان مدیریت انعطافپذیر پارامترها را فراهم میکند.
نحوه فراخوانی رویه ذخیره شده و تولید سند
برای استفاده از رویه ذخیره شده `dbo.GenerateDocumentFromTemplate`، باید نام قالب مورد نظر و یک رشته JSON حاوی اطلاعات جایگزینی را به عنوان پارامتر ارسال کنید. این رشته JSON شامل جفتهای “Key” (نام متغیر در قالب) و “Value” (مقدار جایگزین) است. مثالهای زیر نحوه تولید یک فاکتور و یک سفارش خرید را نشان میدهند:
DECLARE @InvoiceReplacements NVARCHAR(MAX) = N'[
{"Key":"[[CustomerName]]", "Value":"علی احمدی"},
{"Key":"[[InvoiceNumber]]", "Value":"INV-2023-001"},
{"Key":"[[AmountDue]]", "Value":"1,250,000 تومان"},
{"Key":"[[PaymentDueDate]]", "Value":"2023-12-31"},
{"Key":"[[CompanyName]]", "Value":"شرکت توسعه فنآوری پارس"}
]';
EXEC dbo.GenerateDocumentFromTemplate
@TemplateName = 'Invoice',
@Replacements = @InvoiceReplacements;
و در اینجا مثالی برای تولید سفارش خرید با استفاده از همین رویه ذخیره شده و دادههای جایگزینی متفاوت:
DECLARE @PurchaseOrderReplacements NVARCHAR(MAX) = N'[
{"Key":"[[VendorName]]", "Value":"تامین کننده بزرگ"},
{"Key":"[[ItemName]]", "Value":"لپتاپ گیمینگ"},
{"Key":"[[Quantity]]", "Value":"2"},
{"Key":"[[Price]]", "Value":"35,000,000 تومان"},
{"Key":"[[OrderDate]]", "Value":"2023-11-15"},
{"Key":"[[ShippingAddress]]", "Value":"تهران، خیابان ولیعصر، پلاک 100"},
{"Key":"[[BuyerName]]", "Value":"مدیر خرید"}
]';
EXEC dbo.GenerateDocumentFromTemplate
@TemplateName = 'PurchaseOrder',
@Replacements = @PurchaseOrderReplacements;
این دستورات رویه ذخیره شده را با دادههای لازم فراخوانی میکنند و در نتیجه، سند نهایی با جایگزینیهای صحیح تولید میشود. خروجی شامل محتوای سند کامل و آماده برای استفاده در برنامههای کاربردی شما است. این رویکرد به طور موثر به تولید اسناد پویا کمک میکند و مدیریت قالبها را متمرکز و ساده میسازد.
مزایای این رویکرد در مدیریت قالب سند
- تمرکزگرایی: تمامی قالبهای سند در یک مکان مرکزی در پایگاه داده SQL Server مدیریت میشوند. این امر به حفظ یکپارچگی و دسترسی آسان به تمام قالبها کمک میکند.
- انعطافپذیری: به راحتی میتوان قالبهای جدید اضافه کرد یا قالبهای موجود را بدون نیاز به تغییر کد برنامه، ویرایش کرد. این انعطافپذیری برای سیستمهایی که نیاز به بهروزرسانی مکرر قالبها دارند، حیاتی است.
- کارایی: تولید سند به صورت مستقیم در سطح پایگاه داده انجام میشود که میتواند برای حجم بالایی از اسناد کارآمد باشد و بار پردازشی را از لایه برنامه کاربردی کاهش دهد.
- سهولت استفاده: توسعهدهندگان میتوانند به سادگی با فراخوانی یک رویه ذخیره شده و ارسال پارامترهای مورد نیاز، اسناد را تولید کنند. این سادگی، سرعت توسعه و نگهداری را افزایش میدهد.
این روش به شما امکان میدهد تا سیستم مدیریت قالبهای سند قوی و انعطافپذیری را در SQL Server پیادهسازی کنید که برای سناریوهای مختلف تولید سند پویا، مانند فاکتورها، گزارشها، قراردادها و ایمیلهای خودکار، بسیار مفید است.