MS SQL存储过程插入或更新总YTD&上一年发票总额

时间:2017-11-01 16:48:24

标签: sql sql-server stored-procedures

我想将目前的财务YTD发票销售额和上一个财政年度每日为MS SQL数据库中的每个客户开具销售额,并使用此信息填充单独的表。此信息将在具有特定功能的应用程序中提供。

有3个x表包含相关信息:

  • 客户(系统中所有客户的列表)
  • 发票(所有发票数据)
  • CustomData(可以在与数据库交互的应用程序中创建和填充的自定义字段)

我正在寻求有关如何最好地实施实现以下目标的解决方案的建议:

  • 检查当前日期,看是否是财政年度的第1天(4月1日)
  • 如果是,请遍历客户表中满足参数(实时客户)的每条记录,并总计净值 - 上一财政年度(4月1日)上调的两张发票的信用票据价值 - 3月31日)和当前财务年初至今(4月1日),其中发票表中的客户ID与客户表中的ID匹配。

    然后检查CustomData表以查看该customerID的记录是否存在>如果是这样,用新值更新记录(NB空值应该= 0),如果不存在,则将数据插入CustomData表。

  • 如果当前日期不是4月1日,那么只有当前财务YTD销售总额并根据需要更新/插入CustomData

表格构造如下(已排除与此流程无关的列):

CREATE TABLE [dbo].[Customers]
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Code] [varchar](32) NULL,
    [CustomerStatus] [tinyint] NOT NULL 
        CONSTRAINT [DF_Customers_CustomerStatus]  DEFAULT ((0)),

    CONSTRAINT [PK__Customers] 
        PRIMARY KEY CLUSTERED ([ID] ASC)
) ON [PRIMARY]

CREATE TABLE [dbo].[Invoice]
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Datedb] [datetime] NULL,
    [AccountNo] [varchar](32) NULL,
    [Nett] [float] NOT NULL 
         CONSTRAINT [DF_InvoiceHead_Nett]  DEFAULT ((0)),
    [IsCreditNote] [tinyint] NOT NULL 
         CONSTRAINT [DF_InvoiceHead_IsCreditNote]  DEFAULT ((0)),

     CONSTRAINT [PK__InvoiceHead] 
         PRIMARY KEY CLUSTERED ([ID] ASC)
) ON [PRIMARY]

CREATE TABLE [dbo].[CustomData]
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [CustomFieldsContentID] [int] NOT NULL 
         CONSTRAINT [DF_CustomFieldsData_CustomFieldsContentID]  DEFAULT ((0)),
    [ModuleID] [int] NOT NULL 
         CONSTRAINT [DF_CustomFieldsData_ModuleID]  DEFAULT ((0)),
    [ModuleType] [tinyint] NOT NULL 
         CONSTRAINT [DF_CustomFieldsData_ModuleType]  DEFAULT ((0)),
    [ValueNumber] [float] NULL,
    [dbTimeStamp] [timestamp] NOT NULL,

    CONSTRAINT [PK__CustomFieldsData] 
        PRIMARY KEY CLUSTERED ([ID] ASC)
) ON [PRIMARY]

客户关系是Customers.Code Invoice.AccountNo& CustomData.ModuleID

如果Customers.CustomerStatus = 2

,客户仍然有效

上个财政年度发票销售的CustomData.CustomFieldsContentID = 32和YTD发票销售的33。

CustomData.ModuleID是客户代码(Customers.Code& Invoice.AccountNo)

CustomData.ModuleType将是静态值= 18

CustomData.ValueNumber将是nett发票金额的总和。

Invoice.IsCreditNote = 1要求该记录的净值为负数。

我不熟悉使用游标循环记录,也不确定最有效的方法!我真的不知道从哪里开始!

0 个答案:

没有答案