You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET+SQL Server 2012:日期费控记录生成及金额调整需求

嘿,针对你这个VB.NET + SQL Server的需求,我给你整理了一套可行的实现方案,分数据库和代码两部分来说明,你可以参考下:

一、先补全数据库结构(关键前提)

首先得提个重要的点:你的Fee_Payment表目前没有关联客户的字段,这样插入的费用记录没法对应到具体客户,后续根本没法管理。所以第一步建议给Fee_Payment加个外键字段关联Customer_Master:

ALTER TABLE Fee_Payment ADD Customer_ID INT FOREIGN KEY REFERENCES Customer_Master(Customer_ID);
-- 这里假设你的Customer_Master表主键是Customer_ID,如果不是,替换成实际的主键字段名
二、数据库存储过程实现批量插入周期费用记录

用存储过程来处理日期拆分和插入,比在VB.NET里循环效率更高,尤其是客户多、时间范围长的情况。下面的存储过程会把你传入的起止日期按月拆分,每个月生成一条Fee_Payment记录,初始已收款为0,余额等于固定月费:

CREATE PROCEDURE InsertFeePayments
    @Customer_ID INT,          -- 关联的客户ID
    @StartDate DATETIME,       -- 交易起始日期
    @EndDate DATETIME,         -- 交易结束日期
    @MonthlyFee DECIMAL(10)    -- 固定月费
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @CurrentStart DATETIME;
    DECLARE @CurrentEnd DATETIME;

    -- 把起始日期调整到当月第一天
    SET @CurrentStart = DATEADD(MONTH, DATEDIFF(MONTH, 0, @StartDate), 0);

    -- 循环遍历每个月,直到当前周期超过结束日期
    WHILE @CurrentStart <= @EndDate
    BEGIN
        -- 计算当月最后一天作为周期结束日期
        SET @CurrentEnd = DATEADD(DAY, -1, DATEADD(MONTH, 1, @CurrentStart));

        -- 如果当月最后一天超过了用户设定的结束日期,就用用户的结束日期
        IF @CurrentEnd > @EndDate
            SET @CurrentEnd = @EndDate;

        -- 插入费用记录:已收款初始为0,余额=月费-已收款
        INSERT INTO Fee_Payment (Customer_ID, Date_Start, Date_End, Prefixed_Fee, Paid_Amount, Balance)
        VALUES (@Customer_ID, @CurrentStart, @CurrentEnd, @MonthlyFee, 0, @MonthlyFee);

        -- 跳到下一个月
        SET @CurrentStart = DATEADD(MONTH, 1, @CurrentStart);
    END
END
三、VB.NET代码调用存储过程(在客户信息保存后执行)

当你在第一个表单里把客户信息保存到Customer_Master后,就可以调用上面的存储过程来生成对应的费用记录。这里给你写个示例代码:

' 1. 先获取刚插入到Customer_Master的客户ID(用SCOPE_IDENTITY()获取最新主键)
Private Function GetNewCustomerId() As Integer
    Dim newId As Integer = 0
    Dim connStr As String = "你的数据库连接字符串" ' 建议放在配置文件里,不要硬编码

    Using conn As New SqlConnection(connStr)
        conn.Open()
        Using cmd As New SqlCommand("SELECT SCOPE_IDENTITY()", conn)
            newId = Convert.ToInt32(cmd.ExecuteScalar())
        End Using
    End Using

    Return newId
End Function

' 2. 保存客户信息后,调用存储过程生成费用记录
Private Sub GenerateFeePayments()
    Try
        Dim customerId As Integer = GetNewCustomerId()
        Dim startDate As DateTime = dtpStart.Value ' 假设你的起始日期控件是dtpStart
        Dim endDate As DateTime = dtpEnd.Value     ' 结束日期控件是dtpEnd
        Dim monthlyFee As Decimal = Decimal.Parse(txtMonthlyFee.Text) ' 月费输入框是txtMonthlyFee

        Dim connStr As String = "你的数据库连接字符串"
        Using conn As New SqlConnection(connStr)
            conn.Open()
            Using cmd As New SqlCommand("InsertFeePayments", conn)
                cmd.CommandType = CommandType.StoredProcedure

                ' 添加存储过程参数
                cmd.Parameters.AddWithValue("@Customer_ID", customerId)
                cmd.Parameters.AddWithValue("@StartDate", startDate)
                cmd.Parameters.AddWithValue("@EndDate", endDate)
                cmd.Parameters.AddWithValue("@MonthlyFee", monthlyFee)

                ' 执行插入
                cmd.ExecuteNonQuery()
            End Using
        End Using

        MessageBox.Show("费用记录生成成功!")
    Catch ex As Exception
        MessageBox.Show($"生成失败:{ex.Message}")
    End Try
End Sub
四、已收款金额调整功能

如果后续要给某条费用记录添加已收款,更新余额,可以写个简单的存储过程来处理:

CREATE PROCEDURE UpdatePaidAmount
    @FeeId INT,                -- 要更新的Fee_Payment的S_No
    @AddPaidAmount DECIMAL(10) -- 新增的已收款金额
AS
BEGIN
    SET NOCOUNT ON;

    UPDATE Fee_Payment
    SET Paid_Amount = Paid_Amount + @AddPaidAmount,
        Balance = Prefixed_Fee - (Paid_Amount + @AddPaidAmount)
    WHERE S_No = @FeeId;
END

对应的VB.NET调用代码:

Private Sub UpdateFeePaymentPaid()
    Try
        Dim feeId As Integer = 1 ' 这里替换成你要更新的费用记录ID
        Dim addPaid As Decimal = 300.00D ' 新增的已收款金额

        Dim connStr As String = "你的数据库连接字符串"
        Using conn As New SqlConnection(connStr)
            conn.Open()
            Using cmd As New SqlCommand("UpdatePaidAmount", conn)
                cmd.CommandType = CommandType.StoredProcedure
                cmd.Parameters.AddWithValue("@FeeId", feeId)
                cmd.Parameters.AddWithValue("@AddPaidAmount", addPaid)
                cmd.ExecuteNonQuery()
            End Using
        End Using

        MessageBox.Show("已收款更新成功!")
    Catch ex As Exception
        MessageBox.Show($"更新失败:{ex.Message}")
    End Try
End Sub
几个注意事项
  • 日期拆分逻辑:上面是按月拆分,如果你的需求是按周、按季度或者其他周期,只需要修改存储过程里的@CurrentStart和@CurrentEnd计算逻辑就行。
  • 空值处理:如果允许起止日期为空,需要在存储过程里加判断(比如IF @StartDate IS NULL OR @EndDate IS NULL RETURN;),避免插入无效数据。
  • 异常处理:VB.NET代码里一定要加Try-Catch块,捕获数据库操作可能出现的错误,比如连接失败、参数格式错误等。

内容的提问来源于stack exchange,提问作者Md_Ms

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:20:27