找出谁没有在每月结算系统中付款

时间:2017-09-05 23:56:36

标签: sql-server vb.net winforms sql-server-2014

我正在创建管理商店租金的系统。我有4张桌子(顾客,商店,合同,付款)。

这是4个表:

客户:

CREATE TABLE [dbo].[customers](
    [cust_id] [int] NOT NULL,
    [name] [nvarchar](50) NULL,
    [nickname] [nvarchar](50) NULL,
    [city] [nvarchar](50) NULL,
    [phone1] [nvarchar](15) NULL,
    [phone2] [nvarchar](15) NULL,
    [phone3] [nvarchar](15) NULL,
    [email] [nvarchar](50) NULL,
    [image] [varbinary](max) NULL,
    [date] [date] NULL,
    [image_exist] [nvarchar](5) NULL,

商店:

CREATE TABLE [dbo].[shops](
    [shop_id] [int] NOT NULL,
    [size] [nvarchar](5) NULL,
    [floor] [nvarchar](10) NULL,
    [location] [nvarchar](50) NULL,
    [status] [nvarchar](10) NULL,
    [date] [date] NULL,

合同:

CREATE TABLE [dbo].[contracts](
    [con_id] [int] NOT NULL,
    [cust_id] [int] NULL,
    [shop_id] [int] NULL,
    [con_duration] [nvarchar](5) NULL,
    [price] [nvarchar](50) NULL,
    [con_use] [nvarchar](20) NULL,
    [rent_type] [nvarchar](10) NULL,
    [price2] [nvarchar](50) NULL,
    [note2] [nvarchar](max) NULL,
    [image] [image] NULL,
    [date_start] [date] NULL,
    [date_end] [date] NULL,
    [note] [nvarchar](max) NULL,
    [image_exist] [nvarchar](5) NULL,

付款:

CREATE TABLE [dbo].[payments_monthly](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [con_id] [int] NULL,
    [pay_number] [nvarchar](50) NULL, \\ i get the duration from contact and make numbers of payments, if the duration was 12 then the pay_number will be 1,2,3,.....,12- so the customers need to pay 12 time , one time per month
    [pay_value] [decimal](18, 0) NULL, \\ amount of payment  
    [pay_type] [nvarchar](50) NULL,
    [ch_number] [int] NULL,
    [note] [nchar](10) NULL,
    [date] [date] NULL,

所以我需要的是让所有客户在本月或用户选择的特定月份内没有付款(注意:并非所有客户都必须在同一天付款,也许有些人需要支付10-9- 2017年或某些20-9-2017)所以我需要所有必须在9月份(1-9-2017至30-92017)付款的客户。

所以我需要在表格中更改以实现目标或查询。

我正在制定一个管理一组商店和这些商店租用一段时间的程序,所以合同是6个月,12个月,18或24 ......等。 有两种类型的合同:

1-(合同是一段时间,付款是一次)

2-(合同是一段时间,每月支付一定金额)

例如:

  • 1:12000 $ 12个月 - 支付一次(存入pay_yearly表)

  • 合同2:12000个12000个月 - 支付不止一次 - 付款如下(12000/12 =每月1000美元)(存储在payment_monthly表中)

该计划的工作如下:

租户表

租用商店的桌子

合约表(客户与商店处所连接)

之后,每月付款和每年付款的2个表格。记录每份合同的付款(链接到客户和商店)

Diagram

2 个答案:

答案 0 :(得分:2)

如果他们迟到并同时支付两个月,那么9月1日你会收到8月和9月的付款吗?传统的会计系统还有一个发票表,每月创建一个新发票,付款时,它应用于相应的发票。然后,只需查看未结发票即可。

这是我如何创建一个简单的发票表:

CREATE TABLE invoices (
    ID INT IDENTITY(1,1) PRIMARY KEY
    , con_id INT FOREIGN KEY REFERENCES dbo.Invoices(con_id)
    , invoice_date DATETIME NOT NULL DEFAULT GETDATE()
    , payment_id INT FOREIGN KEY REFERENCES dbo.payments(id)
    )

它同时引用合同和付款记录。在每个月的第一天,运行一个为每个有效合同自动生成新发票的流程。然后,当付款进入时,将付款ID添加到发票中,以便您知道它已付款。

这是一个相当简单的系统,因为它假设只有一笔付款可以应用于一张发票,只有在没有人支付部分款项时才有意义。更好的选择是创建另一个在付款和发票之间具有多对多关系的表格:

CREATE TABLE invoice_payments (
    ID INT IDENTITY(1,1) PRIMARY KEY
    , invoice_id INT FOREIGN KEY REFERENCES dbo.invoices(ID)
    , payment_id INT REFERENCES dbo.payments(id)
    , DateCreated DATETIME NOT NULL DEFAULT GETDATE()
    )

现在,您可以对任意数量的发票应用任意数量的付款,并且您可以创建一个查询,将所有发票和所有付款相加,以确保客户已支付所有义务!

答案 1 :(得分:0)

我认为以下示例可能会为您提供一些指示

DECLARE @PaymentMonth INT

-- For Semptember 2017 set the variable to
SET @PaymentMonth = 201709

-- For March 2016 set the variable to
-- SET @PaymentMonth = 201603

SELECT c.Name
FROM customers cust
INNER JOIN contracts cont ON cust.cust_id = cont.cust_id
LEFT JOIN payments_monthly p ON cont.con_id = p.con_id
WHERE DATEPART(year, p.date) * 100 + DATEPART(month, p.date) <> @PaymentMonth