目 录
引言	3
一、系统分析 4
 (一)需求分析 4
 (二)可行性分析 4
 二、 总体设计 4
 (一)项目规划 4
 (二)系统功能结构图 5
 三、详细设计 6
 (一)系统登录设计 6
 (二)窗体设计 7
 (三)代码设计 7
 (四)车辆调度安排 10
 (五)托运申请单管理 14
 (六)货物托运管理 17
 (七)在途跟踪管理 26
 (八)信息查询 31
 四、结论 37
 致谢 38
 参考文献 39
摘 要
随着市场经济的高速发展,制造业、商业企业逐步接受着第三方物流服务。越来越多的企业认识到物流企业外包是降低成本、提高服务水平的有效渠道。物流管理的特点是以客户为核心、构建面向客户的业务流程支持各种形式、各种需求的现在企业中的业务模式。系统支持多形式客户的数据共享、提高作业效率、监控整个流程、提供完整的货品、进行订单跟踪,并且特别关注对各环节业务的监控及例外情况的监控。
关键词: 1、 客户 2、 物流 3、物流管理系统
引言
在当今高速发展的信息社会,现代物流行业突飞猛进发展,伴随着我国国民经济连续多年的高速增长,为现代物流发展创造了良好的条件。目前,我国各类物流企业有14万家左右,展望整个21世纪,可以说现代物流业还将有更大的发展。
在发达国家,物流理论促使物流实践快速发展。经济全球化及现代物流业发展的系统化、信息化、仓储运输的现代化和综合化等趋势,对我国物流业的发展提出了全方位的挑战。传统物流行业的操作模式已经不适应现代的物流行业,如何缩短物流过程,降低产品库存,加速对市场的反应,这是所有企业所面对的问题。本系统就是针对这些问题根据中小型企业的实际需求而开发的一套物流管理系统。系统的开发能够帮助企业实现对物流全过程的优化调度和动态控制,高效整合企业的物流业务,以全面提高经济效益和效率为目的,提供高效、实用、技术的物流管理系统和运营手段。    
物流管理系统是集现代运输、仓储配送、搬运、调度、跟踪为一体的网络系统,系统的开发实现了商品从原料供应商、制造商、分销商到零售商再到消费者的各个环节的有机结合。
一、系统分析
(一)需求分析
 1、通过市场调查,要求本系统具有以下功能:
 (1)统一友好的操作界面,能保证系统的易用性。
 (2)规范、完善的基础信息设置。
 (3)灵活的报表设计及打印功能。
 (4)实现货物申请、托运、跟踪与验收的全过程。
 (5)全方位的信息查询功能。
 (6)系统日志详细记录各种操作,提供追查的有力依据。
 (7)完善的权限管理,增强系统的安全性。
 (8)强大的数据备份及恢复功能,保证系统数据的安全性。
 (二)可行性分析
 1、由于传统物流行业操作过程复杂,手续繁多,业务信息多,围绕这些信息的处理也很纷杂。而且,物流行业竞争激烈,这种竞争,一方面表现在发展客户的市场开拓上,另一方面也存在于收集处理信息的速度、广度和深度,以及在业务操作中对业务数据处理的准确性和严密性,而更高层次上,还牵涉到公司决策层对整体业务的控制和协调。
 2、物流管理系统从物流行业的实际需求出发,参照先进的物流理念和多家领先的物流公司实际的运营流程开发而成,系统从完善的基础信息设置到货物的托运管理、在线跟踪,信息查询、到最后各种报表的生成,清晰的业务流程,使操作人员能够按照流程清晰的进行实际的操作,保证物流运作有序而高效的进行。
二、 总体设计
(一)项目规划
 1、物流管理系统是一个典型的数据库管理系统,系统由基本信息设置、货物托运管理、信息查询、报表管理、系统管理等模块组成,规划系统功能模块如下:
 (1)基本信息设置模块
 该模块主要负责完成部门资料设置、职务信息设置、公司资料设置、员工资料设置、客户资料设置、司机资料设置和车辆资料设置。
 (2)货物托运管理模块
 该模块主要由车辆调度安排、托运申请单管理、货物托运单管理、货物验收单管理和车辆配送跟踪记录单管理几部分组成。
 (3)信息查询模块
 该模块由货物申请单查询、车辆调度信息查询、货物托运信息查询、货物托运验收查询和车辆在途跟踪查询几部分组成。
 (4)报表管理模块
 包括货物申请单报表、货物托运单报表和货物验收单报表3部分。
 (5)系统管理模块
 包括查看日志、删除日志、用户管理、数据备份、数据恢复和系统数据清理几部分。
 (二)系统功能结构图
 1、物流管理系统的系统功能结构图如图1所示。
 
图1 系统功能结构图
三、详细设计
(一)系统登录设计
 1、系统登录主要用于对登录物流管理系统的用户进行安全性检查,以防止非法用户登录该系统。根据给管理员分配的权限,登录用户可以根据自己所具有的权限操作系统中相应的功能。
 2、在登录系统时验证操作员及其密码,主要通过ADO控件中记录集(RecordSet)对象结合If语句判断用户选定的操作员及其输入的密码与数据库中的操作员和密码是否相同来实现,如果相同则允许登录,并给予相应的权限,否则将不允许用户登录。
 系统登录的运行结果如图2所示。
 
