还剩36页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
船舶动态信息管理系统技术手册本技术手册专门为用户编写,手册共分为概述、系统分析、系统设计、编码、测试、维护等六节,囊括了系统开发各阶段的所有技术资料,其内容完备、严谨、详实,为了方便用户使用,在编写中加入了大量的通俗易懂的解释性文字手册为用户使用和维护系统以及对系统进行功能扩充和再工程提供了有力指南掌握系统的核心技术一直是用户的心愿,相信用户在读完此手册后,一定会有如愿以偿之感,使您真正拥有系统,成为驾驭整个系统的主人第1节概述
1、统的功能与特点系统的功能一般是在开展系统设计之前,根据用户需要进行需求分析后定义好的在以下的叙述中将给出系统成形后所拥有的功能,和在实基本功能之上的系统特点本系统能够完成对海洋船舶公司的船舶生产运营信息和公司多项工作信息的录入、维护、查询、统计和报表输出等功能系统采用SQLSERVER作为后台数据库,以Windows窗体程序作为客户端操作平台,客户端程序适于安装在配有Windows98以上版本的操作系统的机器上系统充分发挥计算机网络信息传输的技术优势,公司内部相关人员不论在任何地点,只需在其计算机上安装本系统,并能与公司内部网络相连,在通过登录验证后,便可对系统进行相应操作为了保证系统数据的安全性和完整性,系统将数据录入和数据维护分开数据录入界面只完成对数据的录入操作开发者在界面设计上充分为用户考虑,凡是具有重复录入值的数据项,几乎都可以用下拉列表框直接选取,省去了每次都要键盘录入的繁琐,也最大限度地减少了由键盘录入可能引入的错误通过合理地设置界面中各控制件的焦点次序,用户可以键击回车键或Tab键快速地从一控件切换到下一个要操作的控件,并为界面中的每一按钮设置了热键,只需将Ctrl键和相关热键同时按下,即可完成相当于鼠标对该按钮的单击操作采用以上设计风格,可大大减少键盘操作和鼠标操作的交替次数,降低了用户数据录入的工作强度数据维护界面可对数据进行修改和删除操作,在设计风格上与录入界面保持一致除了对已有数据进行维护操作外,数据维护界面也具有数据录入功能拥有数据维护权限的用户在特殊需要时可以用此界面进行数据的批量录入查询界面操作简捷,用户只需根据自己的意图输入查询条件,系统即可显示出查询结果报表输出功能将报表数据统计和数据填写的工作量降为零,用户只需将报表数据生成条件输入,系统将自动完成各类报表数据的分类汇总,并将最终结果以用户所熟悉亲切的形式呈现于电脑屏幕,用户只要再根据预览效果,对页面设置稍作调整就可打印输出报表输出功能除了在特定时间输出报表外,也可以用作日常的数据查询,而且其屏幕输出结果比简单的查询结果更具有条理性通过改变数据的生成条件,可呈现出反映任何时段的相关信息结果系统维护人员可以将一些在数据录入时频繁用到的数据通过系统维护界面一次性输入,为数据录入提供界面数据支持,以减少键盘录入量同时提高数据的正确率系统的用户信息也要由系统维护界面输入,系统的客户端程序依据用户信息进行客户端身份验证,根据用户权限不同为主窗体的各菜单项设置相应状态,由此可减少用户的误操作数据服务器管理员亦能根据用户信息对数据服务器的登录进行设置
2、系统的体系结构在Web技术被广泛应用的今天,B/S(浏览器/服务器)体系结构似乎成为了现代程序的主导体系结构但B/S体系结构还有一些尚未克服的缺点,如安全性差,结构的中间层次多导致的运行效率低下,适用的客户端构件少功能弱以致不能满足用户的多种需要基于对上述情况的考虑,本系统还是采用了传统的C/S(客户机/服务器)本系结构系统在客户端只驻留少量的程序代码,大量的数据和复杂的功能实现放在服务器端随着网络程序安装和组件版本自动更新技术的发展,C/S本系结构的弱点会在一定程度得到弥补
3、于构件的软件工程思想构件技术是在面向对对象技术的基上发展起来的,构件完成了对类的包装,对多个类进行有机的组合,构件在功能上强于类,对软件资源的复用粒度大于类构件定义了完备的外部接口,通过接口可以方便地实施对构件的控制,将多个构件装配起来可以实现复杂的程序功能开发中所使用的每一构件都是事先经过检验的,由构件组装起来的程序,其可靠性大为增强复用粒度的增加使软件的开发周期大大缩短,软件的调试也变得方便
4、新技术的使用
1、.NET框架是用于生成、部署和运行XMLWebservices和应用程序的多语言环境它包含以下三个主要部分公共语言运行库运行库实际上在组件的运行时和开发时操作中都起作用,尽管名称中没有体现这个意思在组件运行时,运行库除了负责满足此组件在其他组件上可能具有的依赖项外,还负责管理内存分配、启动和停止线程和进程,以及强制执行安全策略在开发时,运行库的作用稍有变化;由于做了大量的自动处理工作(如内存管理),运行库使开发人员的操作非常简单,尤其是与今天的COM相比特别是反射等功能显著减少了开发人员为将业务逻辑转变为可重用组件而必须编写的代码量统一编程类框架为开发人员提供了统一的、面向对象的、分层的和可扩展的类库集API目前,C++开发人员使用Microsoft基础类,而Java开发人员使用Windows基础类框架统一了这些完全不同的模型并且为VisualBasic和JScript程序员同样提供了对类库的访问通过创建跨所有编程语言的公共API集,公共语言运行库使得跨语言继承、错误处理和调试成为可能从JScript到C++的所有编程语言具有对框架的相似访问,开发人员可以自由选择它们要使用的语言ASP.NETASP.NET建立在.NET框架的编程类之上,它提供了一个Web应用程序模型,并且包含使生成ASPWeb应用程序变得简单的控件集和结构ASP.NET包含封装公共HTML用户界面元素(如文本框和下拉菜单)的控件集但这些控件在Web服务器上运行,并以HTML的形式将它们的用户界面推送到浏览器在服务器上,这些控件公开一个面向对象的编程模型,为Web开发人员提供了面向对象的编程的丰富性ASP.NET还提供结构服务(如会话状态管理和进程回收),进一步减少了开发人员必须编写的代码量并提高了应用程序的可靠性另外,ASP.NET使用这些同样的概念使开发人员能够以服务的形式交付软件使用XMLWebservices功能,ASP.NET开发人员可以编写自己的业务逻辑并使用ASP.NET结构通过SOAP交付该服务
2、程序集程序集是.NET框架应用程序的生成块;程序集构成了部署、版本控制、重复使用、激活范围控制和安全权限的基本单元程序集是为协同工作而生成的类型和资源的集合,这些类型和资源构成了一个逻辑功能单元程序集为公共语言运行库提供它要用于识别类型实现的信息对于运行库,类型不存在于程序集上下文之外
3、元数据元数据是一种二进制信息,用以对存储在公共语言运行库可移植可执行文件PE文件或存储在内存中的程序进行描述将您的代码编译为PE文件时,便会将元数据插入到该文件的一部分中,而将代码转换为Microsoft中间语言MSIL并将其插入到该文件的另一部分中在模块或程序集中定义和引用的每个类型和成员都将在元数据中进行说明当执行代码时,运行库将元数据加载到内存中,并引用它来发现有关代码的类、成员、继承等信息
4、ADO.NETADO.NET提供对MicrosoftSQLServer等数据源以及通过OLEDB和XML公开的数据源的一致访问数据共享使用者应用程序可以使用ADO.NET来连接到这些数据源,并检索、操作和更新数据ADO.NET有效地从数据操作中将数据访问分解为多个可以单独使用或一前一后使用的不连续组件ADO.NET包含用于连接到数据库、执行命令和检索结果的.NET数据提供程序您可以直接处理检索到的结果,或将其放入ADO.NETDataSet对象,以便与来自多个源的数据或在层之间进行远程处理的数据组合在一起,以特殊方式向用户公开
5、XML可扩展标记语言“可扩展标记语言”XML提供一种描述结构化数据的方法与主要用于控制数据的显示和外观的HTML标记不同,XML标记用于定义数据本身的结构和数据类型XML使用一组标记来描绘数据元素每个元素封装可能十分简单也可能十分复杂的数据您可以定义一组无限制的XML标记例如,您可以定义一些XML标记来声明订单中的数据,如价格、税收、发货地址、帐单地址等等由于XML标记在整个单位中以及跨单位采用,因此来自各种不同数据存储区的数据将更容易交换和操作XML是一种简单、与平台无关并被广泛采用的标准XML相对于HTML的优点是它将用户界面与结构化数据分隔开来这种数据与显示的分离使得集成来自不同源的数据成为可能客户信息、订单、研究结果、帐单付款、病历、目录数据及其他信息都可以转换为XML
6、VisualBasic.NETVisualBasic.NET是下一代的VisualBasic语言,它是一种可简便快捷地创建.NET应用程序(包括XMLWebservices和ASP.NETWeb应用程序)的语言VisualBasic.NET具有许多新功能和改进功能(如继承、接口和重载),这使VisualBasic.NET成为功能强大的面向对象的编程语言其他新的语言功能包括自由线程处理和结构化异常处理VisualBasic.NET还完全集成了.NET框架和公共语言运行库,.NET框架和公共语言运行库共同提供语言互操作性、垃圾回收、增强的安全性和改进的版本支持
5、严格的软件工程规范本次开发严格遵守软件工程中所定义的各项规范,在软件的需求分析阶段采用了系统文本描述,组织结构模型,实体-关系图、数据流图,对软件的功能范围做出了严格的界定;软件的设计阶段采用了UML(统一建模语言)对各个类的关系进行了描述编码时加入大量的注释文字使源程序便于阅读各项工作都有完备的文档记录,对软件的维护提供了详细的技术资料
6、可行性分析可行性分析中包括的内容很多,可以专门作为专门一节进行述叙,但其中相当一部分应由用户完成,所以在此仅就技术上的可行性做一简单的描述从硬件上讲,用户单位已经配有完整的网络体系,网络的传输速率在MB/S以上,客户端对服务器的一次请求的信息传输量一般在
0.1MB以内,物理网络完全可以满系统的通信要求目前普通的服务器的内在存大于500MB,CPU主频在1G以上运行现的各种数据服务器软件是绰绰有余的,硬盘容量大于40GB,估计整个系统年产生的数据量在10MB左右,只是硬盘容量的四千分之一客户端程序经过编译后一般大小在1MB上下,在当前通用的PC上运行上很轻松的从软件上讲,现在流行的数据服务器软件有几种,选其中的一种作为系统的后台数据服务器是没有问题的,开发客户端数据库程序的开发平台很多,技术是都成熟,可以满足各类开发需要经过以上简述可见开发此系统要软硬件两方面都有充分的技术保障第2节系统分析本节将介绍在系统开发的初期如何运用软件工程中通用的分析工具对用户需求和系统结构进行模型化分析的过程
1、系统的描述文本描述文本是运用自然语言对用户单有组织结构、运营方式,信息流通和用户对系统的需求的一种概括性文字描述在描述中不使用专业术语,而是使用生活化的语言文本也是开发者在与用户进行一系列口头交流后,对其内容进行的整理,文本具有稳定性可以使问题变得明确化下面给出描述文本海洋船舶公司的生产运营活动为油田内部、油田外部和自身提供浅海原油生产物资运输,人员接送,抢险救生等多项服务公司要拥有一个船舶信息管理系统,利用该系统可以完成船舶各类信息的输入、查询和报表输出等多项功能公司生产运营以龙品为中心,并在桩西又设有一生产基地运行船舶往返于龙口、桩西、天津等港口和分布于莱洲湾的浅海作业平台待命船舶停靠于龙口、桩西两港口公司在龙口,桩西、长岛设有修理基地,可以进行船舶修理维护公司配有完备的生产调度系统,根据用船单位和公司内部实际之需调度各条船舶为了协助船舶的生产运营,公司设有为其提供服务的多个三级单位,龙口、桩西还设有部分类似的四级单位为了协调公司的整体运转,每日公司及各单位有一名或多名领导值班每条船舶出海,要配有船长、大副、轮机长、大管轮各一名和船员若干一名船长在多次出航中可以负责不同船舶,同一一船舶在多次的出海也可由不同的船长负责,其他人员与此类似船舶出海有明确的工作内容和服务对象任务执行完毕后,船舶负责人应将任务的完成情况,出航的航时、航程、机油消耗、燃油消耗、淡水存量以及在出海中出现的特殊情况报告调度或相应级别的值班领导生产调度部门应有专人负责将船舶的生产信息记录在案船舶的状态可分为公司内部出海、油田内部出海、油田外部出海、龙口停靠、桩西停靠、龙口修理、桩西修理和长岛修理等七种状态船舶的一种状态的持续的时以天计算船舶在一天中只要出海一次且无论时间长短,该船的当天状态即为出海船舶只有在全天中处于停靠或修理状态方算作停靠或修理状态对于船舶在状态信息也要详细记录在案每天下公司及各单位应按其职能将领导值班情况、前线工作概况、船舶出海信息、船舶状态信息送交系统数据录入人员进行录入公司及其各级子单位会召开各类会议,为了对各次会议做到有案可查,对每次会议的时间、地点、参加人员、会议内容要指定专门人员将其录入系统公司的历次抢险救生情况亦需录入系统数据录入人员应将各生产地点的气象预报在适宜的时间输入系统公司的各级负责人可以利用系统对上述信息所感兴趣的部分进行查询信息的直接发生者也可通过信息查询,以核实各项数据对自身情况反映的真实程度,若发现数据中有错误存在可以向数据的维护人员提出更正要求数据的维护人员应由熟悉公司各项生产活动的人员担当,定期对数据检查,当发现与实际情存在明显偏差的数据时,要与录入人员共同核实数据,以期及时消除错误报表负责人员应在公司每天晨会之前,将生产地点晨报和前线生产日报打印足够份数,以备晨会与会者使用生产地点晨报应包含各生产地点和船舶将要驶向港口的天气预报,前一日出海船舶名称(按用船单位将其分开),停靠、修理船舶(按地点将其分开),以及各单位领导值班情况前线生产日报应包括前一日各条出海船舶的具体情况、前一日的气象情况、前线生产的总体情况和急需办理事务以上信息为晨会制定公司当日工作计划提供依据会后应将今日工作计划录入系统,以形成完整的晨报内容在每月月底相关负责人员要对公司各条船舶自上月二十一日到本月二十日的运营和物资消耗情况做出统计汇总,形成反映统计结果的三张报表月度船舶每日状态报表(反映船舶当月的每天状态)、月度船舶状态总体报表(反映每条船舶当月所处各状态的总天数)、月度船舶物耗报表(反映船舶当月各类物资的总消耗量)
2、船舶生产运营组织框图
3、该表示法是将公司内部与生产运营有关人员、各单位之间的组织管理关系,信息交互关系用框图的形式表示出来
4、实体关系力图(E——R图)在E-R图中,用内带文字的方框表示实体,实体是系统中被关注的对象实体之间的连线表示它们所具有的关系,标准的E-R图连线中间有一菱形并在其中注明关系,为简明此图中将其省略
四、数据流图在上面的工作中已经把系统中各实体和实体之间的关系描述出来了,那么数据在实体之间传递过程如何,将对数据做怎样的加工,数据的存放形式又是什么样的,诸如此类的问题要用到数据流图进行分析在图中用内加文字的方框表示数据的源点和终点;用椭圆并在里面添一条横线表示一个数据加工,横线上方注有此加工的编号,下方有文字注明加工名称;两条横线在其间加入文字表示一个数据文件;带有箭头的线段表示一个数据流及其流向,数据流将上述几种图标连接起来,在线段旁边加有文字以标明数据流名称在每幅数据流图的左上部有一方框内有文字注明图号,图号从零编起零号图是对整个系统的一种高度的概括,将系统抽象为一个加工,有一个数据源点和一个数据终点然后以从上到下,由粗到细的原则,将一个加工逐层分解细化,0号加可以分解为
1、
2、3号加工,1号加加工进一步分解为
1.
1、
1.
2、
1.3号加工,其余的依此类推,最终将整个系统用多幅层次和细化程度不同的数据流图表示出来
5、数据字典数据字典是在数据流图的基础上,以字典排序的形式对在数据流图中出现的各个元素(术语称之为条目)进行更为详细的注解、分析数据字典包括数据元素、数据流、数据文件、数据源点和终点、数据加工等五种条目本字典主要记述数据流、数据加工、数据文件三类条目,每个条目以其名称开始,然后在两条线段之间写明条目各子项及其注解
(一)、数据流
1、公司工作信息数据流名称公司工作信息数据流来源公司各生产经营活动数据流去向以各种记录的式形送交数据录入人员数据流载体书面笔记组成工作安排+会议记录+领导值班+前线工况流量特征一般在各活动完成之后有文字记录送交录入人员形成流量,流量大小与各式各活动的总和有关
2、气象信息数据流名称气象信息数据流来源天气预报数据流去向以文字形式送数据录入人员数据流载体书面笔记组成日期+生产地点+天气情况+龙口潮汐流量特征天气预报得到后,送交录入员时形成流量,天气预报的形式比较固定,流量稳定
3、船舶信息数据流名称船舶信息数据流来源公司船舶生产运营数据流去向送交录入人员数据流载体书面笔记组成船舶任务+船舶状态+船舶物耗流量特征在船舶运营计划、船舶状态、船舶物耗量名确后形成流量
4、规范后的录入流数据流名称规范后的录入流数据流来源录入员数据流去向数据录入接收窗体数据流载体键盘输入组成工作信息+气象信息+船舶信息流量特征录入员在接到各类记录单后形成流量,流量与各信息量有关
5、查询条件数据流名称查询条件数据流来源用户的查询意力图数据流去向查询条件的接收窗口数据流载体键盘输入组成多个表字段值流量特征流量的发生与大小和用户的查询习惯有关
6、查询结果数据流名称查询结果数据流来源数据存储器数据流去向查询结果显示窗口数据流载体数据存储器通向客户机的组成其组成依用户的查询条件而定流量特征在用户发出查询请求后产生流量,流量大小依返回查询结果而定
7、维护请求数据流名称维护请求数据流来源数据的维护需求数据流去向数据维护窗体数据流载体键盘录入组成维护类别+更正内容流量特征当进行数据维护时产生流量,其流量大小与错误发生的频率在关
8、报表条件信息数据流名称报表条件信息数据流来源报表操作者数据流去向报表条件接收窗体数据流载体键盘录入组成报表类型+报表条件+制表人姓名+制表日期+审核人姓名流量特征在需要输出报表时产生流量,流量大小与报表类型,条件复杂度,访问频率有关
9、报表数据数据流名称报表数据数据流来源报表数据处理子系统数据流去向报表显示子系统数据流载体客户机内部传输线路组成报表所需的最终数据流量特征当报表数据处理完成时产生流量,流量大小与报表结果数据有关
10、系统维护维护请求数据流名称系统维护维护请求数据流来源系统维护员数据流去向系统数据维护窗体数据流载体键盘录入组成维护请求内容流量特征流量的产生与大小跟界面支持数据的变更频率有关
11、用户信息数据流名称用户信息数据流来源登录系统的用户数据流去向用户信息接收窗体数据流载体键盘录入组成数据服务器名称+用户名+口令流量特征在用户登录时有流量,流量大小与单位时间登录的用户数有关
12、许可信息数据流名称许可信息数据流来源键盘录入数据流去向功能激活模块数据流载体子系统信息交互组成子系统名称+许可权限流量特征流量与用户成功登录的次数有关
(二)、数据文件系统分析阶段还没有明确的数据库文件或其右供系统直接读取的文件这里说的数据文件只是组机构内部各单位之间传递信息的载体,为了便于分析这里设了一个很抽象的数据存储器,到于它究竟存些什么和如何存等问题会在讨论数据库设计时描述
1、数据存储器名称数据存储器简述存储由数据录入员输入的已经规范化后的各种信息文件的组成船舶信息+公司工作信息+气象信息+界面支持数据文件的组织方式以高度规范化的多张数据表组成,数据定义严谨,便于机器操作
2、公司工作记录单名称公司工作记录单简述将公司的各项工作内容以手工笔记的形式形记录下来文件的组成会议记录+工作安排+领导值班信息+前线工况文件的组织方式文件在组织上带有较大的主观性,以公司内部长期约定俗成的形式出现
3、船舶信息记录单名称船舶信息记录单简述对有关船舶的各类信息以书面的形式记录下来文件的组成船舶任务+船舶状态+船舶物资消耗文件的组织方式文件在组织上带有较大的主观性,以公司内部长期约定俗成的形式出现
4、气象信息记录单名称气象信息记录单简述此信息可以是对气象信息的抄录文本,也可是从气象信息网站上直接拷贝文件的组成各生产地点天气预报+潮汐文件的组织方式视信息的来源不同而有所不同
5、报表硬拷贝名称报表硬拷贝简述将公司生产运营的各类信息统计汇总后以表格的形式呈现于纸上文件的组成标题+表头+细节+总计+报表注释文件的组织方式报表组织形式严谨规范,便于查看
(三)、加工条目
1、数据接收加工名称数据接收加工编号
1.1简述对用户从外设输入的数据进行合理性判断,将明显不符合要求的数据滤除输入数据流规范化的录入信息输出数据流经过过滤之后的数据流加工逻辑将用户输入的数据与一组标准数据进行比较,保正确的数据激发条件用户的数据输入执行频率与数据的输入量有关
2、数据接收加工名称数据接收加工编号
1.2简述在用户的计算机内存中开辟缓存空间,将正确的录入数据暂时保存下来输入数据流正确的录入数据输出数据流XML(扩展置标语言)数据流加工逻辑将普通录入文本保存并转换成XML数据流激发条件正确的数据发出暂存请求执行频率与正确录入的数据量有关
3、查询条件接收加工名称查询条件接收加工编号
2.1简述接收查询条件并对其正确性做出判断输入数据流查询条件输出数据流形式化了的SQL(结构化查询语言)加工逻辑将用户的查询条件变为SQL语流激发条件查询条件被用户提交执行频率与用户的查询次数有关
4、查询处理加工名称查询处理加工编号
2.2简述接收SQL语流,并向数据服务器发出请求输入数据流SQL语流输出数据流查询结果数据加工逻辑根据SQL语流在数据存储器中检索用户所需的信息激发条件数据存储器接到SQL语流执行频率与用户的查询次数有关
5、查询结果显示加工名称查询结果显示加工编号
2.3简述将结果数据可视化输入数据流查询结果数据输出数据流视频流加工逻辑把结果数据发往显示控件,在屏幕止显示激发条件显示控件接收到结果数据执行频率与用户的查询次数有关
6、数据插入加工名称数据插入加工编号
3.1简述将录入数据加入数据存储器输入数据流维护请求信息输出数据流SQL语流加工逻辑将由用户从键盘录入的数据维护请求转换为标准人化的SQL语流并提交数据存储器激发条件用户提交数据插入请求执行频率与数据录入人员数据遗漏量有关
7、数据更新加工名称数据更新加工编号
3.2简述将错误数据的更新结果提交数据存储器输入数据流维护请求信息输出数据流SQL语流加工逻辑将数据更改请求转换为标准的SQL数据更新语流激发条件用户提交数据更新请求执行频率与数据错误发生率有关
8、数据删除加工名称数据删除加工编号
3.3简述将数据存储器中的重复或错误的数据库删除输入数据流维护请求信息输出数据流SQL语流加工逻辑将维护请求信息转换为SQL数据删除语流激发条件用户提交数据删除请求执行频率与数据重复发生频率和用户对数据的维护习惯有关
9、维护结果显示加工名称维护结果显示加工编号
3.4简述在进行数据维护后将数据存储器的维护结果显示给用户输入数据流数据存储器状态信息流输出数据流显示数据存储器状态的视频流加工逻辑将数据存储器的状态可视化激发条件数据存储处理完维护请求执行频率与用户对数据的维护率有关
10、接收生成条件加工名称接收生成条件加工编号
4.1简述把用户输入的报表生成条件暂时保存,并对其进行规范化输入数据流用户的键盘输入输出数据流正确的报表生成条件加工逻辑对用户输入的条件进行判断,将正确的送入报表数据处理模块激发条件用户提交报表请求执行频率与报表的需求量有关
11、报表数据处理加工名称报表数据处理加工编号
4.2简述对原始数据根用户的报表请求进行统计处理输入数据流规范化的报表生成条件输出数据流报表所需的结果数据加工逻辑对原始数据进行筛选、排序、分组、求和激发条件接到规范化的报表生成条件执行频率与报表的需求量有关
12、报表预览加工名称报表预览加工编号
4.3简述将报表结果在屏幕上显示出来输入数据流报表结果数据输出数据流视频流和打印控制流加工逻辑将报表结果数据转换成视频流和打印控制流激发条件接到报表结果数据执行频率与报表的需求量有关
13、报表打印加工名称报表打印加工编号
4.4简述打印机接收到打印控制流,输出报表输入数据流打印控制流输出数据流报表硬拷贝加工逻辑将打印控制流转换为字符点阵激发条件打印机接收到控制流执行频率与报表的需求量有关
14、用户信息维护加工名称用户信息维护加工编号
5.1简述添加用户信息输入数据流用户信息维护请求输出数据流规范化的用户用户信息加工逻辑将各类用户信息添到数据存储器中激发条件收到用户信息维护请求执行频率与用户信息的变更频率有关
15、界面数据维护加工名称界面数据维护加工编号
5.2简述维护数据存储器中界面数据输入数据流界面数据维护请求输出数据流规范化的各类界面信息加工逻辑对界面数据进行各种增删、修改激发条件界面数据维护执行频率与用户信息的变更频率有关
16、用户信息接收加工名称用户信息接收加工编号
6.1简述暂存录入的用户信息,并使其规范化输入数据流用户信息输出数据流用户规范化了的用户信息加工逻辑使信息规范后向验证模块提交激发条件用户键盘录入执行频率与用户的登录频率有关
17、用户信息验证加工名称用户信息验证加工编号
6.2简述对用户的信息进行验证输入数据流已经规范化的用户信息输出数据流许可信息加工逻辑将用户信息与一组标准信息相比较以确定该试图登录者是否为系统用户激发条件接到规范化的用户信息执行频率与用户的登录频率有关
18、激发功能加工名称激发功能加工编号
6.3简述将许可发送到相应的功能模块输入数据流许可信息输出数据流功能模块名和相应权限加工逻辑对权限进行分析,使不同的模块处于不同的可用状态激发条件接收到许可信息执行频率与用户成功登录系统的次数有关第3节系统设计
1、几点说明本软件在开发过程中采用了构件软件技术和UML,此两项技术是以面向对象技术为基础的面向对象技术经过二十多年的发展,已经具备了坚实的理论和实践基础,而且还处在进一步的发展和完善之中构件技术和UML就是对面向对象技术的发展和延伸面向对象的软件工程早有完备的技术体系,软件工程的各阶段都建立了完整的模型,包括需求模型、分析模型、设计模型和实现模型上面些概念和方法比较复杂不易理解,因此在前面的一些分析中没有运用面向对象的方法,面是采用了传统软件工程中常用的一些方法既然在本软件的开发中使用了构件技术,所以在本节还将讲到些面向对象的方法系统设计是在完成对系统分析之后进行的,它向系统的最终实现更靠近了一步,在分析与实现之间架起了一道桥梁基于构件的软件工程在设计阶段要完成的任务就是选择和获取一些搭建整个软件系统所需的构件以及类通常情况下这些东西就存在于软件开发包中,在另有一部分构件本身就是一个独立的程序获得构件和类之后,需考虑它们之间的关系及在一个系统中如何进行配合在设计中会用到一些UML的表示方法,UML是一种表示面向对象中各类元素的符号化语言,这些符号表示法将后面陆续进行介绍
2、系统边界的确定上节中我们分析了系统中的很多实体,其中每一个实体可以抽象为一个类类是面向对象技术中的重要概念,类是对客观世界中一组具有相似特征事物的抽象和概括比如公司中的所有船舶就可以抽象为一个船舶类这个类描述了所有船舶多个共有的属性,如船舶的状态、位置在类中还要描述些类事物所共有的动作行为,如船舶的出海、停靠基于构件的软件工程要求在搭建系统的时候,尽可能地使用一些功能强、复用粒度大的构件,如果把系统所涉及的每一实体都构造成类,显然会使系统变得纷繁庞杂我们利用数据服务器这个大块头的构件,就能把在系统分析中所讨论到的许多实体的动作和属性给保存起来或者抽换一种思维角度,就是数据服务器帮助我们将多个类给封装起来了,而不需要我们亲自去创建数据录入人员、维护人员、查询者和报表的操作者通过系统提供的相应接口与系统进行直接会话,其它实体与软件系统间的信息传递是经过他们间接进行的分析阶段所讨论的系统还是一个很宽泛的系统,本节要把将要在计算机和网络上运行的软件系统划定出来下面用UML中的用例图将系统表示出来图中方形边框表示系统的边界,边界外部的人形表示动作者边界内部以椭圆内加文字表示一个用例用例是从用户的观点看,当系统接收到来自外部的消息后所进行的一系列响应动作
3、数据库设计如何将以上提及的各类实体的属性以及各实体之间的关系合理地存储到数据库中,是数据库设计要研究的问题本系统将用SQL SERVER2000数据服务器作为数据库的载体一个数据库中包含的元素类型很多,我们把重点放在数据表上表是一种可以存储一类实体的多个实例一组属性的数据结构表中包含多个实体实例的记录,如船舶任务是一种实体,那么一条船舶的一次任务就是这种实体的一个实例一种实体具有多个属性,属性在表中可以用一个字段表示字段可以选取的类型有多个,每个属性可用一种字段类型来表示,比如船舶任务有任务执行时间、船长、用船单位等属性执行时间可以用日期型来表示;船长是一个人的姓名可以字符型来表示在每一张数据表中有多条记录,为了使每条记录区分开来,要为每条记录设置可被区分的标识,相对于一个表来说称其为该表的关键字关键字可以从表中字段选取,可以是一个字段或者是多字段的组合比如任务执行时与船舶名称就可以组成一个关键字,但是这个关键字有些长,在向数据表中插入一条记录时,系统要对表中已存在所有记录的关键字进行检查,防止新记录的关键字值与已存在的相同,关键字长了就会降低系统的运行效率为此给表多加一个ID型的字段,而且让其自动取值,作为整张表的关键字下面有表格的形式给出数据库中所有表的字段名和每个字段的类型与长度
1、气象表:weather记录每日各生产地点气象信息主关键字ID字段名实际名称类型长度IDidID16日期date日期型8地点place字符型20气象weather字符型
1002、龙口潮汐表:lk_tide记录龙口的每日的潮汐情况主关键字日期字段名实际名称类型长度日期date日期型8高潮潮时high_time日期型8高潮潮高highwater_hight实型4低潮潮时low_time日期型8低潮潮高lowwater_hight实型
43、船舶任务表:task_table记录各船每日的出航任务主关键字ID字段名实际名称类型长度IDidID16日期date日期型8船名ship_name字符型20船长captain字符型20大副chief_mate字符型20轮机长chidf_engineer字符型20大管轮second_engineer字符型20在船人数worker_count字符型20工作内容task_contnent字符型400用船单位user_name字符型
204、船舶动态表:work_dynamic记录各船航行、油料消耗信息主关键字ID字段名实际名称类型长度IDidID16日期date日期型8船名ship_name字符型20航次sail_number整型4航时Sail_time实型4字段名实际名称类型长度航程Sail_long实型4燃油耗消fuel_wastage实型4燃油存量fuel_stock实型4机油耗消oil_wastage实型4机油存量oil_stock实型4淡水存量warter_stock实型4备注remark字符型400
5、船舶状态表ship_state记录船舶出航或停靠状态主关键字ID字段名实际名称类型长度IDidID16日期tade日期型8船名Ship_name字符型20状态代码State_code字符型
206、状态名表:state_table提供状态的汉字名到拼音缩写的转换住信息字状态名字段名实际名称类型长度状态名state字符型20状态代码code字符型
207、工作安排表:work_plan将公司每日的工作安排内容记录在案主关键字日期字段名实际名称类型长度日期date日期型8安排plan字符型
4008、领导值班表:leader_tudy记录各岗位的值班领导主关键字ID字段名实际名称类型长度IDidID16日期date日期型8岗位station字符20领导name字符
809、前线工作情况表:front_situ记录前线工作情信息主关键字日期字段名实际名称类型长度日期date日期型8日况today_situ字符型400近期安排recent_plan字符型400急办事项instancy_task字符型
40010、抢险救生情况表:save_life记录公司抢险情况主关键字日期字段名实际名称类型长度IDidID16日期date日期型8字段名实际名称类型长度内容content字符型400开始时间Start_time日期型8结束时间End_time日期型8参加船舶Join_ship字符型100指挥人员commander字符型
10011、会议记录表:meeting记录开会时间和会议内容关键字ID字段名实际名称类型长度IDIdID16日期date日期型8地点place字符型30船舶ship字符型100主持人master字符型20参加人员join_people字符型100参加人数people_count整型4内容content字符型
40012、人事简表:employee对输入界面提供基础数据支持关键字ID字段名实际名称类型长度IDidID16姓名name字符型20职称zc字符型20职务zw字符型20单位代码unit_code字符型
2013、单位表:unit_table提供单位汉字名到单位代码之间的转换关键字ID字段名实际名称类型长度单位名称unit_name字符型20单位代码unit_code字符型
2014、船舶信息表:ship_info_table提供船舶的名称和简介关键字ship_name字段名实际名称类型长度船舶名称ship_name字符型20船舶简介ship_intro字符型
2015、天气预报地点表:weather_place_table提供天气预报地点关键字place字段名实际名称类型长度地点place字符型
2016、用户信息表:user_info提供用户登录提供客户端验证依据关键字place字段名实际名称类型长度用户名name字符型20口令password字符型20权限powers字符型
504、窗体设计与数据访问客户端程序设计要决定采用怎样的人机接口来满足用户与系统间进行交互的问题显示器、键盘、鼠标等硬霎接口是已定的了,现在所关注的是软接口的问题,可选的用户图殂形界面的形式有很多,我们选定以Windows窗体作为系统的人机对话接口窗体可以包含许多可视化的控件,通过它能够显示和输入数据,利用可视化软件开了工具可以很方便地完成窗体设计在这里我们重点讨论如何得利用一个名为ADO.NET数据库访问构件对数据库访问操作这个构件中含有一组与数据访问有关的类,下面给出窗体和这组类的UML类图图中方框表示类,方框中的文字注明了类的名称,类之间的连线表示两个类相互间具有某种关系三角形箭头表示继承关系,三角形指向的一端是被继承的类(又叫作父类),加一端为继承类(又叫子类),子类继承了父类的所有功能(父类与子类的关系又叫派生),在此之上又具有自身特有的一些功能;菱形箭头表示聚合关系,箭头所指向的类是箭头另一端类的一部分;虚线箭头表示依赖关系,箭头端是被依赖类,加一端是依赖类,依赖类向被依赖提供一些服务WindowsForm类是对所有Windows窗体的一个抽象,其它各种Windows窗体都由它派生出来DataForm数据窗体类继承了WindowsForm类的所有特征,并在此基础上又具有数据访问的功能DataForm类聚集了DataSet(数据集)类和DataAdaptor(数据适配器)类DataSet是一个功能很强的类,内部包含了DataTable(数据表)类,DataColumn(字段类),DataRow(数据行)类,DataTable类就相当于数据库中表,DataColumn类就如同是表中的字段,DataRow类就好比是表中的记录,整个数据集就像是一个在客户端建立的数据库,借助于DataAdaptor类与数据服务器的连接,便可轻而易将数据库中的所有用户感兴趣的内容给搬到用户的计算机中此时用户可通过客户端程序对数据集中的各个表,以及表中的记录和字段进行多种修改,数据集会将修改的结果暂时保存下来,当用户决定将自己对数据所作的修改提交数据服务器时,数据集会借助于数据适配器将数据改动(包括插入的新记录、修改的已存在的记录和对记录的删除)全部写会到数据服务器数据适配器是在数据集和数据服务器之间架起了一道桥梁,它将Command(命令)类和Connection(连接)类聚合到了一起命令负责把用户对数据服务器操作的各个请求记下来连接负责的事情还挺多,它要将数据服务器的类型和所采用的驱动程序、服务器名称、用户名和密码记下来,然后它带着这些信息去敲数据服务器的大门,如果它给出的密码和用户名都正确,服务器的大门就会向它打开,此时它就会在数据服务器与客户端建立一条信息通道,利这条通道客户发出的各种命令就会传到服务器,服务器所生成的结果数据也借此通道传回客户端ADO.NET的大体情况就是这样,看起来不难吧,当然内部还有许多细节问题,下一节会对此进行详细的叙述第4节编码与实现对软件的蓝图做了这么长这么细的规划,是不是心中早就迫不及待了,想把软件蓝图快些变为现实,无论怎样前面的工作是必要的,正确的计划就是成功的一半在整个软件的开发中,编码工作所占的比重是很小的,而且软件开发技术的不断发展,其比重是越来越小我们已经将搭建软件的全部构件找到了,只要再编写少量的代码将这些构件给连接起来就可以了,在行话中把这种代码叫胶水代码但无论怎样说编码还是一项非常细致的工作,有许多细节要去考虑,要去注意,所以在这一节中我们还是要花一些力气对编码工作进行行讨论为了便于理解我们以在《用户手册》中讲叙的系统操作过程为主线,来看一下藏在窗体后面的代码到底是个什么样子
1、事件、消息和方法在面向对象编程中经常要提到事件、消息、方法这三个名词,我们就先来弄清它们是何意思我们常听新闻,知道一些发生在国内上外的重大事件,这些重大事件无非是说什么人或组织在什么地方干了什么事情在计算机系统的内部和外部也有事件不断发生,外部事件如敲击键盘、点击鼠标,内部事件如一个程序启动要在内存中开辟一块空间,一个程序关闭把占用的空间还给系统消息是对一个事件的描述,并通过一定的载体把它传给消息的接收者比如单击鼠标是个事件,对个事件的描述就是在什么时间,在屏幕的什么位置,单击的是鼠标的左键还是右键,这样就可以把这几条信息给封成一条消息消息的接收者有专门的消息接收装置,当接收装置收到一条消息时它首判断消息是不是发给它的,如果是它将消息接收下来,如果不是它再继续将消息往下传在一个计算机系统中可以接收消息的软硬部件很多,在面向对象程序设计中,消息的接收者就是对象(类的一个实例)接收者收到属于自己的消息时总要做出一定的反应,比如中国收到申奥成功的消息后我们做出的反应是什么——全国上下一片欢腾,类似的当一个对象接到一个消息后也要做出相应的反应,反应可能是由一系列的动作组成,我们把它叫做方法窗体程序编写的主要任务就控制一个控件收到一条消息后应该做出如何的动作反应如一个按钮接到鼠标对它点击的消息后,它会变成一个被按下去的形状,紧接着以会还原成点击前的样子这些方法是按钮类所固有的,我们就是要编写代码加在固有方法的后面,在按钮一下一上之后系统去执行我们想干的事情至于单击按钮的消息如何发出,按钮怎样收到这个消息的的代码是怎样的,我们不必去关心,这全都由编程语言的编译器替我们完成,本软件所使用的集成开发环境是VisualBasic.NET
2、源程序文件源程序的文件类型有好几种,其中大多是由集成开发环境自动生成的,这些文件并不是用VB语言写成的,我们公仅关注一下用VB代码写成的源文件,其文件的扩展名为“.vb”下面用表格将几个具有代表性的文件名称和其功能列出来文件名称功能main.vb程序的主窗体,内设有主菜单可以调任何其它窗体connect.vb登录窗体,负责接收用户输入的用户和密码并与数据服务器连接Add_Task_Form.vb船舶任务信息录入窗体,能够进行数据输入weather_query.vb船舶信息查询窗体,用以接收用户输入的查询条件dyna_view.vb查询结果显示窗体,将查询结果显示在屏幕上Task_Form.vb船舶任务信息维护窗体,可对船舶任务信息进行各类维护Query_Task_Form.vb此窗体专门用以查找已经存在且需要对其进行维护的记录tran.vb数据表格式转换类,用来将已存在的数据形式报表所需的数据形式lkzb.vb龙口晨报条件接收窗体,可以接收用户输入的报表生成条件lk_report.vb龙口晨报打印文档类,用来绘制报表网格和填入数据Module
1.vb项目级模块,在其中可以声明项目级的全局变量
3、主窗体和登录窗体编码主窗体是一个比较简单的窗体,里面只包含一个主菜单,利用主菜单来调用各个窗体,主窗体下部有一个状态栏显示了录入地点、操作员姓名和登录时间在集成开发环境中的项目管理内将主窗体设为整个程序的启动窗体,当程序一启动便会出现主窗体,在主窗体的加载事件中,添入了调用了登录窗体的代码,主窗体如下图所示主菜单可以利用可视化设计工具制作,在各个菜单项的单击事件中添加如下代码即可调用其它窗体,下面是一个菜单项的单击事件处理代码PrivateSubMenuItem3_ClickByValsenderAsSystem.ObjectByValeAsSystem.EventArgs_HandlesMenuItem
3.ClickMenuItem3是菜单项的名称,MenuItem3_Click是处理MenuItem3单击事件的方法名称在VB.NET中每一个窗体都是一个类,要使用一个窗体必先将其实例化为一对象place_weather是窗体实例化的对象名,NewAdd_Weather_Form是调用Add_Weather_Form类的构造函数ShowDialog是将窗体作为模态窗体显示的方法Dimplace_weatherAsNewAdd_Weather_Formplace_weather.ShowDialogEndSub下面是主窗体加载事件的代码PrivateSubForm1_LoadByValsenderAsSystem.ObjectByValeAsSystem.EventArgs_HandlesMyBase.LoadDimFORM_DAsNewconnectconnect是登录窗体类,将其实例化为FORM_DFORM_D.ShowDialogmark是在模块中定义的一个全局变量,它的值由登录窗体返回,如果其值是-1将主窗体关闭,在一个类中以Me来代表这个类自己,这段代码是在主窗体类中,所以Me表示是主窗体自己Ifmark=-1ThenMe.CloseElseMe.Visible=TrueEndIf将状态栏的三个部分赋予不同的值Me.sbp
1.Text=录入地点record_placeMe.sbp
2.Text=操作员operatorMe.sbp
3.Text=登陆时间+System.DateTime.Today.ToLongDateString_+System.DateTime.Now.ToShortTimeStringEndSub登录窗体如下图所示在窗体中有一个下拉列表框、两个文本框、两个单选钮和两个按钮,我们来看一下“确定”按钮单击事件的处理代码PrivateSubButton2_ClickByValsenderAsSystem.ObjectByValeAsSystem.EventArgs_HandlesButton
2.Click定义一个字符型变量scon,将其作为连接的连接字符串,datasource表示数据服务器名的接收变量Me.server.Text是赋给它的一个值,initialcatalog是所连接数据服务器的默认数据库,user是用户名接收变量,password是密码接收变量我们所说的变量在这里并不是‘以变量形式出现,等号右边还是是个字符串,这个字符的含义会由编译器去解释DimsconAsString=datasource=Me.server.Text_;initialcatalog=ship_manage;persistsecurityinfo=False;user_id=Me.user.Text;password=Me.password.TextSharedConnection1是在模块中声明的一个连接类的对象,所有的窗体要与数据服务器连接都要利用它,登录的目的就是要对数据服务器建立连接通道,所以在这要先建立一外个连接对象该对象的ConnectionString(连接字符串)就是sconSharedConnection
1.ConnectionString=sconVB.NET中利用Try和EndTry语句块来监控语句块中代码的运行,与捕捉错误提示给用户,如此不至于系统一碰到错误就被挂起TrySharedConnection
1.Open试探性的将SharedConnection1打开,看其能否与数据服务器正确连接CatchesAsSystem.Exception定义变量es用来捕捞可能发生的错误DimkkAsInt16如果有错误发生就给出一提示对话框,MsgBox是用来显示对话框的函数,函数的第一个参数es.Message是要在对话框中显示的信息,第二个参数表示要在对话框中出现“重试”和“取消”两个按钮,函函数还有一个整型的返值,用整型变量kk接收kk=MsgBoxes.MessageMsgBoxStyle.RetryCancel如果返回值是2说明用户想取消这次登录,则将变量mark置为-1,将自己(登录窗体)关闭,如果用户要继续登录则退出此次单击事件处理程序,登录窗体又变为了活动窗体,用户可以接着输入登录所需信息Ifkk=2Thenmark=-1Me.CloseEndIfExitSubEndTry如果与数据库的连接是成功的程序可以顺利地执行到此,根据用户对单选钮的选择结果会将在模块中定义的变量unitename_mar置成0或1IfMe.unitename.Checked=TrueThenunitename_mark=0Elseunitename_mark=1EndIfEndSub
四、船舶任务数据维护窗体编码数据录入窗体仅能对数据进行录入操作,而数据维护窗体可以数据进行录入、删除、修改等操作,因此录入窗体的功能只是维护窗体的一个子集,所以我们只讨论数据维护窗体的编码下面以船舶任务数据维护窗体编码为例(该窗体的具体操作使用方法请参阅《用户使用手册》)窗体中包含多个数据项录入和显示控件和一组按钮此窗体原本是由VB.NET集成开发环境自动生成,原始的模样非常简单,最初每一个数据录入项都只是一上文本框,这些文本框和数据集中的表字段相绑定表面看上去各项由多种控件组成,它们并没有和数据集相绑定,原先的那文本框还存在只是藏在了这些可以看到的控件的下面当单击“下一条”和“上一条”按钮时,原来的文本框中的数据在变动,利用代码将文本框中的数据取到这些表面可以看到的控件中,当添加新记录时需要把表面控件中的数据赋给文本框,这就是这个窗体手工添加代码的关键所在为了使用户对一个窗体的编码有个整体的把握,以下给出窗体所有少数重要部位的代码(并非完整代码)及详细解释PublicClassTask_Form声时一个名为Task_Form的类现在定义的这个类是承继了System.Windows.Forms.Form类其中System.Windows.Forms.是Form类所在的名字空间,相当于文件的路径,这时只以点代替了反斜杠InheritsSystem.Windows.Forms.Form’下是定义一组变量,以备下面的代码要用到Publicre_addAsBoolean=TruePublicre_ediAsBoolean=TruePrivateT_DAsStringPrivateT_HAsStringPrivateT_MAsStringPrivateT_ThisMomentAsStringPrivateThisMomentAsDatePrivatedsAsNewDataSet下面这行代码提示它下面的代码是由设计器自己生成#RegionWindows窗体设计器生成的代码PublicSubNew’声明类的构造函数MyBase.New构造函数中调用了父类的构造函数该调用是Windows窗体设计器所必需的InitializeComponent在InitializeComponent调用之后添加任何初始化EndSub’下面的一段代码非常长,我们挑选重要的为其做注解’以下定义了一个数据适配器对象SqlDataAdapter1’它的类为SqlDataAdapter,SqlDataAdapter是专门为访问’SQL数据库而设计定义了四个SqlCommand对象和一个SqlConnection’对象,还有一个名Task_DS1数据集对象FriendWithEventsSqlDataAdapter1AsSystem.Data.SqlClient.SqlDataAdapterFriendWithEventsSqlSelectCommand1AsSystem.Data.SqlClient.SqlCommandFriendWithEventsSqlInsertCommand1AsSystem.Data.SqlClient.SqlCommandFriendWithEventsSqlUpdateCommand1AsSystem.Data.SqlClient.SqlCommandFriendWithEventsSqlDeleteCommand1AsSystem.Data.SqlClient.SqlCommandFriendWithEventsSqlConnection1AsSystem.Data.SqlClient.SqlConnectionFriendWithEventsSqlSelectCommand2AsSystem.Data.SqlClient.SqlCommandFriendWithEventsTask_DS1Asship_manage.Task_DS‘以上的代码只是告诉编译系统有这么几对象,但还没有’在内存中为它们真正的开辟空间,下面就是要对这些对象‘进行初始化在内存中为其开辟空间,并将其一些属性给具体化’初始化的方法是用New这个关键字加上对象所属的类名‘再在类名后面加上一对括号System.Diagnostics.DebuggerStepThroughPrivateSubInitializeComponentMe.Task_DS1=Newship_manage.Task_DSMe.SqlDataAdapter1=NewSystem.Data.SqlClient.SqlDataAdapterMe.SqlDeleteCommand1=NewSystem.Data.SqlClient.SqlCommandMe.SqlConnection1=NewSystem.Data.SqlClient.SqlConnectionMe.SqlInsertCommand1=NewSystem.Data.SqlClient.SqlCommandMe.SqlSelectCommand1=NewSystem.Data.SqlClient.SqlCommandMe.SqlUpdateCommand1=NewSystem.Data.SqlClient.SqlCommandMe.SqlSelectCommand2=NewSystem.Data.SqlClient.SqlCommand’将数据适配器SqlDataAdapter1的删除命令对象置为SqlDeleteCommand1’其它几个命令对象照此类推,同时将数据库表与数据集表’的映射关系加入数据适配器Me.SqlDataAdapter
1.DeleteCommand=Me.SqlDeleteCommand1Me.SqlDataAdapter
1.InsertCommand=Me.SqlInsertCommand1Me.SqlDataAdapter
1.SelectCommand=Me.SqlSelectCommand1Me.SqlDataAdapter
1.UpdateCommand=Me.SqlUpdateCommand1Me.SqlDataAdapter
1.TableMappings.AddRange_NewSystem.Data.Common.DataTableMapping_{NewSystem.Data.Common.DataTableMappingTabletask_table_NewSystem.Data.Common.DataColumnMapping_{NewSystem.Data.Common.DataColumnMappingdatedate_NewSystem.Data.Common.DataColumnMappingship_nameship_name_NewSystem.Data.Common.DataColumnMappingcaptaincaptain_NewSystem.Data.Common.DataColumnMappingchief_matechief_mate_NewSystem.Data.Common.DataColumnMappingchidf_engineerchidf_engineer_NewSystem.Data.Common.DataColumnMappingsecond_engineersecond_engineer_NewSystem.Data.Common.DataColumnMappingworker_countworker_count_NewSystem.Data.Common.DataColumnMappingtask_contenttask_content_NewSystem.Data.Common.DataColumnMappinguser_nameuser_name_NewSystem.Data.Common.DataColumnMappinglocationlocation}}下面一段是为SqlDeleteCommand1命令文本属性赋值,等号右边的一长串字符是一条SQL的删除命令,带有@的是命令对象的参数据名Me.SqlDeleteCommand
1.CommandText=DELETEFROMtask_tableWHEREid=@Original_id_ANDcaptain=@Original_captain_OR@Original_captainISNULLANDcaptainISNULLANDchidf_engineer=@Origin_al_chidf_engineerOR@Original_chidf_engineerISNULLANDchidf_engineerISNULL_ANDchief_mate=@Original_chief_mateOR@Original_chief_mateISNULLANDchi_ef_mateISNULLANDdate=@Original_dateOR@Original_dateISNULLANDdateI_SNULLANDlocation=@Original_locationOR@Original_locationISNULLANDloc_ationISNULLANDsecond_engineer=@Original_second_engineerOR@Original_sec_ond_engineerISNULLANDsecond_engineerISNULLANDship_name=@Original_shi_p_nameOR@Original_ship_nameISNULLANDship_nameISNULLANDtask_content=_@Original_task_contentOR@Original_task_contentISNULLANDtask_contentISNU_LLANDuser_name=@Original_user_nameOR@Original_user_nameISNULLANDuser__nameISNULLANDworker_count=@Original_worker_countOR@Original_worker_co_untISNULLANDworker_countISNULL将SqlDeleteCommand1对象的Connection属性置为ShareConnectionMe.SqlDeleteCommand
1.Connection=ShareConnection为SqlDeleteCommand1添加参数,每添加一个参数都是很长一串只举一个例子Me.SqlDeleteCommand
1.Parameters.AddNewSystem.Data.SqlClient.SqlParameter_@Original_idSystem.Data.SqlDbType.UniqueIdentifier16System.Data.ParameterDirection.InputFalseCType0ByteCType0Byte_idSystem.Data.DataRowVersion.OriginalNothing@Original_id要映射的参数的名称,用双引号括起来System.Data.SqlDbType.UniqueIdentifier是参数的类型16是参数的长度System.Data.ParameterDirection.Input是参数输入输出方向False表示该参数要映射的字段不能为空id是数据库表中的列名EndSub初始化完成#EndRegion设计器生成的代码就此结束当数据集的位置指针发生变的时,添加如下处理代码PrivateSubTask_DS1_PositionChanged状态栏将当前记录位置和表中总记录条数显示出来记录位置从零编起,这不符一般习惯所以Position+1Me.stsbp
3.Text=当前记录+Me.BindingContextTask_DS1task_table.Position+
1.ToString+/_+Me.BindingContextTask_DS1task_table.Count.ToString当数据表处于编辑状态时Count的值会大于零,我们在添加记录的时候会先将表的可编辑状态关上,Count等于零所以根据Count的值可以判断是在移动记录还是在添加新的记录IfMe.BindingContextTask_DS1task_table.Count0ThenCount大于零表示在移动记录,所以要将窗体原有的文本框中的数据值赋给在窗体上可以看到的一些控件Me.cbxship_Name.Text=Me.editship_name.TextMe.date_Ymd.Value=Me.editdate.TextMe.date_hour.Text=System.DateTime.ParseMe.editdate.Text.HourMe.date_minute.Text=System.DateTime.ParseMe.editdate.Text.MinuteMe.cbx_captain.Text=Me.editcaptain.TextMe.cbx_chiefmate.Text=Me.editchief_mate.TextMe.cbx_chiefengineer.Text=Me.editchief_engineer.TextMe.cbx_secondengineer.Text=Me.editsecond_engineer.TextElse如果是在添加新的记录,则将在窗体上可以看到的一些控件的值赋为零或为空中或者是当前的时间Me.cbxship_Name.Text=Me.date_hour.Text=0Me.date_minute.Text=0Me.cbx_captain.Text=Me.cbx_chiefmate.Text=Me.cbx_chiefengineer.Text=Me.cbx_secondengineer.Text=EndIfEndSub下面是在类中创建一个公有成员函数用来将用户对数据的修改加入到数据集中,在此之前尽管用户通过窗体上的控个件对数据做了修改,但数据集只利用一个专门的数据结构对修改信息进行保存还没有将修改的结果加进数据集相应的表中去,利用这个函数可将修改合并到数据集中去这里所说的“修改”包括对记录的添加、删除、更新PublicSubUpdateDataSet创建一个新数据集来保存对主数据集所做的更改DimobjDataSetChangesAsship_manage.Task_DS=Newship_manage.Task_DS停止当前的任何编辑Me.BindingContextTask_DS1task_table.EndCurrentEdit获取对主数据集所做的更改objDataSetChanges=CTypeTask_DS
1.GetChangesship_manage.Task_DS检查是否做了任何更改IfNotobjDataSetChangesIsNothingThenTry需要做一些更改,所以尝试通过调用update方法和传递数据集以及任何参数来更新数据源,UpdateDataSource方法也是此类的一个成员函,下面会提到Me.UpdateDataSourceobjDataSetChangesMerge方法是将objDataSetChanges合并到Task_DS1中Task_DS
1.MergeobjDataSetChangesAcceptChanges是使Task_DS1接受修改Task_DS
1.AcceptChangesCatcheUpdateAsSystem.Exception在此处添加错误处理代码ThroweUpdateEndTry添加代码以检查返回的数据集中是否有任何可能已被推入到行对象错误中的错误EndIfEndSub下面这个成员函数是将数据从数据服务器中取数据集中PublicSubLoadDataSet创建一个新数据集以保存从FillDataSet调用返回的记录使用了一个临时数据集,这是因为填充现有的数据集需要重新绑定数据绑定DimobjDataSetTempAsship_manage.Task_DSobjDataSetTemp=Newship_manage.Task_DSTry尝试填充临时数据集FillDataSet是这个类的成员函数,下面会有介绍Me.FillDataSetobjDataSetTempCatcheFillDataSetAsSystem.Exception在此处添加错误处理代码ThroweFillDataSetEndTryTry清空数据集中的旧记录Task_DS
1.Clear将记录合并到主数据集中Task_DS
1.MergeobjDataSetTempCatcheLoadMergeAsSystem.Exception在此处添加错误处理代码ThroweLoadMergeEndTryEndSub下面这个成员函数是将用户对数据集所作的修改传回数据服务器中,在这里再次说明一下数据集不是简单的保存数据,而是在其建立了多种数据结构将数据和对数据所做各种修改信息都保存了下来数据适配器将对这些信息进行分析形成多种SQL语句向数据服务器发送命令PublicSubUpdateDataSourceByValChangedRowsAsship_manage.Task_DSTry在有挂起的更改时,只需要更新数据源即可IfNotChangedRowsIsNothingThen打开连接Me.SqlConnection
1.Open尝试更新数据源SqlDataAdapter
1.UpdateChangedRowsSqlDataAdapter
2.UpdateChangedRowsEndIfCatchupdateExceptionAsSystem.Exception在此处添加错误处理代码ThrowupdateExceptionFinally无论是否引发了异常都关闭连接Me.SqlConnection
1.CloseEndTryEndSubFillDataSet函数利用数据适配器来填充数据集,数据适配器会根据它的SelectCommand命中的内容在数据集中形成表结构PublicSubFillDataSetByValdataSetAsship_manage.Task_DS在填充数据集前关闭约束检查这允许适配器填充数据集而不用考虑表之间的依赖项dataSet.EnforceConstraints=FalseTry打开连接Me.SqlConnection
1.Open尝试通过SqlDataAdapter1填充数据集Me.SqlDataAdapter
1.FilldataSetCatchfillExceptionAsSystem.Exception在此处添加错误处理代码ThrowfillExceptionFinally重新打开约束检查dataSet.EnforceConstraints=False无论是否引发了异常都关闭连接Me.SqlConnection
1.CloseEndTryEndSub以下是窗体加载事件处理代码,这些代码要完成的工作就是向各列表框中添入数据PrivateSubTask_Form_LoadByValsenderAsSystem.ObjectByValeAsSystem.EventArgs_HandlesMyBase.LoadDimseleAsStringDimiAsInteger=0定义了一个名为SqlDataAdapter3的数据适配器对象DimSqlDataAdapter3AsNewSystem.Data.SqlClient.SqlDataAdapterDimSqlSelectCommand3AsNewSystem.Data.SqlClient.SqlCommandSqlDataAdapter
3.SelectCommand=SqlSelectCommand3将SqlSelectCommand3的SqlSelectCommand3属性置为ShareConnectionSqlSelectCommand
3.Connection=ShareConnection将员工表中职称为船长的姓名取出来,然后将其加入下拉列表框其它列表框中的选项加入方法与此类似sele=selectnamefromemployeewherezc=船长SqlDataAdapter
3.SelectCommand.CommandText=sele如果数据集中已经包含有“船长”表,将其清除Ifds.Tables.ContainscaptainThends.Tables.RemovecaptainEndIf用数据适配器填充数据集SqlDataAdapter
3.Filldscaptain利用一个循环向下拉列表框中加入选项Fori=0Tods.Tablescaptain.Rows.Count-1Me.cbx_captain.Items.Addds.Tablescaptain.Rowsi.Item0NextEndSub以下是窗体关闭事件处理代码PrivateSubTask_Form_ClosingByValsenderAsObject_ByValeAsSystem.ComponentModel.CancelEventArgsHandlesMyBase.ClosingTry为了防止用户在关闭窗体时没有将对数据的修改结果进行保存,在这无论用户保存与否,试将数据做保存处理Me.UpdateDataSetCatcheUpdateAsSystem.ExceptionSystem.Windows.Forms.MessageBox.ShoweUpdate.MessageEndTryEndSub在程序设计中经常会根据一些变量的取值情况来判断某些对象的状态,下面就用了两个布尔型变量re_add,re_edi,当数据处于能进入可添加或可编辑状态时它们取值为真,反之为假如果正在添加记录或正在修记录不能从同一种状态再进入同一种状态,这是没有意义的,所以当按下“添加”或“修改”按钮时会将这两个变量的值置为假下面是列表框的值发生变化时的处理代码PrivateSubcbx_captain_SelectedValueChangedByValsenderAsObject_ByValeAsSystem.EventArgsHandlescbx_captain.SelectedValueChanged当正处在添加记录或修改记录时,将列表框的值赋给隐藏其下的文本框IfNotre_addAndNotre_ediThenMe.editcaptain.Text=TrimMe.cbx_captain.TextEndIfEndSub以下是当光标在下拉列表框中,键击键盘时的处理代码,如果用户按下的是回车键,表明用户已经决定了列表框的选值,则将列表框的值赋给文本框,把焦点会移到此列表框的下一个控件PrivateSubcbx_captain_KeyPressByValsenderAsObjectByValeAsSystem.Windows.Forms.KeyPressEventArgsHandlescbx_captain.KeyPressDimkAsIntegerIfe.KeyChar=Microsoft.VisualBasic.ChrW13ThenIfNotre_addAndNotre_ediThen检查当前的列表框的值是否是为列表框中已有值,如果是则进行赋值操作,要是不是则出现一个提示框,提醒用户进行检查k=Me.cbx_captain.FindStringTrimMe.cbx_captain.TextIfk-1ThenMe.editcaptain.Text=TrimMe.cbx_captain.TextMe.cbx_chiefmate.FocusElseSystem.Windows.Forms.MessageBox.Show数据库质疑该姓名所有者的船长身份请检查姓名拼写是否正确若检查无误,则请检查数据初始化,看是否赋予该姓名所有者船长身份?提示MessageBoxButtons.OKMessageBoxIcon.HandEndIfEndIfEndIfEndSubEndSub当焦点从列表框中移开时,添加如下代码,焦点移开同样是确定列表框中选值,所其处理方法与上面一样PrivateSubcbx_captain_ValidatedByValsenderAsObjectByValeAsSystem.EventArgs_Handlescbx_captain.ValidatedDimkAsIntegerIfNotre_addAndNotre_ediThenk=Me.cbx_captain.FindStringTrimMe.cbx_captain.TextIfk-1ThenMe.editcaptain.Text=TrimMe.cbx_captain.TextElseSystem.Windows.Forms.MessageBox.Show数据库质疑该姓名所有者的船长身份请检查姓名拼写是否正确若检查无误,则请检查数据初始化,看是否赋予该姓名所有者船长身份?提示MessageBoxButtons.OKMessageBoxIcon.HandEndIfEndIfEndSub如果界面正处在添加记录或修改记录状态,按下“确定”按钮,将修改的结果保赋给文本框ElseIfNotre_addThenTrytrytoupdatedatasourceMe.btnAdd.Text=添加AMe.btnEdit.Text=修改MMe.editdate.Enabled=FalseMe.cbxship_Name.Enabled=FalseMe.cbx_captain.Enabled=FalseMe.cbx_chiefmate.Enabled=FalseMe.cbx_chiefengineer.Enabled=FalseMe.cbx_secondengineer.Enabled=FalseMe.editworker_count.Enabled=FalseMe.edittask_content.Enabled=FalseMe.edituser_name.Enabled=FalseMe.date_Ymd.Enabled=FalseMe.date_hour.Enabled=FalseMe.date_minute.Enabled=FalseMe.tbx
1.BackColor=System.Drawing.SystemColors.ControlMe.tbx
2.BackColor=System.Drawing.SystemColors.ControlMe.tbx
1.ForeColor=System.Drawing.SystemColors.ControlDarkMe.tbx
2.ForeColor=System.Drawing.SystemColors.ControlDarkMe.btnDelete.Enabled=TrueMe.btnQuary.Enabled=TrueMe.btnExit.Enabled=TrueMe.btnLast.Enabled=TrueMe.btnNavFirst.Enabled=TrueMe.btnNavNext.Enabled=TrueMe.btnNavPrev.Enabled=True将“日期”、“小时”、“分钟”三个控的值合成一个时间型的值赋给文本框T_D=System.DateTime.ParseMe.date_Ymd.Value.Year-System.DateTime.ParseMe.date_Ymd.Value.Month-System.DateTime.ParseMe.date_Ymd.Value.DayIfMe.date_hour.Text=0ThenT_H=00ElseT_H=TrimSystem.Convert.ToStringMe.date_hour.TextEndIfIfMe.date_minute.Text=0ThenT_M=00ElseT_M=TrimSystem.Convert.ToStringMe.date_minute.TextEndIfT_ThisMoment=T_DT_H:T_MMe.editdate.Text=System.Convert.ToDateTimeT_ThisMomentMe.unit_mark.Text=unitname_markre_add=Truere_edi=TrueCatcheUpdateAsSystem.ExceptionSystem.Windows.Forms.MessageBox.ShoweUpdate.MessageEndTryMe.Task_DS1_PositionChangedEndIfEndSubEndSub以下是“删除”按钮单击事件处理代码PrivateSubbtnDelete_ClickByValsenderAsSystem.ObjectByValeAs_System.EventArgsHandlesbtnDelete.ClickIfSystem.Windows.Forms.MessageBox.Show真的要删除该记录(不可恢复)?警告MessageBoxButtons.OKCancelMessageBoxIcon.Exclamation=DialogResult.CancelThenExitSubEndIfIfMe.BindingContextTask_DS1task_table.Count0ThenMe.BindingContextTask_DS1task_table.RemoveAt_Me.BindingContextTask_DS1task_table.PositionMe.Task_DS1_PositionChangedEndIfEndSub在单击“查询”按钮时添加的代码PrivateSubbtnQuary_ClickByValsenderAsSystem.ObjectByValeAsSystem.EventArgs_HandlesbtnQuary.Click将查询窗体类进行实例化 DimW_QueryAsNewQuery_Task_Form保存对数据所做的修改,即将修改结果传回数据库服务器 Me.UpdateDataSet 再次加载数据集 Me.LoadDataSet 调用查询窗体W_Query.ShowDialogEndSub下述为“查询”按钮重绘事件的处理代码,当窗体或窗体中的某些控件 被其它窗体覆盖后,当在它上面的窗体移开时,系统要对其进行重新绘制PrivateSubbtnQuary_PaintByValsenderAsObjectByValeAsSystem.Windows.Forms.PaintEventArgs_HandlesbtnQuary.Paintr_Index是从查询窗体返回的一个记录序号值Ifr_Index=0Then 在数据表中记录的序号是从零编起的,如果返回的值大于等零说明 记录已经找到,就将数据表的当前位置设为r_IndexMe.BindingContextTask_DS1task_table.Position=r_IndexMe.Task_DS1_PositionChangedMe.btnNavFirst.Enabled=TrueMe.btnNavNext.Enabled=TrueMe.btnNavPrev.Enabled=TrueMe.btnLast.Enabled=TrueEndIf 重绘事件并不一定是由查询窗体移开所引起,要将r_Index置为-1, 其它窗体覆盖后移开不会执行上面的代码 r_Index=-1EndSubEndClass至此整个船舶任务数据维护窗体类的代码编完了,再次强调一下这只完整代码的很小一部分四级生产辅助单位离船船务人员生产调度公司主管领导公司生产辅助单位在船工作人员生产地点值班岗位生产调度工作安排报表数据维护人员船舶信息系统数据录入人员气象生产辅助单位公司状态船员任务船舶晨会公司领导报表负责人系统维护人员生产信息处理后的各类信息各类信息信息管理系统0经营管理者公司各类信息源图号0规范后的录入流船舶信息记录单公司事务记录单气象记录单数据录入人员临时保存处理
1.2数据接收
1.1图号1报表负责人身份确认系统维护员录入人员查询用户数据维护员员6数据存储器1数据录入查询处理23数据维护4报表生成5系统维护图号1多种生产信息数据存储器数据存储器图号3查询条件结果显示视频查询用户查询处理
2.
22.3结果显示
2.1查询条件接收图号4维护请求信息数据维护人员维护结果显示
3.
43.3数据删除
3.2数据更新数据存储器
3.1数据插入图号5数据存储器报表结果数据报表条件信息报表操作者
4.4报表打印报表预览
4.3报表数据处理
4.
24.1接收生成条件报表硬拷贝系统维护需求笔记系统维护员
5.2数据存储器界面数据维护用户信息维护图号
65.1数据存储器许可信息用户信息各功能模块各类用户激活相应功能
6.3用户信息验证
6.
26.1用户信息接收图号7维护员查询者报表负责人录入员数据维护数据录入数据服务器数据查询报表输出DataFormWindowsFormDataAdaptorDataSetDataTableDataRowsDataColumnConnectionCommand。