时间: 2021-08-13 作者:daque
在常常的server/client办法mis开拓中,老是有没完没了的报表须要创造,调节和测试报表耗费的功夫也是最多并且蹩脚,还往往不许满意存户的诉求。假如不妨让用户本人安排报表的方法和实质,而后将它生存下来,步调下次启用时它机动挪用生存了的报表方法那有多好。自己经过如次本领最后实行了用的诉求。 pb(powerbuilder)有一种以psr结果的特出的生存报表的文献方法(正文简称作psr文献)。按照数据窗口不妨径直读取psr文献天生报表的道理,步调经过天生psr文献,实行动静报表方法的生存。 一、实行道理: pb中的报表本来就十分所以数据窗口。 第一步,动静报表的实行。经过树立数据窗口东西(dataobject)华文本、列等的resizeable和moveable属性为1来实行东西场所的拖动遏制,经过数据窗口的modify因变量实行东西值的变动(囊括减少和简略)。 第二步,报表方法的生存。在一个运用傍边,数据窗口东西的称呼老是独一的,将每一个数据窗口东西变化成psr文献存于数据库表中。在窗口翻开时,步调先校验报表方法能否生存。即使生存,先将报表方法读掏出来放在一个偶尔文献傍边,而后树立数据窗口(datawindow)的数据东西(dataobject)为这个报表文献,而后索取数据;即使不生存,径直索取数据即可。 二、实行进程: 1、创造一个数据库表用以生存报表方法文献。 表名:dyn_report dwobjectvarchar2(20)数据窗口东西称呼primary key rptitlevarchar2(80)报表的题目称呼 memolong raw 报表方法 2、创造一个窗口w_temp。 设置范例变量如次: string is_dwtype,is_dwobject //生存报表中东西的典型及称呼 控件称呼 控件含意 dw_print数据窗口东西 cb_exit退出按钮 cb_savereport 报表方法生存按钮 3、在窗口的open事变中介入如次代码, 校验报表方法能否生存,即使生存读取设置好的报表方法到数据窗口。 blob emp_pic long ll_handle string ls_dwobject,ls_reportfile,ls_path ls_dwobject = dw_print.dataobject //确定能否生存该数据窗口的报表方法 select count(*) into:ll_count from dyn_report where dwobject =:ls_dwobject; if ll_count>0 then //读取报表方法文献到大文本变量 selectblob memo into:emp_pic from dyn_report where dwobject =:ls_dwobject; //创造psr偶尔文献到硬盘 ls_reportfile = ’\temp7089.psr’ ll_handle = fileopen(is_reportfile,streammode!,write!,lockwrite!,replace!) filewrite(ll_handle,emp_pic) fileclose(ll_handle) dw_print.dataobject = ls_reportfile dw_print.settransobject(sqlca) else dw_print.settransobject(sqlca) end if dw_print.retrieve() 4、报表方法的生存。经过cb_savereport按钮的clicked实行。 string ls_filename long ll_count blob emp_id_pic ls_filename = "temp70201.psr" //生存报表方法到硬盘偶尔文献 dw_print.saveas(ls_filename,psreport! ,false) sqlca.autocommit = true select count(*) into :ll_count from dyn_report where dwobject =:is_dwobject; if ll_count =0 then insert into dyn_report(dwobject,rptitle) values(:is_dwobject,:ls_filename,:ls_path); end if //从硬盘偶尔文献读取数据生存到数据库表中 emp_id_pic = of_readbmpfile(ls_filename)//该因变量将二进制文献实质读到大文本东西中 //革新数据库 updateblob dyn_report set memo = :emp_id_pic where dwobject = :is_dwobject; sqlca.autocommit = false 5、动静报表的实行。经过数据窗口dw_print的clicked事变捕捉数据窗口中东西,并将东西名寄存在实行变量is_dwobject中,为下一步窜改报表作筹备。 string ls_type,ls_dwoname //获得东西典型和称呼 ls_type = trim(upper(dwo.type)) ls_dwoname = trim(dwo.name) is_dwtype = ls_type choose case ls_type case "text","commandbutton","groupbox" is_dwobject = ls_dwoname //树立为不妨拖动和变换巨细,其它类同 this.modify(ls_dwoname+".resizeable=’"+"1’") this.modify(ls_dwoname+".moveable="+"1") case "line" //曲线东西不许经过树立resizeable和moveable属性举行安排,必需经过其它路途 is_dwobject = ls_dwoname case "rectangle","ellipse","graph","bitmap" is_dwobject = ls_dwoname this.modify(ls_dwoname+".resizeable=’"+"1’") this.modify(ls_dwoname+".moveable=’"+"1’") case "column","compute" is_dwobject = ls_dwoname this.modify(ls_dwoname+".resizeable=’"+"1’") this.modify(ls_dwoname+".moveable=’"+"1’") end choose 而后再经过modify()因变量不妨实行基础的动静报表操纵,这一类的作品较多,pb中也有洪量的例子可径直运用,在此这不复累述。 6、在cb_exit按钮的clicked()事变中介入:close(parent)。 7、在运用的open事变中介入: open(w_temp)。而后生存并运转,大功成功啦! 8、本步调在pb7.0加oracle8.05下调节和测试经过。