При разработке системы обработки заработной платы важно иметь гибкое и адаптивное решение, которое может обрабатывать изменяющиеся бизнес-правила без необходимости обширных изменений кода и повторного развертывания. Один из подходов для достижения этой цели – использование программирования на основе интерфейсов.
Программирование на основе интерфейсов – это концепция, широко используемая в объектно-ориентированных языках, где различные типы объектов могут взаимодействовать друг с другом через определенный интерфейс. Хотя SQL Server не является объектно-ориентированным языком, мы все равно можем применить некоторые ключевые концепции программирования на основе интерфейсов к нашим решениям в SQL Server.
В SQL Server сам язык SQL служит интерфейсом к базовым структурам данных, используемым СУБД. Приложения могут отправлять SQL-запросы для извлечения данных из SQL Server, не нуждаясь в понимании механизмов хранения данных. Однако, когда речь идет о реализации сложных бизнес-правил, полагаться только на SQL-запросы может быть сложно.
Один из способов преодолеть эту проблему – использование хранимых процедур в SQL Server. Хранимая процедура – это фрагмент хранимого SQL-кода, который принимает определенный список параметров. Определив стандартный набор параметров для хранимой процедуры “правила”, мы можем легко заменять имена хранимых процедур для реализации различных бизнес-правил.
Например, предположим, у нас есть пять различных правил, которые должны быть реализованы в нашем приложении по обработке заработной платы. Мы можем создать пять различных хранимых процедур, все они принимают один и тот же список параметров:
CREATE PROCEDURE pr_PayrollRule_CalculateGrossPay @PayrollPeriod int, @PayrollGroupID int CREATE PROCEDURE pr_PayrollRule_CalculateFICA @PayrollPeriod int, @PayrollGroupID int CREATE PROCEDURE pr_PayrollRule_CalculateSocSecurity @PayrollPeriod int, @PayrollGroupID int CREATE PROCEDURE pr_PayrollRule_CalculateStateTax @PayrollPeriod int, @PayrollGroupID int CREATE PROCEDURE pr_PayrollRule_Calculate401k @PayrollPeriod int, @PayrollGroupID int
Затем мы можем создать таблицу конфигурации, в которой перечислены правила вместе с соответствующей хранимой процедурой и порядком выполнения:
CREATE TABLE tb_PayrollRule( PayrollRuleID int NOT NULL IDENTITY(1, 1), RuleName varchar(50) NOT NULL, RuleProcedure varchar(128) NOT NULL, ExecutionOrder int NOT NULL ) INSERT INTO tb_PayrollRule(RuleName, RuleProcedure, ExecutionOrder) VALUES('Calculate Gross Pay', 'pr_PayrollRule_CalculateGrossPay', 1) INSERT INTO tb_PayrollRule(RuleName, RuleProcedure, ExecutionOrder) VALUES('Calculate FICA Withholding', 'pr_PayrollRule_CalculateFICA', 2) INSERT INTO tb_PayrollRule(RuleName, RuleProcedure, ExecutionOrder) VALUES('Calculate Social Security Withholding', 'pr_PayrollRule_CalculateSocSecurity', 3) INSERT INTO tb_PayrollRule(RuleName, RuleProcedure, ExecutionOrder) VALUES('Calculate State Tax Withholding', 'pr_PayrollRule_CalculateStateTax', 4) INSERT INTO tb_PayrollRule(RuleName, RuleProcedure, ExecutionOrder) VALUES('Calculate 401(k) Withholding', 'pr_PayrollRule_Calculate401k', 5)
Чтобы получить правильные процедуры для выполнения, мы просто можем выполнить запрос:
SELECT RuleProcedure FROM tb_PayrollRule ORDER BY ExecutionOrder
Основное приложение обработки может затем вызывать каждую процедуру в указанном порядке. Используя хранимые процедуры, мы получаем преимущества скомпилированных, многократно используемых планов выполнения в SQL Server. Если правило нужно изменить, мы легко можем написать и развернуть новую версию правила, выполнив оператор ALTER PROCEDURE.
Кроме того, хранимые процедуры позволяют выполнять транзакционную обработку. Основное приложение обработки может выполнять оператор BEGIN TRANSACTION перед выполнением первого правила и оператор COMMIT TRANSACTION или ROLLBACK TRANSACTION по завершении обработки.
Динамическое определение имен хранимых процедур для вызова во время выполнения также дает нам гибкость в выборе процедур для выполнения. Мы можем реализовать таблицы поиска, указать диапазоны даты действия для конкретных бизнес-правил и даже вызывать процедуры в различных базах данных или серверах.
Программирование на основе интерфейсов в SQL Server с использованием хранимых процедур предоставляет простое, самодостаточное и гибкое решение для обработки сложных бизнес-правил в системе обработки заработной платы. Оно позволяет легко настраивать и адаптировать систему без необходимости обширных изменений кода и повторного развертывания.
Об авторе: Крис Кубли – MCSD с более чем четырехлетним опытом разработки и реализации решений на основе SQL Server в различных отраслях. С ним можно связаться по адресу ccubley@queryplan.com.