基于vfp的仓库管理系统设计与实现

目录

内容提要

引言

第一章 管理信息系统概述…………………………………………

第二章 系统设计…………………………………………

2·1  系统目标设计…………………………………………

2·2  开发设计思想………………………………………

2·3  开发和运行环境选择………………………………………

2·4  系统功能分析………………………………………

2·5  系统功能模块设计………………………………………

第三章 数据库设计…………………………………

3·1  数据库需求分析……………………………………

3·2  数据库概念结构设计……………………………………………

3·3  数据库逻辑结构设计………………………………………………

3·4  数据库结构的实现…………………………………………

第四章 系统主要功能模块的创建………………………………………

  4.1 功能选择界面的设计……………………………………

  4.2 设备入库模块的设计……………………………………

  4.3 设备出库模块的设计………………………………………

  4.4 设备还库模块的设计……………………………………

  4.5 设备需求模块的设计……………………………………

  4.6 设备采购模块的设计……………………………………

  4.7 显示报表模块的设计……………………………………

  4.8 开发中的难点和解决技巧………………………………

第五章 系统的编译和发行…………………………………

总结………………………………………………………………  

致谢(参考文献)…………………………………………………

附录………………………………………………………………

内容摘要

《仓库管理系统》是采用VISAUL FOXPRO开发的一个数据库管理系统。本设计说明书主要讲述了VISAUL FOXPRO的基本功能及设计方法。紧接着以本系统为例,逐一介绍开发本系统系统的步骤:系统分析、系统设计、系统实现、系统维护。在系统分析中先后用数据流图、系统的功能结构图分析了系统所需的各种数据。在系统的设计中,详细的展现了系统的各个功能模块。所需的数据库表及表字段。菜单的设计等。在系统的实现中,给出了实现表单中相应的功能控件的事件及代码。以及菜单实现的方法。文章的最后则给出了本系统的主要功能运行界面图。

关键字:仓库管理 仓库  管理系统   VISAUL FOXPRO 面向对象

    

前言

企业的物资供应管理往往是很复杂的,烦琐的。由于所掌握的物资种类众多,订货,管理,发放的渠道各有差异,各个企业之间的管理体制不尽相同,各类统计计划报表繁多,因此物资管理必须实现计算机化,而且必须根据企业的具体情况制定相应的方案。

根据当前的企业管理体制,一般物资供应管理系统,总是根据所掌握的物资类别,相应分成几个科室来进行物资的计划,订货,核销托收,验收入库,根据企业各个部门的需要来发放物资设备,并随时按期进行库存盘点,作台帐,根据企业领导和自身管理的需要按月,季度,年来进行统计分析,产生相应报表。为了加强关键物资,设备的管理,要定期掌握其储备,消耗情况,根据计划定额和实际消耗定额的比较,进行定额的管理,使得资金使用合理,物资设备的储备最佳。

 所以一个完整的企业物资供应管理系统应该包括计划管理,合同托收管理,仓库管理,定额管理,统计管理,财务管理等模块。其中仓库管理是整个物资供应管理系统的核心。

鉴于Visual Foxpro6.0有强大的数据库管理功能,我们选用Visual Foxpro6.0来完成这个仓库管理系统。

第1章  管理信息系统基础

管理信息系统就是我们常说的MIS(Management Information System),在强调管理,强调信息的现代社会中它越来越得到普及。MIS是一门新的学科,它跨越了若干个领域,比如管理科学、系统科学,运筹学、统计学以及计算机科学。在这些学科的基础上,形成信息收集和加工的方法,从而形成一个纵横交织的系统。

1.1  管理信息系统概述

20世纪,随着全球经济的蓬勃发展,众多经济学家纷纷提出了新的管理理论。20世纪50年代,西蒙提出管理依赖于信息和决策的思想。同时期的维纳发表了控制论,他认为管理是一个控制过程。1958年,盖尔写到:“管理将以较低的成本得到及时准确的信息,做到较好的控制。”这个时期,计算机开始用于会计工作,出现数据处理一词。

1970年,Walter T.Kennevan给刚刚出现的管理信息系统一词下了一个定义:“以口头或书面的形式,在合适的时间向经理、职员以及外界人员提供过去的、现在的、预测未来的有关企业内部及其环境的信息,以帮助他们进行决策。”在这个定义里强调了用信息支持决策,但并没有强调应用模型,没有提到计算机的应用。

1985年,管理信息系统的创始人,明尼苏达大学的管理学教授Gordon B.Davis给了管理信息系统一个较完整的定义,即“管理信息系统是一个利用计算机软硬件资源,手工作业,分析、计划、控制和决策模型以及数据库的人-机系统。它能提供信息支持企业或组织的运行、管理和决策功能。”这个定义全面地说明了管理信息系统的目标、功能和组成,而且反映了管理信息系统在当时达到的水平。

1.2  管理信息系统的特点

1.2.1  管理信息系统的组成

管理信息系统在企业中的应用存在三个要素,这就是人、计算机和数据。

人是指企业领导者、管理人员、技术人员,以及MIS建设的领导机构和实施机构,他们在系统中起主导作用。MIS是一项系统工程,不是只靠一些计算机开发人员就可以完成的,必须有企业管理人员,尤其是企业领导的积极参与。

计算机技术是MIS得以实施的主要技术。在这些技术中,软件开发是MIS开发的重点。

第三个因素也不能忽视。企业的管理数据是MIS正常运行的基础。广义地说,各项管理制度是MIS建设成功的基础。试想要计算一台机床的生产成本,需要按时输入每个部件、每个零件甚至每个螺钉螺帽的费用,涉及企业的生产车间、采购、库房、工艺设计和财务等多个部门,必须有一整套管理制度做保证。

1.2.2  管理信息系统的界面特点

在计算机软件技术中,人机界面已经发展成为一个重要的分支。

MIS人机界面设计一般遵循以下一些基本原则:

1.  以通信功能作为界面设计的核心

人机界面设计的关键是使人与计算机之间能够准确地交流信息。一方面,人向计算机输入信息时应当尽量采取自然的方式;另一方面,计算机向人传递的信息必须准确,不致引起误解或混乱。另外,不要把内部的处理、加工与人机界面混在一起,以免互相干扰,影响速度。

设计MIS时,针对每一个功能,都要按照“I-P-O”的模块化思想,使输入、处理与输出“泾渭分明”,充分体现人机界面的通信功能。这样设计出来的程序不易出错,而且易于维护。

报表打印是MIS必备的功能之一,而且打印之前常常需要计算。计算与打印分开设计,虽然消耗时间,但易于整个MIS系统的维护。

2.  界面必须始终一致

统一的人机界面不致于会增加用户的负担,让用户始终用同一种方式思考与操作。最忌讳的是每换一个屏幕用户就要换一套操作命令与操作方法。

