首页 电信终端计费系统开发 毕业论文

电信终端计费系统开发 毕业论文

举报
开通vip

电信终端计费系统开发 毕业论文电信终端计费系统开发 毕业论文 电信终端计费系统开发 1. 1系统设计 1.1.1 系统功能分析 终端计费系统开发的目的是能够实现对不同型号的程控交换机对计费中心定时或即时传下来的原始话单信息进行及时准确的分类、查询、浏览、修改、删除、统计、话单信息的打印等。能够及时查询客户的通话数据,避免引起话费争议,提高客户的满意度。使管理更科学、更方便、更合理。同时,也能够帮助电信计费有关人员提高工作效率和服务质量。为电信局减少不必要的损失。从而有效的提高电信局经济的效益。 通过对电信局计费中心日常工作的分析,可将终...

电信终端计费系统开发  毕业论文
电信终端计费系统开发 毕业论文 电信终端计费系统开发 1. 1系统 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 1.1.1 系统功能 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 终端计费系统开发的目的是能够实现对不同型号的程控交换机对计费中心定时或即时传下来的原始话单信息进行及时准确的分类、查询、浏览、修改、删除、统计、话单信息的打印等。能够及时查询客户的通话数据,避免引起话费争议,提高客户的满意度。使管理更科学、更方便、更合理。同时,也能够帮助电信计费有关人员提高工作效率和服务质量。为电信局减少不必要的损失。从而有效的提高电信局经济的效益。 通过对电信局计费中心日常工作的分析,可将终端计费系统的功能概括成如下方面。 (1) 号码管理:包括固定电话和公用电话基本信息的录入、修改、删除、查找、 添加、查询等管理。 (2) 字冠管理:包括固定电话和公用电话地方基本字冠的录入、修改、删除、 查找、添加、查询等管理。 (3) 原始话单管理:包话对程控交换传下来的原始话单信息的导入、浏览、删 除等管理。 (4) 费率管理:包括固定电话和公用电话基本费率的录入、修改、删除、查找、 添加、查询等管理。 (5) 关于系统:对有关系统的简介和对用户的管理(包括用户注册、用户删除、 用户修改)。 (6) 计费统计管理:即时计费、定时周期计费、对已统计的计费表的浏览(包 括对统计表的删除、删除统计表的字段、对最近操作进行恢复、查看统计 表)等管理。 考虑系统的安全性,需要对用户进行安全认证,因此还需要实现以下系统用户的管理功能。 (1) 用户登录认证。 (2) 用户管理,包括用户注册、删除用户、修改用户信息等(只有高级管理员 才有此权限)。 (3) 登录日志的记录和删除日志(只有高级管理员才有此权限,普通用户只能 对数据进行浏览)。 1.1.2系统功能模块设计 根据系统所要实现的功能,按照结构化程序设计的原则将整个系统划分为如图1-1所示的若干个功能模块。 2 关于系统 登录日志 系统管理 删除日志 用户管理 号码添加 号码查询 号码管理 号码修改 呈码删除 字冠添加 字冠管理 字冠修改 字冠删除 计费系统 费率添加 费率管理 费率修改 费率删除 话单导入 话单删除 原始话单 话单浏览 即时计费 计费统计 定时计费 话单浏览 图1-1 计费系统功能模块图 3 1.1.3 操作流程图 根据系统功能模块的划分和计费管理系统的实际工作流程,画出如图1-2所示的计费管理系统操作流程图。 登录认证 启动系统 导入 浏览 原始话单 话单库 添加 固话管理 固话表 计 修改 公话管理 公话表 费 删除 费率管理 费率表 系 查找 字冠管理 字冠表 统 话 话费统计 单 即时、定期话单库 库 库 计费 图1-2 计费系统操作流程图 2.1数据库设计 2.1.1 数据库需求设计 在前面的1.1节里已经对计费系统操作流程进行了分析,在它的基础上,我们可以列出以下计费管理系统所需的数据项和数据结构。 (1) 固话表:号码、地名、基本月租等。 (2) 公话表:号码、地名、基本月租等。 (3) 字冠表:地名、类型、本地字冠号 (4) 费率表:主叫类型、通话类型、日期类型、费率、首次三分钟等。 (5) 登录日志:工号、登录日期等 (6) 用户注册:工号、密码、密码验证等。 2.1.2 数据库概念结构的设计 Access 数据库是Office XP 软件包中的产品之一,是一个关系数据库 (RDBMS),与其他的关系数据库管理系统相比,Access具有简单易学、方便实用等特点,易于开发数据库应用程序。 Access通过数据库的方式来处理数据,在Access的数据库中包含了表、表之间关系、查询、报表、宏和数据访问页等对象。其实可以把数据库看成是一个相关对象的容器,创建数据库是使用Access进行数据处理的第一步。在Access 4 中可使用以下三种 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 创建数据库: (1) 用数据库向导创建数据库; (2) 创建空的数据库; (3) 用现有文件创建数据库; 本系统所采用的数据库就是通过Access(数据库向导)来创建的。而且要创建三个数据库:计费系统库、话单库、统计库。 2.1.3 数据库逻辑结构设计 从图1-2 计费系统操作流程图,可以看得出要建立六个基本的数据表来存储系统所必备的信息。这六个表分别为固话表、公话表、字冠表、费率表、登录日志表、用户注册表。实际上,还要建立统计表。但统计表的建立是在进行计费时通过程序来完成建立过程的。后面的章节会介绍到关于这方面的内容。六个数据表的结构如表2.1到表2.6所示。 表2.1 固话表 字段名称 数据类型 ID 自动编号 号码 数字 地名 文本 基本月租 数字 表2.2 公话表 字段名称 数据类型 ID 自动编号 号码 数字 地名 文本 基本月租 数字 5 表2.3 字冠表 字段名称 数据类型 ID 自动编号 地名 文本 类型 文本 本地字冠号 数字 表2.4费率表 字段名称 数据类型 ID 自动编号 主叫类型 文本 通话类型 文本 费率 文本 日期类型 文本 首次三分钟 货币 表2.5 字冠表 字段名称 数据类型 ID 自动编号 工号 文本 登录日期 日期\时间 表2.6 用户注册表 6 字段名称 数据类型 ID 自动编号 工号 文本 密码 文本 密码确认 文本 2.1.4 数据库的创建 创建数据库时可以先创建一个空数据库,然后往数据库中添加相应的对象,这是一种较复杂但又非常灵活的创建数据库方法。创建数据库的步骤如下。 1) 在Access中执行 [文件] [新建] 命令,出现 [新建文件] 对话( 框。 (2) 在[新建文件] 对话框中选择 [新建] 选项中的 [空数据库], 弹出 文件新建数据库] 对话框; [ (3) 在 [文件新建数据库] 对话框中选择保存文件的位置并输入要创建的 数据库名称,然后单击 [创建] 按钮,出现如图2-1所示的[数据库] 窗口。空数据库创建完毕。 图2-1 数据库窗口 7 2.1.5 数据表的创建 创建表其实就是创建表的结构,表的结构包括表中每个字段的字段名、字段的数据类型和字段属性,为表中的每个字段设置好字段名、字段的数据类型和字段属性后,表也就创建好了。 创建表之前首先需要打开数据库窗口,然后在数据库窗口中通过以下四种方法进行创建: 1) 通过输入数据创建表; ( (2) 使用表向导创建表; (3) 使用表的设计视图创建表; (4) 通过导入或链接已有的数据创建新表; 一般采用“使用表向导创建表”来创建表,本系统所用到的表大部分都 采用此方法来创建表。 2.1.6 数据库版本的转换 本系统采用数据控件的形式访问数据库,Visual Basic 6.0 中的数据控件不支持Access 2000以上版本的格式数据库,为了访问数据库,必须将高版本格式的数据库转化为低版本的数据库格式。具体操作如下:用高版本的Access打开数据库文件.mdb,执行 [工具] [数据库实用工具] [转换数据库] [到早期Access数据版本] 命令,输入新的数据库文件路径及文件名,单击 [确定] 即可。将数据转换成较低版本后,不能在数据库直接修改数据库中表的结构。如果需要修改,必须将它转换回高版本的Access数据库格式后才能修改,修改完后再转换成低版本格式的数据库。 2.3 工程文件及主窗体的创建 数据创建完后,下一步就到系统功能的开发和实现。本系统采用中文版Visual Basic 6.0 来编写,而用DAO作为数据访问的对象。 2.3.1 创建工程文件 启动Visual Basic 6.0,新建一个工程文件,为工程添加必要的引用对象和部件库,执行 [工程] [引用]命令,打开[引用]对话框,在[可用的引用]列表框中选择“Microsoft DAO 3.6 Object Library”。这样工程中就可以使用DAO对象库了。[引用]对话框界面如图2-2所示,其中前4项是系统创建工程时自动添加的。 8 图2-2 [引用] 对话框 系统中还需要使用 表格 关于规范使用各类表格的通知入职表格免费下载关于主播时间做一个表格详细英语字母大小写表格下载简历表格模板下载 来显示数据和插入一个音效来播入一个音频文件,为此需要给工程添加表格部件和音效对象。添加方法:[执行] [部件]命令,打开 控件]选项卡中选择[Microsoft DataGrid Control 6.0(OLEDB)],部件对话框,在[ 在[插入对象]选项卡中选择[音效],然后点击[确定]按钮,相应的控制件就会被添加到工具箱上。 保存工程,工程文件命名为工程1。 2.3.2 主控模块的设计 为了提高系统的安全性,用户必须通过登录认证才能使用本系统。程序运行后首先显示的是登录窗体,用户输入正确的工号和密码才能启动主窗体。为了实现这个功能,一种解决办法是将窗体设为启动模块,另一种办法是将启动模块设置为Main过程,在Main过程中显示登录模块进行登录认证,根据认证结果确定是否显示主窗体。本系统采用的是第一种方法。 在工程文件中执行[工程] [工程1属性]命令,打开[工程1属性]对话框,在[通用]选项卡的[启动对象]列表框选取form1(登录模块),单击[确定] 按钮。如图2-3所示。 9 图2-3 [工程1属性] 对话框 2.4 模块变量 2.4.1 变量的定义 在程序中,常用变量来临时存储数据,每个变量声有属于自己的名字和数据,变量的名字简称为变量名,变量的类型决定该变量可存储哪种类型的数据,以及变量作用的范围。全局变量的作用域是整个应用程序。局部变量的作用域只是在过程中可用。在这里我们先介绍本系统设计要用到的一些全局变量,而一些局部变量过程中用到再做介绍。全局变量只能在模块(Module1)中定义,且必须用Public关键字定义。 因此,首先要在工程中添加一个Module1模块。添加模块的方法:在工程里执行 [工程] [添加模块] 命令,就可以在工程中添加一个Module1模块,本系统的Module1模块中定义以下变量: Public dirtablename Public t, strar Public v '判断是否结算过 Public gonghao, gonghao1 Public p '判断登录级别 Public dingshihour Public dingshiname1 2.5 登录模块的创建 2.5.1窗体的创建 10 执行[工程] [添加窗体]命令,给工程添加一个新窗体,窗体的主要属性设置如表2-7所示 表2-7登录窗体属性 属性名 属性值 说明 名称 form1 窗体名称 caption 登录 窗体标 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 picture BitTamp 窗体背景图片 StartUpPositoon 2-屏幕中心 启动后居屏幕的中心 2.5.2登录窗体实现的功能 窗体右上角有日期和时间的显示。“计费系统”标题反复从右向左移动。向文体框输入密工号和密码后,通过过单击“确认”,验证工号和密码有效后,方可进入主界面。同时,如果是试用本系统,系统会提示只能试用4次,超过了第4次,就无法再进入主界面,如果你想继续使用本系统,就必须输入本软件提供的序列号。输入了序列号后就可以永久的使用本软件。 2.5.3窗体界面的设计 登录窗体界面布局如图2-4所示(图中标有主要控件的名称)而在试用期间系统会有相关的提示如图2-5和2-6所示。 图2-4 登录窗体界面 11 图2-5 序列号输入窗口 图2-6 提示框 所用到的控件包括:Label、Text、Command、Timer、data1。 主要控件的属性如表2-8所示。 属性名 属性 属性值 说明 Label3 caption 工号 标签 Label4 caption 密码 标签 Label1 caption 计费系统 标签 按扭控件 Command1(0) caption 确定 Command1(1) caption 取消 按扭控件 Text1(0) borterstyle 1-fixed single 文本框 Text1(1) borterstyle 1-fixed single 文本框 2.5.4登录窗体功能的实现 功能实现的代码如下: Option Explicit Dim i As Integer Dim examdb As Database Dim examtbl As TableDef Dim b, name1, now1 Private Sub command1_click(Index As Integer) Dim name As String Dim password As Variant If Text1(0).Text = "" Or Text1(1).Text = "" Then MsgBox "用户名和密码不能为空~" Exit Sub End If Data1.DatabaseName = App.Path + "\计费系统" Data1.RecordSource = "用户注册" Data1.Refresh name = "工号='" & Text1(0).Text & " ' " Data1.Recordset.FindFirst name 12 If Data1.Recordset.NoMatch = False Then If Data1.Recordset.Fields("密码").Value = Text1(1).Text Then name1 = Text1(0).Text now1 = Now Data1.DatabaseName = App.Path + "\计费系统" Data1.RecordSource = "登录日志" Data1.Refresh Data1.Recordset.AddNew Data1.Recordset.Fields("工号").Value = Text1(0).Text Data1.Recordset.Fields("登录日期").Value = Now Data1.Recordset.Update gonghao = Text1(0).Text Load Form2 '启动主界面 Form2.Show Unload Form1 Exit Sub End If GoTo z Else z: i = i + 1 If i = 3 Then Unload Form1 If i <> 3 Then MsgBox ("输入有误~输入三次不正确将自动退出~") End If End Sub Private Sub Command2_Click() Unload Form1 End Sub Private Sub Form_Activate() Dim a, c Dim xiluehao Text1(0).SetFocus c = Dir(App.Path + "\购买1") If c = "" Then g: xiluehao = InputBox("为了您能够长期的使用本软 件,请您输入-本软件提供正规的序列号~", "序列号") If xiluehao <> "" Then If xiluehao = Trim(123456789) Then Kill (app.path+"\购买2") Open App.Path + "\购买1" For Random As #4 Len = 20 Put #4, 1, xiluehao Close #4 13 MsgBox "欢迎使用本软件~" Else MsgBox "输入的是无效的序列号~" GoTo g End If Else ) a = Dir(App.Path + "\购买2" If a = "" Then b = 1 Open App.Path + "\购买2" For Random As #3 Len = 20 Put #3, 1, b Close #3 End If Open App.Path + "\购买2" For Random As #3 Len = 20 Get #3, 1, b If b > 4 Then MsgBox "警告:该软件已经过期,请购买正式版~", 48, "- 注意" Close #3 End End If If b <> 4 Then MsgBox "这是你第" + Str(b) + "次试用本软件,你还可以试- 用" + Str(4 - b) + "次~" Else MsgBox "这是你第" + Str(b) + "次试用本软件, 这是最后- 一试用。如果你要继续使用,请购正版~" End If b = b + 1 Put #3, 1, b Close #3 End If End If End Sub Private Sub Form_Load() i = 0 Timer1.Enabled = True End Sub Private Sub Timer1_Timer() If Label1.Left + Label1.Width > 0 Then Label1.Move Label1.Left - 200 Else Label1.Left = Label1.Width 14 End If Label2(0).Caption = Format(Date, "dddddd") Label5.Caption = Format(Time, "ttttt") End Sub 动态变量i是用来记录用户登录失败的次数,如里连续4次登验证失败,则退出整个系统。而动态变量b是用来记录试用本软件的次数,如果试用已经超过4次则不能再继续试用。要继续使用必须输入本软件提供的系列号。否则,将无法登录到主界面。 2.6 系统主界面模块的创建 2.6.1 模块分析 主界面模块实现为计费系统提供各种有关计费重要的操作项目,为用户提供一个简洁、方便的人机操作界面。 2.6.2 窗体的创建 执行[工程] [添加窗体]命令,给工程添加一个新窗体,窗体的主要属性设 -9所示 置如表2 表2-9主界面窗体属性 属性名 属性值 说明 名称 form2 窗体名称 caption form2 窗体标题 picture BitTamp 窗体背景图片 StartUpPositoon 2-屏幕中心 启动后居屏幕的中心 Borderstyle 1-Fixed Single 窗体固定边界,禁止用户改变大小 将窗体保存为form2.frm。 2.6.3 模块主界面的设计 在窗体上添加控件。窗体布局运行结果如图2-7所示。 主要控件属性如表1-9所示。 三个标签Label1、Label2、Label3。两个Timer控件:Timer1、Timer2。 6个单选钮,Option1—Option6。两个命令按钮command1、command2。一个Data1。 15 图2-7主界面 表2-9 主界面窗体主要控件属性 控件 属性 属性值 说明 Option1 caption 号码管理 Option2 caption 字冠管理 Option3 caption 系统管理 单选框 Option4 caption 费率管理 Option5 caption 计费统计 Option8 caption 原始话单 Label1 caption 计费系统 Option font 宋体 Option、Label1这两个属性值设置一 Label1 fontcolor &HooooooFF& 样 Timer1 Timer1 interval 50 时钟 确定 Command1 caption 退出 命令按钮 Command2 font 宋体 fontcolor &HococoFF& 应该注意的是Data1、Label2和Label3的属性是在程序运行过程中通过命令 16 赋给的。Label1用来显示当前时间和日期,Label3用来提示是否已经到了定期计 费的时间。Data1数据控件用来存取数据库信息。当定期计费时间到时,通过命 令自动指向在文件统计库.mdb里新成的统计数据表,以便于在表中添加数据。 2.6.4 模块功能实现的代码 Option Explicit Dim examdb As Database Dim examtbl As TableDef Dim examfld(4) As Field Dim zjhm, pjhm, qssj, zcsj Dim dingshiname Dim i '确定字体颜色的改变 ********退出*********** Private Sub command1_click() Unload Form2 End Sub ********Label1文字标题颜色改变******** Private Sub Form_Click() If i = 1 Then Label1.ForeColor = &HFF0000 i = 2 Else Label1.ForeColor = &HFF& i = 1 End If End Sub Private Sub Form_Load() i = 1 Timer1.Enabled = True End Sub Private Sub Command2_Click() Dim msg As Integer If Option2.Value Then '字冠管理 Load Form7 Form7.Show End If If Option1.Value Then '号码管理 Form9.Show End If If Option5.Value Then '启动进行计费 Load Form10 17 Form10.Show End If If Option8.Value Then Load Form3 '启动原始话单 Form3.Show End If If Option4.Value Then Load Form6 '启动费率管理 Form6.Show End If If Option3.Value Then '系统简介 Form8.Show End If End Sub Private Sub Timer1_Timer() '判断是否到结算日期 Open App.Path + "\定时周期" For Random As #5 Len = 20 Get #5, 1, t '定时日期 Get #5, 3, dingshihour Get #5, 2, v '是否结算过 If Val(t) <> Day(Now) Or Val(dingshihour) <> Hour(Now) Then v = 0 Put #5, 2, v Else If v <> 2 Then '没有结算过 Label3.Caption = "今天是结算日期~正在导入数据...." Close #5 *******************表的生成********************* dingshiname = App.Path + "\话单\" + Trim(Str(Month(Now)))_ + Trim(Str(Day(Now))) '话单存在放的路径 dingshiname1 = Trim(Str(Month(Now))) + Trim(Str(Day(Now))) Set examdb = OpenDatabase(App.Path + "\话单库") Set examtbl = examdb.CreateTableDef(dingshiname1) With examtbl Set examfld(0) = .CreateField("主叫号码", dbText, 15) Set examfld(1) = .CreateField("被叫号码", dbText, 15) Set examfld(2) = .CreateField("起始时间", dbText, 50) Set examfld(3) = .CreateField("终止时间", dbText, 50) .Fields.Append examfld(0) .Fields.Append examfld(1) .Fields.Append examfld(2) .Fields.Append examfld(3) End With 18 Set examdb = OpenDatabase(App.Path + "\话单库") Data1.DatabaseName = App.Path + "\话单库" Data1.RecordSource = dingshiname1 Data1.Refresh Open dingshiname For Input As #1 On Error Resume Next examdb.TableDefs.Append examtbl '添加表 Set examdb = OpenDatabase(App.Path + "\话单库") Data1.Refresh While Not EOF(1) Input #1, zjhm, pjhm, qssj, zcsj Data1.Recordset.AddNew Data1.Recordset.Fields("主叫号码").Value = zjhm Data1.Recordset.Fields("被叫号码").Value = pjhm Data1.Recordset.Fields("起始时间").Value = qssj Data1.Recordset.Fields("终止时间").Value = zcsj Data1.Recordset.Update Wend Close #1 Label3.Caption = dingshiname1 + "话单" + "成功导入数据库~" Label3.Caption = "" Timer1.Enabled = False strar = True On Error Resume Next Unload Form12 Form12.Show End If End If Close #5 End Sub Private Sub Timer2_Timer() Label2.Caption = Now End Sub 以上代码完成了系统主界面所需要的各种功能的实现。可以任意在主界面上选择其功能,从而进入系统其它下一级界面执行相应的操作。除此之外,还可以判断是否已经到结算日期,是否已经结算过等功能。 2.7 系统管理模块 2.7.1 模块分析 系统管理管理模块实现对系统安全的管理,包括了关于系统说明、登录日志的记录、登录日志的删除、用户管理。而用户管理又包括了用户的注册、用户修 19 改、用户的删除。用户管理包括的功能只有高级管理员才有权限对此进行操作,其它普通管理员无权对此做任何操作。 关于系统功能和登录日志功能在同一个界面上交叉显示,单击关于系统则在界面上显示关于系统的说明;单击登录日志在界面上则显示登录日志的内容(工号和登录日期)。而单击用户管理时则启动用户管理界面。在用户管理界面上又可以根据其功能进行相应的操作。 2.7.2 窗体的创建 在工程中新建一个窗体,将窗体保存为系统简介.frm。窗体主要属性设置如表2-10所示。 表2-10主界面窗体属性 属性名 属性值 说明 名称 form8 窗体名称 caption 系统简介 窗体标题 picture BitTamp 窗体背景图片 StartUpPositoon 2-屏幕中心 启动后居屏幕的中心 Borderstyle 1-Fixed Single 窗体固定边界,禁止用户改变大小 2.7.3 系统管理模块界面的设计 在窗体上添加控件,Label1、Data1、DBGrid1、Frame1、Command1~ Command4。Label1用来写存放关于系统的一些说明,Data1用来访问数据库,DBGrid1用来绑定登录日志表的字段并显示相关信息。Frame1用来对外观起到美化作用。Command1~ Command4作为命令按钮用。主要控件的属性设置如表2-11所示。 表2-11 主要控件的属性 控件 属性 属性值 说明 Label1 caption 关于系统内容 文本框 Command1 caption 关天系统 Command2 caption 登录日志 Command3 caption 删除日志 命令按钮 Command4 caption 用户管理 datasource Data1 DBGrid1 caption 计费系统 数据网格控件 DBGrid1 Label1 visible flase 隐藏不可见 Command1 font 宋体 ~ 命令按钮 Command4 fontcolor &H80000008& 20 设置好各项属性后,运行界面如图2-8所示 图2-8 系统管理界面 2.7.3.1 系统管理界面功能实现的相关代码 Option Explicit Private Sub command1_click() ‘*****************关于系统的文字说明****************** Label1.Caption = Chr(13) + "本系统是利用Visual Basic_" 语言为背景进行编写的 , 由于时间有限和技术的不成熟_ 系统许多功能都未能很好的完善,今后有时间一定会....._ + Chr(13) + Chr(13) + "_ 创建时间:2005-04-12" + Chr(13) + Chr(13) + "_ 版本: MyFLove "" DBGrid1.Visible = False Command3.Enabled = False End Sub Private Sub Command2_Click() Command3.Enabled = True Label1.Caption = "" Data1.DatabaseName = App.Path + "\计费系统" Data1.RecordSource = "登录日志" Data1.Refresh DBGrid1.Visible = True End Sub Private Sub Command3_Click() Dim prompt, mbook If p = 1 Then If DBGrid1.SelBookmarks.Count = 0 Then MsgBox "请选择要删除的记录~" Exit Sub Else 21 prompt = MsgBox("确定要删除所选定记录吗,", vbYesNo, "删 除选定记录") If prompt = vbNo Then Exit Sub Else For Each mbook In DBGrid1.SelBookmarks With Data1.Recordset .Bookmark = mbook .Delete End With Next Data1.Refresh End If End If Else MsgBox "只有高级管理员才有此权限~" Exit Sub End If End Sub Private Sub Command4_Click() Form16.Show End Sub '判断是不是高级管理员 Private Sub Form_Load() p = 0 Data1.RecordSource = "用户注册" Data1.Refresh Data1.Recordset.MoveFirst If Data1.Recordset.Fields("工号").Value = gonghao Then p = 1 End If End Sub 以上代码,就是实现系统管理模块的各项功能。需要注意的是变量p是用来判断登录的是否是高级管理员。为下面将要介绍的系统管理中用户管理子窗体模块的一些功能是否开通或封闭打上一个标记,p=0为普通用户,系统将会自己识别,并封闭一些功能:p=1为高级用户,可以对任何功能进行操作。从而达到系统的安全性。 2.7.3.2 用户管理子窗体模块 用户管理功能是系统管理模块扩展的一个功能,当单击用户管理,便会跳出一个子窗体。在此窗体上可以注册用户,修改用户,删除用户等操作。当是高级 22 管理员在操作时,系统就通过Data1对数据库进访问,把工号、密码、密码确认等相关内容写入数据库里的日志表里,操作界面如图2-9所示。如果不是高级管理员在操作则在执行某项功能前会有如图2-10的提示框,单击提示框确定后,数据信息将不会被保存到数据库里。 用户管理模块的实现:在窗体上添加控件,Label1~Label3、Data1、Frame1、Command1~Command3。因为用到的控件较少,控件属性的设置也比较简单,具体的属性设置和前面所介绍的相似。在此就不做详细介绍。 图2-9 高级用户管理界面 图2-10 普通用户管理界面 2.7.3.3 用户管理子窗体模块功能实现的代码如下 Option Explicit Dim examdb As Database Dim examtbl As TableDef Dim examfld(7) As Field 23 Dim gonghao11 Private Sub command1_click() If p = 1 Then If Text1.Text = "" Or Text2.Text = "" Then MsgBox "工号和密码不能为空~~" Exit Sub End If If Text3.Text = "" Then MsgBox "请输入密码确认~" Text2.Text = "" Exit Sub End If gonghao11 = "工号='" + Text1.Text + " ' " Data1.Recordset.FindFirst gonghao11 If Data1.Recordset.NoMatch = False Then MsgBox "此工号已经存在~" Exit Sub Else Data1.Recordset.AddNew Data1.Recordset.Fields("工号").Value = Text1.Text Data1.Recordset.Fields("密码").Value = Text2.Text Data1.Recordset.Fields("密码确认").Value = Text3.Text Data1.Recordset.Update MsgBox "注册成功~" End If Else MsgBox "只有高级管理员才有此权限~" End If End Sub Private Sub Command2_Click() If p = 1 Then If Text1.Text = "" Or Text2.Text = "" Then MsgBox "工号和密码不能为空~~" Exit Sub End If If Text3.Text = "" Then MsgBox "请输入密码确认~" Text2.Text = "" Exit Sub End If gonghao11 = "工号='" + Text1.Text + " ' " Data1.Recordset.FindFirst gonghao11 24 If Data1.Recordset.NoMatch = False Then Data1.Recordset.Edit 'Data1.Recordset.Fields("工号").Value = Text1.Text Data1.Recordset.Fields("密码").Value = Text2.Text Data1.Recordset.Fields("密码确认").Value = Text3.Text Data1.Recordset.Update MsgBox "修改成功~" Else MsgBox "此工号不存在~" End If Else MsgBox "只有高级管理员才有此权限~" End If End Sub Private Sub Command3_Click() Dim msg If p = 1 Then gonghao11 = "工号='" + Text1.Text + "'" Data1.Recordset.FindFirst gonghao11 If Data1.Recordset.NoMatch = False Then msg = MsgBox("确定要删除此工号吗,", vbYesNo, "删除用户") If msg = vbYes Then Data1.Recordset.Delete Data1.Refresh Else Exit Sub End If Else MsgBox "没有此工号~" Exit Sub End If Else MsgBox "只有高级管理员才有此权限~" End If End Sub Private Sub Form_Load() Data1.DatabaseName = App.Path + "\计费系统.mdb" Data1.RecordSource = "用户注册" Data1.Refresh End Sub 2.8 号码管理模块 25 2.8.1 模块分析 号码管理模块实现固定电话号码和公用电话号码的分类管理,包括对电话号码的添加、修改、删除和查找等功能。因此,在号码模块下有两个子窗体,因定电话子窗体和公用电话子窗体。号码的添加、修改、删除和查找等功能在各子窗体中实现,因而号码管理窗体只起到一个桥梁链接的作用。其中,采用Data对数据库的固话表和公话表进行访问。然后,通过对数据表进行绑定,在数据网格DBGrid上显示出有关电话的相关信息。数据的添加、修改、删除和查找通过DAO的Command对象完成。 2.8.2 号码管理窗体的创建 在工程中新建一个窗体,将窗体保存为 类型选择.frm 。窗体主要属性设置如表2-12。 如表2-12 号码管理窗体属性 性名 属性值 说明 属 名称 类型选择.frm 窗体名称 caption 选择类型 窗体标题 StartUpPositoon 2-屏幕中心 启动后居屏幕的中心 Borderstyle 1-Fixed Single 窗体固定边界,禁止用户改变大小 2.8.3 号码管理界面的设计 在窗体上添加以下控件:Label1、command1、command2、option1、option2、frame1。各控件的属性设置如表2-13所示。 表2-13 主要控件属性 属性名 属性 属性值 说明 Label1 caption 请选择电话类型 标签 Option1 caption 固话 单选钮 Option2 caption 公话 单选钮 Command1 caption 确定 命令按扭控件 Command2 caption 取消 命令按扭控件 模块的布局和运行结果如图2-11所示。 26 图2-11 号码管理界面 2.8.4 模块功能实现的代码 Private Sub command1_click() If Option1.Value Then Form4.Show If Option2.Value Then Form5.Show Unload form9 End Sub Private Sub Command2_Click() Unload form9 End Sub 2.8.4.1 固定电话子窗体 1(模块分析 实现对固定电话号码的添加、修改、删除和查找等功能。只有点击编辑按钮才能激活各项功能。 2(窗体的创建 在工程中新建一个窗体,将窗体保存为 固话查询.frm 。窗体主要属性设置和表1-11相似。在此就不再做详细分析。 3(固话子窗体界面的设计 在窗体个添加以下控件:Command1(0)~Command1(7)、Command2、Text1~Text3、Data1、DBGrid1、Label1~Label3。并将它们的属性设置为如表2-14所示。本模块的窗体布局如图2-12所示。 27 表2-14 控件属性的设置 控件 属性 属性值 说明 Command1(0) 第一条记录 Command1(1) 上一条记录 Command1(2) 下一条记录 Command1(3) 最后一条记录 命令按钮 Command1(4) caption 添加记录 Command1(5) 修改记录 Command1(6) 查找记录 Command1(7) 删除记录 Command2 编辑 Command1 enabled false datasource Data1 DBGrid1 caption 固话表 数据网格控件 Label1 号码 Label2 caption 地名 文本框 Label3 基本月租 设置好各项属性后,运行界面如图2-12所示 图2-12 固定电话窗体界面 4(模块功能实现的代码如下 28 Option Explicit Private Sub command1_click(Index As Integer) Select Case Index Case 0 '添加 Data1.Recordset.AddNew Case 1 '修改 Data1.Recordset.Edit If Text1.DataChanged Then GoTo save1 If Text2.DataChanged Then GoTo save1 If Text3.DataChanged Then GoTo save1 Case 2 '查找 Dim key Dim key1 As String key = InputBox("请输入查找的号码:", "查找记录") key1 = "号码=" + key ' Data1.Recordset.FindFirst key1 If Data1.Recordset.NoMatch Then MsgBox "数据表没有符合的记录~" Data1.Recordset.MoveFirst Else MsgBox "数据表找到符合的记录!" End If Case 3 '删除 Dim msg Dim ret As String Dim mbook As Variant Dim prompt As Integer ret = MsgBox("是否要删除当前记录,", vbYesNo, "删除当前记录") If ret = vbYes Then Data1.Recordset.Delete Data1.Recordset.MoveFirst Exit Sub Else If DBGrid1.SelBookmarks.Count = 0 Then MsgBox "请选择要删除的行~" Exit Sub End If DBGrid1.AllowDelete = True prompt = MsgBox("确定要删除所选定记录吗,", vbYesNo, "删 除选定记录") If prompt = vbNo Then Exit Sub 29 For Each mbook In DBGrid1.SelBookmarks With Data1.Recordset .Bookmark = mbook .Delete End With Next Data1.Refresh End If save1: msg = MsgBox("要更新的数据保存吗,", vbYesNo) If msg = vbYes Then Data1.UpdateRecord Else Data1.Recordset.CancelUpdate End If Case 4 Data1.Recordset.MoveFirst If Data1.Recordset.BOF Then Data1.Recordset.MoveFirst Case 5 Data1.Recordset.MovePrevious If Data1.Recordset.BOF= True Then Data1.Recordset.MoveFirst Case 6 Data1.Recordset.MoveNext If Data1.Recordset.EOF = True Then Data1.Recordset.MoveLast Case 7 Data1.Recordset.MoveLast End Select End Sub Private Sub Command2_Click() Command1(0).Enabled = True Command1(1).Enabled = True Command1(2).Enabled = True Command1(3).Enabled = True Command1(4).Enabled = True Command1(5).Enabled = True Command1(6).Enabled = True Command1(7).Enabled = True Text1.Enabled = True Text2.Enabled = True Text3.Enabled = True Text2.SetFocus End Sub Private Sub Form_Activate() '判断是否有数据 30 Data1.DatabaseName = App.Path + "\计费系统.mdb" Data1.RecordSource = "固话表" Data1.Refresh If Data1.Recordset.RecordCount = 0 Then 'P55数据库 MsgBox "数据库中没有数据,请添加数据~" Data1.Recordset.AddNew Else Data1.Recordset.MoveFirst End If End Sub Private Sub Data1_Validate(Action As Integer, Save As Integer) Dim msg If Save Then msg = MsgBox("要更新的数据保存吗,", vbYesNo) If msg = vbNo Then Save = 0 End If End Sub 2.8.4.2 公用电话子窗体 公用电话子窗体的模块分析、窗体的创建、窗体界面的设计和固定电话 子窗体的相似。不难得出实现功能的代码也和固定电话子窗体的类似。参照2.8.4.1的第3点源代码即可。在此,也就不再重复版出。 2.9 字冠管理模块 2.9.1 模块分析 字冠管理模块实现的功能是对本通信行业或者同行通信行业本地字冠的号码的管理。包括输入,修改、删除字冠。 为了方便计费统计的进行,将本地字冠(包括本通信行业本地字冠和同行通信行业本地字冠)输入到计费系统库里的字冠表统一管理。 2.9.2窗体的创建 在工程中新建一个窗体,将窗体保存为 字冠管理.frm 。窗体主要属性设置如表1-15所示。 31 表2-15字冠管理窗体属性 属性名 属性值 说明 名称 form7 窗体名称 caption 字冠管理 窗体标题 StartUpPositoon 2-屏幕中心 启动后居屏幕的中心 Borderstyle 1-Fixed Single 窗体固定边界,禁止用户改变大小 2.9.3 模块字冠管理界面的设计 在窗体个添加以下控件:Command1(0)~Command1(5)、Command2、Text1~Text3、Data1、DBGrid1、Label1~Label3。并将它们的属性设置为如表1-16所示。本模块的窗体布局如图1-13所示。Data1用来访问数据库里的字冠表,DBGrid1与数据库里的字冠表各字段进行绑定,然后在表格里显示相应的字段值。 表2-16 控件属性的设置 控件 属性 属性值 说明 Command1(3) 第一条记录 Command1(4) 上一条记录 Command1(5) 下一条记录 Command1(0) caption 添加记录 命令按钮 Command1(1) 修改记录 Command1(2) 删除记录 Command2 编辑 datasource Data1 DBGrid1 caption 字冠表 数据网格控件 Label1 地名 Label2 caption 类型 文本框 Label3 本地字冠 设置好各项属性后,运行界面如图2-13所示。需要注意的是,界面刚运行时,为了防止误操作,除了 编辑 命令按钮可用之外,其它命令是不可用的,只有在单击 编辑 命令按钮后,才生效。 32 图2-13 字冠管理界面 2.9.4 模块功能实现的代码如下 Private Sub Command2_Click() Text1.Enabled = True Text2.Enabled = True Text3.Enabled = True Command1(0).Enabled = True Command1(1).Enabled = True Command1(2).Enabled = True Command1(3).Enabled = True Command1(4).Enabled = True Command1(5).Enabled = True End Sub Private Sub Form_Activate() '判断是否有数据 Data1.DatabaseName = App.Path + "\计费系统.mdb" Data1.RecordSource = "字冠表" Data1.Refresh If Data1.Recordset.RecordCount = 0 Then 'P55数据库 MsgBox "数据库中没有数据,请添加数据~" 33 Data1.Recordset.AddNew Else Data1.Recordset.MoveFirst End If End Sub Private Sub command1_click(Index As Integer) Select Case Index Case 0 Data1.Recordset.AddNew Text2.SetFocus Case 1 '修改 Data1.Recordset.Edit If Text1.DataChanged Then GoTo save1 If Text2.DataChanged Then GoTo save1 If Text3.DataChanged Then GoTo save1 Data1.Recordset.AddNew Text2.SetFocus Case 2 '删除 Dim ret As String Dim mboook As Variant Dim prompt As Integer ret = MsgBox("是否要删除当前记录,", vbYesNo, "删除当前记录") If ret = vbYes Then Data1.Recordset.Delete Data1.Recordset.MoveFirst Exit Sub Else If DBGrid1.SelBookmarks.Count = 0 Then MsgBox "请选择要删除的行~" Exit Sub End If DBGrid1.AllowDelete = True prompt = MsgBox("确定要删除所选定记录吗,", vbYesNo, "删除选定记录") If prompt = vbNo Then Exit Sub For Each mbook In DBGrid1.SelBookmarks With Data1.Recordset .Bookmark = mbook .Delete 34 End With Next Data1.Refresh delfinish = True End If save1: msg = MsgBox("要更新的数据保存吗,", vbYesNo) If msg = vbYes Then Data1.UpdateRecord Else Data1.Recordset.CancelUpdate End If Case 3 Data1.Recordset.MoveFirst If Data1.Recordset.BOF Then Data1.Recordset.MoveFirst Case 4 Data1.Recordset.MovePrevious If Data1.Recordset.BOF = True Then Data1.Recordset.MoveFirst Case 5 Data1.Recordset.MoveNext If Data1.Recordset.EOF = True Then Data1.Recordset.MoveLast End Select End Sub Private Sub Data1_Validate(Action As Integer, Save As Integer) Dim msg If Save Then msg = MsgBox("要更新的数据保存吗1,", vbYesNo) If msg = vbNo Then Save = 0 End If End Sub 3.1 费率管理模块 3.1.1 模块的分析 费率管理模块是为了实现对不同地方设置不同的收费标准。为了便于用户的 操作,费率管理模块可以对费率进行修改,添加,删除。 3.1.2 窗体的创建 在工程中新建一个窗体,将窗体保存为 费率管理.frm 。窗体主要属性的设 置如表3-1所示即可。 35 表3-1费率管理窗体属性 属性名 属性值 说明 名称 form6 窗体名称 caption 费率管理 窗体标题 StartUpPositoon 2-屏幕中心 启动后居屏幕的中心 Borderstyle 1-Fixed Single 窗体固定边界,禁止用户改变大小 3.1.3 费率管理模块界面的设计 在窗体个添加以下控件:Command1(0)~Command1(5)、Command2、Text1~Text3、Data1、DBGrid1、Label1~Label3。并将它们的属性设置为如表3-2所示。本模块的窗体布局如图1-13所示。Data1用来访问数据库里的字冠表,DBGrid1与数据库里的字冠表各字段进行绑定,然后在表格里显示相应的字段值。 -2 主要控件属性的设置 表3 控件 属性 属性值 说明 Command1(0) 第一条记录 Command1(1) 上一条记录 Command1(2) 下一条记录 Command1(3) caption 添加记录 命令按钮 Command1(4) 修改记录 Command1(5) 删除记录 Command2 编辑 Command1 enabled false datasource Data1 DBGrid1 caption 费率表 数据网格控件 Label1 主叫号码 Label2 通话类型 文本框 Label3 caption 日期类型 Label4 费率 Label5 首次三分钟 设置好各项属性后,运行界面如图3-1所示 36 -1 费率管理界面 图3 3.1.4 费率管理模块功能实现的代码 Option Explicit Private Sub Command2_Click() Text1.Enabled = True Text2.Enabled = True Text3.Enabled = True Text4.Enabled = True Text5.Enabled = True Command1(0).Enabled = True Command1(1).Enabled = True Command1(2).Enabled = True Command1(3).Enabled = True Command1(4).Enabled = True Command1(5).Enabled = True End Sub Private Sub Form_Activate() '判断是否有数据 Data1.DatabaseName = App.Path + "\计费系统.mdb" Data1.RecordSource = "费率表" Data1.Refresh If Data1.Recordset.RecordCount = 0 Then 'P55数据库 MsgBox "数据库中没有数据,请添加数据~" Data1.Recordset.AddNew Else 37 Data1.Recordset.MoveFirst End If End Sub Private Sub command1_click(Index As Integer) Select Case Index Case 0 Data1.Recordset.AddNew Case 1 '修改 Data1.Recordset.Edit Text2.SetFocus If Text1.DataChanged Then GoTo save1 If Text2.DataChanged Then GoTo save1 If Text3.DataChanged Then GoTo save1 Case 3 '删除 Dim msg Dim ret As String Dim mbook As Variant Dim prompt As Integer ret = MsgBox("是否要删除当前记录,", vbYesNo, "删除当前记录") If ret = vbYes Then Data1.Recordset.Delete Data1.Recordset.MoveFirst Exit Sub Else If DBGrid1.SelBookmarks.Count = 0 Then MsgBox "请选择要删除的行~" Exit Sub End If DBGrid1.AllowDelete = True prompt = MsgBox("确定要删除所选定记录吗,", vbYesNo, "_ 删除选定记录") If prompt = vbNo Then Exit Sub For Each mbook In DBGrid1.SelBookmarks With Data1.Recordset .Bookmark = mbook .Delete End With Next Data1.Refresh End If save1: msg = MsgBox("要更新的数据保存吗,", vbYesNo) 38 If msg = vbYes Then Data1.UpdateRecord Else Data1.Recordset.CancelUpdate End If Case 2 Data1.Recordset.MoveFirst If Data1.Recordset.BOF Then Data1.Recordset.MoveFirst Case 4 Data1.Recordset.MovePrevious If Data1.Recordset.BOF = True Then Data1.Recordset.MoveFirst Case 5 Data1.Recordset.MoveNext If Data1.Recordset.EOF = True Then Data1.Recordset.MoveLast End Select End Sub Private Sub Data1_Validate(Action As Integer, Save As Integer) Dim msg If Save Then msg = MsgBox("要更新的数据保存吗,", vbYesNo) If msg = vbNo Then Save = 0 End If End Sub 3.2 原始话单模块 3.2.1 模块的分析 原始话单模块实现对程控交换机传下来的原始话单正确的导入数据库,对原始话单进行浏览,对导入数据库的话单进行浏览。删除话单表、删除原始话单、删除记录、显示已导入的话单表等功能。原始话单和话单表可以交叉浏览。 3.2.2 窗体的创建 在工程中新建一个窗体,将窗体保存为 费率管理.frm 。窗体主要属性的设置如表3-3所示即可。 39 表3-3费率管理窗体属性 属性名 属性值 说明 名称 form3 窗体名称 caption 原始话单 窗体标题 StartUpPositoon 2-屏幕中心 启动后居屏幕的中心 Borderstyle 1-Fixed Single 窗体固定边界,禁止用户改变大小 3.2.3 费率管理模块界面的设计 在窗体个添加以下控件:Command1~Command6、Text1~Text3、Data1、DBGrid1、Label1、Option1、Option2、List1、List2。并将它们的属性设置为如表1-16所示。本模块的窗体布局如图3-4所示List1用来对浏览时显示原始话单,List2用来显示已统计的表。Data1用来访问数据库里的表,DBGrid1与数据库里的表各字段进行绑定,然后在表格里显示相应的字段值。 -4 主要控件属性的设置 表3 控件 属性 属性值 说明 Command1 查看 Command2 删除记录 Command3 删除表 Command4 caption 保存 命令按钮 Command5 导入数据库 Command6 编辑 datasource Data1 DBGrid1 caption 话单表 数据网格控件 Label1 话单表 文本框 Option1 caption 话单来源 Option2 表名称 单选钮 Command1 Command6 enable true Command2 Command3 命令按钮 Command4 Command5 enable flase 设置好各项属性后,运行界面如图3-2所示 40 如图3-2 原始话单界面 3.2.4 原始话单模块功能实现的代码 Option Explicit Dim examdb As Database Dim examtbl As TableDef Dim examfld(4) As Field Dim a As Integer '删除标记 Dim zjhm, pjhm, qssj, zcsj, dir1, dir2 Private Sub command1_click() If Option1.Value Then dir1 = Dir(Text1.Text) If dir1 = "" Then MsgBox "此话单不存在~" Exit Sub End If On Error GoTo error2 error2: If (Err.Number = 53 Or Err.Number = 76) Or Err.Number = 75 Then List1.Visible = False MsgBox "请正确输入话单来源~" Exit Sub End If DBGrid1.Enabled = False DBGrid1.Visible = False 41 List1.Enabled = True List1.Visible = True On Error Resume Next Open Text1.Text For Input As #1 List1.Clear List1.AddItem "主叫号码" + Space(4) + "被叫号码" + Space(9) + "起始时间" + Space(9) + "终止时间" + Chr(10) + Chr(13) While Not EOF(1) '显示话单内容 Input #1, zjhm, pjhm, qssj, zcsj List1.AddItem zjhm + Space(4) + pjhm + Space(6) + qssj + Space(6) + zcsj + Chr(10) + Chr(13) Wend Close #1 End If If Option2.Value Then On Error GoTo error3 error3: If Err.Number = 3078 Then DBGrid1.Enabled = False DBGrid1.Visible = False MsgBox "该表不存在~" Exit Sub End If If Text2 = "" Then MsgBox "请输入表名~" Exit Sub End If List1.Enabled = False List1.Visible = False DBGrid1.Enabled = True DBGrid1.Visible = True Data1.DatabaseName = App.Path + "\话单库.mdb" Data1.RecordSource = Text2.Text Data1.Refresh End If End Sub Private Sub Command2_Click() If Option1.Value Then a = 0 If List1.Enabled = False Then Exit Sub End If If List1.Selected(List1.ListIndex) = True Then MsgBox ("注意:每次只能删除一条记录!且要马上保存!否 42 则只对最后删除记录有效!!") List1.RemoveItem List1.ListIndex a = a + 1 '已删除过 Else MsgBox "请选择要删除的记录~" End If End If Close #1 If Option2.Value Then Dim msg Dim ret As String Dim mbook As Variant Dim prompt As Integer If DBGrid1.Enabled = False Then Exit Sub End If ret = MsgBox("是否要删除当前记录,", vbYesNo, "删除当前记") 录 If ret = vbYes Then Data1.Recordset.Delete Data1.Recordset.MoveFirst Exit Sub Else If DBGrid1.SelBookmarks.Count = 0 Then MsgBox "请选择要删除的行~" Exit Sub End If DBGrid1.AllowDelete = True prompt = MsgBox("确定要删除所选定记录吗,", vbYesNo, "删除选定记录") If prompt = vbNo Then Exit Sub For Each mbook In DBGrid1.SelBookmarks With Data1.Recordset .Bookmark = mbook .Delete End With Next Data1.Refresh End If End If End Sub Private Sub Command3_Click() 43 If Text1.Text = "" Then Exit Sub End If Dim i As Integer i = 0 '记录标记 If a <> 0 Then \保存" For Output As #2 Open App.Path + "\话单 Close #2 FileCopy Text1.Text, App.Path + "\话单\保存" Open App.Path + "\话单\保存" For Input As #2 Open Text1.Text For Output As #1 While Not EOF(2) Input #2, zjhm, pjhm, qssj, zcsj If i <> List1.ListIndex Then Write #1, zjhm, pjhm, qssj, zcsj End If i = i + 1 Wend a = 0 '已经保存过 End If Close #1 Close #2 End Sub Private Sub Command4_Click() '*********************表的生成********************* dir2 = Dir(Text1.Text) If dir2 = "" Then MsgBox "原始话单不存在~" Exit Sub End If If Text1.Text = "" Or Text2.Text = "" Then MsgBox "话单来源和表名称不能为空~" Exit Sub Else Label1.Caption = "正在导入中,请稍候..." Set examdb = OpenDatabase(App.Path + "\话单库") Set examtbl = examdb.CreateTableDef(Text2.Text) With examtbl Set examfld(0) = .CreateField("主叫号码", dbText, 15) Set examfld(1) = .CreateField("被叫号码", dbText, 15) Set examfld(2) = .CreateField("起始时间", dbText, 50) Set examfld(3) = .CreateField("终止时间", dbText, 50) 44 .Fields.Append examfld(0) .Fields.Append examfld(1) .Fields.Append examfld(2) .Fields.Append examfld(3) End With On Error GoTo error1 examdb.TableDefs.Append examtbl '添加表 error1: If Err.Number = 3010 Then MsgBox "此表名已存在~" Label1.Caption = "" Exit Sub End If If Err.Number = 53 Then MsgBox "请正确输入原始话单来源~" Label1.Caption = "" Exit Sub End If Set examdb = OpenDatabase(App.Path + "\话单库") Data1.DatabaseName = App.Path + "\话单库" On Error Resume Next Open Text1.Text For Input As #1 examdb.TableDefs.Append examtbl '添加表 Data1.RecordSource = Text2.Text Set examdb = OpenDatabase(App.Path + "\话单库") Data1.Refresh While Not EOF(1) Input #1, zjhm, pjhm, qssj, zcsj Data1.Recordset.AddNew Data1.Recordset.Fields("主叫号码").Value = zjhm 'Str(zjhm) Data1.Recordset.Fields("被叫号码").Value = pjhm 'Str(pjhm) Data1.Recordset.Fields("起始时间").Value = qssj 'CDate(qssj) Data1.Recordset.Fields("终止时间").Value = zcsj 'CDate(czsj) Data1.Recordset.Update Wend MsgBox Text1.Text + "话单" + "成功导入数据库~" Label1.Caption = "" Close #1 End If List2.Clear Call DispTablename End Sub Private Sub Command5_Click() Dim msg1 45 If Text2.Text = "" Then MsgBox "请输入要删除的表名称~" Exit Sub End If On Error GoTo error4 error4: If Err.Number = 3265 Then MsgBox "此表不存在~" Exit Sub End If Set examdb = OpenDatabase(App.Path + "\话单库") msg1 = MsgBox("确定要删除该表吗,", vbYesNo) If msg1 = vbYes Then examdb.TableDefs.Delete Text2.Text Text2.Text = "" End If List2.Clear Call DispTablename End Sub Private Sub Command6_Click() Command2.Enabled = True Command4.Enabled = True Command5.Enabled = True Command3.Enabled = True End Sub Private Sub Form_Load() Set examdb = DBEngine.Workspaces(0).OpenDatabase(App.Path + "\话单库.mdb") Call DispTablename Dim zjhm As String, pjhm As String, qssj As String, zcsj As String '定义字段类型 Open App.Path + "\话单\原始话单" For Append As #1 zjhm = InputBox("请输入主叫号码:") If zjhm <> "" Then pjhm = InputBox("请输入被叫号码:") qssj = InputBox("请输入起始时间:") '创建原始话单 zcsj = InputBox("请输入终止时间:") Write #1, zjhm, pjhm, qssj, zcsj End If Close #1 End Sub 46 Private Sub DispTablename() List2.Clear With examdb For Each examtbl In .TableDefs List2.AddItem examtbl.name Next examtbl End With End Sub 3.3 计费统计模块 3.3.1 模块分析 计费统计模块包话即时计费、定期计费和统计表的浏览。因此,计费统计模块下包含三个子窗体:即时计费窗体、定期计费窗体、统计表浏览窗体。计费统计窗体只起到一个中间链接的作用。 3.3.2 窗体的建立 在工程中新建一个窗体,将窗体保存为 form1.frm 。窗体主要属性的设置和主要控件的属性设置很简单,参照前面所介绍去设置即可。在此就不再做具体分析(下边将要介绍的子窗体也是一样不再做分析)。 3.3.3 模块界面的设计 本模块的窗体运行界面如图3-3 所示。 图3-3 计费统计主界面 3.3.4 模块功能实现的代码 47 Private Sub command1_click(Index As Integer) Select Case Index Case 0 Form11.Show Case 1 Form12.Show Case 2 Form14.Show End Select End Sub 3.3.4.1 现在计费子窗体模块 1. 模块的分析 可以对现有的话单表进行全部或分时段的统计。 2. 窗体的创建 在工程中新建一个窗体,将窗体保存为 现在计费.frm 。 3. 模块界面的设计 运行后模块的界面如图3-4所示。 图4-4 现在计费子窗体界面 4(模块功能实现的代码 (1)流程图 48 取主叫号码 N 时间段内? Y 判断是固话还是公话 固话 公话 i=固话 i=公话 取被叫前2位 =00, Y N 在费率表查找取被叫前1位 主叫类型字段 =i且通话类型 为国际长途所 =0, 对应的费率 Y N 在费率表查找 网话、市话, 主叫类型字段 =i且通话类型 为长途所对应 市 在费率表查找在费率表查找的费率 话 主叫类型字段主叫类型字段 =i且通话类型=i且通话类型 为网话所对应为长途所对应 的费率 的费率 算出通话时长,计算出费用。 把主叫号码、被叫号码等信息写进表里。 下一条记录 返回 49 (2) 模块代码 Option Explicit Dim h As Integer '终止标记 Dim zjhm, pjhm, qssj, czsj Dim shichang, feiyong Dim dhlx As String '通话类型 Dim i As String Dim findhaoma, findchuqiaolx, dayliexing Dim qssd, czsd Dim diming, diming1, tablename Dim feilu, feilu1 Dim zhiguan2, zhiguan22, zhiguan1 Dim firstdate Dim xj1, xj2, xj, fz1, fz2, fz, mm1, mm2, mm Dim Y As Integer '用来判断是否已经建库和表 Dim examdb As Database Dim examtbl As TableDef Public Sub jieshuan() feilu = Data1.Recordset.Fields("费率").Value feiyong = shichang * feilu dhlx = "国内长途" End Sub Public Sub dayliexing1() If Weekday(qssj) = 1 Or Weekday(qssj) = 7 Then dayliexing = "节假日" Exit Sub End If If Month(qssj) = 5 And (Day(qssj) >= 1 And Day(qssj <= 7)) Then dayliexing = "节假日" Exit Sub End If If Month(qssj) = 1 And (Day(qssj) >= 1 And Day(qssj <= 3)) Then dayliexing = "节假日" Exit Sub End If If Month(qssj) = 10 And (Day(qssj) >= 1 And Day(qssj <= 3)) Then dayliexing = "节假日" Exit Sub End If dayliexing = "正常工作日" End Sub Public Sub guoji() 50 Data1.DatabaseName = App.Path + "\计费系统.mdb" Data1.RecordSource = "费率表" Data1.Refresh findchuqiaolx = "主叫类型='" + i + "'" Data1.Recordset.FindFirst findchuqiaolx jiejia1: If Data1.Recordset.NoMatch = False Then If Data1.Recordset.Fields("通话类型").Value = "国际长途" Then If Data1.Recordset.Fields("日期类型").Value = dayliexing Then feilu = Data1.Recordset.Fields("费率").Value feiyong = shichang * feilu dhlx = "国际长途" Else Data1.Recordset.FindNext findchuqiaolx GoTo jiejia1 End If Else Data1.Recordset.FindNext findchuqiaolx GoTo jiejia1 End If Else MsgBox "表参数不全,统计失败,请刷新~~" Label4.Caption = "" Exit Sub End If Call newdata(dhlx) If h = 1 Then MsgBox "统计已经取消~" Label4.Caption = "" Close #1 Exit Sub End If End Sub Public Sub newdata(dhlx As String) '*********************表的生成************************* Dim examfld(7) As Field Dim msg If Y = 0 Then Set examdb = OpenDatabase(App.Path + "\统计库.mdb") g: tablename = InputBox("请输入新生成话单表的名称:") If tablename = "" Then msg = MsgBox("要终止话单统计吗,", vbYesNo, "终止吗,") If msg = vbNo Then 51 GoTo g Else h = 1 Exit Sub End If End If Label4.Caption = "统计中,请稍候..." Set examtbl = examdb.CreateTableDef(tablename) With examtbl Set examfld(0) = .CreateField("主叫号码", dbText, 15) Set examfld(1) = .CreateField("被叫号码", dbText, 15) Set examfld(2) = .CreateField("起始时间", dbText, 50) Set examfld(3) = .CreateField("终止时间", dbText, 50) Set examfld(4) = .CreateField("通话时长", dbInteger, 15) Set examfld(5) = .CreateField("通话类型", dbText, 15) Set examfld(6) = .CreateField("费用", dbDouble, 15) .Fields.Append examfld(0) .Fields.Append examfld(1) .Fields.Append examfld(2) .Fields.Append examfld(3) .Fields.Append examfld(4) .Fields.Append examfld(5) .Fields.Append examfld(6) End With examdb.TableDefs.Append examtbl '添加表 Y = 1 End If '**********************给新添加的表赋值******************* Set examdb = OpenDatabase(App.Path + "\统计库.mdb") Data1.DatabaseName = App.Path + "\统计库.mdb" Data1.RecordSource = tablename Data1.Refresh Data1.Recordset.AddNew Data1.Recordset.Fields("主叫号码").Value = zjhm Data1.Recordset.Fields("被叫号码").Value = pjhm Data1.Recordset.Fields("起始时间").Value = qssj Data1.Recordset.Fields("终止时间").Value = czsj Data1.Recordset.Fields("通话类型").Value = dhlx Data1.Recordset.Fields("通话时长").Value = shichang Data1.Recordset.Fields("费用").Value = feiyong ' Val(feiyong) Data1.Recordset.Update End Sub '******************************************************* Private Sub command1_click() 52 If Text1.Text = "" And Text2.Text = "" Then MsgBox "请输入时间段~" Exit Sub End If If Text1.Text = "" Then MsgBox "输入不完整~" Exit Sub End If If Text2.Text = "" Then MsgBox "输入不完整~" Exit Sub End If If Len(Trim(Text1.Text)) <> 10 Or Len(Trim(Text2.Text)) <> 10 Then 'trim删除前后空格 MsgBox "输入的格式有误~" Text1.Text = "" Text2.Text = "" Exit Sub End If If Mid(Text1.Text, 5, 1) <> "-" Or Mid(Text1.Text, 8, 1) <> "-" Then MsgBox "输入的格式有误~" Text1.Text = "" Text2.Text = "" Exit Sub End If If Mid(Text2.Text, 5, 1) <> "-" Or Mid(Text2.Text, 8, 1) <> "-" Then MsgBox "输入的格式有误~" Text1.Text = "" Text2.Text = "" Exit Sub End If Label4.AutoSize = True qssd = CDate(Trim(Text1.Text)) czsd = CDate(Trim(Text2.Text)) Y = 0 If Text3.Text = "" Then MsgBox "请输入话单表~" Exit Sub End If On Error GoTo error1 error1: If Err.Number = 3078 Then MsgBox "话单表不存在~" Exit Sub End If 53 Set examdb = OpenDatabase(App.Path + "\话单库.mdb") Data2.DatabaseName = App.Path + "\话单库.mdb" Data2.RecordSource = Text3.Text Data2.Refresh huadanfile: Do While Data2.Recordset.EOF = False zjhm = Data2.Recordset.Fields("主叫号码").Value pjhm = Data2.Recordset.Fields("被叫号码").Value qssj = Data2.Recordset.Fields("起始时间").Value czsj = Data2.Recordset.Fields("终止时间").Value firstdate = CDate(Mid(Trim(qssj), 1, 10)) xj1 = Hour(CDate(qssj)) fz1 = Minute(CDate(qssj)) mm1 = Second(CDate(qssj)) xj2 = Hour(CDate(czsj)) fz2 = Minute(CDate(czsj)) mm2 = Second(CDate(czsj)) If firstdate >= qssd And firstdate <= czsd Then xj = Val(xj2) - Val(xj1) fz = Val(fz2) - Val(fz1) mm = Val(mm2) - Val(mm1) Else Data2.Recordset.MoveNext GoTo huadanfile End If If mm > 6 Then fz = fz + 1 End If shichang = (xj * 60 + fz) ' *************************************************************** '判断是固话还是公话 Data1.DatabaseName = App.Path + "\计费系统.mdb" Data1.RecordSource = "固话表" Data1.Refresh findhaoma = "号码=" + Str(zjhm) Data1.Recordset.FindFirst findhaoma If Data1.Recordset.NoMatch = False Then i = "固话" diming = Data1.Recordset.Fields("地名").Value Else Data1.RecordSource = "公话表" Data1.Refresh findhaoma = "号码=" + Str(zjhm) 54 Data1.Recordset.FindFirst findhaoma '???????????? If Data1.Recordset.NoMatch = False Then i = "公话" diming = Data1.Recordset.Fields("地名").Value Else MsgBox "主叫号码不在号码表里~" Exit Sub End If End If '*************************************************************** Call dayliexing1 If Left(pjhm, 2) = "00" Then Call guoji Data2.Recordset.MoveNext GoTo huadanfile End If If Left(pjhm, 1) = "0" Then '判断是否是长途 Data1.DatabaseName = App.Path + "\计费系统.mdb" Data1.RecordSource = "费率表" Data1.Refresh findchuqiaolx = "主叫类型='" + i + "'" Data1.Recordset.FindFirst findchuqiaolx next1: If Data1.Recordset.NoMatch = False Then If Data1.Recordset.Fields("通话类型").Value = "国内长途" Then If Data1.Recordset.Fields("日期类型").Value = dayliexing Then Call jieshuan Else Data1.Recordset.FindNext findchuqiaolx GoTo next1 End If Call jieshuan Else Data1.Recordset.FindNext findchuqiaolx GoTo next1 End If Else MsgBox "表参数不全,统计失败,请刷新~~" Label4.Caption = "" Exit Sub End If Call newdata(dhlx) If h = 1 Then MsgBox "统计已经取消~" 55 Label4.Caption = "" Close #1 Exit Sub Else Data2.Recordset.MoveNext GoTo huadanfile End If Else If Val(Len(pjhm)) = 7 Or Val(Len(pjhm)) = 8 Then '判断是电话还是手机 Data1.DatabaseName = App.Path + "\计费系统.mdb" Data1.RecordSource = "费率表" Data1.Refresh zhiguan1 = Left(zjhm, 3) zhiguan2 = Left(pjhm, 3) If zhiguan1 <> zhiguan2 Then findchuqiaolx = "主叫类型='" + i + "'" Data1.Recordset.FindFirst findchuqiaolx next2: If Data1.Recordset.NoMatch = False Then If Data1.Recordset.Fields("通话类型").Value = "网话" Then feilu = Data1.Recordset.Fields("费率").Value feiyong = shichang * feilu dhlx = "网话" Else Data1.Recordset.FindNext findchuqiaolx GoTo next2 End If Else MsgBox "表参数不全,统计失败,请刷新~" Label4.Caption = "" Exit Sub End If Call newdata(dhlx) If h = 1 Then MsgBox "统计已经取消~" Label4.Caption = "" Close #1 Exit Sub Else Data2.Recordset.MoveNext GoTo huadanfile End If Else 56 Data1.RecordSource = "费率表" Data1.Refresh findchuqiaolx = "主叫类型='" + i + "'" Data1.Recordset.FindFirst findchuqiaolx 'And "通话类型='市话'" next3: If Data1.Recordset.NoMatch = False Then If Data1.Recordset.Fields("通话类型").Value = "市话" Then If i = "固话" Then feilu = Data1.Recordset.Fields("费率").Value feilu1 = Data1.Recordset.Fields("首次三分钟").Value feiyong = feilu1 + (shichang - 3) * feilu Else feilu = Data1.Recordset.Fields("费率").Value feiyong = shichang * feilu End If dhlx = "市话" Else Data1.Recordset.FindNext findchuqiaolx GoTo next3 End If Else MsgBox "表参数不全,统计失败,请刷新~" Label4.Caption = "" Exit Sub End If Call newdata(dhlx) If h = 1 Then MsgBox "统计已经取消~" Label4.Caption = "" Close #1 Exit Sub Else Data2.Recordset.MoveNext GoTo huadanfile End If End If Else zhiguan2 = Left(Str(pjhm), 6) Data1.DatabaseName = App.Path + "\计费系统.mdb" Data1.RecordSource = "字冠表" Data1.Refresh zhiguan22 = "本地字冠号'" + zhiguan2 + "'" Data1.Recordset.FindFirst zhiguan22 diming1 = Data1.Recordset.Fields("地名").Value If diming = diming1 Then 57 Data1.RecordSource = "费率表" Data1.Refresh findchuqiaolx = "主叫类型='" + i + "'" Data1.Recordset.FindFirst findchuqiaolx 'And "通话类型='市话'" next4: If Data1.Recordset.NoMatch = False Then If Data1.Recordset.Fields("通话类型").Value = "市话" Then If i = "固话" Then feilu = Data1.Recordset.Fields("费率").Value feilu1 = Data1.Recordset.Fields("首次三分钟").Value feiyong = feilu1 + (shichang - 3) * feilu Else feilu = Data1.Recordset.Fields("费率").Value feiyong = shichang * feilu End If dhlx = "市话" Else Data1.Recordset.FindNext findchuqiaolx GoTo next4 End If Else MsgBox "表参数不全,统计失败,请刷新~" Label4.Caption = "" Exit Sub End If Call newdata(dhlx) If h = 1 Then MsgBox "统计已经取消~" Label4.Caption = "" Close #1 Exit Sub Else Data2.Recordset.MoveNext GoTo huadanfile End If Else Data1.RecordSource = "费率表" Data1.Refresh findchuqiaolx = "主叫类型='" + i + "'" Data1.Recordset.FindFirst findchuqiaolx 'And "通话类型='网话'" next5: If Data1.Recordset.NoMatch = False Then If Data1.Recordset.Fields("通话类型").Value = "网话" Then feilu = Data1.Recordset.Fields("费率").Value feiyong = shichang * feilu dhlx = "网话" 58 Data1.Recordset.FindNext findchuqiaolx GoTo next5 End If Else MsgBox "表参数不全,统计失败,请刷新~" Label4.Caption = "" Exit Sub End If Call newdata(dhlx) If h = 1 Then MsgBox "统计已经取消~" Label4.Caption = "" Close #1 Exit Sub Else Data2.Recordset.MoveNext GoTo huadanfile End If End If End If End If Loop MsgBox ("统计成功结束~") Label4.Caption = "" End Sub Private Sub Command2_Click() Unload Form11 End Sub Private Sub Command3_Click() Form13.Show End Sub 3.3.4.2 定期计费子窗体模块 1. 模块的分析 当计费周期时间到时,能自动对每个月的话单进行统计,并且有一段音乐 提示。 2. 窗体的创建 在工程中新建一个窗体,将窗体保存为 定期计费.frm 。 59 3. 模块界面的设计 运行后模块的界面如图3-5 所示。 图3-5 定期计费界面 4. 模块功能实现的代码 1. 流程图 定期计费功能模块的流程图和即时计费功能模块的流程图类似。只是个别地 方有所改变。在此也不做详细介绍。参照计费功能模块的流程图即可。 2. 功能实现的代码 Option Explicit Dim zjhm, pjhm, qssj, czsj, shichang, feiyong Dim dhlx As String '通话类型 Dim i As String Dim findhaoma, dayliexing Dim findchuqiaolx, qssd, czsd Dim diming, tablename, diming1 Dim feilu, feilu1, msg Dim zhiguan2, zhiguan22, zhiguan1 Dim firstdate, xj1, xj2, xj, fz1, fz2, fz Dim mm1, mm2, mm Dim Y As Integer '用来判断是否已经建库和表 Dim examdb As Database Dim examtbl As TableDef Public Sub jieshuan() feilu = Data1.Recordset.Fields("费率").Value 60 feiyong = shichang * feilu dhlx = "国内长途" End Sub Public Sub dayliexing1() If Weekday(CDate(qssj)) = 1 Or Weekday(CDate(qssj)) = 7 Then dayliexing = "节假日" Exit Sub End If If Month(CDate(qssj)) = 5 And (Day(CDate(qssj)) >= 1 And Day(CDate(qssj) <= 7)) Then dayliexing = "节假日" Exit Sub End If If Month(CDate(qssj)) = 1 And (Day(CDate(qssj)) >= 1 And Day(CDate(qssj) <= 3)) Then dayliexing = "节假日" Exit Sub End If If Month(CDate(qssj)) = 10 And (Day(CDate(qssj)) >= 1 And Day(CDate(qssj) <= 3)) Then dayliexing = "节假日" Exit Sub End If dayliexing = "正常工作日 End Sub Public Sub guoji() Data1.DatabaseName = App.Path + "\计费系统.mdb" Data1.RecordSource = "费率表" Data1.Refresh findchuqiaolx = "主叫类型='" + i + "'" Data1.Recordset.FindFirst findchuqiaolx jiejia1: If Data1.Recordset.NoMatch = False Then If Data1.Recordset.Fields("通话类型").Value = "国际长途" Then If Data1.Recordset.Fields("日期类型").Value = dayliexing Then feilu = Data1.Recordset.Fields("费率").Value feiyong = shichang * feilu dhlx = "国际长途" Else Data1.Recordset.FindNext findchuqiaolx GoTo jiejia1 End If Else Data1.Recordset.FindNext findchuqiaolx GoTo jiejia1 61 End If Else MsgBox "表参数不全,统计失败,请刷新~~" Label1.Caption = "" Exit Sub End If Call newdata(dhlx) End Sub Private Sub Command4_Click() t = Text8.Text dingshihour = Text10.Text Open App.Path + "\定时周期" For Random As #5 Len = 20 Put #5, 1, t Put #5, 3, dingshihour Close #5 Text8.Enabled = False Text10.Enabled = False End Sub Private Sub Command5_Click() Text8.Enabled = True Text10.Enabled = True Text8.SetFocus End Sub Private Sub Form_Load() Open App.Path + "\定时周期" For Random As #5 Len = 20 Get #5, 1, t Get #5, 2, v Get #5, 3, dingshihour Text8.Text = t Text10.Text = dingshihour Close #5 If Val(t) = Day(Now) And Val(dingshihour) = Hour(Now) Then If v <> 2 Then Label1.Caption = "今天是结算日期,结算中请稍候。。。" v = 2 Open App.Path + "\定时周期" For Random As #5 Len = 20 Put #5, 2, v Close #5 Timer1.Enabled = strar End If 62 End If Label8.Caption = Now End Sub Private Sub Command3_Click() Unload Form12 End Sub Private Sub Timer1_Timer() Label8.Caption = Now Open App.Path + "\定时周期" For Random As #5 Len = 20 Get #5, 1, t Get #5, 3, dingshihour Close #5 If Val(t) = Day(Now) And Val(dingshihour) = Hour(Now) Then Timer1.Enabled = False OLE1.Action = 7 Set examdb = OpenDatabase(App.Path + "\话单库.mdb") .mdb" Data2.DatabaseName = App.Path + "\话单库 Data2.RecordSource = dingshiname1 ',,, Data2.Refresh On Error Resume Next now11: Do While Data2.Recordset.EOF = False zjhm = Data2.Recordset.Fields("主叫号码").Value pjhm = Data2.Recordset.Fields("被叫号码").Value qssj = Data2.Recordset.Fields("起始时间").Value czsj = Data2.Recordset.Fields("终止时间").Value xj1 = Hour(CDate(qssj)) fz1 = Minute(CDate(qssj)) mm1 = Second(CDate(qssj)) xj2 = Hour(CDate(czsj)) fz2 = Minute(CDate(czsj)) mm2 = Second(CDate(czsj)) xj = Val(xj2) - Val(xj1) fz = Val(fz2) - Val(fz1) mm = Val(mm2) - Val(mm1) If mm > 6 Then fz = fz + 1 End If shichang = (xj * 60 + fz) ' ********************************************************* '判断是固话还是公话 Data1.DatabaseName = App.Path + "\计费系统.mdb" Data1.RecordSource = "固话表" Data1.Refresh 63 findhaoma = "号码=" + Str(zjhm) Data1.Recordset.FindFirst findhaoma If Data1.Recordset.NoMatch = False Then i = "固话" diming = Data1.Recordset.Fields("地名").Value Else Data1.RecordSource = "公话表" Data1.Refresh findhaoma = "号码=" + Str(zjhm) Data1.Recordset.FindFirst findhaoma If Data1.Recordset.NoMatch = False Then i = "公话" diming = Data1.Recordset.Fields("地名").Value Else MsgBox "主叫号码不在号码表里~" Exit Sub End If End If Call dayliexing1 If Left(pjhm, 2) = "00" Then Call guoji Data2.Recordset.MoveNext GoTo now11 End If '************************************************************ If Left(pjhm, 1) = "0" Then '判断是否是长途 Data1.DatabaseName = App.Path + "\计费系统.mdb" Data1.RecordSource = "费率表" Data1.Refresh findchuqiaolx = "主叫类型='" + i + "'" Data1.Recordset.FindFirst findchuqiaolx 'And "通话类型='长途'" next1: If Data1.Recordset.NoMatch = False Then If Data1.Recordset.Fields("通话类型").Value = "国内长途" Then If Data1.Recordset.Fields("日期类型").Value = dayliexing Then Call jieshuan Else Data1.Recordset.FindNext findchuqiaolx GoTo next1 End If Call jieshuan Else Data1.Recordset.FindNext findchuqiaolx GoTo next1 End If 64 Call newdata(dhlx) Data2.Recordset.MoveNext GoTo now11 Else MsgBox "表参数不全,统计失败,请刷新~" Exit Sub End If Else If Val(Len(pjhm)) = 7 Then '判断是电话还是手机 Data1.RecordSource = "费率表" Data1.Refresh zhiguan1 = Left(zjhm, 3) zhiguan2 = Left(pjhm, 3) If zhiguan1 <> zhiguan2 Then findchuqiaolx = "主叫类型='" + i + "'" Data1.Recordset.FindFirst findchuqiaolx 'And "通话类型='网话'" next2 If Data1.Recordset.NoMatch = False Then If Data1.Recordset.Fields("通话类型").Value = "网话" Then feilu = Data1.Recordset.Fields("费率").Value feiyong = shichang * feilu dhlx = "网话" Else Data1.Recordset.FindNext findchuqiaolx GoTo next2 End If Call newdata(dhlx) Data2.Recordset.MoveNext GoTo now11 Else MsgBox "表参数不全,统计失败,请刷新~" Exit Sub End If Else Data1.RecordSource = "费率表" Data1.Refresh findchuqiaolx = "主叫类型='" + i + " Data1.Recordset.FindFirst findchuqiaolx 'And "通话类型='市话'" next3 If Data1.Recordset.NoMatch = False Then If Data1.Recordset.Fields("通话类型").Value = "市话" Then If i = "固话" Then feilu = Data1.Recordset.Fields("费率").Value feilu1 = Data1.Recordset.Fields("首次三分钟").Value feiyong = feilu1 + (shichang - 3) * feilu Else 65 feilu = Data1.Recordset.Fields("费率").Value feiyong = shichang * feilu End If dhlx = "市话" Else Data1.Recordset.FindNext findchuqiaolx GoTo next3 End If Call newdata(dhlx) Data2.Recordset.MoveNext GoTo now11 Else MsgBox "表参数不全,统计失败,请刷新~" Exit Sub End If End If Else zhiguan2 = Left(Str(pjhm), 6) Data1.RecordSource = "字冠表" Data1.Refresh zhiguan22 = "本地字冠号'" + zhiguan2 + "'" Data1.Recordset.FindFirst zhiguan22 diming1 = Data1.Recordset.Fields("地名").Value If diming = diming1 Then Data1.RecordSource = "费率表" Data1.Refresh findchuqiaolx = "主叫类型='" + i + "'" Data1.Recordset.FindFirst findchuqiaolx 'And "通话类型='市话'" next4: If Data1.Recordset.NoMatch = False Then If Data1.Recordset.Fields("通话类型").Value = "市话" Then If i = "固话" Then feilu = Data1.Recordset.Fields("费率").Value feilu1 = Data1.Recordset.Fields("首次三分钟").Value feiyong = feilu1 + (shichang - 3) * feilu Else feilu = Data1.Recordset.Fields("费率").Value feiyong = shichang * feilu End If dhlx = "市话" Else Data1.Recordset.FindNext findchuqiaolx GoTo next4 End If Call newdata(dhlx) 66 Data2.Recordset.MoveNext GoTo now11 Else MsgBox "表参数不全,统计失败,请刷新~" Exit Sub End If Else Data1.RecordSource = "费率表" Data1.Refresh findchuqiaolx = "主叫类型='" + i + "'" Data1.Recordset.FindFirst findchuqiaolx 'And "通话类型='网话'" next5: If Data1.Recordset.NoMatch = False Then If Data1.Recordset.Fields("通话类型").Value = "网话" Then feilu = Data1.Recordset.Fields("费率").Value feiyong = shichang * feilu dhlx = "网话" Else Data1.Recordset.FindNext findchuqiaolx GoTo next5 End If Call newdata(dhlx) Data2.Recordset.MoveNext GoTo now11 Else MsgBox "表参数不全,统计失败,请刷新~" Exit Sub End If End If End If End If Loop msg = MsgBox("统计结束~") If msg = 1 Then OLE1.Action = 9 End If Label1.Caption = "" End If End Sub Public Sub newdata(dhlx As String) '*********************表的生成************************* Dim examfld(7) As Field Dim msg If Y = 0 Then Set examdb = OpenDatabase(App.Path + "\统计库.mdb") 67 Set examtbl = examdb.CreateTableDef(dingshiname1) With examtbl Set examfld(0) = .CreateField("主叫号码", dbText, 15) Set examfld(1) = .CreateField("被叫号码", dbText, 15) Set examfld(2) = .CreateField("起始时间", dbText, 50) Set examfld(3) = .CreateField("终止时间", dbText, 50) Set examfld(4) = .CreateField("通话时长", dbInteger, 15) Set examfld(5) = .CreateField("通话类型", dbText, 15) Set examfld(6) = .CreateField("费用", dbDouble, 15) .Fields.Append examfld(0) .Fields.Append examfld(1) .Fields.Append examfld(2) .Fields.Append examfld(3) .Fields.Append examfld(4) .Fields.Append examfld(5) .Fields.Append examfld(6) End With On Error Resume Next examdb.TableDefs.Append examtbl '添加表 Y = 1 End If '**********************给新添加的表赋值******************* Set examdb = OpenDatabase(App.Path + "\统计库.mdb") Data1.DatabaseName = App.Path + "\统计库.mdb" Data1.RecordSource = dingshiname1 Data1.Refresh Data1.Recordset.AddNew Data1.Recordset.Fields("主叫号码").Value = zjhm Data1.Recordset.Fields("被叫号码").Value = pjhm Data1.Recordset.Fields("起始时间").Value = qssj Data1.Recordset.Fields("终止时间").Value = czsj Data1.Recordset.Fields("通话类型").Value = dhlx Data1.Recordset.Fields("通话时长").Value = shichang Data1.Recordset.Fields("费用").Value = feiyong Data1.Recordset.Update End Sub 3.3.4.3 统计话单表浏览子窗体模块 1. 窗体的创建 在工程中新建一个窗体,将窗体保存为 话单浏览.frm。 68 2. 模块实现的功能 可以对已统计的表和表的字段进行删除,恢复和显示打印。显示打印为一个子窗体。 3. 模块界面的设计 -6所示。 运行后,界面如图3 图3-6 话单浏览子窗体界面 4. 功能实现的代码 Option Explicit Dim curdir As String Dim jxdb As Database Dim biao As TableDef Dim zhiduan As Field Private Sub command1_click() Dim msg On Error Resume Next Kill (App.Path + "\备份\统计库1.mdb") jxdb.Close FileCopy App.Path + "\统计库.mdb", App.Path + "\备份\统计库 1.mdb" Set jxdb = DBEngine.Workspaces(0).OpenDatabase(App.Path + "\统 计库.mdb") If List1.ListIndex = -1 Then MsgBox "请选择要删除的表~" Exit Sub End If 69 msg = MsgBox("确定要删除选定的表吗,", vbYesNo, " 删除表") If msg = vbYes Then jxdb.TableDefs.Delete List1.Text '删除选定的表 Call DispTablename '显示表名和表的数目 Else Exit Sub End If End Sub Private Sub Command3_Click() On Error Resume Next jxdb.Close On Error Resume Next Kill (App.Path + "\备份\统计库.mdb") FileCopy App.Path + "\统计库1.mdb", App.Path + "\统计库.mdb" Set jxdb = DBEngine.Workspaces(0).OpenDatabase(App.Path + "\统计库.mdb") Call DispTablename End Sub Private Sub Command4_Click() If List1.Text = "" Then Exit Sub End If dirtablename = List1.Text Form15.Show End Sub Private Sub Form_Load() On Error Resume Next Kill (App.Path + "\临时\统计库.mdb") FileCopy App.Path + "\统计库.mdb", App.Path + "\临时\统计库.mdb" Set jxdb = DBEngine.Workspaces(0).OpenDatabase(App.Path + "\统计库.mdb") Call DispTablename End Sub Private Sub DispTablename() List1.Clear With jxdb For Each biao In .TableDefs List1.AddItem biao.name 70 Next biao Text1.Text = .TableDefs.Count End With End Sub '************************************************ Private Sub DispFieldName() List2.Clear Set biao = jxdb.TableDefs(List1.Text) With biao For Each zhiduan In .Fields List2.AddItem zhiduan.name Next zhiduan Text2.Text = .Fields.Count End With End Sub Private Sub Command2_Click() Dim msg If List2.ListIndex = -1 Then MsgBox "请选择要删除的字段~" Exit Sub End If msg = MsgBox("确定要删除选定的字段吗,", vbYesNo, "删除字段") If msg = vbYes Then jxdb.TableDefs(List1.Text).Fields.Delete List2.Text Call DispFieldName Else Exit Sub End If End Sub Private Sub List1_Click() Call DispFieldName End Sub 4. 显示子窗体模块 (1)窗体的创建 在工程中新建一个窗体,将窗体保存为 话单显示.frm。 71 (2)模块功能的实现 运行后的界面如图4-7 所示。 图4-7 话单显示界面 (2)功能实现的代码 Option Explicit Dim f, jbyz, find1, find2, g, e Dim file1, file2, file3, file4, file5 Dim examdb As Database Dim examtbl As TableDef Dim i As Integer ' 循环计数器 Dim j As Integer Dim rCount As Long ' 记录的个数 Dim xl As Object ' OLE自动化对象 Dim Sn As Recordset Dim examfld(7) As Field Public Sub newdata() Data2.DatabaseName = App.Path + "\临时\统计库.mdb" Data2.RecordSource = "临时表" + dirtablename Data2.Refresh Data2.Recordset.AddNew Data2.Recordset.Fields("主叫号码").Value = Data1.Recordset.Fields("主叫号码").Value Data2.Recordset.Fields("被叫号码").Value = Data1.Recordset.Fields("被叫号码").Value Data2.Recordset.Fields("起始时间").Value = Data1.Recordset.Fields("起始时间").Value Data2.Recordset.Fields("终止时间").Value = Data1.Recordset.Fields("终止时间 72 ").Value Data2.Recordset.Fields("通话类型").Value = Data1.Recordset.Fields("通话类型").Value Data2.Recordset.Fields("通话时长").Value = Data1.Recordset.Fields("通话时长").Value Data2.Recordset.Fields("费用").Value = Data1.Recordset.Fields("费用").Value Data2.Recordset.Update End Sub '******************************** Public Sub last() Set examdb = OpenDatabase(App.Path + "\临时\统计库.mdb") Data2.DatabaseName = App.Path + "\临时\统计库.mdb" Data2.RecordSource = "临时表" + dirtablename Data2.Refresh Data2.Recordset.AddNew Data2.Recordset.Fields("主叫号码").Value = g Data2.Recordset.Fields("被叫号码").Value = "基本月租" ").Value = jbyz Data2.Recordset.Fields("费用 Data2.Recordset.Update End Sub Private Sub command1_click() 'data1 指向的是临时 'data2 指向的是新建 'data3 指向的是dirtablename 'data4 指向的是固话表公话表 Label1.Caption = "准备导出..." Label1.Refresh Set examdb = OpenDatabase(App.Path + "\临时\统计库.mdb") Data1.DatabaseName = App.Path + "\临时\统计库.mdb" Data1.RecordSource = dirtablename Data1.Refresh Do While Data1.Recordset.EOF = False Data1.Recordset.MoveFirst g = Data1.Recordset.Fields("主叫号码").Value Data4.DatabaseName = App.Path + "\计费系统.mdb" Data4.RecordSource = "固话表" Data4.Refresh find1 = "号码=" + Str(g) Data4.Recordset.FindFirst find1 If Data4.Recordset.NoMatch = False Then jbyz = Data4.Recordset.Fields("基本月租").Value Else Data4.RecordSource = "公话表" Data4.Refresh 73 Data4.Recordset.FindFirst find1 If Data4.Recordset.NoMatch = False Then jbyz = Data4.Recordset.Fields("基本月租").Value Else MsgBox "主叫号码" + Str(Data3.Recordset.Fields("主叫号码").Value) + "在系统表里找不到~" Exit Sub End If End If find2 = "主叫号码='" + Trim(Str(g)) + "'" Data1.Recordset.FindFirst find2 q: If Data1.Recordset.NoMatch = False Then Call newdata Data1.Recordset.Delete Else GoTo r End If Data1.Recordset.FindNext find2 GoTo q r: Call last If Data1.Recordset.RecordCount = 0 Then Exit Do End If Loop '********************************** Screen.MousePointer = 11 Label1.Caption = "打开数据库..." Label1.Refresh Set examdb = Workspaces(0).OpenDatabase(App.Path + "\临时\统计库.mdb") Label1.Caption = "创建Excel对象..." Label1.Refresh Set xl = CreateObject("Excel.Sheet.8") Label1.Caption = "创建快照型记录集..." Label1.Refresh Set Sn = examdb.OpenRecordset("临时表" + dirtablename, dbOpenSnapshot) If Sn.RecordCount > 0 Then Label1.Caption = "将字段名添加到电子表格中" Label1.Refresh For i = 0 To Sn.Fields.Count - 1 xl.Worksheets(1).cells(1, i + 1).Value = Sn(i).name Next Sn.MoveLast 74 Sn.MoveFirst rCount = Sn.RecordCount ' 在记录中循环 i = 0 Do While Not Sn.EOF Label1.Caption = "Record:" & Str(i + 1) & " of" & _ Str(rCount) Label1.Refresh For j = 0 To Sn.Fields.Count - 1 ' 加每个字段的值加到工作表中 If Sn(j).Type < 11 Then xl.Worksheets(1).cells(i + 2, j + 1).Value = Sn(j) Else ' 处理Memo和LongBinary 类型的字段 xl.Worksheets(1).cells(i + 2, j + 1).Value = "Memo or Binary Data" End If Next j Sn.MoveNext i = i + 1 Loop ' 保存工作表 Label1.Caption = "保存文件..." file1 = Month(Now) file2 = Day(Now) file3 = Hour(Now) file4 = Minute(Now) file5 = Second(Now) Label1.Refresh xl.SaveAs App.Path + "\打印\" + Str(file1) + Str(file2) + Str(file3) + Str(file4) + Str(file5) + ".xls" '"c:\Customers.XLS" '从内存中删除Excel对象 Label1.Caption = "退出Excel" Label1.Refresh xl.Application.Quit Else ' 没有记录 End If ' 清除 Label1.Caption = "清除对象" Label1.Refresh Set xl = Nothing Set Sn = Nothing Set examdb = Nothing 75 Screen.MousePointer = 0 ' 恢复鼠标指针 Label1.Caption = "已成功导出..." Label1.Refresh If e = 0 Then e = 1 Command1 = True Else Command1 = False End If End Sub Private Sub Command2_Click() Unload Form15 End Sub Private Sub Form_Load() f = 0 e = 0 Set examdb = OpenDatabase(App.Path + "\临时\统计库.mdb") Set examtbl = examdb.CreateTableDef("临时表" + dirtablename) With examtbl Set examfld(0) = .CreateField("主叫号码", dbText, 15) Set examfld(1) = .CreateField("被叫号码", dbText, 15) Set examfld(2) = .CreateField("起始时间", dbText, 50) Set examfld(3) = .CreateField("终止时间", dbText, 50) Set examfld(4) = .CreateField("通话时长", dbInteger, 15) Set examfld(5) = .CreateField("通话类型", dbText, 15) Set examfld(6) = .CreateField("费用", dbDouble, 15) .Fields.Append examfld(0) .Fields.Append examfld(1) .Fields.Append examfld(2) .Fields.Append examfld(3) .Fields.Append examfld(4) .Fields.Append examfld(5) .Fields.Append examfld(6) End With examdb.TableDefs.Append examtbl '添加表 Label1.AutoSize = True Label1.Caption = "" Label1.Refresh End Sub Private Sub Form_Activate() Data1.DatabaseName = App.Path + "\统计库.mdb" 76 Data1.RecordSource = dirtablename Data1.Refresh End Sub 3.5 通信串中的建立 3.5.1实现的功能 实现计算机间的数据传输(采用第三方控伯PDQComm来实现)。 3.5.2用PDQComm控件实现串口通信的程序设计 (1) 通讯口初始代码如下 Public Sub SettingLoad() On error resume next PDQcomm.InOroutput=1 PDQcomm.CommPort=1 PDQcomm.Settings=”38400,N,8,1” PDQcomm.InputLen=0 PDQcomm.Sthreshold=1 PDQcomm.Rthreshold=1 PDQcomm.PortOPen=True End usb (2) 有关通讯代码 Private Sub PQDCommon_Oncomm() If InOroutput=1 then ………………..\\应用程序 end if 3.6 发行软件的制作 发行软件制作的步骤: (1) 利用Visual Basic 的编译功能把当前工程编译在可执行文 件。 (2) 启动 Visual Basic 的“Package&Deployment” 向导。 (3) 选择“包”类型为SETUP 程序。 (4) 选中编译生在的.EXE文件和所有VB自带的DLL文件。 (5) 把工程中用到的第三方DDL或ActiveX控件加载到程序包 中。 77
本文档为【电信终端计费系统开发 毕业论文】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_036899
暂无简介~
格式:doc
大小:559KB
软件:Word
页数:117
分类:生活休闲
上传时间:2017-11-18
浏览量:17