VB工程合同管理系统Access版源代码实现详解与开发指南
在工程项目管理中,合同是核心文档之一,其规范性、可追溯性和高效管理直接影响项目的成败。随着信息化技术的发展,利用Visual Basic(VB)结合Microsoft Access数据库构建轻量级合同管理系统已成为中小型施工企业或项目团队的首选方案。本文将详细讲解如何基于VB开发一个功能完整、界面友好、数据安全的工程合同管理系统,并提供Access版源代码结构与关键模块的设计思路。
一、系统需求分析
在开始编码前,必须明确系统的功能目标和用户角色:
- 管理员:负责合同录入、修改、删除、查询、权限分配等操作;
- 项目经理:查看本项目合同状态、审批流程、履约进度;
- 财务人员:核对付款节点、收款记录、发票信息;
- 普通员工:仅能查阅与其相关的合同内容。
系统应支持以下核心功能:
- 合同基本信息维护(编号、名称、甲方乙方、金额、签订日期、有效期等);
- 合同状态跟踪(待审批、已生效、履行中、已完成、终止);
- 附件上传与管理(PDF、Word、Excel等文件);
- 合同提醒机制(到期前自动提示);
- 多条件组合查询与导出报表功能(Excel格式);
- 基础用户权限控制(登录验证+角色区分)。
二、技术架构设计
本系统采用VB6.0(或VB.NET)作为前端开发语言,Access 2016及以上版本作为后台数据库,两者通过ADO(ActiveX Data Objects)接口进行数据交互。这种组合具有部署简单、学习成本低、适合本地化使用的优势,尤其适用于预算有限但需快速上线的小型团队。
数据库表结构设计如下:
CREATE TABLE Contracts (
ID AUTOINCREMENT PRIMARY KEY,
ContractNo TEXT(50),
Title TEXT(100),
PartyA TEXT(100),
PartyB TEXT(100),
Amount CURRENCY,
SignDate DATE,
ValidUntil DATE,
Status TEXT(20),
Remarks MEMO,
CreatedBy TEXT(50),
CreatedAt DATETIME DEFAULT Now()
);
CREATE TABLE Users (
UserID AUTOINCREMENT PRIMARY KEY,
Username TEXT(50) UNIQUE,
Password TEXT(50),
Role TEXT(20), -- Admin, PM, Finance, User
IsActive BOOLEAN DEFAULT TRUE
);
CREATE TABLE Attachments (
ID AUTOINCREMENT PRIMARY KEY,
ContractID LONG,
FileName TEXT(100),
FilePath TEXT(255),
UploadTime DATETIME DEFAULT Now(),
FOREIGN KEY (ContractID) REFERENCES Contracts(ID)
);
三、VB界面设计与控件布局
主窗体分为三个区域:
- 菜单栏:包含“新增合同”、“编辑合同”、“删除合同”、“查询合同”、“导出Excel”等功能按钮;
- 工具栏:快速访问常用功能,如刷新列表、搜索框、状态筛选器;
- 数据网格视图:展示所有合同列表,支持排序、分页、双击查看详情。
合同详情窗口包含文本框、下拉选择框、日期控件、文件路径输入框等,用于填写和修改合同信息。此外,添加一个“附件管理”标签页,允许上传PDF/Word文件并保存到本地指定目录,同时在Access中记录路径。
四、关键代码实现(VB + ADO)
以下是几个典型功能的代码片段:
1. 连接Access数据库
Dim conn As ADODB.Connection Set conn = New ADODB.Connection conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\ContractsDB.accdb;"
2. 查询所有合同并绑定到DataGridView
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.Open "SELECT * FROM Contracts ORDER BY SignDate DESC", conn, adOpenKeyset, adLockOptimistic
' 假设有一个 DataGridView 控件名为 dgvContracts
With dgvContracts
.DataSource = rs
End With
3. 新增合同逻辑(含文件上传)
Private Sub btnAdd_Click()
Dim sql As String
Dim filePath As String
' 获取用户输入
sql = "INSERT INTO Contracts (ContractNo, Title, PartyA, PartyB, Amount, SignDate, ValidUntil, Status, Remarks, CreatedBy) VALUES ('" & txtNo.Text & "', '" & txtTitle.Text & "', '" & txtPartyA.Text & "', '" & txtPartyB.Text & "', " & Val(txtAmount.Text) & ", #" & Format(dtpSign.Value, "yyyy-mm-dd") & "#, #" & Format(dtpValid.Value, "yyyy-mm-dd") & "#, '" & cboStatus.Text & "', '" & txtRemarks.Text & "', '" & CurrentUser & "')"
conn.Execute sql
' 如果有附件则保存
If Not IsEmpty(txtFile.Text) Then
filePath = App.Path & "\Attachments\" & Mid(txtFile.Text, InStrRev(txtFile.Text, \) + 1)
FileCopy txtFile.Text, filePath
' 插入附件记录
conn.Execute "INSERT INTO Attachments (ContractID, FileName, FilePath) VALUES (" & LastInsertId(conn) & ", '" & Mid(filePath, InStrRev(filePath, \) + 1) & "', '" & filePath & "')"
End If
End Sub
4. 合同状态变更与提醒机制
' 每天定时检查合同是否即将到期(可用Windows Task Scheduler触发VB程序)
Dim rs As ADODB.Recordset
rs.Open "SELECT * FROM Contracts WHERE ValidUntil BETWEEN Date() AND Date()+7 AND Status='履行中'", conn
If Not rs.EOF Then
MsgBox "以下合同将在一周内到期:" & vbCrLf & rs.Fields("Title").Value
End If
五、安全性与扩展建议
虽然Access适合小型应用,但在生产环境中仍需注意:
- 密码加密存储(建议用MD5或SHA-1哈希);
- 防止SQL注入攻击(使用参数化查询);
- 设置数据库只读权限保护文件不被误删;
- 定期备份数据库(可集成AutoBackup功能)。
未来可扩展方向包括:
- 迁移到SQL Server或MySQL以支持多人并发访问;
- 增加移动端适配(如用VB.NET + WinForms移植到UWP);
- 集成电子签名功能(如使用第三方API);
- 加入合同生命周期可视化图表(甘特图或流程图)。
六、总结与实践价值
通过上述步骤,开发者可以构建一个实用性强、易于维护的VB工程合同管理系统Access版源代码项目。它不仅满足了日常合同管理的基本需求,还能根据实际业务灵活调整字段与逻辑,是中小型企业数字化转型的第一步。对于学习VB编程、Access数据库设计及软件工程实践的学生或初级开发者而言,该项目也具备极高的教学价值。





