PowerBuilder的创始人 米歇尔克茨曼。
PowerBuilder奠基人 大卫李特瓦克。
1991年6月。Powersoft公司发布了其旗标式客户/服务器硬功开发工具。
1995年PowerBuilder1.0
1996年PowerBuilder5.0
2003年PowerBuilder9.0
PowerBuilder特点:
面向对象的编程和时间去懂的应用开发程序开发工具,
支持跨平台开发
可以轻松编写语句
人性化设计。
拥有独特的库文件画板和层次清晰的系统资源库。
提供了丰富多样不同风格的数据窗口
PowerBuilder9.0新特性。
支持快速开发的jsp编辑器。
支持xml、PBNI(PowerBuilder Native Interface)、EJB Client、PB9.0与Web Service 的关系,PB9.0与.NET、其他增强功能。
建立应用对象
建立Student的工作区和目标,然后建立一个名为student的对象在其Open事件中加入如下脚本:
//设置SQLCA的属性,利用名为pbexam的数据源连接数据库 SQLCA.DBMS="ODBC" SQLCA.AutoCommit=False SQLCA.DBParm="Connectistring='DSN=pbexam'" CONNECT USING SQLCA; //打开登录窗口 open(w_register) |
在应用程序的Close事件中加入如下脚本:
//断开数据库连接 DISCONNECT USING SQLCA; |
登录窗口
在用户名的单行编辑框的ue_enterkey事件中加入如下脚本:
//判断用户是否按下回车 If key = KeyEnter! Then //把输入焦点转移到"密码"单行编辑框 sle_2.SetFocus() End If |
在密码单行编辑框的ue_enterkey事件中加入如下脚本:
If key = KeyEnter! Then //触发登录按钮的Clicked事件 cb_1.TriggerEvent(Clicked!) End If |
在登录按钮的Clicked事件的脚本中加入如下脚本:
String password,right //用SQL语句根据用户名查找密码 //right为一全局变量,用来保存用户权限 SELECT mm,qx INTO:password,right FROM "yh" WHERE "yh"."hm"=:sle_1.text; //SQLCode等于100代替没有得到任何记录。 If SQLCA.SQLCode=100 Then MessageBox("提示消息","没有此用户") sle_1.text="" sle_1.SetFocus() ElseIf password<>sle_2.text Then MessageBox("提示信息","密码错误!") sle_2.text="" sle_2.SetFocus() Else //打开主窗口,关闭登录窗口 Open(w_main) Close(Parent) End If |
在取消按钮的Clicked事件的中加入如下脚本:
Close(parent)//关闭登录窗口 |
菜单设计
在学生管理菜单项的Clicked事件中加入如下脚本:
//打开学生管理窗口 OpenSheet(w_student,w_main,4) |
在页面设置菜单项的Clicked事件中加入如下脚本:
window actsheet //取得当前活动窗口 actsheet=w_main.GetActiveSheet() //触发活动窗口的ue_pageset事件 actsheet.TriggerEvent("ue_pageset") |
在打印菜单项的Clicked事件中加入如下脚本:
window actsheet actsheet=w_main.GetActiveSheet() actsheet.TriggerEvent("ue_print") |
在退出菜单项的Clicked事件中加入如下脚本:
Close(ParentWindow) |
在窗口级联菜单项的Clicked事件中加入如下脚本:
//修改菜单的选中标志 m_jilian.checked=True m_chongdie.checked=False m_shuiping.checked=False m_chuizhi.checked=False //改变工作表的排列方式 ParentWindow.ArrangeSheets(cascade!) |
在窗口重叠菜单项的Clicked事件中加入如下脚本:
m_jilian.checked=False m_chongdie.checked=True m_shuiping.checked=False m_chuizhi.checked=False ParentWindow.ArrangeSheets(Layer!) |
在窗口水平菜单项的Clicked事件中加入如下脚本:
m_jilian.checked=False m_chongdie.checked=False m_shuiping.checked=True m_chuizhi.checked=False ParentWindow.ArrangeSheets(Tile!) |
在窗口垂直菜单项的Clicked事件中加入如下脚本:
m_jilian.checked=False m_chongdie.checked=False m_shuiping.checked=False m_chuizhi.checked=True ParentWindow.ArrangeSheets(TileHorizontal!) |
在个人成绩统计菜单项的Clicked事件中加入如下脚本:
//打开专业选择窗口,并把统计的类型作为参数传递给专业选择窗口 OpenWithParm(w_selectzy,"person",w_main) |
MDI主窗口
在主窗口的Open事件中加入如下脚本:
//如果不是系统管理员则屏蔽用户管理菜单项 If right<>1 then m_main.m_file.m_id.visible=False //因为打开主窗口后还没有打开任何工作表,所以把和工作表相关的功能菜单的Enabled属性设为false m_main.m_file.m_pageset.enabled=False m_main.m_file.m_preview.enabled=False m_main.m_file.m_previewcancle.enabled=False m_main.m_file.m_print.enabled=False m_main.m_edit.m_insert.enabled=False m_main.m_edit.m_del.enabled=False m_main.m_edit.m_save.enabled=False m_main.m_edit.m_append.enabled=False m_main.m_edit.m_retrieve.enabled=False m_main.m_edit.m_prior.enabled=False m_main.m_edit.m_next.enabled=False m_main.m_edit.m_first.enabled=False m_main.m_edit.m_last.enabled=False m_main.m_caozuo.m_select.enabled=False m_main.m_caozuo.m_find.enabled=False m_main.m_caozuo.m_sortasc.enabled=False m_main.m_caozuo.m_sortdesc.enabled=False m_main.m_window.m_jilian.enabled=False m_main.m_window.m_chongdie.enabled=False m_main.m_window.m_shuiping.enabled=False m_main.m_window.m_chuizhi.enabled=False |
学生管理窗口
在学生管理窗口的Open事件中加入如下脚本:
//为数据窗口分配事务对象,并检索数据 dw_stu.SetTransObject(SQLCA) dw_stu.Retrieve)_ //用静态文本显示当前日期 st_1.text=string(today(),"yyyy/mm/dd") |
在查询按钮的Clicked事件中加入如下脚本:
If sle_1.text="" Then //如果没有输入查询关键字提示输入 MessageBox("提示","请输入您要查询的关键字") sle_1.SetFocus() Else //按输入的姓名查询,并用like事件模糊查询 dw_stu.setFilter("xm like '%"+sle_1.text+"%'") dw_stu.filter() dw_stu.SetFocus() End If |
在学生管理窗口的Activate事件中加入如下脚本:
//此事件在当前窗口获得焦点时触发 //如果当前用户不是系统管理员和数据管理员则屏蔽和数据修改有关的菜单项 If right>2 Then m_main.m_edit.m_insert.enabled=False m_main.m_edit.m_del.enabled=False m_main.m_edit.m_save.enabled=False m_main.m_edit.m_append.enabled=False Else m_main.m_edit.m_insert.enabled=True m_main.m_edit.m_del.enabled=True m_main.m_edit.m_save.enabled=True m_main.m_edit.m_append.enabled=True End If //在当前窗口得到焦点后设置菜单项的enabled属性为True //在窗口得到焦点时使用菜单项即可 m_main.m_file.m_pageset.enabled=True m_main.m_file.m_preview.enabled=True m_main.m_file.m_previewcancle.enabled=True m_main.m_file.m_print.enabled=True m_main.m_edit.m_retrieve.enable=Ture m_main.m_edit.m_prior.enable=Ture m_main.m_edit.m_next.enable=Ture m_main.m_edit.m_first.enable=Ture m_main.m_edit.m_last.enable=Ture m_main.m_caozuo.m_select.enabled=True m_main.m_caozuo.m_find.enabled=True m_main.m_caozuo.m_sortasc.enabled=True m_main.m_caozuo.m_sortdesc.enabled=True m_main.m_window.m_jilian.enabled=True m_main.m_window.m_chongdie.enabled=True m_main.m_window.m_shuiping.enabled=True m_main.m_window.m_chuizhi.enabled=True |
在学生管理窗口的CloseQuery事件中加入如下脚本:
Integer i //判断是否有数据的修改 If dw_stu.ModifiedCount()+dw_stu.DeletedCount()>o Then i=MessageBox("提示","是否保存对数据的修改?",Exclamation!,YesNoCancel!) Choose case i case 1 //保存数据 If dw_stu.UpDate() = 1 Then //如果保存成功则提交 COMMIT; Else ROLLBACK; MessageBox("错误","数据库内容更新失败") End If case 2 //不保存数据 Return 0 case 3 //阻止窗口的关闭 Return 1 End Choose End If |
在学生管理窗口的Resize事件中加入如下脚本:
//此事件在窗口改变大小时触发 //修改数据窗口的控件的位置及大小,使其随窗口的大小的改变而改变 dw_stu.x=10 dw_stu.y=150 //newwidth和newheight为该事件传递的参数,代表窗口的新宽度和高度 dw_stu.width=newwidth-20 dw_stu.height=newheight-160 |
在学生管理窗口的ue_append事件中加入如下脚本:
//事件追加功能 Long therow //在数据窗口最后一行插入 therow=dw_stu.insertrow(0) //滚动到新加入的行 dw_stu.ScrollToRow(therow) dw_stu.SetFocus() |
在学生管理窗口的ue_del事件中加入如下脚本:
//实现删除功能 Integer i,m m=0 Long therow i=MessageBox("提示信息","确认要删除行?",exclamation!,YesNoCancel!) If i=1 Then //如果当前数据窗口中选择了多行则用循环语句删除多行 Do //因为如果删除了第3行,那么原来第四行就变成了现在的第三行 //所以要把搜索的行号减1 therow=dw_stu.GetSelectedRow(therow-1) If therow<>0 Then m=1 dw_stu.DeleteRow(therow) End If Loop While therow<>0 //如果没有选中多行则删除当前行 If m=0 Then dw_stu.DeleteRow(0) End If End If dw_stu.SetFocus() |
在学生管理窗口的ue_filter事件中加入如下脚本:
//实现查询功能,打开查询窗口,并把数据窗口dw_stu作为参数传递过去, //可以使用多个窗口功用一个查询窗口 OpenWithParm(w_filter,dw_stu,w_student) |
在学生管理窗口的ue_find事件中加入如下脚本:
//实现查询功能,打开查询窗口,并把数据窗口dw_stu作为参数传递过去, //可以使用多个窗口功用一个查询窗口 OpenWithParm(w_filter,dw_stu,w_student) |
在学上管理窗口的ue_first事件中加入如下脚本:
//滚动到第一行,实现最前一个的功能 dw_stu.ScrollToRow(1) dw_stu.SetFocus() |
在学上管理窗口的ue_insert事件中加入如下脚本:
//实现插入功能 Long therow,therow1 //得到当前数据窗口当前行,并在当前行前面插入 therow=dw_stu.GetRow() therow1=dw_stu.InsertRow(therow) dw_stu.SetRow(therow1) dw_stu.SetFocus() |
在学上管理窗口的ue_last事件中加入如下脚本:
//滚动到最后一行,实现最后一个的功能 Long therow therow=dw_stu.RowCount() dw_stu.ScrollToTow(therow) dw_stu.SetFocus() |
在学上管理窗口的ue_next事件中加入如下脚本:
//滚动到下一行,实现下一个功能 dw_stu.ScrollPriorRow() dw_stu.SetFocus() |
在学上管理窗口的ue_prior事件中加入如下脚本:
//滚动到上一行,实现上一个的功能 dw_stu.ScrollPriorRow() dw_stu.SetFocus() |
在学上管理窗口的ue_pageset事件中加入如下脚本:
//实现页面设置功能,打开页面设置窗口,并把数据窗口dw_stu作为参数传递过去, //可以使多个窗口共用一个页面设置窗口 OpenWithParm(w_pageset,dw_stu,w_student) |
在学上管理窗口的ue_preview事件中加入如下脚本:
//实现打印预览功能,打开打印预览窗口,并把数据窗口dw_stu作为参数传递过去 //可以使多个窗口功用一个打印预览窗口 OpenWithParm(w_preview,dw_stu,w_student) |
在学生管理窗口的ue_previewcancle事件中加入如下脚本:
//取消数据窗口的预览模式 dw_stu.modify("datawindwo.print.preview=No") dw_stu.SetFocus() |
在学生管理窗口的ue_print事件中加入如下脚本:
//实现打印预览功能,打开打印预览窗口,并把数据窗口dw_stu作为参数传递过去, //可以使多个窗口功用一个打印预览窗口 OpenWithParm(w_pageset,dw_stu,w_student) |
在学生管理窗口的ue_retrieve事件中加入如下脚本:
//实现检索功能,把过滤条件设置为空,并重新检索数据 dw_stu.setFilter("") dw_stu.SetSort("") dw_stu.SetTransObject(SQLCA) dw_stu.Retrieve() dw_stu.SetFocus() |
在学生管理窗口的ue_save事件中加入如下脚本:
//实现保存功能 If dw_stu.UpDate()=1 Then COMMIT; Else ROLLBACK; MessageBox("错误","数据库内容更新失败") End If |
在学生管理窗口的ue_sortasc事件中加入如下脚本:
//实现升序的功能 String ls_ColumnName //得到数据窗口中当前列的列名 Is_ColumnName=dw_stu.GetCOlumnName() If Is_ColumnName<>""Then dw_stu.SetSort(Is_ColumnName+"A") dw_stu.Sort() Else MessageBox("提示","请您点击数据窗口中的某一列,将此列按升序排列") End If |
在学生管理窗口的ue_sortdesc事件中加入如下脚本:
//实现降序的功能 Stirng Is_ColumnName Is_ColumnName=dw_stu.GetColumnName() If Is_ColumnName<>"" Then dw_stu.SetSort(Is_ColumnName+"D") dw_stu.Sort() Else MessageBox("提示","请您点击数据窗口中的某一列,将此列按升序排列") End If |
在数据窗口控件dw_stu的Clicked事件中加入如下脚本:
//通过单击可以选择一行或多行 Long therow,startrow,endrow If KeyDown(KeyControl!) Then //如果按着Ctrl键则使点击的行被选择 If row>0 Then //row是系统传递到Clicked事件的参数,代表当前鼠标点击的行 //事件的参数可以在脚本编辑器的“Paste Argument”下拉列表框中查看 this.SelectRow(row,True) Else Return End If ElseIf keyDown(keyShift!)Then//如果按着shift键则选择一定范围内的行 startrow=this.GetRow() endrow=row If startrow>endrow Then For therow=startrow To endRow Step-1 this.SelectRow(therow,True) Next Else For therow=startrow To endrow this.SelectRow(therow,True) Next End If Else //如果没有按Ctrl和Shift键,则取消选中状态 this.SelectRow(0,False) End If |
在数据窗口控件dw_stu的DBError事件中加入如下脚本:
//用自己的错误提示来屏蔽某些系统的错误提示 Choose case SQLDBCode //SQL Anywhere8.0主码重复的错误脚本为-193 //可以特意发生错误从而得到数据库管理系统的特定的错误脚本 case -193 MessageBox("提示信息","第"+string(row)+&"行学生编号重复",Exclamation!,OK!) ScrollToRow(row) Return 1 End Choose Return 0
|
在数据窗口控件dw_stu的DoubleClicked事件中加入如下脚本:
//双击打开成绩管理窗口,显示该学生的成绩 String Expression //得到当前行的学号,并拼出成绩的窗口的数据的过滤条件 Expression="xk_xh='"+this.object.xh[row]+"'" OpenSheetWithParm(w_score,Expression,w_main,4) |
在数据窗口控件dw_stu的RetrieveEnd事件中加入如下脚本:
//此事件在数据检索完成后处罚 Integer ColIndex,ColNum If right>2 Then //如果不是系统管理员和数据管理员则通过把列对象的Order //设为0来阻止对数据的修改 ColNum=integer(this.describe("datawindow.column.count")) For ColIndex=1 To ColNum this.SetTabOrder(ColIndex,0) Next End If |
在数据窗口控件dw_stu的ue_enterkey 事件中加入如下脚本:
Long therow If this.AcceptText()<0 Then Return 1 End If If this.GetColumn()=Long(this.object.datawindwo.column.count)Then If this.GetRow()=this.RowCount()then therow=this.Insertrow(0) Send(Handle(this),256,9,Long(0,0))//相当于在数据窗口中按下Tab键 this.ScollToRow(therow) this.SelectRow(0,False) this.SelectRow(therow,True) this.SetColumn(1) Retun 1 End If End If Send(Handle(this),256,9,Long(0,0)) Return 1 |
成绩录入窗口
在查询按钮的Clicked事件中加入如下脚本:
String kh If sle_1.text="" And Sle_2.text="" Then MessageBox("提示","请输入您要查询的关键字") sle_1.SetFocus() ElseIf sle_1.text="" Then //得到输入课程表的课程编号 SELECT kh INTO: kh FROM "kc" WHERE "kc"."km"=:sle_2.text; If SQLCA.SQLCode=100 Then MessageBox("提示信息","课程表中不存在此课程") sle_2.text="" sl3_2.SetFocus() Else //设置过滤条件,查询时用户只输入了课程名没有输入姓名 dw_score.SetFilter("xk_kh='"+kh+"'") dw_score.Filter() dw_score.SetFocus() End If ElseIf sle_2.text="" Then //设置过来条件,查询时用户只输入了姓名没有输入课程名 dw_score.SetFilter("xs_xm='"+sle_1.text+"'") dw_score.Filter() dw_score.SetFocus() Else SELECT kh INTO:kh FROM "kc" where "kc"."km"=:sle_2.text; If SQLCA.SQLCode=100 Then MessageBox("提示信息","课程表中不存在此课程") sle_2.text="" sle_2.SetFocus() Else //设置过滤条件,查询时既输入了姓名也输入了课程名 dw_score.SetFilter("xk_kh='"+kh+"'and"+"xs_xm='"+sle_1.text+"'") dw_score.Filter() dw_score.SetFocus() End If End If |
在数据窗口控件dw_score的ItemChanged事件中加入如下脚本,用来完成对当前输入学生学号时,自动从学生基本情况表中找到该学生的姓名,并填入姓名列表中。
String xm //判断是否在修改学号列 If dwo.name="xk_xh" Then //根据学号从学生基本情况表中查找学生姓名 SELECT xm INTO :xm FROM "xs" WHERE "xs"."xh"=:data; If SQLCA.SQLCode-100 Then MesssageBox("错误","该学号在学生表中不存在!") Else //设置姓名列的内容 this.object.xs_xm[row]=xm End If End If |
页面设置窗口
在页面设置窗口的Open事件中加入如下脚本:
String szDescribe //获得传递过来的数据窗口参数 i_dwToAct=Message.PowerObjectParm //获得当前数据窗口的页边框 dzDwscribe=i_dwToActOn.Desctibe("Data Window.Print.Margin.Bottom") em_bottom.Text=szDescribe dzDwscribe=i_dwToActOn.Desctibe("Data Window.Print.Margin.Left") em_left.Text=szDescribe dzDwscribe=i_dwToActOn.Desctibe("Data Window.Print.Margin.Right") em_right.Text=szDescribe dzDwscribe=i_dwToActOn.Desctibe("Data Window.Print.Margin.Top") em_top.Text=szDescribe |
在确定按钮的Clicked事件中加入如下脚本:
Deciml bottom,left,right,top String szModify,szReturn //拼写设置页边距的字符串 If em_bottom.GetData(bottom)=1 Then szModify=szMOdify+"datawindow.print.margin.bottom="+string(bottom) End If If em_left.GetData(left)=1 Then szModify=szMOdify+"datawindow.print.margin.left="+string(left) End If If em_right.GetData(right)=1 Then szModify=szMOdify+"datawindow.print.margin.bottom="+string(right) End If If em_top.GetData(top)=1 Then szModify=szMOdify+"datawindow.print.margin.bottom="+string(top) End If szModify=Trim(szModify) //设置数据窗口的页边距 szReturn=i_dwTOActOn.Modify(szModify) If szReturn<> "" Then MessageBox("错误","边框设置错误!"+"~n"+szReturn) Return End If Close(Parent) |
在取消按钮的Clicked事件中加入如下脚本:
Close(Parent) |
打印预览窗口
在打印预览窗口的Open事件中加入如下脚本:
//取得传递的数据窗口参数 i_dwToActOn=Message.PowerObjectParm |
在掩码编辑框em-custom的Modified事件中加入如下脚本:
//把"自定义"单选按钮设置为选中状态 rb_custom.checked=True |
在确定按钮的Clicked事件中加入如下脚本:
String sZoom,szReturn,szModify //取得预览比例 If rb_200p.checked=True Then sZoom="200" ElseIf rb_100p.checked=True Then sZoom="100" ElseIf rb_50p.checked=True Then sZoom="50" ElseIf rb_33p.checked=True Then sZoom="33" ElseIf rb_custom.checked=True Then sZoom=em_custom.text End If //拼写修改数据窗口预览设置的字符串 szModify=szModify+"datawindow.print.preview.zoom="+sZoom //把数据窗口的预览状态置为真 szModify=szModify+"datawindow.print.preview=YES" If cbx_rulers.checked=True Then szModify=szModify+"datawindow.print.preview.rulers="+"YES" Else szModify=szModify+"datawindow.print.preview.rulers="+"NO" End If szMOdify=Trim(szModify) //修改数据窗口预览设置 szReturn=i_dwtoaction.modify(dzModify) If szReturn<>"" Then messagebox("错误","打印预览失败!") Return End If Close(Parent) |
打印设置窗口
在打印设置窗口的Open事件中加入如下脚本:
String szCopies i_dwToActOn=Message.PowerObjectParm //取消当前使用打印机的型号 st_current_printer.text="当前打印机:"+&String(i_dwToActOn.Object.DataWindow.Printer) //取消当前数据窗口的打印份数 If szCopies=String(i_dwToActOn.Object.DataWindow.Print.Copies) //设置初试打印份数 If szCopies<>"" And szCopies<> "0" Then em_copies.Text=szCopies Else em_copies.Text="1" End If //如果当前数据窗口的打印份数校验取值为"YES",则设置"校验拷贝"复选框 //的Checked为True(选中状态),否则设为False cbx_collate.Ckecked=(Upper(String(&i_dwToActOn.Object.DataWindow.Print.Collate))="YES") //初始化下拉列表的默认选项 ddlb_range_include.SelectItem(1) |
在全部单选按钮(rb_all_page)的Clicked事件中加入如下脚本:
//清空选择页面后面单行列表框中的内容 sle_page_range.text="" |
在当前页单选按钮(rb_current_page)的Clicked事件中加入如下脚本:
sle_page_range.text="" |
在"选择页码"单选按钮(rb_page)的Clicked事件中加入如下脚本:
If this.Checked Then //点击该单选按钮后使单行编辑框获得焦点 sle_page_range.SetFocus() End If |
在单行编辑框(sle_page_range)的Modified事件中加入如下脚本:
//使"选择页码"单选按钮成为当前选项 rb_pages.checked=True |
在确定按钮的Clicked 事件中加入如下脚本:
Integer nIndex String szPage,szModify,szReturn Decimal sCopies //取得掩码编辑框的内容,即打印份数 em_copies.getdata(sCopies) //下面不但拼写szModify字符,用来保存打印属性的设置 //在字符串中保存打印份数属性 smModify="DataWindow.Print.Copies="+string(scopies) //保存打印校验属性 If cbx_collate.Checked Then szModify=szModify+"DataWindow.Print.Clooate=Yes" Else szModify=szModify+"dataWindow.Print.Collate=No" End If If rb_all_page.Checked Then //保存打印全部页码 szModify=szModify+"DataWindow.Print.Page.Range=" ElseIf rb_current_page.Checked Then //保存打印但前页码 szPage=i_dwToActOn.Describe("Evaluate('Page()',"+&String(i_dwToActOn.GetRow())+")") szModify=szModify+"DataWindow.Print.Page.Range='"szPage+"'" Else //保存打印用户输入的页码 szModify=szModify+"DataWindow.Print.Page.Range='"+&sle_page_range.text+"'" End If //取得用户在下拉列表框中所选项的索引值 nIndex=ddlb_range_include.FindItem(ddlb_range_include.Text,0) //保存希望打印页的页号 szModify=szModify+"DataWindow.Print.Page.RangeInclude="+String(nIndex-1) szModify=Trim(szModify) //修改数据窗口的打印设置 szReturn=i_dwToActOn.Modify(szModify) If szReturn<> "" Then MessageBox("错误","打印参数设置失败!") Return End If Parent.Visible=False //打印数据窗口 i_dwToActOn.Print() this.SetFocus() Close(Parent) |
在取消按钮中加入如下脚本:
Close(Parent) |
打印机设置按钮中加入如下脚本:
PrintSetup() |
查询窗口
在查询窗口中声明如下的实例变量:
s_colinfo colinfo[] //保存列注释、名称和数据类型的数组 Integer ColCount //保存当前数据窗口中列的数目 String thelogic //保存当前选择的逻辑关系 String Expression //保存查询表达式 datawindow i_dwToActOn //保存传递过来的数据窗口 |
在查询窗口的Open事件中加入如下脚本:
Integer i thelogic="" i_dwToActOn=Message.PowerObjectParm //取得当前数据窗口的列的数据 ColCount=Integer(i_dwToActOn.Object.DataWindow.Column.Count) For i=1 To ColCount //取得并保存列的简单注释、名称和数据类型 colinfo[i].colname=i_dwToActOn.Describe("#"+string(i)+".Name") colinfo[i].coltag=i_dwToActOn.Describe("#"+string(i)+".Tag") colinfo[i].coltype=left(i_dwToActOn.Describe("#"+string(i)+".ColType"),4) //在列选择下拉列表中添加项 ddlb_1.additem(i_dwToActOn.Describe("#"+string(i)+".Tag")) Next //初始化,把and默认的逻辑关系 rb_1.Checked=True ddlb_1.selectiem(1) |
在添加按钮的Clicked事件中加入如下脚本:
String thecol,val Integer i //取得用户选择的列和用户输入的具体查询条件 thecol=ddlb_1.text val=sle_1.text //从数组中查找用户选择的列在数组中的位置 For i=1 To ColCount If thecol=colinfo[i].coltag Then exit Next //根据列的数据类型,拼不同的查询字符串 Choose Case colinfo[i].coltype Case "char" //拼写查询字符串 Expression = Expression +thelogic+colinfo[i].colname & +ddlb_2.text +"'" + val+"'" Case "deci","long","numb","real" //判断用户输入是否为数值 If IsNumber(sle_1.text) Then Expression=Expression+thelogic+colinfo[i].colname & +ddlb_2.text+val Else MessageBox("错误","请输入数值作为条件") sle_1.text="" sle_1.SetFocus() Return End If Case "date" //格式化用户的输入为具体的日期格式 val=String(Date(val),"yyyy-mm-dd") Expression=Expression+thelogic+colinfo[i].colname & + ddlb_2.text+val End Choose //根据用户的选择设置逻辑关系 If rb_1.Checked Then thelogic="And" Else thelogic="Or" End If //在多行编辑框中显示查询字符串 mle_1.text=Expression |
在查询按钮的Clicked事件中加入如下脚本:
//设置过滤条件 i_dwtoacton.SetFilter(mle_1.text) i_dwtoacton.Filter() Close(Parent) |
在取消按钮中加入如下脚本:
Close(Parent) |
查选窗口
在查询窗口中声明如下的实例变量:
s_colinfo colinfo[] //保存列注释、名称和数据类型的数组 Integer ColCount //保存当前数据窗口中列的数目 datawindow i_dwToActOn //保存传递过来的数据窗口 Long row=0 //保存当前查选的其实行 |
在窗口的Open事件中加入如下脚本:
Integer i i_dwToActOn=Message.PowerObjectParm ColCoutn=Integer(i_dwToActOn.Object.DataWindow.Column.Count) For i=1 To ColCount colinfo[i].colname=i_dwToActOn.Describe("#"+string(i)+".Name") colinfo[i].coltag=i_dwToActOn.Describe("#"+string(i)+".Tag") colinfo[i].coltype=left(i_dwToActOn.Describe("#"+string(i)+".ColType"),4) ddlb_1.additem(i_dwToActOn.Describe("#"+string(i)=".Tag")) Next //取得当前行 row=i_dwtoactin.GetRow() ddlb_1.SelectIten(1) |
在查询按钮的Clicked事件中加入如下脚本:
Boolean FindToEnd String thecol.Expression,val Ingeger i //取得用户选择的列 thecol =ddlb_1.text If sle_FindWord.text="" Then MessageBox("提示","请输入您要查询的关键字") sle_FindWord.SetFocus() Return End If val=sle_FindWord.text //获得用户选择的列在数组中的位置 For i=1 To ColCount If thecol=colinfo[i].coltag Then exit Next //确定查找方向 If rb_back.Checked=True Then FindToEnd=True ElseIf rb_prior.Checked =True Then FineToEnd=False End If //若是第二次查找,则把"查找"按钮的标题改为"查找下一个",并取消上次查找行的选中状态 This.Text="查找下一个" i_dwtoaction.SelectRow(row.False) //根据数据类型的不同拼写查找字符串 Choose Case colinfo[i].coltype Case "char" Expression=colinfo[i].colname+"='"+val+"'" Case "deci","long","numb","real" If IsNumber(val) Then Expression=colinfo[i].colname+"="+val Else MessageBox("错误","请输入作为查询条件") sle_FindWord.text="" sle_FindWord.SetFocus() Return End If Case "date" val=String(Date(val),"yyyy-mm-dd") Expression=colinfo[i].colname+"="+val End Choose If FindToEnd = True Then //从前向后查找,从当前往后查找因此row++ row++ //如果row大于当前数据窗口的总行数,向下越界,把row设为0 If row<=i_dwtoaction.RowCount() Then row=i_dwtoaction.Find(Expression,row,i_dwtoaciton.RowCount()) Else row=0 End If Else //从后向前查找,从但前行往前查找因此row-- row-- //如果row小于1,向上越界,把row设为0 If row<1 Then row=0 Else row=i_dwtoaction.Find(Expression,row,0) End If End IF If row =0 Then MessageBox("警告","当前窗口内未找到此关键字") Colse(Parent) Return ElseIf row<0 Then MessageBox("错误","查找关键字失败") Return Else //把查找到的行为设置为选中状态并滚动到改行 i_dwtoacton.SelectRow(row,true) i_dwtoacton.ScrollToRow(row) End If |
在取消按钮的Clicked事件中加入如下脚本:
Close(parent) |
专业选择窗口
在窗口的Open事件中加入如下脚本:
String zy
ddlb_1.AddItem("全部")
//声明游标
DECLARE mycursor CURSOR FOR
SELECT DISTINCT zy //读出各个专业名
FROM "xs"
OPEN mycursor;
If SQLCA.SQLCode<0 Then
MessageBox("数据库错","游标无法打开")
Return
End If
FETCH mycursor INTO :zy;
//如果执行成功则SQLCode的值为0
DO WHILE SQLCA.SQLCode=0
ddlb_1.AddItem(zy)
FETCH mycursor INTO :zy;
LOOP
CLOSE mycursor;
//初始化下拉列表的选择
ddlb_1.SelectItem(1)
在确定按钮的Clicked事件中加入如下脚本:
s_statictics work
//得到菜单传递过来的统计类型
work.name-Message.StringParm
work.zy=ddlb_1.text
//打开统计窗口,并把结构体作为参数传递给统计窗口
OpenSheetWithParm(w_statictics,work,w_main,4)
Close(Parent)
统计窗口
在统计窗口的Open事件中加入如下脚本:
String sqlsoure
s_statictics work
//得到专业选择窗口或专业课程选择窗口传递过来的参数
work=Message.PowerObjectParm
//根据不同的统计是统计窗口中数据窗口控件和不同的用于统计的数据窗口睇相关联
Choose Case work.name
Case "person"
dw_st.DataObjcet="d_personst"
Case "lesson"
dw_st.DataObject="d_lessonst"
End Choose
dw_st.SetTransObject(SQLCA)
//得到数据窗口的创建语句
sqlsource=dw_st.GetSQLSelect()
//如果选择了专业,则修改数据窗口的创建语句,加上专业的条件限制
If work.zy<>"全部" Then
sqlsource=sqlsoucre+"and(xs.zy='"+work.zy+"')"
End If
//如果选择了课程,则修改数据窗口的创建语句,加上课程的条件限制
If work.km<>"" And work.km<>"全部" Then
sqlsource=sqlsource+"and(kc.km='"+work.km+"')"
End If
//设置数据窗口的创建语句
dw_st.SetSqlSelect(sqlsource)
dw_st.Retrleve()
成绩分布窗口
在窗口的Open事件中加入如下脚本:
Integer thecount[5].seriesno
Integer i
String thesql[5],kh
//work是由上一个窗口传递过来的自定义结构型参数
//work.zy表示当前选择的专业,work.km表示当前选择的课程名称
work=Message.PowerObjectParm
//添加一个系列
seriesno=gr_1.AddSeries("成绩分布")
//根据不同的分数段拼写不同的语句查询该份数段的认输
thesql[1]="SELECT COUNT(*) FROM xk,xs WHERE xk_xh=xs_xh and xk.cj>=90"
thesql[2]="SELECT COUNT(*) FROM xk,xs WHERE xk_xh=xs_xh and xk.cj>=80 and xk.cj<90"
thesql[3]="SELECT COUNT(*) FROM xk,xs WHERE xk_xh=xs_xh and xk.cj>=70 and xk.cj<80"
thesql[4]="SELECT COUNT(*) FROM xk,xs WHERE xk_xh=xs_xh and xk.cj>=60 and xk.cj<70"
thesql[5]="SELECT COUNT(*) FROM xk,xs WHERE xk_xh=xs_xh and xk.cj<60"
//如果选择了专业,则在查询语句中加入专业限制
If work.zy<>"全部" Then
For i=1 To 5
thesql[i]=thesql[i]+"and xs.zy='"+work.zy+"'"
Next
End If
//如果选择了课程,则在查询语句中加入课程限制
If work.km<>"全部" Then
//找出选择课程的课程编号
SELECT kh
INTO :kh
FROM "kc"
WHERE "kc"."km"=:work.km;
For i=1 To 5
thesql[i]=thesql[i]+"And xk.kn='"+kh+"'"
Next
End If
For i=1 To 5
//定义动态SQL来执行不同的SQL语句
DECLARE mycursor DYNAMIC CURSOR FOR SQLSA;
PREPARE SQLSA FROM :thesql[i]
OPEN mycursor;
If SQLCA.SQLCode<0 Then
MessageBox("数据库错","游标无法打开")
Return
End If
Fetch myscurso INTO :thecount[i];
CLOSE mycursor;
Next
//添加数据种类
gr_1.AddCategory("90分以上")
gr_1.AddCategory("80至90分")
gr_1.AddCategory("70至80分")
gr_1.AddCategory("60至70分")
gr_1.AddCategory("不及格")
//添加每个数据种类的数据值
gr_1.AddData(seriesno,thecount[1],"90分以上")
gr_1.AddData(seriesno,thecount[2],"80至90分")
gr_1.AddData(seriesno,thecount[3],"70至80分")
gr_1.AddData(seriesno,thecount[4],"60至70分")
gr_1.AddData(seriesno,thecount[5],"不及格")
制作可执行文件