例如在整个系统可以以问号图标表示帮助,以磁盘图标表示存盘,以打印机图标表示打印等。

3.  界面必须使用户随时掌握任务的进展情况

人机界面应该能够告诉用户软件运行的进度。特别是在需要较长时间的等待时,必须让用户了解工作进展情况,如可以设计已经完成了百分之几的任务进度条等。目前,Windows下的应用软件无论大小,其安装程序几乎均做到了这一点。开发MIS软件时,这一点很值得借鉴。

4.  界面必须能够提供帮助

一个优秀的MIS软件应该提供在线求助功能,甚至提供使用向导,这将给用户带来极大的方便。在多媒体环境下,以语音提示作为操作向导,不会干扰屏幕信息,是一个极佳的选择。

5.  界面友好、使用方便

多数MIS软件的数据输入量较大。对于一些相对固定的数据,不应让用户频频输入(特别是汉字),而应让用户用鼠标轻松选择。例如,人事管理系统中的“文化程度”是相对固定的数据,其值一般取“小学”、“初中”、“高中”、“大专”、“大本”、“硕研”、“博研”等。录入这类数据之前,MIS软件应在相应位置弹出一个列表框,待用户以鼠标点击,而不应让用户每次都输入这些汉字。

另外,开发者应编写一个错误实时记录程序,自动记录何日、何时、何程序出了何种错误。

总之,所开发的MIS在使用过程中,应使用户的数据输入量降至最低限度,同时也要减少用户的干预量。实践证明,用户干预愈少,MIS系统的满意程度愈高。

6.  输入画面尽可能接近实际

如果某个电算会计软件的凭证录入画面是表格式的,一屏可录入多条记录,而且与实际凭证一模一样,甚至连颜色都无异,用户在终端上录入凭证,仿佛用笔在纸上填写凭证,以增加人机亲和力。

7.  具有较强的容错功能

误操作、按键连击等均有可能导致数据误录。巧妙地进行程序设计,可以避免此类因素造成的错误。例如,录入学生成绩时,我们可以对其范围进行限定,使用户无法输入0~100以外的数据;录入学生年龄时,不妨根据实际情况将范围限制在15~20之间。

1.3  管理信息系统的开发

管理信息系统开发方法主要有:结构化生命周期开发方法、原型法、面向对象的开发方法等。

1.  结构化生命周期开发方法

目前较为流行的MIS开发方法是结构化生命周期开发方法,其基本思想是:用系统的思想和系统工程的方法,按用户至上的原则,结构化、模块化地自上而下对生命周期进行分析与设计。

用结构化生命周期开发方法开发一个系统,将整个开发过程划分为5个依次连接的阶段:

  1. 系统规划阶段:主要任务是明确系统开发的请求,并进行初步的调查,通过可行性研究确定下一阶段的实施。系统规划方法有战略目标集转化法(SST,Strategy Set Transformation)、关键成功因素法(CSF,Critical Success Factors)和企业规划法(BSP,Business System Planning)。
  2. 系统分析阶段:主要任务是对组织结构与功能进行分析,理清企业业务流程和数据流程的处理,并且将企业业务流程与数据流程抽象化,通过对功能数据的分析,提出新系统的逻辑方案。
  3. 系统设计阶段:主要任务是确定系统的总体设计方案、划分子系统功能、确定共享数据的组织,然后进行详细设计,如处理模块的设计、数据库系统的设计、输入输出界面的设计和编码的设计等。
  4. 系统实施阶段:主要任务是讨论确定设计方案、对系统模块进行调试、进行系统运行所需数据的准备、对相关人员进行培训等。
  5. 系统运行阶段:主要任务是进行系统的日常运行管理,评价系统的运行效率,对运行费用和效果进行监理审计,如出现问题则对系统进行修改、调整。

这五个阶段共同构成了系统开发的生命周期。结构化生命周期开发方法严格区分了开发阶段,非常重视文档工作,对于开发过程中出现的问题可以得到及时的纠正,避免了出现混乱状态。但是,该方法不可避免地出现开发周期过长、系统预算超支的情况,而且在开发过程中用户的需求一旦发生变化,系统将很难作出调整。

2.  原型法

原型法在系统开发过程中也得到不少应用。原型法的基本思想是系统开发人员凭借自己对用户需求的理解,通过强有力的软件环境支持,构造出一个实在的系统原型,然后与用户协商,反复修改原型直至用户满意。 原型法的应用使人们对需求有了渐进的认识,从而使系统开发更有针对性。另外,原型法的应用充分利用了最新的软件工具,使系统开发效率大为提高。

3.  面向对象系统开发方法

面向对象(OO,Object Oriented)的系统开发方法,是近年来受到关注的一种系统开发方法。面向对象的系统开发方法的基本思想是将客观世界抽象地看成是若干相互联系的对象,然后根据对象和方法的特性研制出一套软件工具,使之能够映射为计算机软件系统结构模型和进程,从而实现信息系统的开发。

1.3.3  管理信息系统的开发过程

管理信息系统的开发过程一般包括系统开发准备、系统调查、系统分析、系统设计、系统实现、系统转换、系统运行与维护、系统评价等步骤。根据开发系统的大小、复杂、投入、方式、方法等因素的不同,各步骤的要求和内容也不同,用户需要根据实际情况进行取舍和计划。

1.  系统开发准备

系统开发准备工作主要包括提出系统开发要求、成立系统开发小组、制订系统开发计划等工作。

2.  系统调查

新系统的系统分析与系统设计工作都要建立在对现行系统调查的基础上,即必须调查现行系统的运行情况、问题等,明确用户的需求,特别是合作开发和委托开发方式。

调查的主要内容有:

(1)现行系统概况:该组织的发展历史、目前组织的规模、工作状况、管理水平、与外界的主要联系等。调查该项内容的目的主要是为了划分系统界限、系统与外界的输入输出接口等。

(2)组织机构:画出组织的组织结构图,弄清组织的行政关系、人员编制、工作范围、地理位置等,发现不合理问题及新系统启动后可能对现有组织的影响。

(3)业务流程:按照业务种类的不同和处理时间的先后不同,深入了解现行系统的业务流程,画出现行系统业务流程图,并与业务人员反复讨论,得到认可。调查中要注意定性与定量相结合,注意人、财、物、信息的流向、规格、频率、要求以及需要解决的问题等。

(4)报表、数据处理:了解各种统计报表、数据的格式、内容、处理时间及上报时间、频率、规律,存在的问题,对新系统的要求、希望等并收集各种报表。

(5)问题:现行系统中存在的主要问题和薄弱环节,可以按照严重程度分成不同的等级。新系统的建立应能解决大部分问题,并改善薄弱环节。

(6)新系统的功能和目标:了解各级领导和各类业务工作人员对新系统功能的要求,为进一步完善新系统的目标做准备。

