PB中使用FORMULA ONE

本文是小王整理计算机时找到的,google了一下,网上似乎没有,发上来与大家分享吧。我将以一个例子来详细说明F1的用法,以补充前文所述,此例为电力企业停电申请票的上报审批过程,内含过程权限控制,每一权限只能修改F1报表的一个部分,且有做图功能,采用PB 6.5和F1 6所编,下面将详细说明:
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对象就是一个没有行头、列头及标签的空白表格。
 
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的帮助中,请自己用时查阅。

你可能感兴趣的:(职场,one,Formula,休闲)