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

使用ASP.Net、C#和Sql Server实现夜间进程,c#,asp.net,sql-server,tsql,sql-server-2008,C#,Asp.net,Sql Server,Tsql,Sql Server 2008,我需要在我的应用程序计费模块中实现夜间流程的功能。请参见相关表格的图像。 让我用红色数字来解释表格。基本上,这是一个房屋分配应用程序数据库,租户可以在其中选择计费计划和插件。就像我们的移动服务一样 步骤:1。这是第一个most表,tbl_MSTBilling,最终用户将在其中创建一个带有一些插件的计划。插件在这里称为事务类型。这些计费计划的一般详细信息保存在此处的相同详细信息中,其中,作为插件,将参考计费计划(即计费计划id)保存在表2中。同样,在表1中,我们有两个实体BillingDayOf

我需要在我的应用程序计费模块中实现夜间流程的功能。请参见相关表格的图像。

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

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

第2步:在达成协议时,承租人选择适合自己的计费计划,然后该计费计划将附在协议中。在表3中,我们有协议id和billingplanid。现在,我们同意生成来自表2的计费计划的附件,并将其插入表4。在这里,协议和计费计划有1:1的关系

Sterp3:现在夜间进程的场景出现了,每晚都会发生。首先,它将检查表3中的每月计费日,它将必须取出所有用户的协议id,这些用户的每月计费日与今天相同。现在,根据所有协议,表4中的行将填充到表5中。此处,每行的TransactionDate为空,Statementdate将成为当前日期。4的TransactionType与5的TransactionTypeId相同。假设我们得到了100行20个不同的AgreementId。同时,我们必须在表6中检查是否有基于IncludedInstant的协议到期票据,这是位字段。如果包含此项,则它将设置为true

步骤4:取表5和表7,将一行插入表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

如果日程安排对您来说比较困难,那么您可以使用SQL代理的日程安排作业在存储过程中完成夜间工作,也可以编写一个控制台应用程序,执行与Windows内置日程安排任务相同的操作

代码本身不应该太难浏览您的需求


祝你好运:)

我不清楚你在问什么。看起来你想让我们为你写这整件事,但你肯定没想到。谢谢@tvan。。。我错过了。。夜间进程受阻。@amran-设置夜间任务或为夜间任务编写代码?我需要一个sql作业,该作业将每周一次执行此spmidnight@Richard,我正等着你呢。你肯定有一些解决方案。如果我把整个场景分解成多个查询而不是单个查询呢?这是一个好方法吗?我会在逻辑查询中分解它是的。易于编写和维护。