(7)其他:如对新系统的各种约束条件,需要说明的其他问题等。

3.  系统分析

系统分析(又称逻辑设计)是管理信息系统开发的关键环节,要求在系统调查的基础上,对新系统的功能进行细致的分析,并建立一个新系统的逻辑模型。

新系统的逻辑模型由系统数据流程图、概况表、数据字典、吃理逻辑表达式及有关说明组成。最后要完成系统分析报告(也称为系统逻辑设计说明书)。系统逻辑模型就像在根据需要建设一座学校前,按照学校教育的层次(初等、中等、高等)、规模、投资、地理环境、技术水平等条件的要求和约束,先由建筑设计院进行设计,保证学校建成后的各种功能得以实现,之后才能进行工程设计和施工一样。在系统设计阶段要做认真、细致的分析、研究工作,避免新系统在功能上存在先天不足或缺陷。

因为新系统模型是建立在对现行系统的分析及要求的基础上的,所以系统调查工作要进行得深入、细致、全面。用户可以对新系统的逻辑模型提出意见,双方经过讨论、修改,最后达成共识,并完成系统分析报告(系统逻辑设计说明书),经有关领导审批通过之后,转入系统设计(又称系统物理设计)阶段。

4.  系统设计

系统设计又称系统物理设计。系统设计要根据系统分析报告中的系统逻辑模型综合考虑各种约束,利用一切可用的技术手段和方法进行各种具体设计,确定新系统的实施方案,解决“系统怎么做”的问题。

结构化系统设计是指利用一组标准的图表工具和准则,确定系统有哪些模块,用什么方法连接,如何构成良好的系统结构,并进行系统输入、输出、数据处理、数据存储等环节的详细设计。这一阶段的重点是设计好系统的总体结构,选择最经济合理的技术手段。系统设计阶段的文件是系统设计报告(又称系统物理设计说明书)。

管理信息系统的开发是一项系统工程,为了保证系统的质量,设计人员必须遵守共同的设计原则,尽可能地提高系统的各项指标(系统可变性、可靠性、工作质量、工作效率、经济性等)。

5.  系统实施与转换

系统实施阶段的主要工作包括:系统硬件的购置与安装、程序的编写(购买)与调试、系统操作人员的培训、系统有关数据的准备和录入、系统调试和转换。

在系统实施阶段要成立系统实施工作量到小组,组织各专业小组组长和有关部门的领导共同编制新系统实施计划。可以应用各种项目管理的软件和方法进行管理,实行项目经理负责制,保证系统实施工作的顺利进行和成功。

硬件的购置和安装包括计算机硬件、外设、网络、电源、机房、环境等有关设备的购买、验收、安装与调试工作等,这些工作主要由专业技术人员完成。

数据准备与录入工作主要是指由手工操作转入计算机处理所需的各种数据的整理、录入及计算机系统中为新系统所用数据的转换工作。数据准备与录入工作要注意数据的准确性,在整理、录入、校验等各个环节把好关,为系统的顺利转换打好基础。

在进行以上各个环节的同时展开人员培训工作,包括管理信息系统只是的普及教育、新制度的学习、计算机操作训练等。使所有人员了解新系统的基本功能、新系统对使用人员的要求、建立管理信息系统的目的、管理信息系统的建立可以为组织和个人带来的帮助和便利、个人在新系统中应该承担的工作等,是用户关心、支持新系统的实现。

6.  系统维护和评价

管理信息系统是一个复杂的人机系统。系统外部环境与内部因素的变化,不断影响系统的运行,这时就需要不断地完善系统,以提高系统运行的效率与服务水平,这就需要从始至终地进行系统的维护工作。

系统评价主要是指系统建成后,经一段时间的运行后,要对系统目标与功能的实现情况进行检查,并与系统开发中设立的系统预期目标进行对比,及时写出系统评价报告。

系统维护与评价阶段是系统生命周期中的最后一个阶段,也是时间最长的一个重要阶段,就像汽车的维护工作好可以延长汽车的使用寿命和提高其使用效率一样,系统维护工作的好坏可以决定系统的生命周期的长短和使用效果。

  •  系统设计
    1. 1 系统目标设计

系统开发的总体任务是实现企业物资设备管理的系统化,规范化和自动化,从而达到提高企业物资管理的效率的目的。

2.2 开发设计思想

仓库管理的物资在本文中主要假定都是企业生产所需要的各种设备。进货时经检查合同确认认为有效托收以后,进行验货入库,填写入库单,进行入库登记。企业各个部分根据所需要的物资设备总额和部门生产活动需要提出物资需求申请。计划员根据整个企业的需求开出物资设备出库单,仓库管理员根据出库单核对发放设备。设备使用完毕需要及时归还入库,填写入库单。根据需要按照月,季,年进行统计分析,产生相应报表。

   仓库管理的特点是信息处理量比较大。所管理的物资设备种类繁多,而且由于入库单,出库单,需求单等单据发生量特别大,关联信息多,查询和统计的方式各不相同。因此在管理上实现起来有一定的困难。在管理的过程中经常会出现信息的重复传递,单据,报表种类繁多,各个部门管理规格不统一等问题。

在本系统的设计过程中,为了克服以上困难,满足计算机管理的需要,我们采取了下面的一些原则。

●统一各种原始的单据的格式,统一帐目和报表的格式。

●删除不必要的管理冗余,实现管理规范化、科学化。

●程序代码标准化,软件统一化,确认软件的可维护行和实用性。

●界面尽量简单化,做到实用、方便,尽量满足企业中不同层次员工的需要。

●建立操作日志,系统自动记录所进行的各种操作。

2.3 系统功能分析

本人中的仓库管理系统需要完成功能主要有一下几点。

●仓库管理各种信息的输入,包括入库、出库、还库、需求信息的输入等。

●仓库管理各种信息的查询、修改和维护。

●设备采购报表的生成。

●在库存管理中加入最高储备和最低储备字段,对仓库中的物资设备实现监控和报警。

●企业各个部门的物资需求的管理。

●操作日志的管理。

    • 仓库管理的使用帮助。

2.4 系统功能模块设计

在系统功能分析的基础上,考虑vfp程序编制的特点,得到如图所示的系统功能模块图:

                                   仓库管理系统

          系          输          维           查           报          帮

统          入          护           看           表          助

模          模          模           模           模          模

块          块          块           块           块          块

打         日           入         出        还        需

印         志           库         库        库        求

设         管           模         模        模        模

置         理           块         块        块        块

第三章 数据库设计

3.1 数据库需求分析

在仔细调查企业仓库物资设备管理过程的基础上,得到本系统所处理的时间流程如图所示:

        仓库现有库存              各部门需求               企业总体生产计划

汇总 处理

设备 采购                                                设备 出库

设备 入库                                                设备 还库

                            数据流程图

