以一个例子来详细说明F1的用法。此例为电力企业停电申请票的上报审批过程,内含过程权限控制,每一权限只能修改F1报表的一个部分,且有做图功能,采用PB 6.5 和 F1 6 所编,下面将详细说明: 4.读模板的内容至控件:
declare instance variables: BLOB vcf_form declare global variables: string gs_ztm,gs_lrdw,gs_gldw datetime gd_lrsj,gd_tdsj 在窗口的OPEN事件中写脚本: datetime sj int fh string ls_dwmc em_1.text=string(gd_tdsj,"yyyy年mm月dd日hh:mm") selectblob SQPNR into :vcf_form from DFS_TDSQP where LRSJ=:gd_lrsj and LRDW=:gs_lrdw using sqlca;//取出库中申请票内容 if isnull(vcf_form) then ole_1.object.Read("模板.vts", ref fh)//把模板读入OLE控件 ole_1.object.setactivecell(21,2) ole_1.object.Entry=string(gd_tdsj,"mm月dd日hh时mm分至")//填入计划停电时间 ole_1.object.setactivecell(4,3) select ZZ_DWMC into :ls_dwmc from B04 where ZZ_DWBM=:gs_lrdw; ole_1.object.Entry=ls_dwmc//填入计划停电单位 ole_1.object.setactivecell(4,6) ole_1.object.Entry=xm//填入姓名 else if fileexists("c:/book1.vts") then filedelete("c:/book1.vts") end if fh=fileopen("c:/book1.vts",streammode!,write!)//建一临时文件 if fh<>-1 then filewrite(fh,vcf_form)//把库中的库中申请票内容写入临时文件 fileclose(fh) ole_1.object.Read("c:/book1.vts", ref fh)//把临时文件内容读入控件 else MessageBox("错误提示", "打开文件操作错误!") close(this) return end if END IF CHOOSE CASE qx CASE "lr"//权限为二级单位录入时只能录入左半边的报表 ole_1.object.selection="A1:G38" ole_1.object.setprotection(false,false)//将A1:G38的单元格置为可写,其余不可。 ole_1.object.enableprotection=true ole_1.object.selection="C4"//光标停在C4单元格处 CASE "gl" CASE "zd" CASE "zb" END CHOOSE 5.鼠标右键双击OLE_1控件可直接编辑报表,填入内容至可写的单元格内,可以采用F1的画图工具对报表进行简单的做图。 6.将已修改的控件内容写入数据库: int fh OLEobject book; string filename="c:/book1.vts" book=ole_1.object book.Write(filename, 12)//将控件内容写入临时文件 fh=fileopen( filename, StreamMode!) IF fh<>-1 THEN FileRead(fh, vcf_form) //将临时文件内容写入BLOB变量 FileClose(fh) ELSE RETURN 0 END IF if len(vcf_form )>0 then UPDATEBLOB DFS_TDSQP set SQPNR=:vcf_form where LRSJ=:gd_lrsj and LRDW=:gs_lrdw using sqlca;//将BLOB变量内容写入库中 IF SQLca.sqlcode=0 THEN COMMIT using sqlca; // MessageBox("提示", "完成对数据库的申请票存储操作!") ELSE ROLLBACK using sqlca; MessageBox("提示", "申请票存储操作失败!") RETURN 0 END IF end if gd_tdsj=datetime(date(left(em_1.text,4)+"-"+mid(em_1.text,7,2)+"-"+mid(em_1.text,11,2)),& time(mid(em_1.text,15,5)+":00")) update DFS_TDSQP set TDSJ=:gd_tdsj , ZTM=:ztm_wf where LRSJ=:gd_lrsj and LRDW=:gs_lrdw using sqlca;//保存录入时间和录入单位的值 IF SQLca.sqlcode=0 THEN COMMIT using sqlca; MessageBox("提示", "完成对数据库的存储操作!") return 1 ELSE ROLLBACK using sqlca; MessageBox("提示", "停电时间存储操作失败!") RETURN 0 END IF 7、打印控件内容 ole_1.object.fileprint(true) 实际上,read、write、savefiledlg、fileprint等函数都是FORMULA ONE所有的,POWERBUILDER中只需在Ole_1后加一个object即可引用这些函数,函数的定义在F1的帮助中,请自己用时查阅。
1.建一张申请票的F1文件作为模板,如下图:
为实现权限控制,将I1:P38的单元格设上保护,使右半边报表不可写:
1)、选中单元格,鼠标右键FORMAT CELLS:PROTECTION下的LOCKED前打勾。
2)、FORMAT菜单下SHEET项的PROTECTION前打勾,这句很重要,否则上句不起作用。
2.库中建一停电申请票表DFS_TDSQP:
LRSJ 录入时间 TDSJ 停电时间
LRDW 录入单位
GLDW 管理单位
TDSB 停电设备
GZNR 工作内容
KGSJ 开工时间
WGSJ 完工时间
GZR 工作人
ZTM 状态码
SQPNR 申请票内容 IMAGE类型
3.在PB窗口中插入F1控件:
在POWERBUILDER的窗口中点中OLE图标:会出现“插入对象”对话框,选择insert control 标签项(如下图),
在对象列表中选择 Vci Formula One Workbook,按确定键后,选好插入位置点击鼠标,即加入了一个名为ole_1的OLE对象,在其上用鼠标右键选中OCX Properties项,在Show标签下可将Row Heading和Column Heading项取消选中,将Tabs的值由Bottom改为Off(如下图),加入的OLE对象就是一个没有行头、列头及标签的空白表格。