Pb学生管理系统源代码

PowerBuilder的创始人  米歇尔克茨曼。

PowerBuilder奠基人 大卫李特瓦克。

1991年6月。Powersoft公司发布了其旗标式客户/服务器硬功开发工具。

1995年PowerBuilder1.0

1996年PowerBuilder5.0

2003年PowerBuilder9.0

PowerBuilder特点:

面向对象的编程和时间去懂的应用开发程序开发工具,

支持跨平台开发

可以轻松编写语句

人性化设计。

扫描二维码关注公众号,回复: 8498821 查看本文章

拥有独特的库文件画板和层次清晰的系统资源库。

提供了丰富多样不同风格的数据窗口

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],"不及格")

制作可执行文件

 

 

发布了178 篇原创文章 · 获赞 178 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/luckystar_99/article/details/97618780