在本设计中,通过对企业仓库管理的内容和数据流程分析,设计的数据项和数据结构如下:

    • 设备代码信息。包括的数据项有设备号、设备名称。
    • 现有库存信息。包括的数据项有现有设备、现有数目、总数目、最大库存、最小库存等。
    • 设备使用信息。包括的数据项有使用的设备、使用部门、数目、使用时间、出库时状态。
    • 设备采购信息。包括的数据项有采购的设备、采购员、供应商、采购数目、采购时间等。
    • 设备归还信息。包括的数据项有归还设备、归还部门、归还数目、归还时间、经手人等。
    • 设备需求信息。包括的数据项有需求的部门、需求设备、需求数目、需求时间等。

有了上面的数据结构、数据项和数据流程,就能进行下面的数据库设计。

3.2 数据库概念结构设计

这一设计阶段是在需求分析的基础上,设计出能够满足用户需求的各种实体,以及它们之间的关系,为后面的逻辑结构设计打下基础。

本设计根据上面的设计规划出的实体有库存实体、入库实体、出库实体、采购实体、还库实体、需求实体。各个实体的E-R图及其关系描述如下:

1)库存实体E-R图:

                             现有库存

设备号           现有库存            警戒库存              总数

2)入库实体E-R图:

                               

                                   入库

设备号          供应商信息           采购价格信息           采购员

3)出库实体E-R图:

                             出库

设备号             使用部门            数量 时间              经手人

4)部门需求实体E-R图:

                               部门需求

  设备号               需求部门          需求数量             需求时间

5)还库实体E-R图:

                             设备还库

  设备号             还库时间 人           还库数量            经手人

6)计划采购实体E-R图:

                              计划采购

设备号               库存信息           供应信息              时间

7)实体和实体之间的关系E-R图如图所示:

   入库                    现有库存                      出库

    还库                   部门需求                     设备采购

3.3 数据库逻辑结构设计

在上面的实体以及实体之间的关系的基础上,形成数据库中的表格以及各个表格之间的关系。

仓库管理系统数据库中的各个表格的设计结果如下面的几个表格所示。每个表格表示在数据库中的一个表。

(1)设备代码表:

列名

数据类型

可否为空

设备号(主键)

数值型(20)

不能为空

设备名称

字符型(50)

可为空

(2)设备入库表:

列名

数据类型

可否为空

设备号

数值型(20)

不能为空

入库时间(主键)

日期型(8)

可为空

供应商

字符型(50)

可为空

供应商电话

字符型(15)

可为空

入库数量

数值型(20)

可为空

价格

字符型(10)

可为空

采购员

字符型(20)

可为空

(3)设备出库表:

列名

数据类型

可否为空

设备号

数值型(20)

不能为空

出库时间(主键)

日期型(8)

可为空

使用部门

字符型(50)

可为空

出库状况

数值型(20)

可为空

经手人

字符型(20)

可为空

出库数量

数值型(10)

不能为空

领取人

字符型(50)

可为空

用途

字符型(50)

可为空

(4)现有库存表:

列名

数据类型

可否为空

设备号(主键)

数值型(20)

不能为空

现有库存

数值型(20)

可为空

最大库存

数值型(20)

可为空

最小库存

数值型(20)

可为空

总数

数值型(20)

可为空

(5)部门需求表:

列名

数据类型

可否为空

设备号(主键)

数值型(20)

不能为空

部门名称

字符型(20)

不能为空

需要数量

数值型(20)

可为空

需求开始时间

日期型(8)

可为空

需求结束时间

日期型(8)

可为空

(6)设备还库表:

列名

数据类型

可否为空

设备号(主键)

数值型(20)

不能为空

还库时间

日期型(8)

不能为空

仓库管理员

数值型(20)

可为空

归还数量

数值型(20)

可为空

归还人

字符型(10)

可为空

(7)操作日志表:

列名

数据类型

可否为空

操作员

字符型(50)

不能为空

操作内容

字符型(50)

不能为空

操作时间

日期型(8)

可为空

(8)设备采购计划表:

列名

数据类型

可否为空

设备号

数值型(20)

不能为空

现有库存

数值型(20)

可为空

总库存

数值型(20)

可为空

最大库存

数值型(20)

可为空

购买数量

数值型(20)

可为空

供应商

字符型(20)

不能为空

价格

字符型(10)

可为空

计划采购时间(主键)

日期型(8)

可为空

    1. 4 数据库结构的实现

在需求分析、概念结构设计的基础上得到数据库的逻辑结构设计之后,我们就可以在Visual FoxPro6.0数据库系统中实现该逻辑结构。

打开如图所示的“仓库管理”项目后,在项目管理器中展开数据文本夹,用鼠标选中数据库,单击右侧的“新建”按钮,在弹出的对话框中将该数据库文件存储为c:\仓库管理\仓库管理.dbc。

在弹出的如图所示的数据库设计器中单击鼠标右键,选择“新建表”,为数据库添加数据表(表的内容见上节)。下面以表设备代码表为例来介绍表的建立过程。

选择“新建表”,在弹出的对话框中将表存储为c:\仓库管理\设备代码.dbf 。在弹出的如图所示的表设计器中填写表的内容。

字段设置完成后,单击“确定”按钮后为表输入数据,如不想现在输入,可以先“取消”,以后再输入。具体方法如下:

  1. 如图所示,选中要输入数据的表,单击“浏览”按钮。
  2. 此时弹出无数据的表,在Visual FoxPro6.0的主窗口中选择“表”,选择“追加新记录”后,就 可以在表中输入数据了。如图所示。不过这种方法只能一次输入一条记录,如果要输入第二条记录时,需再次选择追加新记录。如果有一个已有的数据表,就可以使用“使用追加记录”将这个有数据的表追加到当前表中,不过执行该操作要求这二个表的结构完全相同。

第四章 系统主要功能模块的创建

  按照前面的分析,我们将管理系统的逻辑模块统一到6个实际功能模块中,如图所示。切换面板用于切换不同的操作,每项具体操作结束后,都会返回到切换面板。

                

                                切换面板

          设       设         设        设         设        显

备       备         备        备         备        示

入       出         还        需         采        报

库       库         库        求         购        表

下面对各模块的作用进行说明:

  1. 设备入库模块:添加设备到库存中。
  2. 设备出库模块:将设备从库存取出并记录。
  3. 设备还库模块:将归并到库存的设备保存到数据库。
  4. 设备需求模块:记录各部门的设备需求。
  5. 设备采购模块:记录要采购的设备。
  6. 切换面板:用于切换到不同的操作,如设备入库、设备出库等。
  7. 显示报表:显示库存过多、库存不足等信息。

   下面就按照功能模块图来设计该仓库管理系统。首先在Visual FoxPro6.0中建立一个项目管理器,以便管理本系统中所有的数据,命名为“仓库管理”。一下操作均在该项目管理器中进行。以下所有表单的“desktop”属性全部设为“.T.-真”。

