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的幫助中,請自己用時查閱。
總結
以上是生活随笔為你收集整理的PB中使用FORMULA ONE的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从流量到留量:双11为什么开始变了?
- 下一篇: 个人简历自我介绍竞聘PPT模板