2008-1-281.报表路径:先把路径列出,大家稍微看一下。D:\合并报表主要有三个内容合并报表编程过程说明:1.由于第一次编合并报表,所以很多东西不知道,那么就查资料,主要参考三个资料,一个是UFO的二次开发帮助文件,第二个是孙勇写的《UFO报表高级应用培训讲义》,第三个是用友报表的PDF帮助2.客户的要求:客户要求将12张资产负债表(当然还有很多其他的表)做合并,这12张分别是不同的下属单位,由于在开始实施的时候,就考虑到合并报表的事情,所以但是在建立帐套的时候,要求所有单位的会计科目(包括辅助核算),报表格式都必须一致,所以这12张表的格式都是一模一样的。开始动手了1.现在第一步是建立一张合并报表模板,可以直接用现有的资产负债表模板,然后把公式清空,报表文件为“D:\合并报表\zt003\2008\资产负债表.rep”2.报表归类:我们假设合并两张报表就可以了,zt003和zt013,路径如下:D:\合并报表D:\合并报表\zt003\2008\资产负债表.repD:\合并报表00批命令01母公司ZT00301母公司02合并口径03管理主体ZT013ZT02302合并口径03管理主体用于存放批处理文件(SHL文件)用于存放最终合并后的报表用于存放最终需要合并的报表D:\合并报表\zt013\2008\资产负债表.rep简单的合并方式:将zt013的资产负债表的对应的单元格与ZT003对应的单元格相加。批处理放在以下文件夹:D:\合并报表\批处理\2008我们先简单建立一个批处理,用以实现两个单元格的简单合并,文件命名为“zt003zcfzb.shl”批命令如下:LETC7=C7+D:\合并报表\zt003\2008\资产负债表.rep-C7RELA年WITHD:\合并报表\zt003\2008\资产负债表.rep-年,月WITHD:\合并报表\zt003\2008\资产负债表.rep-月起码知道以上的命令可以实现将C7单元格的数据加上“D:\合并报表\zt003\2008\资产负债表.rep”C7的数据。但是如果这样做的话,每一个单元格就要一条语句,而且如果有多张表的话,就更加复杂,而且如果到时候要修改的话,比如到了2009年的话,每一条都要改一下,甚至如果单元格发生变化,要改的话,那不是要疯掉!!所以在想能不能通过变量来实现,便于后续修改。经过翻查资料,大概知道了变量的应用,然后就来实现吧。第一步,把报表路径变量化,可以直接设定一个变量&rep,然后赋值,语句如下:let&rep=D:\合并报表\zt003\2008\资产负债表.rep那么单元格的赋值就可以这样来写:LETC7=C7+&rep-C7RELA年WITH&rep-年,月WITH&rep-月这样写可以减少修改报表路径的问题,至少改个路径变量值,其他就不用改了,相对来说比较方便一些,但是,问题是单元格也是比较麻烦,一条一来,有没有什么其他办法呢?睡觉的时候突然想到能否用循环来处理,如果可以就好办多了,于是就开始实施,用while循环,但是问题是如何来表示列号和行号呢?经过翻查资料,有一个意外的发现:有了这个意外的发现之后,我就想,干脆把路径、列号、行号都用变量表示算了,看看情况如何,代码如下://设置报表路径、合并起始列、起始行let&rep1=D:\合并报表let&rep2=\zt003let&rep3=\2008let&rep4=\资产负债表.replet&col0=3let&row0=7//设置报表路径1)变量使用关键字年、季、月、日为数值型,单位名称、单位编号为字符型。表示报表名:&REP_NAME-单元格名表示表页号:@&TAB表示行号:#&ROW表示列号:!&COLlet&rep=&rep1+&rep2+&rep3+&rep4//设置列号let&col=&col0//设置行号let&row=&row0//通过循环合并数据,合并C7:D55的单元格while&col=4while&row=55let!&col#&row=!&col#&row+&rep-!&col#&rowrela年with&rep-年,月with&rep-月let&row=&row+1endlet&row=&row0let&col=&col+1end做了以上变动之后,至少修改起来事比较简单,可以把这段代码保存为“zt003zcfzb.shl”通过以上的批处理命令,我们在执行此批命令的时候,就可以实现把一个表的C7:D55的单元格与ZT003的对应的单元格相加。现在的情况有所变化,我们有两种需要合并的报表,比如D:\合并报表\zt003\2008\资产负债表.repD:\合并报表\zt013\2008\资产负债表.rep最终合并到以下表:D:\合并报表\01母公司\2008\资产负债表.rep如何实现呢?如何来利用之前做的批命令呢?难道需要把批命令重复写一遍吗?突然想到,能否通过调用批命令文件,相当于编程里面的“include”,那问题就可以解决了,也就是说,将一个合并的批命令写成一个批命令文件,然后来调用,只要有需要合并的时候,就调用此批命令,问题就可以解决了,减少重复工作,同时容易修改。在批处理里面是有一个调用批命令的命令,就是用”DO”命令。我们把之前做的“zt003zcfzb.shl”重新另存为“zcfzb_hbbb.shl”,路径如下:DOD:\合并报表\批命令\2008\zcfzb_hbbb.shl然后我们建立一个“zcfzb_main.shl”的批处理文件来调用。代码如下://首先进入数据状态Zt003资产负债表Zt003资产负债表01母公司资产负债表合并DATA//报表取数DOD:\合并报表\批命令\2008\zcfzb_hbbb.shl把此文件放在:D:\合并报表\00批命令\01母公司\2008\zcfzb_main.shl为了能够在进入报表的时候,将最终合并的报表的数据先清空,同样我们做一个清空的批处理命令。//清空数据,合并数据前先把数据清空。CLEARC7:D55CLEARG7:H55把文件命名为“D:\合并报表\批命令\2008\zcfzb_clear.shl”以备调用然后我们对“zcfzb_main.shl”的批命令再次修改,加入清除数据的批处理。//首先进入数据状态DATA//清空数据DOD:\合并报表\批命令\2008\zcfzb_clear.shl//报表取数DOD:\合并报表\批命令\2008\zcfzb_hbbb.shl那么以后不管有多少张表,资产负债表,损益表等等,只要每一张表都保存相应的三个批处理(主命令、清空命令、合并命令)。只是每张表需要修改的地方就是将“zcfzb_hbbb.shl”里面的参数做一些修改。比如路径、文件名称、年份,列名等等。但是能否有更好的办法呢?能否将合并数据作为一个通用的模板,用来调用呢?然后把变量的赋值放在主程序中进行,这样不是更好吗?模型:这个时候,我们开始做统一规划了:D:\合并报表\批命令\2008\主程序(主批处理):zcfzb_main.shl子程序(清空数据):zcfzb_clear.shl主程序:定义变量、赋值子程序1:清空数据子程序2:合并数据子程序3:数据整理子程序(合并报表):zcfzb_hbbb.shl先把主程序列出:主程序(主批处理):zcfzb_main.shl//----------------------------------------------------程序开始----------------------------------------//合并报表//合并报表说明://zt003广海本部//----------------------------------------------------首先进入数据状态--------------------------------//--把变量清空,然后要求输入关键字。DATAfreeallif年=0disp请先输入关键字returnelse//--设置批处理命令的路径。let&shl01=D:\合并报表\00批命令let&shl02=\01母公司let&shl03=\2008let&shl04=&shl01+&shl02+&shl03let&shlclr=\zcfzb_clear.shllet&shlhb=\zcfzb_hbbb.shllet&shlclr=&shl04+&shlclrlet&shlhb=&shl04+&shlhb//----------------------------------------------------清空数据----------------------------------------------------DO&shlclr//----------------------------------------------------初始化取数报表--------------------------------------------let&rep1=D:\合并报表let&rep2=\zt003//设置取数帐套let&rep3=\2008let&rep4=\资产负债表.replet&col01=3//设置列起始值Clet&colmax01=4//设置列循环最大值Dlet&col02=7//设置列起始值Glet&colmax02=8//设置列循环最大值Hlet&row01=7//设置行起始值7let&rowmax=55//设置行循环最大值55//-----------------------------------------------------报表取数----zt003let&rep2=\zt003//设置取数帐套let&row0=&row01//设置行起始值//----------------------------------------------------01.分列取数1let&col0=&col01//设置列起始值Clet&colmax=&colmax01//设置列循环最大值DDO&shlhb//----------------------------------------------------02.分列取数2let&col0=&col02//设置列起始值Glet&colmax=&colmax02//设置列循环最大值HDO&shlhb//----------------------------------------------------END------------------------------------------//---------------------------------------------------保存报表------------------------------------------//savefreeallend//第一层IF的结尾清空命令:zcfzb_clear.shl//清空数据CLEARc7:d55CLEARg7:h5合并命令:zcfzb_hbbb.shl//------------------------合并报表---------------------------------------------//设置报表路径、合并起始列、起始行let&rep=&rep1+&rep2+&rep3+&rep4let&col=&col0let&row=&row0//通过循环合并数据while&col=&colmaxwhile&row=&rowmaxlet!&col#&row=!&col#&row+&rep-!&col#&rowrela年with&rep-年,月with&rep-月let&row=&row+1endlet&row=&row0//重新置位,否则行的循环无法进行let&col=&col+1end以上代码供参考,已经做了必要的注释,相信应该可以知道是做什么的。以后如果需要合并报