4.1功能选择界面的设计:

这一模块的主要功能是作为系统主界面为进入本系统不同功能界面选择提供一个接口,使用一个窗口来实现这一功能。

首先建立一个表单,设取“caption”属性为“仓库管理”。在该表单上添加6个“按钮”控件,它们的“caption”属性分别为“设备入库”,“设备出库”,“设备还库”,“部门需求”,“设备采购”,“显示报表”。然后在表单上添加“图象控件”,并设其“stretch”属性为“2-strech(扩展)”,“pictrue”属性为图片所在的位置,本例中为“c:\仓库管理\001.jpg”。

在“comm.and1”(“caption”属性为“设备入库”)控件的“click”事件中添加如下代码:

do form 设备入库表

thisform.release

 在“comm.and2”(“caption”属性为“设备出库”)控件的“click”事件中添加如下代码:

do form 设备出库表

thisform.release

  在“comm.and3”(“caption”属性为“设备还库”)控件的“click”事件中添加如下代码:

do form 设备还库表

thisform.release

  在“comm.and4”(“caption”属性为“部门需求”)控件的“click”事件中添加如下代码:

do form 部门需求表

thisform.release

在“comm.and5”(“caption”属性为“设备采购”)控件的“click”事件中添加如下代码:

do form 设备采购表

thisform.release

在“comm.and6”(“caption”属性为“显示报表”)控件的“click”事件中添加如下代码:

do form 显示报表

thisform.release

在“form1”的属性里选择“autocenter”设置为“.T.-真”,同时将“backcolor”

设置为“255,255,255”,“windowstate”设置为“0-普通”。

添加“form1”的“init”事件的代码如下:

set directory to c:\仓库管理\

*将程序的默认的路径指向资源所在的文件夹

该表单设计结果如图所示:

4.2 设备入库模块的设计

在设备入库模块中将实现设备数据的添加和入库等功能。本模块设计采用先用向导生成表单,然后修改的方法实现。

首先在项目管理器的文档视图下单击“新建”按钮,

       

在接下来的向导中,“数据库和表”选择“仓库管理”以及“设备入库表”,这是前面定义好的数据库和表。

由于设备入库需要显示所有的字段,因此我们将可用字段全部移至选定字段,如图所示,单击“下一步”按钮,

在表单样式中,选择“阴影式”以及“图片按钮”,如图所示。左上角的窗口提供了表单样式的预览功能,图片按钮和文本按钮的区别在于显示的时候是以图片来表达功能还是文字来表达,实现功能的函数没有区别。选择“上一步”按钮可以跳回上一个界面对表单中显示的字段进行修改。

单击“下一步”按钮后,向导进行到“步骤3-排序次序”,如图所示,选择“设备号”为索引,并选择升序排列。最后预览表单,核对每项的设置,完成表单向导,如图所示。

值得注意的是,在结束表单向导前,可选择“保存表单以备将来使用”,“保存并运行表单”,或者“保存表单并用表单设计器修改表单”。由于Visual FoxPro6.0向导生成的表单只具有普遍性,对于当前设计的仓库管理系统还需要一定的改变,因此以我们选择“保存表单并用表设计器修改表单”。

单击“完成”按钮系统提示保存表单,将表单保存为“设备入库表.scx”,存于c:\仓库管理目录下。然后打开表单修改器生成的表单,如图所示。

在修改BUTTONSET时,可以通过属性窗口的下拉列表选定单个按钮,调整其位置和其它属性。如图所示。

 

根据功能需求,把“cmdprint”、“”cmdexit、“cmdDelete”和“cmdedit”的Visible属性都设为“.F.-假”。添加2个命令按钮,Caption属性分别设为“修改库存”和“回主界面”。

在“回主界面”命令按钮的click事件中添加代码如下:

thisform.release

do form 仓库管理

在修改库存命令按钮的click事件中添加代码如下:

select 现有库存表

getid=thisform.设备号1.text1.value

set order to 设备号

seek getid

if found()

  getnum=thisform.入库数量1.text1.value

  update 现有库存表 set 现有库存=(现有库存+getnum) where (设备号=getid)

  

    

else

    insert into 现有库存表 (设备号,现有库存,最大库存,最小库存);

       value (thisform.设备号1.text1.value,thisform.入库数量1.text1.value,1000,10)

   

endif

insert into 操作日志表(操作员,操作内容,操作时间);

values (thisform.采购员1.text1.value,'设备入库',date())

保存后运行表单,界面如图所示:

4.3设备出库模块的设计:

在设备出库模块中将实现设备出库数据的添加和修改库存等功能。该模块的功能和设备入库的功能相似。具体操作可以参考设备入库模块的设计,设计最终的界面如图所示。

在表单的左上角加上了显示当前时间的功能,添加标签label2的caption属性设为“当前时间”;添加label3的caption属性设为空;为当前表单的label3init事件添加如下代码:

this.caption=dtoc(date())

该模块具体实现过程不再一一详细说明。下面列出了表单中所用到控件的属性值。

  1. Form1控件的主要属性:

属性名称

属性值

Caption

设备出库表

Autocenter

.T.-真

BackColor

255.255.255

 (2)ButtonSet1控件的主要属性:

控件名

属性名称

属性值

cmdExit

Visible

.F.-假

cmdDelete

Visible

.F.-假

cmdPrint

Visible

.F.-假

cmdEdit

Visible

.F.-假

Command1

Caption

修改库存

Command2

Caption

回主界面

下面时设备出库表单中“修改库存”命令按钮的click事件的代码:

select 现有库存表

*先在该表单的数据环境中添加现有库存表

getid=thisform.设备号1.text1.value

set order to 设备号

seek getid

*在现有库存表中查找设备号等于getid的纪录

if found()

  getnum=thisform.出库数量1.text1.value

  update 现有库存表;

 set 现有库存=(现有库存-getnum) where (设备号=getid)

   *如果库存表中有该项设备,则更新库存表

   insert into 操作日志表(操作员,操作内容,操作时间);

      values (thisform.领取人1.text1.value,'设备出库',date())

else

    messagebox("出错",1,"错误的设备号")

   

endif

4.4 设备还库模块的设计

在设备还库模块中将实现设备还库数据的添加和修改库存等功能,按照前面介绍的步骤设计设备还库表。

设备还库表所可能用到的控件的属性如表所示:

(1)Form1控件的主要属性:

属性名称

属性值

Caption

设备还库表

Autocenter

.T.-真

BackColor

255.255.255

 (2)ButtonSet1控件的主要属性:

控件名

属性名称

属性值

cmdExit

Visible

.F.-假

cmdDelete

Visible

.F.-假

cmdPrint

Visible

.F.-假

cmdEdit

Visible

.F.-假

