Реализация ночных процессов с использованием ASP.Net, C # и Sql Server - PullRequest
2 голосов
/ 19 марта 2011

Мне нужно реализовать функциональность ночного процесса в моем модуле биллинга приложений. Смотрите изображение таблиц. enter image description here

Позвольте мне объяснить таблицы их номерами в красном. По сути, это база данных приложений для дома, где арендаторы могут выбирать тарифные планы и надстройки в ней. Как у нас есть наш мобильный сервис.

Шаг: 1. Это самая первая таблица, tbl_MSTBilling, где конечный пользователь создаст план с некоторым дополнением. Аддон известен как тип транзакции здесь. Там общие детали плана выставления счетов сохраняются здесь в тех же деталях, где дополнения сохраняются в таблице № 2 со ссылкой на план выставления счетов, то есть идентификатор плана выставления счетов. Также здесь, в таблице 1, у нас есть две сущности BillingDayOfMonth как целое число и LatefeeAppliedDayOfMonth как целое. Который принимает данные в диапазоне от 1 до 31 (дни месяцев).

Шаг 2: Теперь, во время согласования, арендатор выбирает подходящий для него план выставления счетов, и этот план выставления счетов прилагается к соглашению. В таблице 3 у нас есть идентификатор соглашения и billingplanid. Теперь, когда мы сформировали соглашение, надстройки тарифного плана из таблицы 2 будут вставлены в таблицу 4. Здесь соглашение и BillingPlan имеют отношение 1: 1.

Sterp3: Теперь наступает сценарий ночного процесса, который будет происходить каждую ночь. Сначала он проверит день выставления счета в таблице 3. Он должен будет извлечь идентификатор соглашения для всех пользователей, чей день выставления счета соответствует текущему. Теперь на основе всех соглашений строки из таблицы 4 будут заполнены в таблице 5. Здесь TransactionDate будет нулевым для каждой строки, а Statementdate станет текущей датой. TransactionType, равный 4, такой же, как TransactionTypeId, равный 5. Скажем, мы получили 100 строк из 20 различных идентификаторов соглашения. Кроме того, в то время как мы должны проверить в таблице 6, существует ли какой-либо счет, подлежащий соглашению на основе включенного состояния, которое является битом поле. Если это включено, тогда оно будет установлено в true.

Шаг 4: Взяв таблицы 5 и 7, в таблицу 7 будет вставлена ​​одна строка, которая будет исходным счетом.

Так что это весь мой запрос. Я застрял на шаге 3, где начинается ночной процесс . Я надеюсь, что я вам понятен. Любые вопросы, пожалуйста, поставьте его.

Мой текущий скрипт Sql

    BEGIN TRY

        BEGIN TRANSACTION
            DECLARE @Today AS INT
            --
            SET @Today =12-- (SELECT DATEPART(DAY,GETDATE()))

            -- First of all check for the agreements 
            INSERT INTO tbl_AccountTranscation (AgreementID,TranscationDate,TranscationTypeID,Amount,StatementDate)
            SELECT AgreementId, NULL, TransactionType,Amount,GETDATE() FROM tbl_AgreementTransaction
            WHERE AgreementId IN (SELECT AgreementId From tbl_MSTAgreement WHERE BillingDayOfMonth = @Today)


            Declare @Count AS INT
            SET @Count = (Select COUNT(*) FROM tbl_BillDue WHERE IncludedinStatement=0 AND AgreementID IN (SELECT AgreementId 
                                                                                                           From tbl_MSTAgreement 
                                                                                                           WHERE BillingDayOfMonth = @Today) )
            IF @Count >0 
                BEGIN
                    INSERT INTO tbl_AccountTranscation (AgreementID,TranscationDate,TranscationTypeID,Amount,StatementDate)
                    Select  AgreementId,NULL,-1,ISNULL(((ISNULL(TotalDueAmount,0)+ ISNULL(LateFeeAmount,0)) - ISNULL(AdjustmentAmount,0)),0) as Amount, 
                            GETDATE() as StatementDate
                    From tbl_BillDue
                    Where IncludedinStatement = 0 and AgreementID IN (  SELECT AgreementId 
                                                                        From tbl_MSTAgreement 
                                                                        WHERE BillingDayOfMonth = @Today
                                                                    )
                END                 
            --INSERT INTO tbl_MSTBill
            --(AgreementId,OutStandingPayment,BillDate,BillDueDate,PaymentDate,AmountPaid)
            --SELECT AgreementID, SUM(Amount) as Amount,StatementDate,NULL,NULL,NULL  
            --FROM  tbl_AccountTranscation WHERE AgreementId IN ( SELECT AgreementId 
            --                                                  From tbl_MSTAgreement 
            --                                                  WHERE BillingDayOfMonth = 12)

            --GROUP BY AgreementID, Amount,StatementDate

            SELECT     tbl_MSTAgreement.AgreementID, tbl_MSTAgreement.LateFeeApplyDayOfMonth, tbl_AccountTranscation.StatementDate, 
                     SUM(tbl_AccountTranscation.Amount) as Amount
FROM         tbl_AccountTranscation INNER JOIN
                      tbl_MSTAgreement ON tbl_AccountTranscation.AgreementID = tbl_MSTAgreement.AgreementID
                      GROUP BY tbl_MSTAgreement.AgreementID,Amount,tbl_MSTAgreement.LateFeeApplyDayOfMonth, tbl_AccountTranscation.StatementDate
        COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
        ROLLBACK TRANSACTION

    END CATCH
END

1 Ответ

2 голосов
/ 19 марта 2011

Если планирование является сложной для вас, вы можете использовать запланированное задание с агентом SQL для выполнения вашей ночной работы в хранимой процедуре или написать консольное приложение, которое выполняет то же, что и вы. выполнять через Windows встроенные запланированные задачи.

Сам код не должен быть таким сложным для просмотра ваших требований.

Удачи:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...