图2 系统登录窗体的运行结果
 (二)窗体设计
 1、在工程中新建1个窗体,将窗体的名称设置为“frm_xtdl”,BorderStyle属性设置为“0-None”,通过设置Picture属性为窗体添加图片。
 2、在窗体上添加Adodc控件,由于该控件属于ActiveX控件,在使用之前必须从“部件”对话框中添加到工具箱。添加方法如下:
 在“工程”/“部件”对话框中勾选“Microsoft Ado Data Controls 6.0(SP4)”列表项,单击【确定】按钮之后即可将Ado控件添加到工具箱当中。
 3、在窗体中添加1个ComboBox控件和文本框控件,分别设置名称为Name属性为“Cbx_Name”和“txt_Password”,设置BorderStyle属性为“0-None”,将ComboBox控件的Text属性设置为“MR”。
 4、在窗体中添加2个CommandButton控件,分别将Name属性设置为“Cmd_Ok”和“Cmd_Cancel”,Caption属性设置为“登录”和“取消”。
 登录窗体的设计结果如图3所示
 在这里插入图片描述
 
图3 系统登录窗体的设计界面
 (三)、代码设计
 1、在代码窗口的声明部分定义如下变量:
 Dim itmX As ListItem '定义一个ListItem对象
 Dim key As String '定义字符串变量
 2、在窗体装载事件中,通过ADO控件的ConnectionString属性建立数据库连接,同时将所有操作员的姓名添加到Cbx_Name控件当中,代码如下:
 Private Sub Form_Load()
 Call WHScreen '调用获取屏幕分辨率的过程函数
 '使用代码连接数据库与数据表
 Adodc1.ConnectionString = PublicStr
 Adodc1.RecordSource = “select * from tb_user”
 Adodc1.Refresh
 If Adodc1.Recordset.RecordCount > 0 Then
 Adodc1.Recordset.MoveFirst
 Cbx_Name.Clear '在添加数据时,首先清空控件中的内容
 Do While Adodc1.Recordset.EOF = False '将操作员信息添加到ListView控件当中
 Cbx_Name.AddItem (Adodc1.Recordset.Fields(“user_name”))
 Adodc1.Recordset.MoveNext
 Loop
 End If
 If TWidth <= 800 Or THeigth <= 600 Then '判断屏幕分辨率的大小
 Exit Sub
 Else
 ChangeScreen '调整屏幕分辨率
 End If
 End Sub
 3、单击【确定】按钮,如果输入的操作员姓名和口令正确,则通过身份验证,登录到系统当中。设计思路:通过SQL语句查询输入的用户名和密码信息在数据库中是否存在,如果查询到符合条件的记录信息则显示系统主窗体,登录到系统当中,实现的程序代码如下:
 Private Sub Cmd_Ok_Click()
 Dim MPassword As String
 If Cbx_Name.Text = “MR” And Txt_Password.Text = “mingrisoft” Then '判断是否使用的是超级口令登录
 Frm_Main.StatusBar1.Panels.Item(2).Text = “当前操作员: MR”
 Name1 = Cbx_Name.Text ‘将操作员姓名信息赋予全局变量Name1
 Unload Me
 Frm_Main.Show ‘显示系统主窗体
 Else
 Adodc1.RecordSource = "select * from tb_user where user_name =’" & Cbx_Name.Text & "’"
 Adodc1.Refresh
 If Adodc1.Recordset.RecordCount > 0 Then
 MPassword = Adodc1.Recordset.Fields(“user_mm”)
 If Txt_Password.Text = MPassword Then '判断数据的密码是否正确
 Name1 = Cbx_Name.Text
 Frm_Main.StatusBar1.Panels.Item(2).Text = "当前操作员: " +
 Adodc1.Recordset.Fields(“user_name”)
 Frm_Main.Show '通过身份验证则显示主窗体,登录到系统当中
 Unload Me
 Else
 MsgBox “密码不正确,请您确认后重新输入”, , “提示信息”
 Txt_Password.Text = “”
 Txt_Password.SetFocus
 End If
 Else
 MsgBox “对不起 没有此用户的信息”, , “提示信息”
 Cbx_Name.Text = “”
 Txt_Password.Text = “”
 End If
 End If
 End Sub 
 4、如果在输入密码的文本框中按下〈Enter〉键,则将调用【确定】按钮的单击事件,判断登录用户是否合法,代码如下所示。
 Private Sub Txt_Password_KeyDown(KeyCode As Integer, Shift As Integer)
 If KeyCode = 13 Then
 Call Cmd_Ok_Click '调用确定按钮的单击事件代码
 End If
 End Sub
 (四)车辆调度安排
 1、车辆调度安排是物流管理过程中的重要环节,物流公司在接到托运货物信息之后,首要的问题是安排托运货物的车辆。在本系统当中通过车辆调度安排填写安排托运车辆的信息,然后打印出车辆调度通知单,并将通知单发放到托运司机的手中,司机根据调度通知单上的信息执行托运任务。通过单击窗体中的Cmd_Select按钮选择车牌号码,然后输入其他一些辅助的信息,最后保存车辆调度安排信息。车辆调度安排模块的运行结果如图4所示。
 
图4 车辆调度安排窗体的运行结果
 2、窗体设计
 (1)在工程中新建1个窗体,将窗体的名称设置为“frm_Cldd”,BorderStyle属性设置为“1-Fixed Single”,MaxButton属性设置False。
 (2)在窗体上添加1个Toolbar控件和1个ImageList控件。
 (3)在窗体的Toolbar控件上单击鼠标右键,在弹出的快捷菜单中选择“属性”项,在弹出的“属性页”对话框中设置窗体的工具栏,设计完成的工具栏如图5所示。
 (4)在窗体中添加1个Frame控件,在Frame控件上添加1个文本框控件数组,并为每个文本框控件配置1个标签控件,并且设置相应的Caption属性值,如图5所示。
 (5)在窗体上添加1个DTPicker控件,命名为DT1,用于输入或显示托运司机执行任务的日期时间。
 (6)在窗体上添加1个Ado控件和1个DataGrid控件,将DataGrid控件的名称设置为Dgr_Sjll,DataSource属性设置为Adodc1,AllowUpdate属性值设置为False。
 (7)在窗体中添加1个标签控件,命名为Lbl_Num。
 (8)在窗体上添加1个时钟控件Timer1,在属性窗口中将控件的Interval属性值设置为60。
 车辆调度安排窗体的设计结果如图5所示。
 