Command1

Caption

修改库存

Command2

Caption

回主界面

下面是设备还库表中“修改库存”命令按钮的click事件的代码:

select 现有库存表

*先在该表单的数据环境中添加现有库存表

getid=thisform.设备号1.text1.value

set order to 设备号

seek getid

*在现有库存表中查找设备号等于getid的纪录

if found()

  getnum=thisform.归还数量1.text1.value

  update 现有库存表;

 set 现有库存=(现有库存-getnum) where (设备号=getid)

  insert into 操作日志表(操作员,操作内容,操作时间);

      values (thisform.归还人1.text1.value,'设备还库',date())

  *如果库存表中有该项设备,则更新库存表,同时更新操作日志

else

    messagebox("出错",1,"错误的设备号")

*如果没有该设备号则报告出错信息       

endif

保存后运行表单,可得到如图所示的设备还库表。

4.5 设备需求模块的设计

在设备需求模块中将实现设备需求数据的添加和保存日志等功能。首先通过Visual Foxpro的表单向导生成所需的设备需求表单,选择部门需求表的所有可用字段,然后为保持程序风格的一致,继续采用表单的阴影式和图片按钮的风格。在“步骤3-排序次序”时。选择设备号的升序排列。最后单击“完成”按钮,把表单保存在“c:\仓库管理\”目录下,名为“设备需求.scx”。

通过表单向导生成的表单如图所示,我们可以调节控件的位置,修改表单中控件的属性,最后结果所下图所示:

相关的属性设置如下图所示:

(1)Form1控件的主要属性:

属性名称

属性值

Caption

部门需求表

Autocenter

.T.-真

BackColor

255.255.255

 (2)ButtonSet1控件的主要属性:

控件名

属性名称

属性值

cmdExit

Visible

.F.-假

cmdDelete

Visible

.F.-假

cmdPrint

Visible

.F.-假

cmdEdit

Visible

.F.-假

Command1

Caption

保存日志

Command2

Caption

回主界面

在表单设计器中,双击“保存日志”命令按钮。添加click事件代码如下:

insert into 操作日志表 (操作员,操作内容,操作时间) values (username,'设备需求',date())

双击回主界面命令按钮,添加click事件代码如下:

thisform.release

do form 仓库管理

保存对表单所作的修改。

4.6 设备采购模块的设计

在设备采购模块中将实现设备采购数据的添加和保存日志等功能。

(1)由数据表生成表单

通过Visual Foxpro的表单向导,生成设备采购计划表单。在选择数据库和表时,选择仓库管理数据库和设备采购计划表。在选择字段时,选择所有可用字段,选择阴影式和图片按钮作为设备采购计划表的样式。选择计划采购时间的升序排列作为设备采购计划表的索引。

(2)为窗体修改和添加命令按钮

添加2个命令按钮“保存日志”和“回主界面”。设置表单中控件的属性。下面的表列出了需要修改的控件的名称以及属性值。

(1)Form1控件的主要属性:

属性名称

属性值

Caption

设备采购表

Autocenter

.T.-真

BackColor

255.255.255

 (2)ButtonSet1控件的主要属性:

控件名

属性名称

属性值

cmdExit

Visible

.F.-假

cmdDelete

Visible

.F.-假

cmdPrint

Visible

.F.-假

cmdEdit

Visible

.F.-假

Command1

Caption

保存日志

Command2

Caption

回主界面

(3)为按钮添加click事件代码:

在表单设计器中,双击保存日志命令按钮。添加click事件代码如下:

insert into 操作日志表 (操作员,操作内容,操作时间) values (username,"设备需求",date())

*把设备需求写入操作日志表中

双击回主界面按钮,添加click事件代码如下:

thisform.release

*释放本表单

do form 仓库管理

*运行仓库管理界面

保存对表单所作的修改,表单运行效果如图所示:

4.7 显示报表模块的设计

在该模块中,一共要显示3个报表,分别提供库存不足,库存过多和操作日志等信息。

1. 设计显示报表表单

在项目管理器的文档视图下选择“新建”,然后选择新建表单,如图所示。

  

在如图所示的空白表单中添加一个页框控件,并按照下表设置页框的属性,同时在数据环境里添加现有库存表和操作日志表。

控件名

属性名称

属性值

Form1

Caption

显示报表

Pageframe1

Caption

3

Pageframe1.Page1

Caption

库存不足表

Pageframe1.Page2

Caption

库存过多表

Pageframe1.Page3

Caption

操作日志

分别为每个page添加一个表格grid1,如图所示:

   

库存过多表                    库存不足表

 操作日志表

设置表格控件的属性,如表所示:

grid1控件的主要属性表:

控件名

属性名称

属性值

Pageframe1.Page1.grid1

ReadOnly

.T.-真

Pageframe1.Page1.grid1

RecordSourceType

1-别名

Pageframe1.Page1.grid1

ColumnCount

-1

Pageframe1.Page2.grid1

ReadOnly

.T.-真

Pageframe1.Page2.grid1

RecordSourceType

1-别名

Pageframe1.Page2.grid1

ColumnCount

-1

Pageframe1.Page3.grid1

ReadOnly

.T.-真

Pageframe1.Page3.grid1

RecordSourceType

1-别名

Pageframe1.Page3.grid1

ColumnCount

-1

2. 代码设计

定义Pageframe1.Page1.grid1的init事件

运行“显示报表”表单,界面所图所示:

local Custs1

select 设备号,最大库存,现有库存 from 现有库存表 where (现有库存>最大库存) into cursor Custs1

thisform.页框.库存过多.库存过多表.recordsource="Custs1"

定义Pageframe1.Page2.grid1的init事件

local Custs2

select 设备号,最小库存,现有库存 from 现有库存表 where (现有库存<最小库存) into cursor Custs2

thisform.页框.库存不足.库存不足表.recordsource="Custs2"

定义Pageframe1.Page3.grid1的init事件

local Custs3

select * from 操作日志表  into cursor Custs3

thisform.页框.操作日志.操作日志表1.recordsource="Custs3"

运行“显示报表”表单,界面如图所示。

4.8  开发中的难点和解决技巧

Visual FoxPro6.0中的向导包括表向导、数据库向导、表单向导、查询向导、报表向导、标签向导、邮件合并向导、数据透视表向导、导入向导、文档向导、安装向导、升迁向导、应用程序向导、WEB发表向导等、我们合理应用向导可以在编程中提高效率。

为了快速开发高效的软件,本设计中的多数表单的设计采用利用表单设计向导生成,然后在生成的表单的基础上修改。

数据库软件用来管理数据的优势在于可以迅速从成千上万的数据中找到我们需要的数据,而查询功能的设计也是数据库应用软件设计过程中的重点也是难点。本设计过程中利用表单向导强大的功能,轻松完成了数据的查询功能。而且表单向导生成的查询功能非常强大,完全可以满足数据库应用软件的需要。

