PB开发笔记.docx
- 文档编号:9759022
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:150
- 大小:97.27KB
PB开发笔记.docx
《PB开发笔记.docx》由会员分享,可在线阅读,更多相关《PB开发笔记.docx(150页珍藏版)》请在冰豆网上搜索。
PB开发笔记
//通过代码更改数据窗口对象的方法
stringerror_syntaxfromSQL,error_create
stringnew_sql,new_syntax
new_sql='SELECTemp_data.emp_id,emp_data.emp_namefromemp_data'&
+'WHEREemp_data.emp_salary>45000'
new_syntax=SQLCA.SyntaxFromSQL(new_sql,'Style(Type=Form)',error_syntaxfromSQL)
IFLen(error_syntaxfromSQL)>0THEN //Displayerrors
mle_sfs.Text=error_syntaxfromSQL
ELSE //GeneratenewDataWindow
dw_new.Create(new_syntax,error_create)
IFLen(error_create)>0THEN
mle_create.Text=error_create
ENDIF
ENDIF
dw_new.SetTransObject(SQLCA)
dw_new.Retrieve()
//打开动态窗口的方法:
windownewarray[3]
stringwin[3]
inti
win[1]="w_employee"
win[2]="w_customer"
win[3]="w_sales"
fori=1to3
Open(newarray[i],win[i])
next
//显示一个与Windows操作系统风格一致的About对话框。
首先声明如下外部函数:
functionintShellAboutA(ulongal_hWnd,stringas_szApp,stringas_szOtherStuff,ulonghIcon)library"shell32"
ShellAboutA(handle(parent),"关于...#摆渡人工作室","欢迎光临摆渡人工作室",0)
//如何将COLUMN的显示风格在EDIT、DDDW、DDLB之间相互切换:
(1)切换成DDDW:
dw_1.Modify("#1.dddw.Name='dddw_jg'")
dw_1.Modify("#1.dddw.DisplayColumn='name_jg'")
dw_1.Modify("#1.dddw.DataColumn='id_jg'")
(2)切换成DDLB:
dw_1.Modify("#1.ddlb.case='any'")
dw_1.Object.#1.Values="red~t1/white~t2"
(3)切换成EDIT:
dw_1.Modify("#1.edit.case='any'")
dw_1.Modify("#1.edit.AutoSelect='Yes'")
(4)获取当前风格:
dw_1.Describe("#1.Edit.Style")
(5)如果还不行,可能得要如下操作:
dw_1.Modify("#1.dddw.Name=''")一下;
//在dw_1中选定想要打印的几条记录
longll_pos
dataStorelds_ds
lds_ds=createdataStore
lds_ds.dataObject=dw_1.dataObject
forll_pos=1todw_1.rowCount()
ifdw_1.IsSelected(ll_pos)then
dw_1.RowsCopy(ll_pos,ll_pos,Primary!
lds_ds,lds_ds.rowCount()+1,Primary!
)
endif
next
lds_ds.print()
//实现在循环时可以通过点击按钮终止循环
integern
//sb_interrupt是共享变量
sb_interrupt=false
forn=1to3000
yield()
ifsb_interruptthen//sb_interrupt的值在"取消”按纽的Clicked事件中修改为true
MessageBox("我不干了","你真坏!
")
sb_interrupt=false
exit
else//其它处理,在单行编辑器中显示当前n值
sle_1.text=string(n)
endif
next
//SQL语句调用规范
INTEGERli_customer_id=1
STRINGls_city_code='501'
PREPARESQLSAFROM"DELETEbb_customer_info_tWHEREcity_code=?
ANDcustomer_id=?
";
EXECUTESQLSAUSING:
ls_city_code,:
li_customer_id;
//通过modify函数来同时修改多个表
1、新建一个数据窗口d_grid_dep_emp,它的Select语句为
SELECTdepartment.dept_id,
department.dept_name,
employee.emp_id,
employee.emp_fname,
employee.emp_lname
FROMdepartment,employee
WHEREemployee.dept_id=department.dept_id
2、设置数据窗口d_grid_dep_emp的属性,将列的taborder改为非0值;并点击菜单Rows——>Update
Properties,设置此数据窗口AllowUpdates,TabletoUpdate设为department,UpdateableColumns为
department.dept_id,department.dept_name。
3、在窗口中更新数据窗口按钮的clicked事件编写脚本:
longll_rtn
//修改Department表(Department表在第2步已设置为可更新)
ll_rtn=dw_1.update(true,false)
Ifll_rtn=1then
//关闭对Department表的修改
dw_1.Modify("department_dept_name.Update='No'")
dw_1.Modify("department_dept_id.Update='No'")
dw_1.Modify("department_dept_id.Key='No'")
//设置Employee表成为新的可修改表
dw_1.Modify("DataWindow.Table.UpdateTable='employee'")
dw_1.Modify("employee_emp_id.Update='Yes'")
dw_1.Modify("employee_emp_fname.Update='Yes'")
dw_1.Modify("employee_emp_lname.Update='Yes'")
dw_1.Modify("employee_emp_id.Key='Yes'")
//修改Employee表
ll_rtn=dw_1.Update()
IFll_rtn=1THEN
COMMITUSINGSQLCA;
dw_1.retrieve()
messagebox('提示信息','更新成功!
')
ELSE
ROLLBACKUSINGSQLCA;
MessageBox('提示信息','更新失败!
')
ENDIF
//重置修改标志
dw_1.Modify("department_dept_name.Update='Yes'")
dw_1.Modify("department_dept_id.Update='Yes'")
dw_1.Modify("department_dept_id.Key='Yes'")
dw_1.Modify("DataWindow.Table.UpdateTable='department'")
dw_1.Modify("employee_emp_id.Update='No'")
dw_1.Modify("employee_emp_fname.Update='No'")
dw_1.Modify("employee_emp_lname.Update='No'")
dw_1.Modify("employee_emp_id.Key='No'")
ELSE
ROLLBACKUSINGSQLCA;
MessageBox('提示信息','更新失败!
')
ENDIF
//可以将以上功能作成一个函数,在必要的时候调用即可。
//单击编辑框选中其中内容
getfocus事件中书写代码:
this.selecttext(1,len(this.text))。
保存后运行,却得不到我们想要的
效果。
想到了一个另类办法:
以pbm_bnclicked为事件ID,创建单行编辑框的自定义事件ue_clicked,
代码是:
this.selecttext(1,len(this.text)),
getfocus事件的代码改为:
This.PostEventue_clicked()。
保存后运行,效果出来了!
//怎样得到字符串中汉字的个数
Fori=1toLen(aString)
ls_ch=Mid(aString,i,1)
IfAsc(ls_ch)>=128then//是汉字
li_num++
i=i+1
Endif
Next
//最后,li_num就是汉字的个数了
//DW支持双击标题进行排序
Stringls_old_sort,ls_column,ls_name,ls_criteria
Charlc_sort
IFRight(dwo.Name,2)='_t'THEN //取得是否是列标题名
ls_column=LEFT(dwo.Name,LEN(String(dwo.Name))-2)
ls_old_sort=this.Describe("Datawindow.Table.sort")
IFls_column=LEFT(ls_old_sort,LEN(ls_old_sort)-2)THEN
lc_sort=RIGHT(ls_old_sort,1)
IFlc_sort='A'THEN
lc_sort='D'
ELSE
lc_sort='A'
ENDIF
this.SetSort(ls_column+""+lc_sort)
ELSE
ls_criteria=ls_column+"A"
this.SetSort(ls_criteria)
ENDIF
this.Sort()
ENDIF
//DW支持单击按Ctrl或Shift进行多选
int il_last_row //il_last_row为实例变量,记录上次单击的行
intli_current_row //当前单击行
intli_row //中间变量
//未选择就返回
ifrow=0then
return
else
li_current_row=row
endif
ifkeydown(keyshift!
)then //按下SHIFT键
ifil_last_row=0then
this.selectRow(row,true)
il_last_row=li_current_row
else
this.selectRow(0,false)
ifli_current_row>il_last_rowthen
forli_row=il_last_rowtoli_current_row
this.selectrow(li_row,true)
endfor
else
forli_row=il_last_rowtoli_current_rowstep-1
this.selectrow(li_row,true)
endfor
endif
endif
else //未按下SHIFT键
il_last_row=li_current_row
ifkeydown(keycontrol!
)then //按下CTRL键
ifthis.isSelected(li_current_row)then
this.selectrow(li_current_row,false)
else
this.selectrow(li_current_row,true)
endif
else //无CTRL键或SHIFT键按下
this.selectrow(0,false)
this.selectrow(li_current_row,true)
endif
endif
//改变DW的查询条件语句
stringls_select,ls_filter
ls_select=dw_1.getSqlSelect()
ls_select=mid(ls_select,1,pos(upper(ls_select),'FROM')+30)
ls_filter="WHEREservice_kind="+vi_service_kind+"ORDERBYFEE_IDASC"
ls_select=ls_select+ls_filter
dw_1.Reset()
dw_1.SetTransObject(SQLCA)
dw_1.SetSQLSelect(ls_select)
dw_1.Retrieve()
//数据窗口的closeQuery事件:
提示保存数据
dw_1.AcceptText()
IFdw_1.ModifiedCount()+dw_1.DeletedCount()>0THEN
CHOOSECASEMessageBox("操作提示","数据已经发生变化,是否保存?
",Question!
YesNoCancel!
1)
CASE1
cb_save.TriggerEvent(clicked!
)
CASE2
Return0 //不做任何操作直接关闭窗口
CASE3
Return1 //不会运行CloseEvent,维持原来的情况
ENDCHOOSE
ENDIF
//提示:
请选择要删除的记录
ifdw_2.GetSelectedRow(0)=0then
MessageBox("提示信息","请选择要删除的记录!
")
return
endif
//按某字段进行排序
IFdwo.name="fee_id_t"THEN
this.setSort("fee_ida")
this.sort()
elseifdwo.name="fee_position_t"then
this.setsort("fee_positiona,fee_ida")
this.sort()
ENDIF
//控制DATAWINDOW里每页显示的行数
1、在Datawindow中增加一个计算域,起名为:
ceil_page,此计算域必须放在Detail段中,
Expression中输入ceiling(getrow()/25)25表示每页打印25行,也可以是一个参数。
2、分组,选择菜单Rows\CreateGroup,选择ceil_page
按ceil_page分组,并选中NewPageOnGroupBreak(意思是新组开始时换页)。
3、将此计算域设为隐藏(在属性页中的expression页中在visible属性中写0)。
4、补空行:
在窗口的open事件中写如下代码:
longli_count,li_i
li_count=dw_1.retrieve()
ifmod(li_count,25)<>0then
forli_i=1to25-mod(li_count,25)
dw_1.insertrow(0)
next
endif
//如何实现数据窗口数据的自动折行
1)在DataWindowPainter中打开此DataWindow对象。
2)在需设定自动折行的列上双击鼠标,弹开此列的属性窗口。
3)选择Position标签,选中AutosizeHeight多选框。
4)选择Edit标签,不选中AutoHorzScroll多选框。
5)单击OK按钮,保存所做的修改。
6)点中DetailBand(即写有Detail的灰色长带),单击鼠标右键,选择Properties...菜单项。
7)选中AutosizeHeight多选框。
8)单击OK按钮,保存所做的修改。
9)保存此DataWindow。
注意:
连在一起的汉字(中间没有标点或空格分隔),系统将认为是一个单词,不会自动进行折行,
英文也是如此……DW窗口折行如果有汉字的话就必需中间加空格才会折行,否则怎样设置都不行。
例如你
如果想在第20位折行,就先判断第20位是否是个汉字,如不是就在第20位后加空格,如果是汉字就在
第19位加空格。
判断是否是汉字可以用它的ASCII码是否大于127来判断。
//按条件对某行数据进行颜色区分
case(cjwhenis>=90thenrgb(255,0,0)whenis<60thenrgb(0,255,0)elsergb(0,0,255)))
//PB中同时连接多个数据库,如连接SQLServer2000和Oracle8
stringls_startupfile
ls_startupfile='hisini.ini'
sqlca.DBMS=ProfileString(ls_startupfile,"database","dbms","")
sqlca.database=ProfileString(ls_startupfile,"database","database","")
sqlca.userid=ProfileString(ls_startupfile,"database","userid","")
sqlca.dbpass=ProfileString(ls_startupfile,"database","dbpass","")
sqlca.logid=ProfileString(ls_startupfile,"database","logid","")
sqlca.logpass=ProfileString(ls_startupfile,"database","LogPassWord","")
sqlca.servername
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PB 开发 笔记