使用ASP.Net,C#和Sql Server实现夜间进程

时间:2011-03-19 12:00:58

标签: c# asp.net sql-server tsql sql-server-2008

我需要在我的应用程序计费模块中实现夜间进程的功能。查看相关表格的图像。 enter image description here

让我用红色的数字来解释表格。基本上这是一个房屋分配应用程序数据库,租户可以在其中选择计费方案和插件。就像我们有移动服务一样。

步骤:1。这是第一个最大的表tbl_MSTBilling,最终用户将使用一些插件创建一个计划。 Addon在这里称为事务类型。此处的结算方案一般详细信息保存在相同的详细信息中,其中插件将参考结算方案保存到表2中,即结算方案ID。同样在表1中,我们将两个实体BillingDayOfMonth作为整数,将LatefeeAppliedDayOfMonth作为int。它在1-31(几个月的几天)之间输入。

步骤2:现在在协商时,租户选择了一些适合他的计费方案,然后根据协议附上计费方案。在表3中,我们有协议ID和billingplanid。现在我们生成协议,表2中的计费方案的插件将插入到表4中。这里协议和BillingPlan之间有1:1的关系。

Sterp3:现在每晚都会出现夜间过程。首先,它将检查表3中的每月结算日,它必须将所有用户的协议ID提取为今天的结算日。现在在所有协议的基础上,表4中的行将填充到表5中。这里TransactionDate对于每一行都是null,Statementdate将成为当前日期。 TransactionType为4与TransactionTypeId为5相同。假设我们得到了100行20个不同的AgreementId。也就是说我们必须在表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 个答案:

答案 0 :(得分:2)

如果调度对您来说很难,您既可以使用SQL代理的预定作业在存储过程中进行夜间工作,也可以编写一个与您相同的控制台应用程序通过Windows内置的计划任务执行。

代码本身不应该那么难以浏览您的要求。

祝你好运:)