第五章 系统的编译和发行

5.1 设置主文件

用主图标标记的文件是用户在启动.app或者.exe时被调用的文件。它可以是一个表单、菜单或者程序,建议使用程序作为主文件。

5.2 构造主文件

如果主文件是一个程序,它将调用应用程序框架中的各个功能组件,然后由这些组件调用应用程序的其余部分。

如果要建立一个简单的主程序,可以按下列步骤进行。

  1. 现设置应用环境界面。
  2. 建立初始用户界面。
  3. 建立事件循环。
  4. 恢复环境,退出应用程序。

例如,可以建立下面的程序作为主程序:

为了避免无限循环,必须在READ EVENTS命令之前安排CLEAR EVENTS命令。可以在主菜单或者主表单中添加一个“退出”项,该项发出CLEAR EVENTS命令。

5.3 在.app和.exe文件中包含和排除文件

   如果在发布的应用程序中不想再更改这些文件,可把它们放在项目中并设置为“包含”。那么这些文件变成只读的,不能修改。如果想修改这些文件,把它们放在项目中并设置为“排除”,然后作为独立文件随着应用程序一起发布。

   在默认情况下,Visual FoxPro6.0在嵌放的过程中排除了数据库、表格、成为.ff的c库文件和.app文件。建议除了一些特定的表格,最好不要包含这类文件。数据库和表格需要变化和添加,而如果编译后包含自.exe或者是.app文件中,由于这二个文件被创建后都是静态的,因此被包含的文件也是静态的和只读的。把数据库和表格包含在这些文件中很明显会带来问题。

  因为这些文件不能被包含在文件.exe或者是.app文件中,所以要在发布一个应用程序之前为这些文件做好准备。

  如要排除可修改的文件,首先在项目管理器中,选择可修改的文件,然后从“项目”菜单中选择“排除”命令。在一个文件被排除后,则在文件的左方加入一个排除符号。

小结

一个完整的仓库管理系统到此就制作完成了。在本例中详细的讲述了从创建数据库到系统设计和各模块的创建、面向对象的表单的设计、基本功能如查询的实现、主程序的编写。

致   谢

在本次毕业设计的过程中,我的导师和学院的老师们给了我很大的指导和帮助。不仅使我在规定的时间内完成了系统的设计,同时还使我学到了很多有益的经验。在此, 我谨向他表示最衷心的感谢。

同时,学校给了我这次毕业设计的机会,使我得到了很好的锻炼,在此,我也向学校的各位老师表示最诚挚的感谢。

主要参考文献

作者.  书名.  出版社.   出版日期

  1. 李加福·Visual FoxPro6.0·北京·清华大学出版社·1999年6月

2.周建成·FoxPro2.5命令与函数专辑·北京·人们邮电出版社·1994年7月

3.梁杰、效英、殷咸青·Foxpro 2.6 for windows使用详解·西安·西安电子科技大学出版社·1995年5月

附录:程序运行界面:

1:主界面:

2:设备入库表:                              3:设备出库表:

  

4:设备还库表:                          5:部门需求表:

  

6:设备采购表:

7:显示报表:

附录2:主要控件的源代码清单:

1:主程序源代码:

SET TALK off

set sysmenu off        

set cent on           

_screen.windowstate=2

_screen.icon="icons\happy.ico"   

_screen.maxbutton=0

_screen.minbutton=1

_screen.closable=.f.

modify window screen noclose

MODIFY WINDOW SCREEN TITLE " 仓库管理信息系统  "

ZOOM WINDOW SCREEN MAX

set default to data

do form 登录表单

read events

clear

close all

return

endif

2:登录表单的确定按钮控件的click源代码:

locate for alltrim(用户名)==alltrim(thisform.combo1.value) and alltrim(密码)==alltrim(thisform.text1.value)

if !eof()

  if alltrim(级别)=="管理员"

     public jb,username

     jb=1

     username=alltrim(thisform.combo1.value)

  else

      public jb,username

     jb=0

     username=alltrim(thisform.combo1.value)

  endif

   do menu.mpr

 thisform.release

   do form 仓库管理

else

#define missmatch_loc "用户或口令错,请重新登录!"

wait window missmatch_loc timeout 1

thisform.combo1.value=''

thisform.text1.value=''

thisform.text1.setfocus

numcount=numcount+1

    if numcount=4     

       numcount=0

     mess =messagebox("三次口令错,将退出程序!",4+16+2,"退出")     

    clear event

    release thisform     

    endif

   endif

3:密码修改表单的修改按钮的click事件源代码:

if empty(thisform.text4.value)

   mess=messagebox("用户名不能为空!",48,"警告")

else

   if  empty(thisform.text1.value)

       mess=messagebox("旧密码不能为空!",48,"警告")    

    else

       if empty(thisform.text2.value)

           mess=messagebox("新密码不能为空!",48,"警告")

       else

          if empty(thisform.text3.value)

              mess=messagebox("重复密码不能为空!",48,"警告")

          else

              if alltrim(thisform.text2.value)<>alltrim(thisform.text3.value) or len(alltrim(thisform.text2.value))<>len(alltrim(thisform.text3.value))

                   mess=messagebox("二次密码不一致!",48,"警告")

               else

                  locate for alltrim(用户名)==alltrim(thisform.text4.value) and alltrim(密码)==alltrim(thisform.text1.value)

                  if eof()

                      mess=messagebox("密码错误,系统将取消你的修改权利!",48,"警告")

                      thisform.release

                   else

                      repl 密码 with alltrim(thisform.text3.value)

                      mess=messagebox("密码修改成功!",48,"信息")

                      thisform.release

                  endif

4:添加操作员表单的最首按钮的click事件源代码:

go top

thisform.grid1.setfocus

thisform.grid1.refresh

5:添加操作员表单的上一个按钮的click事件源代码:

skip-1

if bof()

?? chr(7)

     =messagebox("警告,这已经是第一条记录!",48,"信息窗口")

go top

endif

thisform.grid1.setfocus

thisform.grid1.refresh

6:添加操作员表单的下一个按钮的click事件源代码:

skip

if eof()

?? chr(7)

     =messagebox("警告,这已经是最后一条记录!",48,"信息窗口")

go bottom

endif

thisform.grid1.setfocus

thisform.grid1.refresh

7:添加操作员表单的最末按钮的click事件源代码:

go bottom

thisform.grid1.setfocus

thisform.grid1.refresh

8:添加操作员表单的修改按钮的click事件源代码:

if thisform.command5.caption='修改'

thisform.text1.readonly=.f.

thisform.text2.readonly=.f.

thisform.text3.readonly=.f.

thisform.combo1.readonly=.f.

thisform.command5.caption='保存'

thisform.command1.enabled=.f.

thisform.command2.enabled=.f.

