固定模式:
对于cs1方式:
tabletable1、在全局定义段,添加2个变量,g_sql,g_str
若已经存在g_sql参数,则不用再增加此参数。
参数g_str的作用就是用来组动态传递参数,通过tiptop接口函数传递给crystal report。
在crystal report中有p1-p20,共20个参数用于接收,此20个参数都为string型
如何组动态参数:g_str = ‘p1’ , ’;’ , ’p2’, … , ’;’ , ’p20’ 每个参数请用;隔开。
2、在数据处理段,即抓取报表资料的函数段。
首先要做的就是检查sql语句的正确性。除了语法外,还包括是否列出了所有要查的字段。利用cs1这个接口参数,crystal report将直接通过tiptop程序中的数据查sql语句在数据库中查符合要求的资料。
检查完毕后,将sql语句以下部分全部mark起来。
之后,可以做组动态参数的动作。即给g_str赋值。
完成上述动作后,就可以使用cl_prt_cs1()这个接口参数。
cl_prt_cs1()的参数有(‘程序代号’,’报表代号’,g_sql,g_str)
3、将原来的report段mark起来。
对于cs3方式:
也有固定的格式。
1、在全局定义段,定义3个变量,g_sql,g_str,l_table
l_table是用来存放临时报表名。
2、在main()程序段创建临时表。
先利用g_sql变量对临时表字段进行定义。
以aooi010为例
LET g_sql="azb01.azb_file.azb01,",
"azb02.azb_file.azb02,",
"azb06.azb_file.azb06,",
"_02,",
"_03,",
"_04,",
"_02 "
注意一下它的语法结构,首先是临时表字段名(如azb01),接着是该字段的参照来源(如azb_file.azb01),在临时表字段和它的参照来源之间用”.”分隔,这个点相当于LIKE。
接着利用cl_prt_temptable()函数来创建临时表。
语句是:l_table = cl_prt_temptable(‘程序代号’,g_sql) CLIPPED
创建成功的话,会返回一个临时表表名给l_table变量。如果不成功则返回-1。
所以,紧接着在创建临时表语句下面就是对返回值的一个判断。
其语句是:IF l_table = -1 THEN EXIT PROGRAM END IF 若创建不成功则退出程序。
在判断之后,就是申明一个sql语句,其功能是用于将数据插入到临时表中。
sql语句是:LET g_sql = "INSERT INTO ds_report.",l_table CLIPPED, " VALUES(?,?,?,?,?,?,?)"
临时表的资料统一放置在一个相同的db内,ds_report。
接着对这句sql语句做申明:PREPARE insert_prep FROM g_sql
申明完成后就是检查:IF STATUS THEN
CALL cl_err('insert_prep',STATUS,1) EXIT PROGRAM
END IF
完整的临时表创建过程:(以aooi010为例)
LET g_sql="azb01.azb_file.azb01,",
"azb02.azb_file.azb02,",
"azb06.azb_file.azb06,",
"_02,",
"_03,",
"gen
<_04,",
"_02 "
LET l_table = cl_prt_temptable('aooi010',g_sql) CLIPPED
IF l_table = -1 THEN EXIT PROGRAM END IF
LET g_sql = "INSERT INTO ds_report.",l_table CLIPPED,
" VALUES(?,?,?,?,?,?,?)"
PREPARE insert_prep FROM g_sql
IF STATUS THEN
CALL cl_err('insert_prep',STATUS,1) EXIT PROGRAM
END IF
3、以上2步完成后,一般可以直接定位到报表数据抓取的函数段了。
首先,就是对定义的数据数组做检查,和临时表定义的字段数目,字段类型,字段排序等是否一致。
如: sr RECORD
azb01 LIKE azb_file.azb01,
azb02 LIKE azb_file.azb02,
azb06 LIKE azb_file.azb06,
gen02 LIKE 02,
gen03 LIKE 03,
gen04 LIKE 04,
gem02 LIKE 02
END RECORD
接着是对旧版本报表写法的mark。
一般有以下一些语句:
SELECT zo02 INTO g_company FROM zo_file WHERE zo01 = g_lang
CALL cl_outnam('aooi010') RETURNING l_name
START REPORT i010_rep TO l_name
以上这些动作都是在foreach段开始前做。
接着对foreach段内做些修改。
同样,对旧写法做mark。
那么一般在foreach段内需要mark的语句为:OUTPUT TO REPORT i010_rep(sr.*)
处理完成后,在end foreach这一行的上一行,其实此时,整个foreach段已经对资料完成了相应的处理。我们可以写上,EXECUTE insert_prep USING sr.*,这个语句,把资料插入到临时表中。
特别说明下,这个资料的处理必须集中到foreach段内完成。
在旧版本中,一些程序在对某些个别字段处理时,将处理语句放到了report段,那么,也需要把这些处理语句合理地搬挪到foreach段内。总之,在对临时表插入时,所有的数据都应该是处理完成状态。
接下来,出foreach段后,我们还是先做一个mark的动作。
将FINISH REPORT i010_rep和CALL cl_prt(l_name,g_prtway,g_copies,g_len)这两个语句mark起来。
采用crystal report后,我们不再采用prt来呼叫报表,而采用接口函数cs1和cs3这两种方式来呼叫报表。
接着,处理呼叫报表。
写一句对临时表抓取数据的sql语句:
LET g_sql = " SELECT * FROM ",g_cr_db_str CLIPPED ,l_table CLIPPED
请注意一下,g_cr_db_str这个变量,里面存放的值就是ds_report,临时报表的dbname。
之所以采用参数的形式,是为了避免第二次查询时,不到临时表的dbname。
写完sql后,对g_str变量赋值。
再调用接口函数cl_prt_cs3(‘程序代号’,’报表代号’,g_sql,g_str)
最后,对原有的report段进行mark。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。