图5 车辆调度安排窗体的设计结果
 3、代码设计
 (1)工具栏中的控制按钮控制着窗体的各项操作,在Toolbar控件Tbr_xxcz的ButtonClick事件当中,通过选择Select Case语句的索引值(单击工具栏中的按钮执行相应的索引值)调用相应的过程来完成添加、删除、修改和保存等操作的功能,保存过程事件的代码如下:
 Private Sub Saves() ‘保存信息的过程
 If Text1(0).Text = “” Or Text1(3).Text = “” Then
 MsgBox “重要信息不能为空值”, 48, “提示信息”
 Else
 AdoRs.Open "select * from tb_Goods_cldd where cldd_cphm=’" +
 Text1(0).Text + “'”, Cnn, adOpenKeyset
 If AdoRs.RecordCount > 0 Then
 MsgBox “该信息已经存在”, 48, “提示信息”
 AdoRs.Close ‘关闭记录集对象
 Else
 AdoRs.Close ‘关闭记录集对象
 c = MsgBox(“确认保存信息吗”, 33, “提示信息”)
 If c = vbOK Then
 Set AdoRs = Cnn.Execute("insert into tb_Goods_cldd values(’" &Txt_id & "’,‘" & Text1(0)&
 "’,‘" & Text1(1) & "’,‘" & Text1(2) & "’,‘"& Text1(3) & "’,‘" & Str(DT1.Value) & "’,‘" & Text1(4)
 & "’,‘" & Text1(5)& "’,‘" & Txt_bz & "’)“)
 MsgBox “数据保存成功”, 64, “提示信息”
 Else
 End If
 Adodc1.RecordSource = “select * from tb_Goods_cldd order by cldd_id”
 Adodc1.Refresh
 Call DBGCon
 End If
 Call Tbr_cortrol(Tbr_xxcz, True)
 End If
 End Sub
 (2)用户自定义修改信息过程事件的代码如下:
 Private Sub Edits() ‘修改信息的过程
 c = MsgBox(“确认修改信息吗”, 33, “提示信息”)
 If c = vbOK Then
 Set AdoRs = Cnn.Execute("UPDATE tb_Goods_cldd SET cldd_id=’” + Txt_id
- “‘,cldd_cphm=’” + Text1(0) + “‘,cldd_czxm=’” + Text1(1) + “‘,cldd_sjxm=’”
- Text1(2) + “‘,cldd_rwsj=’” + Str(DT1.Value) + “‘,cldd_phmc=’” + Text1(4)
- “‘,cldd_shdd=’” + Text1(5) + “‘,cldd_bz=’” + Txt_bz + “’ where cldd_id='”
- Txt_id.Text + “'”)
 MsgBox “数据修改成功”, 64, “提示信息”
 Adodc1.RecordSource = “select * from tb_Goods_cldd order by cldd_id”
 Adodc1.Refresh
 StrId = Txt_id.Text
 StrTitle = Text1(0).Text
 Call joinRZ '添加修改信息日志
 Call DBGCon
 Else
 End If
 End Sub
 (3)用户自定义删除信息过程事件的代码如下:
 Private Sub Deletes() ‘删除信息
 c = MsgBox(“确认删除该信息吗”, 17, “提示信息”)
 If c = vbOK Then
 On Error Resume Next ‘执行错误处理
 Set AdoRs = Cnn.Execute("Delete tb_Goods_cldd from tb_Goods_cldd where
 cldd_id=’" + Txt_id.Text + "’")
 Adodc1.Refresh '刷新数据信息
 End If
 For i = 0 To 5
 Text1(i).Text = “”
 Next i
 Txt_bz.Text = “”
 End Sub
 (五)托运申请单管理
 1、在正式托运货物之前,需要进行托运货物申请,在进行托运货物申请时需要填写托运货物申请单,托运申请单经过核对之后,才可以填写货物托运单进行托运货物。在托运申请单中记录的托运货物的详细信息,以便托运货物时进行核对。
 货物托运申请管理模块的运行结果如图6所示。
  
图6 货物托运申请管理模块运行结果
 2、窗体设计
 (1)在工程中新建1个窗体,将窗体的名称设置为“frm_Tysq”,BorderStyle属性设置为“1-Fixed Single”,MaxButton属性设置“False”。
 (2)在窗体上添加1个Toolbar控件和1个ImageList控件,为窗体设计工具栏。
 (3)在窗体中添加1个Frame控件,在Frame控件上添加1个文本框控件数组,并为每个文本控件配置1个标签控件,设置相应的Caption属性值,如图7所示。
 (4)在Frame控件上添加2个DTPicker控件,分别名称命名为DT1和DT2,用于输入或显示出货日期时间和开票日期。
 (5)在窗体上添加1个Ado控件。
 (6)在窗体中添加1个标签控件,命名为Lbl_Num。
 (7)在窗体上添加1个时钟控件Timer1,在属性窗口中将控件的Interval属性值设置为60。
 货物托运申请单管理窗体的设计结果如图7所示。
 
图7 货物托运管理窗体的设计结果
 3、代码设计
 (1)当窗体启动时,锁定窗体中文本框,禁止输入字符信息,同时通过Ado控件的ConnectionString属性连接到数据库,实现代码如下:
 Private Sub Form_Load()
 Call LoadFile '在窗体加载的时候显示数据信息
 For i = 1 To 20
 Text1(i).Locked = True '锁定文本框,禁止输入字符信息
 Next i
 Adodc1.ConnectionString = PublicStr '通过代码连接到数据库
 Adodc1.RecordSource = “select * from tb_Goods_sqd order by sqd_lszh”
 Adodc1.Refresh
 DT1.Value = Date
 Call Tbr_cortrol(Tbr_xxcz, True)
 End Sub
 (2)单击窗体中的工具栏按钮,完成相应的添加、删除、修改、保存和打印的操作,Toolbar控件Tbr_xxcz的ButtonClick事件代码如下所示:
 Private Sub Tbr_xxcz_ButtonClick(ByVal Button As MSComctlLib.Button)
 Select Case Button.Index
 Case 1 ‘添加信息
 Call Tbr_cortrol(Tbr_xxcz, False)
 For i = 0 To 20
 Text1(i).Locked = False
 Text1(i).Text = “”
 Next i
 Text1(0).SetFocus
 AdoRs.Open “select * from tb_Goods_sqd where sqd_lszh like '%” + Format(Date, “yyyymmdd”) + "%’ order by sqd_lszh", Cnn, adOpenKeyset '根据日期产生流水账号
 If AdoRs.RecordCount > 0 Then
 AdoRs.MoveLast
 Txt_id.Text = Val(AdoRs.Fields(“sqd_lszh”)) + 1
 Else
 Txt_id.Text = Format(Date, “yyyymmdd”) & “0000001”
 End If
 AdoRs.Close
 Case 2 '删除信息
 Call Deletes
 Case 3 '修改信息
 Call Edits
 Case 4 '保存信息
 Call Saves
 Case 5
 Call Tbr_cortrol(Tbr_xxcz, True)
 For i = 1 To 20
 Text1(i).Text = “”
 Text1(1).SetFocus
 Next i
 Case 6 '打印信息
 Unload Me
 End Select
 End Sub
 (3)通过文本框的Change事件,来实现在另一个文本框中自动计算合计金额的功能,实现的具体代码如下所示:
 Private Sub Text1_Change(Index As Integer)
 If Index = 7 Then
 Text1(15).Text = Val(Text1(7).Text) + Val(Text1(11).Text)
 ElseIf Index = 11 Then
 Text1(15).Text = Val(Text1(7).Text) + Val(Text1(11).Text)
 ElseIf Index = 15 Then
 Text1(15).Text = Val(Text1(7).Text) + Val(Text1(11).Text)
 End If
 End Sub
 (六)货物托运管理
 1、货物托运管理是本系统的核心,在货物托运申请完成之后,就可以填写货物托运单,托运司机根据货物托运单将货物托运到客户手中。对于同一张货物托运单,可以托运多种不同的货物,在托运管理窗体中可以添加或删除托运货物,还可以通过ListView控件浏览货物托运单信息。
 2、货物托运管理模块的运行结果如图8所示,单击工具栏中的【添加货物】按钮,将弹出增加托运货物窗体,如图9所示。
 
图8 货物托运管理模块的运行结果
 
图9 增加托运货物窗体
 3、货物托运窗体及增加托运货物窗体的设计
 (1)在工程中新建一个窗体,将窗体的名称设置为“frm_Hpty”,BorderStyle属性设置为“1-Fixed Single”,MaxButton属性设置False。
 (2)在窗体上添加Toolbar控件,根据前面所介绍的方法为窗体设计工具栏。
 (3)在窗体中添加2个ImageList控件。
 (4)在窗体上添加1个ListView控件。
 (5)在ListView控件上单击鼠标右键,在弹出的快捷菜单中选择“属性”项,在弹出的“属性页”对话框中选择“通用”选项卡,在该选项卡中选取“整行选择”、“网格行”和“热跟踪”等复选框,在“查看”旁的列表框中选择3-lvwReport,如图10所示。
 
图10 设置控件的显示模式
 (6)在ListView控件上单击鼠标右键,在弹出的快捷菜单中选择“属性”项,在弹出“属性页”对话框中选择“列首”选项卡,在该选项卡中单击【插入列】按钮,然后在“文本”文本框中输入插入列的标题名称,在“宽度”文本框中输入插入列的宽度,如图11所示。
 
图11 设置插入列的属性
 (7)在ListView控件上单击鼠标右键,在弹出的快捷菜单中选择“属性”项,在弹出的“属性页”对话框中选择“图像列表”选项卡,在该选项卡中的“普通”和“列标头”列表框中分别选择“ImageList2”,如图12所示。
 
图12 连接ImageList2控件
 (8)在窗体上添加1个Ado控件。
 (9)在窗体中添加3个Frame控件,分别在Frame控件中添加文本框控件和DataGrid控件,将DataGrid控件的名称设置为Dgr_Sjll,DataSource属性设置为Adodc1,BackColor属性值设置为&H00FFFFC0&,设计完成的界面如图13所示。
 (10)在窗体中添加1个标签控件,名称命名为Lbl_Num。
 (11)在窗体上添加1个时钟控件Timer1,在属性窗口中将控件的Interval属性值设置为60。
 货物托运管理窗体的设计结果如图13所示。
 
图13 货物托运管理窗体的设计界面
 (12)在工程中添加1个窗体,将窗体命名为Frm_Tyhwgl,该窗体作为货物托运管理的子窗体,用于为完成为货物托运单添加托运货物的操作。
 (13)将该窗体的BorderStyle属性设置为“1-Fixed Single”。
 (14)在该窗体上添加1个Ado控件。
 (15)在该窗体中添加1个Frame控件,在Frame控件中添加文本框控件和标签控件。
 (16)在该窗体中添加1个DataGrid控件,将DataGrid控件的名称设置为Dgr_Sjll,DataSource属性设置为Adodc1,设计完成的界面如图14所示。
 (17)在窗体上添加4个CommandButton控件,分别将控件的名称命名为“Cmd_Add”、“Cmd_Save”、“Cmd_Del”、“Cmd_Cancel”,Caption属性设置为“添加”、“保存”、“删除”、“取消”。
 
图14 托运货物管理窗体的设计界面
 (七)货物托运管理窗体的代码设计
 1、在窗体启动时,通过调用LoadFile过程,在窗体上显示数据,同时利用Ado对象计算出当前数据库中数据记录的条数,代码如下:
 Private Sub Form_Load()
 Call RefreshData
 Call LoadFile
 For i = 1 To 21 ‘锁定文本框,禁止输入内容
 Text1(i).Locked = True
 Next i
 AdoRs.Open “select * from tb_Goods_tyd order by tyd_tydh”, Cnn,
 adOpenKeyset
 If AdoRs.RecordCount > 0 Then
 Lbl_Num.Caption = “当前数据表中共有 " & AdoRs.RecordCount & " 条记录”
 End If
 AdoRs.Close
 Call Tbr_cortrol(Tbr_xxcz, True)
 End Sub
 2、单击工具栏中的控制按钮,通过Select Case语句控制工具栏中的按钮,完成添加、删除、修改、保存、添加货物和删除货物等操作,实现的代码如下:
 Private Sub Tbr_xxcz_ButtonClick(ByVal Button As MSComctlLib.Button)
 Select Case Button.Index
 Case 1
 Call Tbr_cortrol(Tbr_xxcz, False)
 For i = 0 To 21
 Text1(i).Locked = False
 Text1(i).Text = “”
 Next i
 Text1(0).SetFocus
 ‘根据日期产生流水账号
 AdoRs.Open “select * from tb_Goods_tyd where tyd_tydh like '%” + Format(Date, “yyyymmdd”) + "%’ order by tyd_tydh", Cnn, adOpenKeyset
 If AdoRs.RecordCount > 0 Then
 AdoRs.MoveLast
 Txt_id.Text = Val(AdoRs.Fields(“tyd_tydh”)) + 1
 Else
 Txt_id.Text = Format(Date, “yyyymmdd”) & “00001”
 End If
 AdoRs.Close
 Case 2 ‘删除信息
 Call Deletes
 Case 3 ‘修改信息
 Call Edits
 Case 4 ‘保存信息
 Call Saves
 Case 5
 Call Tbr_cortrol(Tbr_xxcz, True)
 For i = 1 To 21
 Text1(i).Text = “”
 Text1(1).SetFocus
 Next i
 Case 6 ‘添加货物
 TStrs = Txt_id.Text
 Frm_Tyhwgl.Cmd_Del.Enabled = False ‘使添加货物窗体中的“删除”按钮不可用
 Frm_Tyhwgl.Show 1
 Case 7 ‘删除货物
 TStrs = Txt_id.Text
 Frm_Tyhwgl.Cmd_Add.Enabled = False
 Frm_Tyhwgl.Cmd_Save.Enabled = False
 Frm_Tyhwgl.Show 1
 Case 8
 Unload Me
 End Select
 End Sub
 3、通过单击选择ListView控件中的元素(托运单号),然后调用DataLoad过程在窗体上显示相对应托运单号的数据信息,同时查询该记录是否被修改过,如果修改过则将修改时间及修改人信息显示在窗体的Txt_ysrq和Txt_ysr文本框当中,代码如下所示:
 Private Sub ListView1_Click()
 AdoRs.Open "select * from tb_Goods_tyd where tyd_tydh=’" & ListView1.SelectedItem & "’ order by tyd_tydh", Cnn, adOpenKeyset
 If AdoRs.RecordCount > 0 Then
 Call DataLoad ‘调用显示数据的过程
 End If
 AdoRs.Close ‘关闭数据集对象
 AdoRs1.Open "select * from tb_Goods_khys where khys_tydh=’" & ListView1.SelectedItem & "’“, Cnn, adOpenKeyset
 If AdoRs1.RecordCount > 0 Then
 Txt_ysrq.Text = AdoRs1.Fields(“khys_ysrq”)
 Txt_ysr.Text = AdoRs1.Fields(“khys_ysr”)
 Else
 Txt_ysrq.Text = “”
 Txt_ysr.Text = “”
 End If
 AdoRs1.Close
 Call ShowData '调用数据刷新的过程
 Call DBGCon
 End Sub
 4、通过时钟控件,将当前数据库中的记录条数显示在标签控件Lbl_Num当中,实现的代码如下所示:
 Private Sub Timer1_Timer()
 On Error Resume Next ‘执行错误处理的语句
 Lbl_Num.Caption = “当前数据表中共有 " & AdoRs.RecordCount & " 条记录”
 End Sub
 (八)添加托运货物信息窗体的代码设计
 1、在增加托运货物窗体中单击【添加】按钮,清空窗体中文本框的信息,代码如下:
 Private Sub Cmd_Add_Click()
 For i = 1 To 4
 Text1(i).Text = “”
 Next i
 Text1(1).SetFocus
 End Sub
 2、在窗体中单击【保存】按钮,在确认该货物信息没有被保存之后,保存所添加的货物信息,同时刷新窗体中的数据信息,代码如下:
 Private Sub Cmd_Save_Click()
 If Text1(0).Text = “” Then
 MsgBox “托运单号不能为空”, 64, “提示信息”
 Else
 AdoRs.Open "select * from tb_Goods_hwzx where hwzx_hwid=’” + Text1(1) +
 "’", Cnn, adOpenKeyset
 If AdoRs.RecordCount > 0 Then
 MsgBox “该货物已经添加过”, 64, “提示信息”
 Else
 c = MsgBox(“确认保存信息吗”, 33, “提示信息”)
 If c = vbOK Then
 Set AdoRs = Cnn.Execute("insert into tb_Goods_hwzx values(’" &
 Text1(1) & "’,’" & Text1(2) & "’,‘" & Text1(0) & "’," & Text1(3) & “,” & Text1(4)
 & “)”)
 MsgBox “数据保存成功”, 64, “提示信息”
 Adodc1.RecordSource = “select * from tb_Goods_hwzx where
 hwzx_sqdh='” + Text1(0) + “’ order by hwzx_hwid”
 Adodc1.Refresh
 Call DBGCon
 Cmd_Add.SetFocus
 End If
 End If
 AdoRs.Close
 End If
 End Sub
 (八)在途跟踪管理
 1、在途跟踪是对正在托运的货物信息进行管理,托运司机在托运货物的过程中,每到一个地方或者在托运过程中出现某些异常情况,就会给托运公司反馈一个信息,托运公司将反馈回来的信息进行记录,并且对反馈回来的异常情况进行处理,这个过程就是在途跟踪。
 2、在途跟踪管理模块的运行结果如图15所示。
 
图15 在途跟踪管理模块运行结果
 3、窗体设计
 (1)在工程中新建1个窗体,将窗体的名称设置为“Frm_Ztgz”,BorderStyle属性设置为“1-Fixed Single”,MaxButton属性设置False。
 (2)在窗体上添加1个Toolbar控件和1个ImageList控件。
 (3)在窗体上添加1个ListView控件。
 (4)在窗体上添加1个Ado控件。
 (5)在窗体中添加3个Frame控件,在Frame控件中添加文本框控件,并设置控件的相关属性。
 (6)在窗体上添加DataGrid控件,将DataGrid控件的名称设置为Dgr_Sjll,DataSource属性设置为Adodc1。
 在途跟踪管理窗体的设计结果如图16所示。
 
图16 在途跟踪管理窗体的设计
 4、代码设计
 (1)通过单击选择ListView控件中的元素(托运单号),在窗体中即可以显示相对应托运单号的数据信息,同时查询tb_Goods_ztgzlx数据表,从中检索出该托运单号的跟踪路线信息,将其显示在窗体的Txt_lx.文本框当中,实现的代码如下所示:
 Private Sub ListView1_Click()
 AdoRs.Open “select * from tb_Goods_ztgz where ztgz_cydh='” & ListView1.SelectedItem & “’ order by ztgz_cydh”, Cnn, adOpenKeyset
 If AdoRs.RecordCount > 0 Then
 Text1(0).Text = AdoRs.Fields(“ztgz_id”)
 Text1(1).Text = AdoRs.Fields(“ztgz_cydh”)
 Text1(2).Text = AdoRs.Fields(“ztgz_sjxm”)
 Text1(3).Text = AdoRs.Fields(“ztgz_cphm”)
 DT1.Value = AdoRs.Fields(“ztgz_dasj”)
 Text1(4).Text = AdoRs.Fields(“ztgz_sjsj”)
 Text1(5).Text = AdoRs.Fields(“ztgz_dadd”)
 Text1(6).Text = AdoRs.Fields(“ztgz_bz”)
 End If
 AdoRs.Close ‘关闭记录集对象
 AdoRs1.Open "select * from tb_Goods_ztgzlx where ztgzlx_tydh=’" &
 ListView1.SelectedItem & “'”, Cnn, adOpenKeyset
 If AdoRs1.RecordCount > 0 Then
 Txt_lx.Text = AdoRs1.Fields(“ztgzlx_lx”)
 End If
 AdoRs1.Close ‘关闭记录集对象
 Adodc1.RecordSource = "select * from tb_Goods_ztgz where ztgz_cydh=’" +
 ListView1.SelectedItem + “'”
 Adodc1.Refresh ‘刷新数据信息
 Call DBGCon ‘给DataGrid控件的列标题赋值
 End Sub
 (2)在工具栏中单击【保存】按钮将调用用户自定义的保存过程,保存在途跟踪信息,用户自定义的保存过程的代码如下:
 Private Sub Saves() ‘保存信息的过程
 If Text1(1).Text = “” Then
 MsgBox “托运单号不能为空”, 48, “提示信息”
 Else
 AdoRs2.Open "select * from tb_Goods_ztgz where ztgz_id=’" + Text1(0) +
 "’", Cnn, adOpenKeyset
 If AdoRs2.RecordCount > 0 Then
 MsgBox “该信息已经存在”, 48, “提示信息”
 Else
 c = MsgBox(“确认保存信息吗”, 33, “提示信息”)
 If c = vbOK Then
 Set AdoRs = Cnn.Execute("insert into tb_Goods_ztgz values(’" &
 Text1(0) & “‘,’” & Text1(1) & “‘,’” & Text1(2) & “‘,’” & Text1(3) & “‘,’”
 & Text1(4) & “‘,’” & Text1(5) & “‘,’” & Str(DT1.Value) & “‘,’” & Text1(6)
 & “')”)
 AdoRs.Open “select * from tb_Goods_ztgzlx where ztgzlx_tydh='”
- Text1(1) + “'”, Cnn, adOpenKeyset
 If AdoRs.RecordCount > 0 Then
 Call DDTJ ‘统计到达的路线
 Set AdoRs = Cnn.Execute("UPDATE tb_Goods_ztgzlx SET
 ztgzlx_lx=’" + Txt_lx + “’ where ztgzlx_tydh='” + Text1(1).Text + “'”)
 Else
 Call DDTJ ‘统计到达的路线
 Set AdoRs = Cnn.Execute("insert into tb_Goods_ztgzlx
 values(’" & Text1(1) & “‘,’” & Txt_lx & “')”)
 End If
 MsgBox “数据保存成功”, 64, “提示信息”
 End If
 Adodc1.RecordSource = “select * from tb_Goods_ztgz order by ztgz_id”
 Adodc1.Refresh
 Call DBGCon
 Call Tbr_cortrol(Tbr_xxcz, True)
 End If
 AdoRs2.Close
 End If
 Call RefreshData
 End Sub
 (3)在工具栏中单击【删除】按钮将调用用户自定义的删除过程,删除在途跟踪信息,用户自定义删除在途跟踪过程的代码如下:
 Private Sub Deletes() ‘删除信息
 c = MsgBox(“确认删除该信息吗”, 17, “提示信息”)
 If c = vbOK Then
 On Error Resume Next
 Set AdoRs = Cnn.Execute("Delete tb_Goods_ztgz from tb_Goods_ztgz where
 ztgz_id=’" + Text1(0).Text + “'”)
 Adodc1.Refresh ‘刷新数据信息
 Call DBGCon
 End If
 For i = 1 To 5
 Text1(i).Text = “”
 Next i
 Cbx_xb.Text = “” ‘清除列表控件的内容
 Call RefreshData
 End Sub
 (4)在保存在途跟踪信息的时候,需要调用用户自定义的DDTJ过程,完成在文本框Txt_lx中显示跟踪路线信息的功能,DDTJ过程的实现代码如下:
 Private Sub DDTJ()
 AdoRs1.Open "select * from tb_Goods_ztgz where ztgz_cydh=’" + Text1(1) + "’", Cnn, adOpenKeyset
 If AdoRs1.RecordCount > 0 Then
 AdoRs1.MoveFirst '将数据库中的记录移向第一条
 Txt_lx.Text = “”
 On Error Resume Next '执行错误处理
 For i = 0 To AdoRs1.RecordCount
 If Txt_lx.Text = “” Then
 Txt_lx.Text = “公司本部” & “–>” & AdoRs1.Fields(“ztgz_dadd”)
 Else
 Txt_lx.Text = Txt_lx.Text & “–>” & AdoRs1.Fields(“ztgz_dadd”)
 End If
 AdoRs1.MoveNext '将数据库中的记录移向下一条
 Next i
 End If
 AdoRs1.Close '关闭记录集对象
 End Sub
 (九)信息查询
 1、在应用软件的设计过程中,将同一项功能设计到同一个窗体当中是非常必要的,这样会减少应用程序中窗体的数量和代码数量,提高程序的运行速度,本系统当中的查询模块就是这样设计的。通过在主窗体的查询模块的菜单中设置一个标识变量,然后在查询窗体中根据这个标识变量设置具体实现的查询功能,如将托运申请单查询的标识变量设置为1、车辆调度信息查询的标识变量设置为2等等,这样在查询窗体当中,当窗体启动时进行判断,如果标识变量是1,则进行托运申请信息查询的相关操作,如果标识变量是2,则进行车辆调度信息查询的相关操作。
 2、信息查询模块的运行结果如图17所示(这里以货物托运单查询为例)。
  
图17 信息查询模块运行结果
 3、窗体设计
 (1)在工程中新建1个窗体,将窗体的名称设置为“Frm_Xxcx”,BorderStyle属性设置为“1-Fixed Single”,MaxButton属性设置False。
 (2)在窗体上添加1个Ado控件,其名称为默认。
 (3)在窗体中添加1个Frame控件,在Frame控件中添加1个ComboBox控件、1个标签控件、1个文本框控件和2个CommandButton控件,并设置控件的相关属性。
 (4)在窗体上添加1个DataGrid控件,将DataGrid控件的名称设置为“Dgr_Cx”,DataSource属性设置为Adodc1。
 信息查询窗体的设计结果如图18所示。
 
图18 信息查询窗体的设计结果
 4、代码设计
 (1)在窗体启动时,通过接收到不同的标识变量值,将相应的查询字段信息添加到ComboBox控件当中,并且根据标识变量执行相应的查询函数Flcx(),完成在窗体上显示数据表中所有数据的功能,实现的代码如下:
 Private Sub Form_Load()
 AdoRs.Open “select * from tb_Goods_sqd”, Cnn, adOpenKeyset
 If AdoRs.RecordCount > 0 Then
 End If
 AdoRs.Close
 Me.Left = (Screen.Width - Me.Width) / 2
 Me.Top = (Screen.Height - Me.Height) / 2
 If StrCx = 1 Then
 Call Flcx(1) '执行托运申请信息查询
 ElseIf StrCx = 2 Then
 Call Flcx(2) '执行车辆调度信息查询
 ElseIf StrCx = 3 Then
 Call Flcx(3) '执行货物托运信息查询
 ElseIf StrCx = 4 Then
 Call Flcx(4) '执行托运验收信息查询
 End If
 Adodc1.ConnectionString = PublicStr
 Adodc1.RecordSource = StrRs
 Adodc1.Refresh
 Set Dgr_Cx.DataSource = Adodc1
 If StrCx = 1 Then '添加托运申请信息查询字段
 Call DgrTitle(1) '调用保存查询字符串的过程
 For i = 0 To 23
 Cbx_tj.AddItem Dgr_Cx.Columns(i).Caption
 Next i
 ElseIf StrCx = 2 Then '添加车辆调度信息查询字段
 Call DgrTitle(2)
 For i = 0 To 7
 Cbx_tj.AddItem Dgr_Cx.Columns(i).Caption
 Next i
 ElseIf StrCx = 3 Then '添加货物托运信息查询字段
 Call DgrTitle(3)
 For i = 0 To 23
 Cbx_tj.AddItem Dgr_Cx.Columns(i).Caption
 Next i
 ElseIf StrCx = 4 Then '添加托运验收信息查询字段
 Call DgrTitle(4)
 For i = 0 To 6
 Cbx_tj.AddItem Dgr_Cx.Columns(i).Caption
 Next i
 End If
 End Sub
 (2)在用户自定义的Flcx函数过程当中,保存着相对应的查询字符串信息,根据该查询字符串来完成相应的查询事件,代码如下:
 Private Sub Flcx(Nums As Integer)
 Select Case Nums
 Case 1 '货物申请查询
 Me.Caption = “货物申请单查询”
 StrRs = “select * from tb_Goods_sqd order by sqd_lszh”
 Case 2
 Me.Caption = “车辆调度查询”
 StrRs = “select * from tb_Goods_cldd order by cldd_id”
 Case 3
 Me.Caption = “货物托运单查询”
 StrRs = “select * from tb_Goods_tyd order by tyd_tydh”
 Case 4
 Me.Caption = “货物验收单查询”
 StrRs = “select * from tb_Goods_khys order by khys_id”
 End Select
 End Sub
 (3)通过文本框中字符信息的改变,调用查询事件的过程FlcxChage执行查询事件,完成各种查询功能。代码如下:
 Private Sub Txt_cx_Change()
 If Cbx_tj.Text <> “” Then
 If StrCx = 1 Then '货物申请单查
 Call FlcxChage(1) '调用查询过程
 Call DgrTitle(1)
 ElseIf StrCx = 2 Then '车辆调度查询
 Call FlcxChage(2)
 Call DgrTitle(2)
 ElseIf StrCx = 3 Then '货物托运单查询
 Call FlcxChage(3)
 Call DgrTitle(3)
 ElseIf StrCx = 4 Then '货物验收单查询
 Call FlcxChage(4)
 Call DgrTitle(4)
 End If
 End If
 End Sub
 (4)在用户自定义的FlcxChage函数过程当中,完成随时查询的操作,实现的代码如下:
 Private Sub FlcxChage(Nums As Integer)
 Select Case Nums
 Case 1 ‘执行货物申请查询
 Adodc1.RecordSource = “select * from tb_Goods_sqd where " & Coms &
 " Like '%” + Txt_cx.Text + "%’"
 Adodc1.Refresh
 Case 2 ‘执行车辆调度查询
 Adodc1.RecordSource = “select * from tb_Goods_cldd where " & Coms &
 " Like '%” + Txt_cx.Text + "%’"
 Adodc1.Refresh
 Case 3 ‘执行托运信息查询
 Adodc1.RecordSource = “select * from tb_Goods_tyd where " & Coms &
 " Like '%” + Txt_cx.Text + "%’"
 Adodc1.Refresh
 Case 4 ‘执行托运验收查询
 Adodc1.RecordSource = “select * from tb_Goods_khys where " & Coms &
 " Like '%” + Txt_cx.Text + "%’"
 Adodc1.Refresh
 End Select
 End Sub
四、结论
当今高速发展的信息社会,现代物流行业突飞猛进发展,伴随着我国国民经济连续多年的高速增长,为现代物流发展创造了良好的条件。目前,我国各类物流企业有14万家左右,展望整个21世纪,可以说现代物流业还将有更大的发展。
 通过对现代物流的分析与设计,可以更好的发现问题、从而大大提高了现在物流的成本以及更好的实现智能化。
致谢
感谢学院的培育之恩,三年大学学习学会了坚持与忍耐,感谢学院提供了很好的设计环境,感谢齐老师的精心指导与帮助,让我能顺利完成这次的论文,感谢同学的热心帮助!
参考文献
[1]. 赛奎春、高春艳等,Visual Basic精彩编程200例 机械工业出版社,2003年1月
 [2]. 刘志铭、高春艳等,Visual Basic数据库开发实例解析 机械工业出版社,2003年8月
 [3].王晶莹、王国辉等,Visual FoxPro数据库开发实例解析 机械工业出版社,2003年9月
 [4]. 华传铭、张振坤等,Power Builder数据库开发实例解析 机械工业出版社,2003年9月
 [5]. 赛奎春、郑骁鹏等,Delphi数据库开发实例解析 机械工业出版社,2004年2月
 [6]. 张振坤、李文立等,PowerBuilder 精彩编程200例 机械工业出版社,2004年9月
 [7]. 王国辉、董韶华等,Visual FoxPro 精彩编程200例 机械工业出版社,2004年9月
 [8]. 李严、于亚芳、王国辉,ASP数据库开发实例解析 机械工业出版社,2004年12月
 [9]. 宋坤、赵智勇等,Delphi工程应用与项目实践 机械工业出版社,2005年1月
 [10]. 高春艳、李俊民等,Visual Basic工程应用与项目实践 机械工业出版社,2005年1月
 [11]. 张雨、阮伟良等,Visual C++工程应用与项目实践 机械工业出版社,2005年1月
 [12]. 陈威、白伟明、李楠 ,JSP工程应用与项目实践 机械工业出版社,2005年2月
 [13]. 王国辉、牛强、李南南,ASP工程应用与项目实践 机械工业出版社,2005年4月
 [14]. 高春艳、李俊民、张耀庭等,Visual Basic 信息系统开发实例精选 机械工业出版社,2005年7月
 [15]. 王国辉、牛强、李南南等,ASP 信息系统开发实例精选 机械工业出版社,2005年7月
 [16]. 宋坤、赵智勇、刘强等,Delphi 信息系统开发实例精选 机械工业出版社,2005年7月
 [17]. 周桓、张雨、王国辉,Visual foxpro数据库开发关键技术与实例应用 人民邮电出版社,2004年5月
 [18]. 刘志铭 张振坤 冯文萃,PoweBuilder数据库开发关键技术与实例应用 人民邮电出版社,2004年5月
 [19]. 高春艳、李艳,Visual basic数据库开发关键技术与实例应用 人民邮电出版社,2004年5月
 [20]. 赛奎春 陈紫鸿 宋昆,Delphi数据库开发关键技术与实例应用 人民邮电出版社,2004年5月