PB开发笔记.docx

上传人:b****7 文档编号:9759022 上传时间:2023-02-06 格式:DOCX 页数:150 大小:97.27KB
下载 相关 举报
PB开发笔记.docx_第1页
第1页 / 共150页
PB开发笔记.docx_第2页
第2页 / 共150页
PB开发笔记.docx_第3页
第3页 / 共150页
PB开发笔记.docx_第4页
第4页 / 共150页
PB开发笔记.docx_第5页
第5页 / 共150页
点击查看更多>>
下载资源
资源描述

PB开发笔记.docx

《PB开发笔记.docx》由会员分享,可在线阅读,更多相关《PB开发笔记.docx(150页珍藏版)》请在冰豆网上搜索。

PB开发笔记.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1