医药物流毕业论文
物流管理系统----医药物流管理系统
目 录
一.引 言 ...................................................................................................... 2
二.需求分析 ...................................................................................................... 3
2.1 开发背景 ......................................................................................................................... 3
2.2 初步设计 ......................................................................................................................... 3
2.3 实现目标 ......................................................................................................................... 4
2.4 系统结构图 ..................................................................................................................... 4
2.5 系统流程图 ..................................................................................................................... 5
2.6 开发环境 ......................................................................................................................... 5
2.6.1 硬件环境........................................................ 5
2.6.2 软件环境........................................................ 5
三.概要设计 ...................................................................................................... 6
3.1 销售管理 ......................................................................................................................... 6
3.2 进货管理 ......................................................................................................................... 6
3.3 库房管理 ......................................................................................................................... 6
3.4 调货管理 ......................................................................................................................... 7
3.5 财务管理 ......................................................................................................................... 7
3.6 账目管理 ......................................................................................................................... 8
3.7 基础信息管理 ................................................................................................................. 8
3.8 系统管理 ......................................................................................................................... 9
四.详细设计及功能实现 .................................................................................. 9
4.1 数据库设计 ..................................................................................................................... 9
4.2 主程序界面设计 ........................................................................................................... 10
4.3 系统登录界面设计 ....................................................................................................... 11
4.4 功能模块设计与功能实现 ........................................................................................... 12
4.4.1 查询类模块..................................................... 13
4.4.2 报表类模块..................................................... 17
4.4.3 登记类模块..................................................... 18
4.4.4 结账类模块..................................................... 21
4.4.5 可修改类模块................................................... 24
4.5 其它模块设计 ............................................................................................................... 25
4.5.1操作员管理 ..................................................... 25
4.5.2权限管理设计 ................................................... 26
4.5.3 数据备份与恢复 ................................................. 28
五.存在问题及解决方案 ................................................................................ 29
六.结 论 .................................................................................................... 30
七.参考资料 .................................................................................................... 30
一.引 言
物流管理是指在社会再生产过程中,根据物质资料实体流动的规律,应用管理的基本原理和科学方法,对物流活动进行计划、组织、指挥、协调、控制和监督,使各项物流活动实现最佳的协调与配合,以降低物流成本,提高物流效率和经济效益。
物流管理的内容包括:
(1)、对物流活动诸要素的管理,包括运输、储存等环节的管理;
(2)、对物流系统诸要素的管理,即对其中人、财、物、设备、方法和信息等六大要素的管理;
(3)、对物流活动中具体职能的管理,主要包括物流计划、质量、技术、经济等职能的管理等。
现在物流管理的流程一般分为10个阶段:
订单处理作业→采购作业→进货入库作业→库存管理作业→补货及拣货作业→流通加工作业→出货作业处理→配送作业→会计作业→营运管理及绩效管理作业
过去物流管理着重在企业内部作业与组织的整合,对下游顾客的对应,是以服务与品质为主要重心。随着物流业的发展物流管理从物的处理,提升到物的加值方案设计、解决和管理上。可以为客户提供度身订造式的,并带有个性化的服务,企业逐渐转向强调跨企业界限的整合,使得顾客关
系的维护与管理变得越来越重要.
二.需求分析
2.1 开发背景
本系统假设为一个医药品的销售公司做物流管理系统。
随着我国市场经济的蓬勃发展和对医药品的需求迅速增加,医药行业也相应的处于一个飞速发展的时期。行业的快速发展必然导致各企业之间的竞争更加激烈,为了使自己的企业在竞争中能够站稳脚跟,不被激烈的竞争环境所压倒,必然要求企业加强对自身的管理,提高企业的经营效率。
由于医药行业的特殊性,造成医药品的种类繁多,业务量巨大,若仍然采用人工的记账方式,必然不能满足企业的需求,企业需要利用计算机来进行医药品的物流管理,因此需要构造一个物流管理系统。
2.2 初步设计
由于本系统假设为一个医药品的销售公司做物流管理系统。针对医药品销售的特点,初步设计本系统包含以下几个功能模块:
(1) 销售管理:包含销售登记,销售退货,销售报表。
(2) 进货管理:包含入库登记,入库退货,入库报表。
(3) 库房管理:包含库存查询,库存盘点,库存修改,库存报表。
(4) 调货管理:包含调货登记,调货查询。
(5) 财务管理:包含收款单,收款查询,付款单,付款查询。
(6) 账目管理:包含财务结账,当月结账,销售查询统计,入库查询 统计,销售退货查询,财务报表,月报表。
(7) 基础信息管理:包含药品信息,员工信息,客户信息,供应商信
息,仓库基本信息。
(8) 系统管理:包含操作员管理,权限设置,数据备份,数据恢复。
2.3 实现目标
本医药物流管理系统在完成运行后,需要达到以下效果:
(1) 操作简单,易于上手。
(2) 查询方便灵活,浏览简单,明目。
(3) 数据存储安全可靠。
(4) 功能全面,实用性强。
(5) 自动化信息管理。
2.4 系统结构图
图1. 医药物流管理系统结构图
2.5 系统流程图
图2. 医药物流管理系统流程图
2.6 开发环境
2.6.1 硬件环境
主频50MHz以上
内存10MB以上
240MB以上的硬盘空间
VGA或更高的分辨率显示器,1MB以上的显存
2.6.2 软件环境
本系统是在 Windows XP 环境下,采用Microsoft Visual FoxPro 6.0数据库开发工具进行构建系统。
Microsoft Visual FoxPro 6.0是微软公司推出的可视化编程工具,它
的开发效率高,成本低,投资小,见效快。Microsoft Visual FoxPro 6.0一直是中国台式机数据库的主流,易学,易用,易维护。
三.概要设计
通过前面的需求分析可以知道,本系统一共分为了8个系统模块,包括:销售管理,进货管理,库房管理,调货管理,财务管理,账目管理,基础信息管理,系统管理。每个系统模块下,包含了若干小的功能模块。每一个系统模块都实现其特定的功能。
3.1 销售管理
销售管理模块主要实现销售方面的功能,它包含销售登记,销售退货,销售调查三个功能模块。销售管理主要是针对公司的销售人员而设计,帮助公司对所销售的药品进行一个系统地记录。
销售登记可以实现日常的销售开票,自动计算金额,多种结算方式。销售退货用于单据已开出的客户进行退货操作。
销售报表实现按日期查询药品销售信息,可预览和打印销售报表。
3.2 进货管理
进货管理模块主要实现药品入库的功能,它包括入库登记,入库退货,入库报表三个功能模块。进货管理主要是针对公司的仓库管理人员而设计,此系统模块能帮助公司在药品入库的时候,对药品的各项信息进行系统地记录,可以大大减少进行手工记录时所犯的错误,提高公司的营运效率。
入库登记实现入库登记操作,并自动计算金额,生成入库票号。
入库退货实现调用药品的基本信息,生成退货票号作为退货的凭证。 入库报表实现按日期查询入库药品信息,打印和预览入库报表。
3.3 库房管理
库房管理模块是对药品在库房中的管理,它包括库存查询,库存盘点,库存修改,库存报表。此系统模块同样为仓库管理员而设计。由于同种药品入库有时间上的先后,而药品的信息也会随着时间的推移而不停的修改。因此库房管理模块就能实现对库存中的药品信息进行系统地管理。
库存查询实现按不同条件查询库存信息,以页框和列表来浏览信
息。
库存盘点实现以表单的形式显示库存数量大于零的全部药品信
息。
库存修改实现查询和浏览信息功能外,还设置了修改,删除信息
功能。
库存报表实现按条件查询库存信息,预览和打印库存报表。
3.4 调货管理
调货管理用于实现对库存的药品在不同的仓库之间进行调动的记录。它包含调货登记,调货查询。与上面两个系统模块一样,此模块仍然为仓库管理人员设计。药品由于其种类繁多,信息复杂,在进行药品的调动时,对调动的信息进行记录也就显得尤为关键。
调货登记完成各仓库间药品调货信息记录,自动生成调货票号,日期,以列表的形式显示调货结果。
调货查询支持条件和日期查询,以页框和列表方式浏览调货信息。
3.5 财务管理
财务管理主要实现收款与付款的记录功能。医药品业务的流通量是非常巨大的,因此在财务上对收款与付款的信息记录也就非常繁琐。利用财务管理系统模块可以简化这些操作,使用方便,简洁。财务管理包含收款单,付款单,收款查询,付款查询。
收款单可实现查询和浏览收款信息,对未付款客户进行结款操作。 收款查询能按不同条件查询收款信息,以页框和列表浏览收款信息。 付款单可对供应商进行结款操作,能查询与浏览付款信息。
付款查询与收款查询相似,可查询与浏览付款信息。
3.6 账目管理
账目管理所包含的功能模块较多,它主要是为公司的财务人员而设计。它可以大大简化公司财务人员的工作量,对公司的财务账目信息有一个系统的管理。账目管理系统模块包含财务结账,当月结账,销售查询统计,入库查询统计,销售退货查询,入库退货查询,财务报表,查询月报表。
财务结账可完成日结账操作,可汇总每日结账信息。
当月结账完成月结账操作,统计汇总结账信息
销售查询统计可查询与浏览销售信息,统计汇总销售信息。
入库查询统计可查询与浏览药品入库信息,自动汇总入库药品信息。 销售退货查询可查询与浏览销售退货的信息结果,快速浏览信息。 入库退货查询与销售退货查询的功能实现相似。
财务报表可按时间查询财务报表,以报表形式反映药品的进销存情况,预览和打印财务报表。
查询月报表可按条件查询该月的药品进销存信息,可预览和打印此月报表。
3.7 基础信息管理
基础信息管理模块是对公司的常用信息进行管理,如药品,员工,客户的信息等。这个模块相当于公司的档案管理,有大量的数据信息。它包含药品信息,员工信息,客户信息,供应商信息,仓库基本信息。这些信
息数据是其它功能模块实现的基础。
药品信息实现浏览查询药品基本信息,可添加,修改,删除信息。 员工信息提供了添加,修改,删除员工信息功能,也可查询浏览。 客户信息实现了客户信息的添、删、改功能。
供应商信息与上述三种功能模块实现的功能相似。
仓库基本信息出了现了信息的添、删、改功能外,还能自动生成7位仓库编号。
3.8 系统管理
系统管理模块是针对系统的保护而设计的。此模块专为系统管理员而设计。此系统的管理操作可直接影响整个系统的操作管理。它包括操作员管理,权限管理,数据备份,数据恢复。
操作员管理可以对操作员信息进行增加、删除、修改,可设置操作员密码。
权限管理能查询操作员级别及使用权限,为一般操作员设置权限。 数据备份可以对库存中的数据信息实现备份功能。
数据恢复可将数据备份的库存信息安原路经恢复。
四.详细设计及功能实现
4.1 数据库设计
利用Microsoft Visual FoxPro 6.0新建一个数据库,名称为Medicamentmanage ,在此数据库中添加27个表:临时登记表Ltabdhdj, 临时日结表Ltabrj,临时入库登记表Ltabrkdj,临时入库退货表Ltabrkth,临时销售登记表Ltabxsdj,临时销售退货表Ltabxsth,临时月结表Ltabyj,调货登记表Tabdhdj,供应商信息表Tabgys,结算方式表Tabjsfs,库存
表Tabkc,客户信息表Tabkh,权限表Tabpurview,日结表Tabrj,入库登记表Tabrkdj,入库结账表Tabrkjz,入库票号表Tabrkph,入库退货表Tabrkth,仓库信息表Tabstorage,销售登记表Tabxsdj,销售结账表Tabxsjz,销售票号表Tabxsph,销售退货表Tabxsth,员工信息表Tabyginfo,月结表Tabyj,月结初始化Tabyjcsh,药品信息表Tabypinfo。
4.2 主程序界面设计
创建一个标准项目,名称为“医药物流管理系统”,在该项目中添加一个表单,名称为Fdesktop。在表单中插入名称为Vcxmain的ToolBar类。 在各个按钮的Click事件中添加类代码。
图3. 主程序界面
为了使操作更加简便,将常用的几种操作单独提出来,设计一个Vcxmain的Toolbar类。添加代码如下:
在“销售登记”按钮的Click事件中添加代码:do form form\xiaoshoudj 同理,在“入库登记”按钮中添加:do form form\rukudj
在“调货登记”按钮中添加:do form form\tiaohuodj
在“库存查询”按钮中添加:do form form\kcquery
在“销售查询”按钮中添加:do form form\xiaoshouquery
在“入库查询”按钮中添加:do form form\rukuquery
在“财务结账”按钮中添加:do form form\cwjz
在“药品信息”按钮中添加:do form form\ypmanage
在“退出”按钮中添加:quit
4.3 系统登录界面设计
用户进入系统前,必须进入系统登录界面,系统登录界面能够确认用户的身份及使用权限。
图4. 系统登录界面
首先要判断用户输入的用户名是否正确,然后判断用户输入的密码是否正确,如果正确,这根据用户选择操作员说拥有的权限级别为全局变量赋值,如果不正确,弹出系统警告。
在进行编码的时候,首先将使用的数据表—权限表打开:
use database\tabpurview &&打开数据表
为了对所输入的操作员姓名与权限表中的姓名相比较,我们用权限表
中的“操作员姓名”作为索引文件:
set order to 操作员姓名 &&指定控制索引文件
当输入姓名与密码以后,我们要判断所输入的操作员名称和密码是否正确。方法是先查找表中是否有所输入的名字,如果表中没有所输入的名字,则系统登陆失败,并显示登陆失败。
在查询搜索名字时,可用以下语句:
seek cname &&快速查询
判断错误,并显示错误界面:
if alltrim(tabpurview.操作员姓名)!=cname
cMessagetext='操作员错误,请重新输入!'
如果在表中找到了所输入的名字,则系统需要对所对应的密码进行比较判断,看是否能与名字所匹配,方法与上面的名字比较相似:
if alltrim(tabpurview.密码)!=ppassword
cmessagetext='密码错误,请重新输入!'
当系统发现所输入的名字与密码都正确的时候,系统需要给此用户赋予表中相对应的权限,先判断用户的权限级别:
purview=val(alltrim(tabpurview.权限级别))
再对应的各个系统模块,分别赋予相应的权限,以“销售管理”权限为例,将销售管理的权限赋值给全局变量:
pxsgl=tabpurview.销售管理 &&赋值给全局变量
4.4 功能模块设计与功能实现
通过前面的需求分析可以知道,本系统共有8个部分,一共包含33个完整的功能模块。这33个功能模块,除去系统管理所实现的功能,其它的模块根据其实现的功能可以分为以下几类:
(1) 查询类模块:库存查询,调货查询,收款查询,付款查询,
销售查询统计,入库查询统计,销售退货查询, 入库退货查询。
(2) 报表类模块:销售报表,入库报表,库存报表,财务报表,查询 月报表,库存盘点。
(3) 登记类模块:销售登记,销售退货,入库登记,入库退货,调货 登记。
(4) 结账类模块:收款单,付款单,财务结账,当月结账。
(5) 可修改类模块:库存修改,药品信息,员工信息,客户信息,供 应商信息,仓库基本信息。
4.4.1 查询类模块
由于本系统中含有大量的数据信息,而在实际的系统操作中,又需要对数据进行查询,因此在这些查询类模块中,我们要设计并实现查询这项功能。
图5. 查询系统界面
在本系统中,查询的种类分为两大类:分别为条件查询与时间查询。 条件查询分为四种方式,分别为模糊查询(like) ,小于查询()和等于查询(=)。
为了实现这条件查询的这几种方式,在创建表单的时候,须在表单上添加2个Combo控件,属性均为:RowSource RowSourceType,分别用来
提供查询字段列表和查询条件列表。
而如果模块中,要实现按日期查询,还需要在表单中加入2个Text控件,属性为Format Value,用来提供日期的输入。
对于模块需要按条件还是日期来查询,在查询前,需要进行选择,为了实现这个选择功能,在表单设计时,需添加2个Check控件,用来分别选择查询的方式。
当选择查询的类型时,只要在查询方式前加上勾,系统就将采用此种查询方式,系统判断是否选择,使用下面的方法:
if thisform.check1.value=1 &&选择了该方法
if thisform.check1.value=0 &&为没选择该方法
当系统发现选择了该查询方式,则需要设置控件有效来使用此方法:
store.t.to thisform.combo1.enabled,
thisform.combo2.enabled,thisform.text1.enabled &&设置控件有效
若发现未使用该方法,只需要将第一句改为:
store.f.to thisform.combo1.enabled 即可。
这样也就实现是选择条件还是日期来查询。
如果按选择条件查询,系统在查询的时候,将查询过程分成三个情况。 第一种情况为查询操作失败,出现这种情况,主要是使用查询的时候,没有按照要求来进行查找操作,如没有填写查询的字段,没有选择查询的方式,出现这种情况,系统会提示查询失败,需要重新查询。
系统判断出没有填写完整的查询,也就是没有选择查询方式为空和查询的内容为空,输出错误提示:
if empty(ccif) or empty(ctext)
messagebox('请选择查询条件!',48,'操作失败!')
此时查询失败,需要重新查询
第二种情况为模糊查询,实现模糊查询在Microsoft Visual FoxPro 中显得比较容易,因为Visual FoxPro的语言代码中有一个很特殊的符号,这个符号就是“%”。“%”在Microsoft Visual FoxPro 的数据库代码中叫做通配符,使用通配符可以连接任意数目的字符。因此要实现模糊查询,只需要先利用系统查出带有所输入字段的所有目标,而“%”在语句中则表示其他所有任意字段字符。
先判断出所选的查询为模糊查询(like):
if thisform.combo2.displayvalue='like'then
然后找出所有与所写的字段相匹配的信息,其中非所写字段的信息就用通配符所代替:
fff=alltrim(thisform.combo1.displayvalue)+""+alltrim(thisform.
combo2.displayvalue)
+"'"+alltrim(thisform.text1.value)+"%'"
这样,系统就可以找出所要查询的所有信息。
第三种情况为除去模糊查询的其它查询,包括小于,大于,等于查询,这三种查询与模糊查询相比,唯一的不同就是所给的字段微可比较的,而且不需要系统对不确定的信息进行搜索,也就是没有通配符。
fff=alltrim(thisform.combo1.displayvalue)+""
+alltrim(thisform.combo2.displayvalue);
+" '"+alltrim(thisform.text1.value)+"'"
上面就是条件查询的几种方式。
当然,除了条件查询的方式外,还可以按时间日期进行查询。
如果是按照时间日期查询,与条件查询相似,时间查询可以分为查询失败和日期查询两个情况:
sdate 与 edate 分别指向了时间查询的日期起止时间,若起止时间为空,则查询失败
if sdate={//} or edate={//}
messagebox('请输入起始时间!',48,'操作失败!')
如果日期均不为空,则系统将查找起止日期之间的信息,将信息存入临时表Lindeping以供使用。以销售登记查询 为例,我们将销售登记表中的销售日期作为起止日期查询标准,将满足日期的所有数据信息装入Lindeping 。
fff=between(销售日期,sdate,edate)
select * from tabxsdj where &fff.into cursor lindeping
有的模块使用查询功能的同时,希望能够实现统计功能。我们可以通过查询语句将符合条件的记录存入临时表Lindeping中,在对临时表Lindeping 进行统计。
计算方法为:统计品种数:品种数=临时表Lindeping中的记录总数 select lindeping
creccount=recount( )
统计数量:对符合条件的记录进行求和计算
sum 数量 to jhcount
统计金额:对符合条件的记录进行求和计算
sum 金额 to jhje
4.4.2 报表类模块
本系统中所实现的报表类模块功能大体一样,均包含打印,打印预览,以及使用查询罗列出所需的信息。
在系统中单单实现打印与打印预览是很容易的,只要在表单的相应位置写入简单的语句即可实现。
在“打印预览”按钮的Click事件中加入:
report form report\xiaoshou to print preview &&打印预览报表 在“打印”按钮的Click事件中加入:
report form report\xiaoshou to print &&打印报表
这样,利用上述的代码就可以实现将表单grid控件中所罗列的数据以表单的形式打印出来。
在设计表单类模块的时候,关键是要能把所查询的数据能够罗列出来。为了实现该功能,我们首先应该将查询的数据输入到临时表中。
以销售报表为例,我们需要将所输入的查询时间范围内的所有数据线找出来,以销售票号作为索引,将结果输入到临时表Lindeping 中:
select *;
from medicamentmanage!tabxsdj;
where between(出库日期,sdate,edate);
order by tabxsdj.销售票号;
into cursor lindeping &&查询结果输出到临时表中
然后我们需要实现将所找到的数据输入表单的到grid控件,也就是我们可以清楚看到的列表中:
现将指针移动到临时表的顶端,如果没有我们要找的信息,指针移动
到最后一条记录,然后显示出无记录的信息
go top &&指针移动到表顶端
if eof() &&空信息
go bottom &&记录指针移动到最后一条记录
messagebox('无记录!',48,'信息窗口')
如果临时表中发现了由数据信息存在,则开始进行数据的录入: thisform.grid1.recordsource='lindeping'
thisform.commandgroup1.command1.enabled=.t.
thisform.commandgroup1.command2.enabled=.t.
如果上述语句=.f. 则表示不用输入,在前面无信息输入的时候,可以用此语句完成信息的不输入状态。
4.4.3 登记类模块
登记类各个模块所实现的功能比较繁多,每个模块都比较大,但这些模块都有一些共同的功能,而这些功能在登记类模块是一些核心功能,这些功能包括登记,保存和自动生成各种票号。
自动生成票号功能是随着登记功能的实行而启动实现的。
当单击“登记”按钮时,将清空表单上相关的内容,做好接受用户输入信息的准备。系统将自动生成票号,已入库登记为例,入库票号由系统日期,字母“rkd”,四位数字组成。首先判断入库登记表“Tabrkdj”中的入库票号是否为空,如果为空,则入库票号等于“系统日期+rkd+0001”,如果不为空,则入库票号等于“系统日期+rkd+四位数字编码加1”。
先选定表,这里选择入库登记表,将月份与日期的信息先提出
select tabrkdj
lmonth=padl(alltrim(str(month(date()),2)),2,'0') &&月份信息
lday=padl(alltrim(str(day(date()),2)),2,'0') &&日期信息
在判断入库票号是否为空,如果为空,则以0001结尾
if empty(入库票号)
set cent on thisform.text2.value=
alltrim(str(year(date()),4)+'-'+lmonth+'-'+lday+'rkd0001')
如果入库票号不为空,则需要先找出表中最大的票号
select max (入库票号) from tabrkdj into array a
找到最大的票号后,需要在票号后面加1,形成所需的新票号。
cend=val(substr(a(1),14))+1 &&票号尾数+1
thisform.text2.value=alltrim(str(year(date()),4)+'-'+lmonth+'-'+lday+
'rkd'+padl(alltrim(str(cend,4)),4,'0')) &&形成新票号
thisform.text3.value=date()
在将所输入的信息进行登记,由于在登记的时候不允许同时保存,和退出,但可以取消,因此要设置保存csave 和退出功能cexit无效,而登记cadd 和取消cexit有效。
thisform.commandgroup1.cadd.enabled=.f.
thisform.commandgroup1.csave.enabled=.t.
thisform.commandgroup1.ccancel.enabled=.t.
thisform.commandgroup1.cexit.enabled=.f.
以上代码可以实现登记按钮的功能
当所填信息完成时,我们需要单击“保存”按钮。仍以入库登记为例,当我们单击“保存”按钮时,将临时表中的入库信息保存到入库登记表“Tabrkdj”中,将临时表中的入库信息汇总后保存到入库票号“Tabrkph”表中,在库存信息表“Tabkc”查找该药品,如果找到,则修改库存数量,
如果没找到,则在库存信息中添加该药品的信息,并清空临时表。
首先完成临时表的信息保存到入库登记表中
thisform.grid1.recordsource='tabrkdj' &&赋数据源
select tabrkdj &&选择Tabrkdj工作区为当前工作区 append from database\ltabrkdj &&把数据表中的记录追加到当前数据库文件尾,其中ltabrkdj为临时入库信息表
在数据记录的加入后,我们需要对临时表中的信息进行汇总
select ltabrkdj &&选择临时入库登记表为当前工作区
pzs=reccount()
sum 数量 to ccount &&对数量字段求和
完成了数据信息的汇总后,我们要将信息保存到入库票号得表中,对数据的各种信息,先设定其信息来源,如入库票号从表单中的text2控件中获得: rkph=thisform.text2.value 其它的信息仿照上述格式写,最后将信息加入到入库票号表tabrkph中
insert into database\tabrkph values(rkph,pzs,
ccount,yf,sf,wf,gysname,date1,jsfs,sfjq,manager,jsr)
最后就要完成对库存信息的更新,首先要选择工作区:
select ltabrkdj
接着,对表中的每一条信息和库存信息表中的进行比较,找出相同的药品,在寻找信息的时候,以药品编号作为索引,检查药品编号与仓库名称相同的信息:
go top &&将指针移动到表的顶端
do while !eof() &&用循环的方法来进行查找
select *;
from medicamentmanage!tabkc;
where 药品编号==ltabrkdj.药品编号 AND 仓库名称==ltabrkdj.
仓库名称;
order by tabkc.药品编号; &&索引为药品编号
into cursor lindeping &&将信息存入临时表中
如果库存表中没有相同的药品,则直接将信息存入到库存表中 if reccount()
insert into tabkc values(ltabrkdj.药品编号,ltabrkdj.仓库名称,ltabrkdj.药品名称,ltabrkdj.简称,ltabrkdj.剂型,ltabrkdj.货位,ltabrkdj.产地,ltabrkdj.规格,ltabrkdj.包装,ltabrkdj.单位,ltabrkdj.商标,ltabrkdj.批准文号,ltabrkdj.批号,ltabrkdj.进价, ltabrkdj.数量,ltabrkdj.金额,ltabrkdj.保质期) &&追加新记录
如果找到了一样的药品,则需要将原有的药品信息表更新,使用update 语句来实现。
update tabkc set 药品名称=ltabrkdj.药品名称,库存数量=库存数量+ltabrkdj.数量,单价=ltabrkdj.进价,库存金额=库存数量*单价 where 药品编号=ltabrkdj.药品编号
在执行完操作后需要将临时表清空
use database\ltabrkdj exclusive &&以独占方式打开数据表
zap &&清空数据表
上述三种功能是登记类模块的核心功能,只要实现了这三种功能,登记类模块的其他功能也就容易实现。
4.4.4 结账类模块
顾名思义,结账类模块所要实现的核心功能就是要结账,本系统主要实现日结账与月结账功能。在这类模块中,用到最多的是汇总数据
如语句:sum 金额to xiaoshou 可以实现汇总入库金额
图6. 日结账界面图
对于日结账,我们要实现的功能方法与罗列数据到表单中的方法相似,我们用循环的方法一次加入数据信息:
select ltabrj &&选择临时日结表作为当前工作区
go top
do while !eof() &&以循环方式进行数据追加
insert into tabrj values(ltabrj.操作员,ltabrj.销售,ltabrj.销售退货,ltabrj.入库,ltabrj.入库退货,ltabrj.日期)
skip &&记录指针向下移动一条记录
enddo
在输入完数据后,我们依然要进行清空表的操作
use database\ltabrj exclusive
zap
而对于月结账,在实现上述功能之前还需要对月份进行一次选择
图7. 月结账选择界面
在系统中添加一个名为Yuejie1的表单,其中需要添加一个Combo控件,用于提供结账月份的列表,先要定义月结的开始和结束时间,分别以startdate和enddate 来表示
public startdate,enddate &&定义全部变量
在对时间的定义中,开始时间比较容易把握,所选月份的第一天,但结束时间的把握要复杂一些,分为两种情况:第一种情况为12月以外的月份,则结束时间是在开始时间月份上+1,年份不变:
mm=alltrim(str(val(m)+1))
yy=y
对于12月的结账,则截止时间月份变为1月,年份+1:
if val(m)=12
mm=alltrim('01')
yy=alltrim(str(val(y)+1))
最终时间的确定:
enddate=ctod(mm+'/'+dd+'/'+yy)
为了不重复对月进行结账,在本系统中,如果月结前发现已经对本月进行了结账,则不再进行此操作,要实现此项功能,必须以开始日期作为索引:
select tabyjcsh
set order to 开始日期 &&指定控制索引文件
seek startdate &&快速查询
if found()
messagebox('此月已结帐,不能再进行月结操作!',48,'操作失败!') 如果没有发现开始日期,月结账进入与日结账相似的表单。
4.4.5 可修改类模块
可修改类模块大部分是各类数据信息系统,这类模块机查询,登记,保存,修改等功能于一体。其中查询功能与查询类模块所实现的功能相似,而登记,修改功能与登记类模块所实现的功能相似,这些功能在前面已实现,这里不再重复,现在最重要的是实现修改功能。
其实,在进行添加和保存功能介绍时,对如何实现这类功能已经有了介绍,例如要想在表单的text2 中进行修改,只要系统执行
thisform.commandgroup1.text2.enabled=.t.就可以了,同理如果=.f.就不能实现修改,这种语句可以用在表单中不能修改的控件上。
还有一点要注意,在修改的过程中,表单上的功能件只有保存、取消能够执行,而修改这个按钮在修改执行以后,就不能再执行了,这一点很容易搞错:
thisform.commandgroup1.cmodify.enabled=.f. &&设置修改无效
thisform.commandgroup1.cdel.enabled=.f. &&设置删除无效
thisform.commandgroup1.ccancel.enabled=.t. &&设置取消有效
thisform.commandgroup1.csave.enabled=.t. &&设置保存有效
thisform.commandgroup1.cadd.enabled=.f. &&设置添加无效
由此可以实现修改的功能。
4.5 其它模块设计
在本系统中除了上述几种功能模块外,还一些关于系统管理的模块设计。
4.5.1操作员管理
对于操作员管理系统,主要实现用户的增加,删除,修改以及密码的设置。其中用户的增加,删除,修改与可修改类模块实现的功能相似,对于“密码修改确定”功能可以采用以下方法实现:
首先要将权限表置为当前工作区
use database\tabpurview
然后将操作员姓名作为索引
set order to 操作员姓名
在表中查找当前要修改密码的人员是否为表中所含有的人员
seek cname &&快速查询
set exact on &&字符精确比较
如果所修改的人员不为表中所拥有的,显示错误:
if alltrim(tabpurview.操作员姓名)!=cname
cMessagetext='操作员错误,请重新输入!'
如果人员的名字无误,则原密码进行比较,同样若密码不正确,同样显示修改失败
if alltrim(tabpurview.密码)!=ppassword
cmessagetext='原密码错误,请重新输入!'
上述功能实现与前面所讲的登陆确认功能相似,当身份的到确认的时候,下面的功能就实现了密码的修改确认。
thisform.commandgroup1.adddel.enabled=.t.
thisform.commandgroup1.modify.enabled=.t.
thisform.commandgroup1.cok.enabled=.f.
thisform.text2.enabled=.t.
thisform.text3.enabled=.t.
thisform.text1.enabled=.f.
thisform.combo1.enabled=.f.
thisform.text2.setfocus
这种语句所实现的功能就是修改thisform后面的控件的内容
4.5.2权限管理设计
为了保护本系统的各用户的利益,保证数据的安全性,本系统采用了权限管理。也就是不同的用户拥有不同的权限。各自用户只能进入权限规定的功能模块。
图8. 权限管理界面
本系统的权限管理共分四个等级,分别为1,2,3,4级别,等级1的级别最高,属于系统管理员等级,且只有一个,能使用各种功能系统。等级2不能实现系统管理功能,等级3不能使用基础信息管理与系统管理。这三类等级的人员权限均不可改。等级4的人员权限由系统管理员进行设置,可以设置与等级1一样的权限。
因此有可能出现等级为4的人员,却能实现等级2和3都不能使用的功能模块。
为了系统的安全性,权限等级为1的只能有一个,当再设置权限的时候发现设置成了权限1,则系统自动提示信息,拒绝操作:
case val(alltrim(thisform.text1.value))=1 &&设置权限等级1
thisform.resize &&执行表单的Resize事件
messagebox('级别1为系统管理员,不能有多个,请重新输入!',48,'
权限管理')
thisform.text1.value='' &&拒绝操作
对于设置权限为非1的人,可以用update语句来设置表中的功能模块的是用权限,设置为t 为可以使用,设置为f为不能使用
locate for 操作员姓名=czyname
do case &&条件语句
case crand='2' &&等级为2
update tabpurview set 权限级别=crand,销售管理=.t., 进货管理=.t.,库房管理=.t.,调货管理=.t.,财务管理=.t.,帐目管理=.t.,基础信息管理=.t.,系统管理=.f. where 操作员姓名=czyname
case crand='3' &&等级为3
update tabpurview set 权限级别=crand,销售管理=.t., 进货管理=.t.,库房管理=.t.,调货管理=.t.,财务管理=.t.,帐目管理=.t.,基础信息管理=.f.,系统管理=.f. where 操作员姓名=czyname
case crand='4' &&等级为4
update tabpurview set 权限级别=crand,销售管理=cxsgl, 进货管理=cjhgl,库房管理=ckfgl,调货管理=cthgl,财务管理=ccwgl,帐目管理=czmgl,基础信息管理=cjcinfo,系统管理=csysgl where 操作员姓名=czyname
endcase
为了能够实现权限改动的功能,表单上列出了各种管理模块的复选框,只要在所选功能的前面打上勾,就能实现这项功能,而在选择功能的时候,只有确定和取消按钮有效,由于有8个系统功能,若分别写有效与无效代码太麻烦,可用下列方法简化
在“销售管理”的控件中添加
thisform.command3.enabled=.t. && 取消有效
thisform.command2.enabled=.f. && 权限退出无效
thisform.command1.enabled=.t. && 确定有效
在其他的复选框中添加
thisform.xsgl.interactivechange &&执行xsgl的interactivechange事件 这样就都实现了按钮的功能有效性。
同在查询选择时介绍的方法一样,用下了语句判断是否选择此系统功能: thisform.check1.value=1 表示该功能被选。
4.5.3 数据备份与恢复
为了在意外的情况下,能够对数据进行保护,需要设计数据备份与数据恢复。
图9. 数据备份
进行上述两个功能时,需要关闭所有的数据库文件,可以利用 close
all 语句来实现。在关闭数据库文件后,需要赋值给progressbar控件的值,并且取出原数据库文件所在的路径赋给变量。
thisform.progressbar1.value=thisform.progressbar1.min &&把progressbar控件的属性值赋给progressbar控件的值
source=sys(5)+sys(2003)+"\database\*.*" &&取出原数据库文件所在的路径赋值给变量
obj=alltrim(thisform.text1.value)+"*.*"
在进行备份或恢复功能,方法一样,只是原文件与目标文件相反
copy file "&obj" to "&source" 或者 copy file "&source" to "&obj"
以上就能够实现数据的恢复与备份。
五.存在问题及解决方案
本系统最大的问题在于多台计算机共享一个系统时候的网络连接问题。由于本系统目前只针对单机的使用,因此并没有采用前台与后台的数据连接方式来构造系统。因此要想在现有的系统基础上实现多台计算机使用此系统,只能使用微软公司在Windows操作系统中自带的“远程桌面连接”系统来实现此功能。但这样也会对计算机系统本身的安全性造成一定的影响。所以,网络的连接问题是本系统的一个重要问题。
本系统的另一个问题是系统管理模块的操作员管理,如果是首次使用此系统,会出现一个没有初始用户的问题。此时用户由于没有初始的用户和密码,这无法进入该系统。只有人为的在数据库中添加一个用户,才能开始使用此系统。目前认为解决此问题的方法是在对操作员管理模块编码的时候,事先创造一个系统自带的管理员,级别为0级。在系统创造好并且第一次运行时,将自动出现在该系统中。
六.结 论
本系统针对医药业的产品种类繁多,销售模式特殊,业务量大的特点,利用Microsoft Visual FoxPro 6.0 数据库工具开发出医药物流管理系统。实现了对大规模数据流的控制与管理,为开发其它物流管理系统提供了很好的框架,对使用数据库工具开发各类系统也有了深刻的认识。
七.参考资料
(1)《数据库原理,编程与性能》 Patrick O’Neil,Elizabeth O’Neil 著 周
傲英,俞荣华等译 机械工业出版社出版 2004年3月
(2)《从零开始-Visual FoxPro中文版基础培训教程》 姜继红 著 人民邮电
出版社出版 2003年8 月
(3)《Visual FoxPro 数据库开发实例解析》 王晶莹,王国辉著 机械工业
出版社出版 2003年9月
(4)中国物流网 网址: www.chinact.net.cn/