thisform.command3.enabled=.f.

thisform.command4.enabled=.f.

thisform.command6.enabled=.f.

thisform.command7.enabled=.f.

thisform.command8.enabled=.f.

else

thisform.command5.caption='修改'

thisform.text1.readonly=.t.

thisform.text2.readonly=.t.

thisform.text3.readonly=.t.

thisform.combo1.readonly=.t.

thisform.command1.enabled=.t.

thisform.command2.enabled=.t.

thisform.command3.enabled=.t.

thisform.command4.enabled=.t.

thisform.command6.enabled=.t.

thisform.command7.enabled=.t.

thisform.command8.enabled=.t.

endif

thisform.grid1.setfocus

thisform.grid1.refresh

9:添加操作员表单的添加按钮的click事件源代码:

if thisform.command6.caption='添加'

thisform.text1.readonly=.f.

thisform.text2.readonly=.f.

thisform.text3.readonly=.f.

thisform.combo1.readonly=.f.

thisform.command6.caption='保存'

thisform.command1.enabled=.f.

thisform.command2.enabled=.f.

thisform.command3.enabled=.f.

thisform.command4.enabled=.f.

thisform.command5.enabled=.f.

thisform.command7.enabled=.f.

thisform.command8.enabled=.f.

appe blan

else

thisform.command6.caption='添加'

thisform.text1.readonly=.t.

thisform.text2.readonly=.t.

thisform.text3.readonly=.t.

thisform.combo1.readonly=.t.

thisform.command1.enabled=.t.

thisform.command2.enabled=.t.

thisform.command3.enabled=.t.

thisform.command4.enabled=.t.

thisform.command5.enabled=.t.

thisform.command7.enabled=.t.

thisform.command8.enabled=.t.

endif

thisform.grid1.setfocus

thisform.grid1.refresh

10:添加操作员表单的删除按钮的click事件源代码:

cMessageTitle='系统警告'

     cMessageText='确认要删除吗?'

    nDialogType=4+32

    nanswer=messagebox(cMessageText,nDialogType,cMessageTitle)

if nanswer=6

dele

thisform.grid1.setfocus

thisform.grid1.refresh

endif

11:类baseform的picrecord的源代码:

IF TYPE("THIS.APP_MEDIATOR.BaseClass")#"C"

RETURN

ENDIF

IF THIS.APP_MEDIATOR.PickRecordToWorkOn()

IF THIS.APP_MEDIATOR.lAdding AND !EMPTY(ALIAS())

THIS.REFRESH()

* Check if we have blank record already from txtbtns

IF GETFLDSTATE(1) #3

THIS.AddRecord()

ENDIF

ENDIF

ENDIF

12:类baseform的queryunload的源代码:

IF TYPE("THIS.APP_MEDIATOR.BaseClass")#"C"

IF !THIS.ResolveConflicts()

NODEFAULT

RETURN .F.

ENDIF

RETURN

ENDIF

IF DODEFAULT()

    IF NOT THIS.App_Mediator.QueryUnload()

       NODEFAULT

       RETURN .F.

   ENDIF

ELSE

  NODEFAULT

  RETURN .F.

ENDIF

13:类baseform的release的源代码:

IF !THIS.Queryunload()

NODEFAULT

RETURN .F.

ENDIF

14:类baseform的resolveconflicts的源代码:

#DEFINE PROMPTTOSAVE_LOC "Data has been changed. Would you like to save changes?"

IF !THIS.lSaveBufferedData

RETURN

ENDIF

LOCAL nDECursors, aDECursors, cDataEnvRef, lPromptSave,lHadPrompt

LOCAL lcAlias, lnFields, nPromptSave, i, loCurrentControl

* Flush current control

IF TYPE("THIS.ActiveControl.baseclass")="C" AND;

  PEMSTATUS(THIS.ActiveControl,"value",5) AND;

  PEMSTATUS(THIS.ActiveControl,"controlsource",5) AND;

  !EMPTY(THIS.ActiveControl.controlsource)

loCurrentControl = THIS.ActiveControl

* Check if data actually changed

IF !EVAL(loCurrentControl.controlsource)= loCurrentControl.Value

loCurrentControl.Value = loCurrentControl.Value

ENDIF

loCurrentControl=""

ENDIF

nDECursors = 0

cDataEnvRef = ""

DIMENSION aDECursors[1]

DO CASE

CASE TYPE("THISFORM.DataEnvironment") = "O"

nDECursors = AMEMBERS(aDECursors,THISFORM.DataEnvironment,2)

cDataEnvRef = "THISFORM.DataEnvironment"

CASE TYPE("THISFORMSET.DataEnvironment") = "O"

nDECursors = AMEMBERS(aDECursors,THISFORMSET.DataEnvironment,2)

cDataEnvRef = "THISFORMSET.DataEnvironment"

CASE THIS.lUpdateAllBufferedTables

nDECursors=AUSED(aDECursors)

OTHERWISE

IF !EMPTY(ALIAS())

aDECursors[1]=ALIAS()

nDECursors=1

ENDIF

ENDCASE

FOR i = 1 TO m.nDECursors

IF EMPTY(m.cDataEnvRef)

lcAlias = aDECursors[m.i]

ELSE

WITH EVAL(m.cDataEnvRef + "." + aDECursors[m.i])

IF ATC("CURSOR",.BaseClass)=0  &&skip relations

LOOP

ENDIF

lcAlias = .ALIAS

ENDWITH

ENDIF

IF USED(lcAlias) AND CursorGetProp("sourcetype",lcAlias )=3 AND ;

  CursorGetProp("buffering",lcAlias )>1

IF !m.lHadPrompt

IF CursorGetProp("buffering",lcAlias )>3

IF GETNEXTMODIFIED(0,lcAlias )=0

LOOP

ENDIF

ELSE

lnFields = GETFLDSTATE(-1,lcAlias)

IF REPLICATE("1",LEN(lnFields))=TRANS(lnFields)

LOOP

ENDIF

ENDIF

nPromptSave = MESSAGEBOX(PROMPTTOSAVE_LOC,35)

IF nPromptSave=2

RETURN .F.

ENDIF

lPromptSave=(nPromptSave=6)

lHadPrompt = .T.

ENDIF

   IF m.lPromptSave

TableUpdate(.T.,.T.,lcAlias)  && update on exit

   ELSE

TableRevert(.T.,lcAlias)  && update on exit

ENDIF

ENDIF

ENDFOR

15:类baseform的show的源代码:

LPARAMETERS nStyle

LOCAL lcAppRef

IF TYPE("THIS.APP_MEDIATOR.BaseClass")#"C" OR !THIS.lShowFirstTime

RETURN

ENDIF

THIS.lShowFirstTime = .F.

THIS.lSaveBufferedData = .F.

THIS.PickRecord()

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等天晴i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值