单证打印的整流程.docx
- 文档编号:26117546
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:17
- 大小:47.62KB
单证打印的整流程.docx
《单证打印的整流程.docx》由会员分享,可在线阅读,更多相关《单证打印的整流程.docx(17页珍藏版)》请在冰豆网上搜索。
单证打印的整流程
1.数据库的设置和格式文件设计:
1.1数据库的设置:
数据库的设置是打印一张单证的基础,也是较为困难的部分。
该部分工作由开发人员对本地库直接进行操作。
前台需要设置的表有t_insrnc_dfn(险种定义表),T_DOC_INFO(单证信息主档),T_DOC_DATABLK(单证数据块档),T_ITEM_DCRB(单证数据项描述档)。
后台的设置和前台相同。
各表的详细说明见内部接口的单证设置表部分。
(注:
t_insrnc_dfn(险种定义表)的定义未包含在内,该表设置了险种的信息,其中的c_doc_id字段是单证打印模块所需要的。
)
首先,要分析提供的单证的格式样本。
然后根据单证的格式样本中要打印的单证数据来确定该单证的数据块及每个数据块包含的数据项;在此基础上,写出得到这些数据块和数据项的值的SQL语句,并将数据块,数据项和设计的SQL语句添加到数据库中相关的单证设置表中。
供单证打印系统使用。
在此以单证PC0002为例说明分析和设置的过程(可用单证编辑器打开PC0002.FMP浏览其格式)。
在PC0002的单证样本中,我们可以看到以下信息:
险种,保单号,被保险人姓名,保险标的地址,受益人名称,保险项目及保险金额,保险期限,免赔信息,保险费率,付款日期及方式,特别约定和保险公司的信息等。
这些信息都可以根据该保单的保单号从数据库中获得。
当然不一定只用一个SQL语句就可获得所有的信息。
我们将每个SQL语句查询出的信息称为一个数据块,而每个数据块由多个数据项组成。
在本例中,有四个数据块:
PLY_HEAD(保单的基本信息),PLY_OBJ(标的物信息),PLY_RDR(附加险信息)和PLY_TERM(缴费信息)。
每个数据块包含的数据项可在“域”对象的表达式属性页中点击“数据项”按钮浏览。
每个数据块包含的数据项的个数应和该数据块对应的SQL语句SELECT出的字段的个数一致,并且SELECT出的字段的顺序必须和该数据块中的数据项的n_ord_id的顺序相同。
否则该单证无法打印或打印出的数据与要求不一致。
在设置时,每个数据块应尽可能包含可能需要的所有信息,而不应局限于提供的单证格式样本。
1.2格式文件的设计
参照单证格式样本用单证编辑器设计单证格式文件。
2.软件设计:
2.1模块关系图:
2.2层次结构
2.2.1客户端
2.2.1.1软件结构
以下是单证打印的概要设计,其详细设计请参阅文档单证打印(车险)详细设计书.doc
本系统所提供的各项业务、功能在系统设计实现阶段按三个层次划分。
这三个层次是:
●主模块;
单证打印客户端的功能主要分成两个独立的部分:
数据读取和格式打印,通常先通过前一部分从服务器取到单证数据后,才能开始按格式进行打印,但这两个步骤不一定是连续完成的,数据读取可以将读来的数据暂存在客户端(可以是多个单证的数据),格式打印根据暂存数据打印单证。
其描述如下:
功能:
数据读取
参数:
单证类别号、相关编号(如保单号、批单号等)以及其它参数(详见定义)
1.将参数打包发送给服务器;
2.接收服务器送来的数据,数据可能是分批送来的多个二维数据块(可根据单证设置表的本地版本得到这些数据块的定义);
3.如果有数据需要由用户输入的数据替换,且用户输入的数据不为空,则替换相应的数据;
4.将接收的数据存放到本地临时数据库中。
详细定义:
序号
模块名称
功能介绍
1
GetDocTempDataId
查询单证临时数据的ID
2
GetFormDataIntoMDB
从服务器查询单证临时数据并放入本地数据库
3
GetFormNo
查询单证的单证号
4
InsertTempDoc
插入单证数据到本地数据库
5
PutDataIntoMDB
将单证临时数据放入本地数据库
1.1.1GetDocTempDataId():
●原型:
CStringGetDocTempDataId(char*lpPara)
●功能:
从本地库中查询单证临时数据的ID
●流程:
首先分析参数lpPara生成SQL语句,用该语句打开本地库中的t_tmp_doc表,如果记录集为空则返回空串,否则返回c_data_id字段的值。
1.1.2GetFormDataIntoMDB()
●原型:
CStringGetFormDataIntoMDB(CBASEBASE*pThis,char*lpPara,shortlen)
●功能:
从服务器端查询获得要打印单证的临时数据并将其保存在本地库中,同时返回单证临时数据的ID
●流程:
向服务器发包并收包,失败则返回空串,成功则调用PutDataIntoMDB将接收的数据保存到本地库中,失败则报错,成功则返回单证临时数据的ID
1.1.3GetFormNo()
●原型:
BOOLGetFormNo(CStringsInsrncCde,CString&sDocId)
●功能:
根据险种代码sInsrncCde查询该险种保单的ID
●流程:
根据sInsrncCde生成SQL语句,用该语句打开本地库中的t_insrnc_dfn表,如果记录集为空则返回假,否则返回真,该险种保单的ID保存在sDocId中。
1.1.4InsertTempDoc()
●原型:
BOOLInsertTempDoc(CDaoDatabase*m_pdbpasys,CStringsDataID,char*lpPara)
●功能:
将单证的临时数据的参数保存在本地库中
●流程:
先分析lpPara生成SQL语句,用该语句将单证临时数据插入到本地库中的t_tmp_doc表,成功则返回真,失败则返回假。
1.1.5PutDataIntoMDB()
●原型:
CStringPutDataIntoMDB(char*lpPara,char*lpData)
●功能:
将从服务器端查询获得的单证的临时数据保存在本地库中
●流程:
(1)在本地库的t_doc_info表中查询指定单证的数据块,失败则报错并返回,有则继续;
(2)循环:
while还有指定单证的数据块
✧获得该数据块的ID
✧构造单证记录集对象CDocRecordset
✧把从服务器传来的数据lpData分块存入本地数据库中,每块的记录数保存到row中
✧将该数据块的单证临时数据写入本地库中
✧返回循环开始处
(3)结束返回
功能:
格式打印
模块名:
print_doc
参数:
本地临时单证数据ID,打印或预览标记
1.根据临时数据库的数据得到单证类别;
2.打开该类别的格式文件,将格式信息读取到格式信息结构中;
3.申请一页数据的缓冲,根据格式信息确定该页要打印哪些对象;
4.对于每一个对象,若对象为一个域,则根据其表达式分析计算其值,计算过程中需要读取临时数据库的内容,将值填入该域对应的位置,并按格式设置其属性;
5.如果还需要打印下一页,转3;
6.根据缓冲数据,按要求预览或打印该单证的内容。
详细定义
序号
模块名称
功能介绍
1
PrintForm
打印单证(单证打印模块内部调用接口)
2
PrintForm
打印单证(提供给其它模块的调用接口)
PrintForm()
●原型:
BOOLPrintForm(CBASEBASE*pThis,prtGetNameAndPrintNoStruCond,CStringsFormNos,intfunc)
●功能:
单证打印子系统打印指定单证的模块。
●流程:
(1)根据是否合并和单证类型生成单证ID,在本地库的t_doc_info表中查询是否有该单证ID,无则报错并返回,有则继续;
(2)根据结构prtGetNameAndPrintNoStru中的数据生成参数lpPara
(3)调用函数GetDocTempDataId
(4)如果返回值为空则调用GetFormDataIntoMDB
(5)如果返回值为空则结束返回,否则继续
(6)如果有印刷号
✧填写单证查询、修改处理数据结构vchProcessStruct
✧如果是收据
Ø如果不合并打印则将印刷号填写到vchProcessStruct中
Ø否则填写系统单证号列表数据结构vchSysprnNoStruct并添加到要发送的数据包
✧向服务器发包做销号处理,返回值存到bSucc
(7)指定格式文件
(8)如果是预览则调用单证打印类的预览功能,否则调用单证打印类的直接打印功能
(9)返回bSucc
PrintForm()
●原型:
extern"C"voidWINAPIPrintForm(CBASEBASE*pThis,CStringsDocID,CStringsP1,CStringsP2,CStringsP3="",CStringsP4="",CStringsP5="",CStringsP6="",intfunc=1)
●功能:
其他子系统打印单证的调用接口。
●流程:
(1)在本地库的t_doc_info表中查询是否有该单证ID,无则报错并返回,有则继续;
(2)根据传入的参数生成参数lpPara
(3)调用函数GetDocTempDataId
(4)如果返回值为空则调用GetFormDataIntoMDB
(5)如果返回值为空则结束返回,否则继续
(6)指定格式文件
(7)如果是预览则调用单证打印类的预览功能,否则调用单证打印类的直接打印功能
●子系统;
除以上两个模块,单证打印部分还包括界面处理、本地临时单证数据管理、表达式处理、函数求值以及格式编辑器等部分,界面处理涉及到保批单打印、快速打印和收据打印,除快速打印处理较简单外,另两个处理过程基本相似,这里统一描述:
功能:
界面处理
1.显示查询界面;
2.将用户输入的查询条件,打包发到服务器;
3.接收服务器传回的符合条件单证的有关信息,将其列表显示出来;
4.对于每一个用户在列表中选定的单证,如果在本地临时数据库没有该单证的信息,则调用get_bill_data,调用的参数根据具体单证类型来确定,注意如果是合并打印,可能参数不止是一个编号,而是一组编号,这时在客户端需要将这组编号串接成(‘No.1’,’No.2’,’No.3’,……’No.n’)形式的字符串作为参数,而在服务器端的SQL语句会将该参数拼装作为IN子句的操作数;
5.根据用户的选择,调用print_bill来打印各个单证;
功能:
本地临时单证数据管理
描述:
本地临时单证数据的删除、打印及锁定与解锁。
锁定表示该单证数据将不被自动删除。
系统显示一个列表,列出本客户机上临时单证数据库中的所有单证,用户通过按与以上几个功能对应的按钮完成相应的动作。
功能:
表达式处理
描述:
由于在一个单证中各个可打印域的数据来源是用表达式表示的,因此需要有专门的表达式处理程序,这里主要提供了表达式语法分析模块和表达式求值模块供其它程序调用。
功能:
函数求值
描述:
域的表达式中可能包含有本系统提供给用户使用的各种函数,在表达式求值过程中需要对函数进行求值。
此模块完成此功能供表达式求值模块调用,具体函数描述见本文档用户接口部分。
功能:
格式编辑器
描述:
格式编辑器是一个独立执行的程序,它实现对单证格式文件的建立、编辑调整。
要求用可视化的界面对单证中各个可打印对象进行拖放,定义其属性,并能实现模拟的预览和打印。
因此此程序需要调用表达式求值模块和print_bills模块。
●公用类;
ØCDocRecordSet类:
该类表示一个数据块,该类继承了类CDaoRecordSet,除此之外要用到以下的属性和方法:
1.doc_id单证号
2.data_id单证临时数据标识
3.blk_id数据块号
4.item_count数据项个数
5.item_name[]数据项名数组,可用CArray类
6.offset[]数据项的偏移值,可用CArray类
7.type[]数据项的类型,可用CArray类
8.CDocRecordSet()构造函数,可从一个存在的相同类对象复制,也可以用单证号、数据块号为参数得到
9.GetItemVal()得到一个数据项的值,参数可以为序号也可以为数据项名
10.SetItemVal()设置一个数据项的值,参数可以为序号也可以为数据项名
11.SetVal()设置记录值,参数可以为Cstring类,也可以为char*类型
12.AddNew()插入一条记录,参数可以为Cstring类,也可以为char*类型
ØCDocVal类:
该类继承了类CString,它定义了单证打印对象的表达式计算的结果。
ØCEvaluate类:
该类无父类。
它负责对单证打印对象的表达式的语法检查和计算。
ØCDocObj类:
该类无父类。
它定义了单证打印对象。
即用户接口部分的可打印对象。
实现了可打印对象的画面预览和实际打印功能。
ØCDocPrint类:
该类无父类。
它实现了单证数据按单证格式文件在对话框中预览,单证数据输出到打印机和读取单证格式文件的单证格式的功能。
2.2.2服务器端
2.2.2.1软件结构
单证打印在服务器端的处理较为简单,主要流程如下:
1.接受到客户端的读取数据参数,按其中的单证类别码从单证设置表中取得该类单证的数据处理信息(单证设置表结构见本文档内部接口定义);
2.对于该单证的每个数据块,得到读取数据的SQL语句,将参数填入到该语句适当位置,执行该SQL语句,将结果按格式打包发送到客户端;
3.如果以上语句执行出现错误,则返回错误信息;否则成功返回。
2.3接口设计
2.3.1用户接口
需要用户了解的信息主要有以下几个:
1.数据块的概念
每类单证的数据应该由多个数据块组成,(数据块设置见内部接口中单证设置表的定义);可以将各个数据块之间的数据关联描述为一种树型层次关系,最多只有三层,相邻层的数据块之间有关键字相互关联。
根结点的数据块只能得到单条记录(无关键字),第二层数据块可能是一维表格(即仅有一个关键字),第三层数据块实际上是二维表格,它的每条记录是由上层的父数据块和本数据块关键字确定(即有两个关键字)。
2.可打印对象
◆域
最重要的可打印对象是域,它其实是打印内容由表达式来计算的一个文本框,该文本框的内容需要定义以下属性:
1)输出项的数据转换:
定义一种输出转换关系(要求缺省打印原值),如:
若原值为’Y’输出为’是’,若原值为’N’,则输出为’否’,对未定义值打印原值。
2)数据项的输出格式:
如日期类型使用“YYYY/MM/DD”等格式,数值使用“-9999.99”的格式等。
3)可定义域的高度和宽度及打印字体,字符串类型的值可以在域中折行(某数据域在指定范围内如果不能折行打印完的话,那么,要在下一页的同样位置打印剩余的内容,此功能可作为一项属性,用户可选择换页,也可选择截取剩余内容。
若选择换页,而在打印时真的发生换页的话,应向用户给出提示,以便让用户知道换什么样的纸来打印)。
4)可定义域中内容是左对齐、右对齐还是居中
◆表格
这里的表格是一种内嵌了域的一维表格,但与数据块之间有一一对应的关系,主要是需要使用其数据。
对于第三层结点的数据块,在格式定义的表格中还要指定其与第二层数据块关联的关键字的值,注意,一张单证格式定义中每个数据块只能对应一个表格。
表格要定义属性如下:
1)表格所对应数据块的名(若是第三层数据块,还需指定其对应第二层数据块的关键字的值)
2)记录走向是横向还是纵向;
3)每行的行高(横向表格则是列宽),在每页中可打印的行数(横向表格是列数);
4)可以定义任何可打印的域,域的含义同前,域定义的表达式中包含的数据块的列值,如果是本身数据块中的列,在每行根据记录顺序取值;否则,该列值在每行中应该都是固定取值。
但是不能直接引用其下层数据块的列,可以使用下层数据块的列作参数的函数,但其取值受本数据块当前行的限制。
5)可以指定从对应数据块的第几行记录开始打印,即跳过前面n条记录。
◆其它可打印对象
其它对象如图形、图像和自由文字,可定义其尺寸、字体等属性。
◆对象公共属性:
1)每页打印属性:
定义对象是否在每一页的相同位置都打印;
2)隐藏属性:
定义对象是否可以隐藏,可以隐藏时应规定隐藏条件;
3)所属表格属性:
定义对象是否是表格中的对象;
3.表达式语法
表达式中的运算仅限于四则运算(包括括号)或字符连接操作,参加运算的操作数可以是常数和在数据处理部分中定义的表格中的列,也可以是下面定义的函数,其中字符常数用双引号括起来;
4.函数
用户可以使用的函数包括以下几个:
(这里参数中的T代表数据块名;C代表列名)
sum(T,C,f):
对一个数据块的某列求和(f为0表示求总和;为1则求到当前页为止的累计数);
averge(T,C):
对一个数据块的某列求平均数;
count(T,C,f):
计算一个数据块的记录数(f为0求总记录数;为1则求到当前页为止的记录数);
upper(e,f):
将数值表达式e的结果转换成金额大写形式,f为0表示中文大写,为1表示英文大写;
substr(e,f1,f2):
求串表达式的子串,从位置f1开始,取f2长;
tochar(e,fmt):
将数值表达式e的内容按格式fmt转换成字符串;e为日期型时,fmt对应的格式为:
1:
YYYY/MM/DD;2:
DD/MM/YYYY;3:
YYYY年MM月DD日;4:
YYYY-MM-DD;5:
YYYY.MM.DD;6:
MONDD,YYYY;7:
MM/DD/YYYY
year(d):
取日期d的年
month(d):
取日期d的月
date(d):
取日期d的日
getval(T,C,k):
得到数据块T中指定列C,关键字为k的行的值,仅适用于非根结点表格;
page():
当前页号;
sumofpg():
总共页数。
注意,这些函数中的T为第三层数据块的时候,则其取值将被限定为与上层数据块当前行相关联的数据行,如:
对sum函数,当T为第三层数据块时,仅对与上层数据块当前行相关联的行进行求和。
5.打印区域(目前有detail和tail区,但tail区域只可打印页码)
单证的打印区域有三个:
header、detail和tail,三个区域除只有detail中可以包含表格外,都可以包含任何其它可打印对象,且在header和tail中,域在每页中的内容一般都相同(除非包含了与页相关的函数的域,如page()、sum(T,C,1)、count(T,C,1)等)。
每个单证可以先打印一个封面,封面和后面的页可以是不同大小的纸,并且由于没有换页,所以不包含三个打印区域,整个只有一个打印区域,封面中可以包含任何可打印对象,但若有表格则仅能打印该表格对应数据块的前面若干行。
2.3.2外部接口
无
2.3.3内部接口
单证打印部分的内部接口主要包括:
单证设置表、单证格式文件、单证数据临时数据库和一些内部数据结构。
1.内部接口单证设置表
单证设置表为数据库中的三个表:
单证信息主档、单证数据块档、单证数据项描述档,这些表都可本地化。
它们的构成分别如下:
◆单证信息主档(设置单证的基本信息):
c_doc_id单证号
c_doc_cnm单证中文名
c_inscde险种,非固定险种则为空
c_language中文或英文(C-中文、E-英文、N-不限制)
c_doc_cls类别(A:
投保单;B:
批改申请;E:
批单;L:
最新保单;M:
赔款收据;N:
无赔退费收据;O:
现场查勘报告?
?
?
;P:
保单;R:
保费收据;S:
手续费收据;U:
退保费通知单)
c_crt_cde创建人代码
c_upd_cde修改人代码
t_crt_tm创建时间
t_upd_tm修改时间
c_privilege权限操作码
n_priv_tag权限检查标志
n_cls_ord类别序号
◆单证数据块档(设置单证数据块的信息):
c_doc_id单证号
c_blk_id数据块号
c_blk_nme数据块的名称
c_key1关键字1的序号
c_key2关键字2的序号
c_parent上层数据块号
c_sql得到数据的SQL语句,该语句中若包含’#1’、’#2’……则在执行时,它们的位置被参数代替;
n_level所处层数
n_item_count该数据块包含的数据项的个数
◆单证数据项描述档(设置单证各数据块中的数据项的信息):
c_doc_id单证号
c_blk_id数据块号
n_ord_id在本数据块中的序号
c_item_enm数据项英文名
c_item_cnm数据项中文名
c_type类型(0:
字符;1:
数字;2:
日期)
n_length长度
此档中单证号和数据项英文名为关键字,即在一个单证中各数据项的英文名不能重名。
2.单证格式文件
单证格式文件中定义了一个单证的属性以及它所包含的各种可打印对象的属性。
这里仅初步地描述单证格式中两个重要的可打印对象的定义:
域和表格
◆单证格式域定义:
sheet所属表格序号
expression表达式
x位置横坐标,若c_sheet不为空,则指在当前表格一行中的横坐标,否则为打印区域横坐标
y位置纵坐标,若c_sheet不为空,则指在当前表格一行中的纵坐标,否则为打印区域纵坐标
width域宽度
height域高度
wordwrap是否允许折行
overpage若打印内容超出本域的打印范围是否换页
font字体定义
format格式定义
alignment格式排列(左对齐、右对齐或居中)
listtable转换表
◆单证格式表格定义:
blk_id数据块号
direction打印方向(横向或纵向)
x位置横坐标
y位置纵坐标
width表格宽度
height表格高度
border是否有边框
rowheight行高,若是横向打印则是行宽
startrec开始记录号
3.单证数据临时数据库
单证数据临时数据库仅在客户端存在,它分为主档和付档两个表,构成分别如下:
◆单证临时数据主档:
c_data_id临时数据标识
c_doc_id单证号
d_build_time生成时间
c_argv1参数1
c_argv2参数2
c_argv3参数3
c_argv4参数4
c_argv5参数5
c_argv6参数6
◆单证临时数据付档:
c_data_id临时数据标识
c_blk_id数据块号
c_key1关键字1
c_key2关键字2
c_value行值(长字段),根据各数据项在单证数据项描述表中c_offset和c_length的值来分离出各数据项的取值
4.其它数据结构
单证打印部分内部还需要定义一些数据结构用于内部的通信,主要有单证执行参数和单证数据传送格式
◆单证执行参数:
doc_id单证号
argv1_len参数1长度
argv2_len参数2长度
argv3_len参数3长度
argv4_len参数4长度
argv5_len参数5长度
argv6_len参数6长度
prn_no单证印刷号
a
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 打印 整流