实验三数据窗口的编程.docx
《实验三数据窗口的编程.docx》由会员分享,可在线阅读,更多相关《实验三数据窗口的编程.docx(14页珍藏版)》请在冰豆网上搜索。
实验三数据窗口的编程
实验三数据窗口的编程
一、目的和要求
(1)进一步加深对数据窗口的了解,熟悉数据窗口画板的使用和数据窗口对象属性的调整方法;
(2)加深对数据窗口类型、各种类型数据窗口的特点以及使用方法的认识;
(3)掌握选项卡控件的使用和编程方法;
(4)掌握数据窗口各种类型数据检索程序的设计方法。
二、上机准备
(1)复习窗口控件中关于选项卡控件的有关内容,有关数据窗口对象的内容,以及有关数据窗口控件的内容;
(2)启动PowerBuilder9.0;
(3)选择已经创建的应用mypb.pb1;
(4)连接数据库到已创建的student。
三、上机步骤
本次实验将制作一个数据库查询窗口,该窗口中有一个包含了4页的选项卡,分别对应于4种不同的查询方式。
第1页是按学生姓名查询,只要在姓名栏中输人要查询的学生姓名单击“查询”按钮,就可以在student表中查出该学生的数据,见图4;第2页是按学生的家庭地址的模糊查询,只要在地址栏中输入要查询地址的一部分信息,单击“查询”按钮,就可以在student表中查出与该地址有关的学生的数据,见图5;第3页是按学生的出生日期查询,只要在两个日期栏中分别输人日期的下限和上限,单击“查询”按钮,就可以查出在此时间段中出生的所有学生的数据,见图6;第4页是按学生的党团员情况查询,只要在组合框中单击要查询的单选钮,就可以在数据窗口中查出与该单选钮对应政治面貌的学生数据,见图7。
1.创建窗口对象
创建一个新的弹出式窗口对象,Title为“学生数据查询”;WndowType为“popup!
”;保存窗口名称为w_querystudent。
2.向窗口中添加控件
(1)布置窗口中的静态文本控件
窗口中只有一个标题使用静态文本控件,在窗口控件下拉列表工具栏图标中选择静态文本控件,然后在窗口上单击,生成静态文本控件。
在Text属性栏中输入“学生数据查询”,选择“方正舒体”36号字体,选中“Bold”复选框,TextColor为黑色。
(2)布置窗口中的“退出”按钮控件
在窗口控件下拉列表工具栏图标中选择命令按钮控件,然后在窗口上单击,生成命令按钮控件。
窗口中只有1个命令按钮控件,作为“退出”按钮。
设置按钮的名称为cb_exit,Text属性为“退出”,选中Cancel属性,选择“方正舒体”22号黑色字体,选中“Bold”复选框。
“退出”按钮的Clicked事件脚本为;
Close(Parent)
(3)布置窗口中的选项卡控件
在窗口控件下拉列表工具栏图标中选择选项卡控件,然后在窗口上单击,生成选项卡控件。
拖动选项卡的边框,调整选项卡的尺寸。
在选项卡上面的标签部位单击,选中选项卡控件,这时按下鼠标左键可以拖动选项卡,调整选项卡的位置。
此时属性窗口中的属性为选项卡控件的属性,保留缺省的名称Name为“tab_l”。
在选项卡的下部单出,选中的是选项页,设置Name属性为“tabpage_name”;text属性为“按姓名”。
在选项卡上面的标签部位单击右键,选择弹出菜单中“InsertTabpage”菜单项,这时会弹出一个新的选项页,设置Name属性为“tabpage_home”;Text属性为“按家庭地址”。
同样方法制作出共4页的选项卡,其余各页的Name属性和text属性分别为“tabpage_birthday”、“按出生日期”,“tabpage_party”、“按党团员”。
3.关联窗口W_Querystudent到应用程序中
打开创建的mypb应用的open事件窗口,添加事件的脚本为:
Open(w_querystudent)
4.设计“按姓名”查询选项页
(1)设计数据窗口对象
按姓名查询的数据窗口对象是一个条件查询的数据窗口,其设计步骤为:
l)单击New图标按钮,弹出“New”对话框;
2)选择DataWindow选项页,双击FreeForm图标,弹出“ChooseDataSourceforFreeFormDataWindow”对话框;
3)选择“SQLSelect”数据源方式,单击“Next”按钮,弹出“SelectTable”对话框;
4)在Table列表框中选择student表,单击“Open”按钮,这时弹出Select画板;
5)单击菜单Design∣RetrievalArguments…弹出SpecifyRetrievalArguments”对话框,在Name栏中输入ls_name,在Type下拉列表框中选择String,单击“OK”按钮,对话框关闭:
6)在Select画板的TableLayout子窗口中的表框中列出了student表的全部字段的名称,每单击一个字段,该字段就变为蓝底白字,表示选中,同时,会在上面的“SelectionList:
”区域中排列出该宇段。
如果单击选中的字段,就会变为不被选中,该字段从上面的排列中消失。
单击每一个字段,将全部字段选中;
7)在Select画板的Where子窗口中单击Colunm栏,右边出现一个“▼”符号,单击“▼”按钮,弹出student表的所有字段,选择“student”.“name”,在右边的Value栏中,单击右键,选择弹出菜单中的“Arguments...”,弹出一个小窗口,内部有刚才定义的变量“:
Is_name”,单击选中它,单击“Paste”按钮,“:
ls_name”就出现在Value栏中。
设计好的Select画板见图8。
图8Select画板
8)单击“Return”图标按钮,弹出“SelectColorlBorderSettings”对话枢,单击“Next”按钮,弹出“ReadytoCreateFreeFormDataWindow”对话框。
,该对话框对数据窗口对象的主要属性进行了小结。
单击“Finish”按钮,弹出“SpecifyRetrievalArguments”对话框,要求对检索变量ls_name进行赋值,以便对数据库进行数据检索,并将检索结果放到Preview子窗口中。
可以在Value栏中输人一个姓名后按“OK”键进行检索,也可以按“Cancel”键不进行检索,然后进入数据窗口对象画板。
9)在数据窗口对象画板中,将字段名称改为中文,调整字段的位置和大小,设置文字颜色、背景颜色和字段边框;
10)选择菜单Edit∣Select∣SelectColunms,将所有字段全部选中,然后在Properties属性卡中选择Edit页,选中“DisplayOnly”复选框,不选中“AutoSelection”复选框;
11)保存数据窗口对象名称为d_queryname。
(2)在tabpage_name选项贞中布置控件
在tabpage_name选项页中布置一个静态文本控件,其Text为“请输入学生姓名”,size为12,宋体;一个单行编辑框,Name为“sle_name”;一个命令按钮,其Name为“cb_name”,Text属性为“查询”,选中“Default”复选框;还有一个数据窗口控件,其Name为“dw_name”;DataObjeCt为d_queryname,选中HSCrollBar和VSCrollBar复选框。
保存所做的工作。
(3)编写脚本
“查询”按钮的Clicked事件脚本为:
stringIs_name
Is_name=trim(Sle_name.text)
ifnotls_name=""then
dw_name.retrieve(ls_name)
else
MessageBOX("数据不全","请输入待查询学生的姓名。
")
endIf
sle_name.setFocus()
在w_querystudent查询窗口的Open事件中,还需要为数据窗口使用数据库设置事物对象,如下面代码:
tab_1.tabpage_name.dw_name.SetTransObject(SQLCA)
上面语句中反映了数据窗口对象dw_name属于选项页tabpage_name,而选项页tabPage_name又属于选项卡控件tab_l;选项卡控件tab_l直接属于窗口对象。
在程序设计中,类似的这种层次关系不能搞错。
(4)测试“按姓名查询”程序
尽管我们的查询程序还没有做完,但是,“按姓名查询”选项页已经可以使用了。
运行程序,在“按姓名查询”页的姓名栏中输入一个数据库中己经存在的学生姓名,查看检索结果。
图1 按学生姓名查询
5.设计“按家庭地址”查询选项页
“按家庭地址”查询的数据窗口对象与“按姓名”查询的数据窗口对象一样都是一个条件查询的数据窗口,但是二者又有不同,“按姓名”查询要求查询条件完全符合,即要求查询的学生姓名必须与查到的学生姓名完全一致;而“按家庭地址”查询则不要求完全对应要求具有一定的模糊查询功能。
例如,地址为“河南省、郑州市、中原东路、127号”,如果只输入“河南”或“郑州”,甚至“127号”,也能够将上述地址的记录查出来。
其设计步骤为:
(1)设计数据窗口对象
数据窗口对象的设计过程与“按姓名”’查询的数据窗口对象的设计十分相似,数据窗口对象选择Grid风格。
增加一个检索参数RetrievalArgument为ls_home,在Select画板的Where子窗口中设计的条件为:
"student"."home"like:
ls_home
保存数据窗口对象名称为d_queryhome。
(2)在tabpage_name选项页中布置控件
在tabpage_name选项页中布置一个静态文本控件,其Text为“请输入家庭地址”,size为12,宋体;一个单行编辑框,Name为“sle_name“;一个命令按钮,其Name为“cb_home”,Text属性为“查询”,选中“Default”复选框;还有一个数据窗口控件,其Name为dw_home”;DataObject为d_queryhome,选中HScrollBar和VScrollBar复选框。
保存所做的工作。
(3)编写脚本
“查询”按钮的Clicked事件脚本为:
stringIs_home
Is_home=trim(Sle_home.text)
ifnotls_home=""then
ls_home="%"+ls_home+"%"
dw_home.retrieve(ls_home)
else
MessageBox("数据不全","请输入待查询学生的地区名称。
")
endif
sle_home.setFocus()
在w_querystudent查询窗口的Open事件中,再增加为数据窗口dw_home使用数据库的事物对象的代码:
tab_1.tabpage_home.dw_home.SetTransObject(SQLCA)
(4)测试“按家庭地址”查询程序
运行程序,在“按家庭地址”查询页的地址栏中输入一个地址中的一部分;查看检索结果。
图2 按家庭住址查询
6.设计“按出生日”查询选项页
“按出生日期”查询的数据窗口对象采用的是限定日期范围的双条件查询的数据窗口,它将在指定日期范围之内的所有记录都检索出来。
其设计步骤为;
(1)设计数据窗口对象
数据窗口对象的设计过程与前面“按姓名”查询和“按出生日期”查询的数据窗口对象的设计十分相似,增加两个日期类型的检索参数RetrievalArgument分别为ld_startdate和ld_enddate,在Select画板的Where子窗口中设计的条件为:
"student"."birthday">=:
ld_startdateAnd
"sudent"."birthday"<=:
ld_enddate
保存数据窗口对象名称为d_querybirthday。
(2)在tabpage_birthday选项页中布置控件
在tabPage_birthday选项页中布置两个静态文本控件,其Text属性分别为“请输人日期范围”和“至”,Size为12,宋体;两个单行编辑框,Name分别为“sle_datestart”和“sle_dateend”;一个命令按钮,其Name为“Cb_birthday”,Text属性为“查询”,选中“Default”复选框;还有一个数据窗口控件,其Name为“dw_birthday”,DataObject为d_querybirthday,选中HScrollBar和VScrollBar复选框。
保存所做的工作。
(3)编写脚本
“查询”按钮的Clicked事件脚本为:
stringls_start,ls_end
dateld_Start,ld_end
ifIsDate(sle_datestart.text)then
ifIsDate(sle_dateend.text)then
ld_start=date(sle_datestart.text)
ld_end=date(sle_dateend.text)
dw_birthday.retrieve(ld_start,ld_end)
else
MessageBox("数据错误","请重新输入结束日期。
")
endif
else
MessageBox("数据错误","请重新输入开始日期。
")
endIf
sle_datestart.SetFocus()
在w_querystudent查询窗口的Open事件中,再增加为数据窗口dw_birthday使用数据库的事物对象的代码:
tabl.tabpage_birthday.dw_birthday.SetTansObject(SQLCA)
(4)测试“按出生日期”查询程序
运行程序,在“按出生日期”查询页的两个日期栏中分别输入要求检索学生的出生日期,查看检索结果。
图3 按出生日期查询
7.设计“按党团员”查询选项页
“按党团员”查询选项页中没有“查询”按钮,该选项页中对数据库的查询是由单选按钮组的选择触发的。
其设计步骤为:
(1)设计数据窗口对象
数据窗口对象的设计过程与前面“按姓名”查询和“按出生日期”查询的数据窗口对象的设计十分相似,增加一个字符串类型的检索参数为ls_party,在Select画板的Where子窗口中设计的条件为:
"student"."party"=:
Is_party
保存数据窗口对象名称为d_queryparty。
(2)在tabpage_party选项页中布置控件
在tabpage_party选项页中布置一个分组框控件,其Text属性为“选择”;3个单选按钮控件,Name分别为“rb_cy”,“rb_cb”和“rb_none”,Text属性分另为“团员”,“党员”和“非党团员”,选中“rb_cy”单选按钮的‘Checked”复选框;布置一个数据窗口控件,其Name为“dw_party”,DataObject为d_queryparty,选中HScrollBar和VScrollBar复选框。
保存所做的工作。
(3)编写脚本
“团员”单选按钮的Clicked事件脚本为:
dw_party.retrieve(”团员”)
“党员”单选按钮的Clicked事件脚本为:
dw_party.retrieve(”党员”)
“非党团员”单选按钮的Clicked事件脚本为:
dw_party.retrieve(”非”)
在w_querystudent查询窗口的Open事件中,再增加数据窗口dw_Party使用数据库的事物对象和初始化的代码:
tabl.tabpage_party.dw_party.SetTransObject(SQLCA)
tabl.tabpage_party.dw_party.retrieve(”团员”)
(4)测试“按党团员”查询程序
运行程序,在“按党团员”查询页中选择不同的单选按钮,查看检索结果。
图4 按政治面貌查询
四、实验结果
图6按学生姓名查询
图7按家庭地址的查询
图8按出生日期的查询
图9按党团员查询
(一)
图9按党团员查询
(二)
图9按党团员查询(三)
五、实验总结
这次实验,我使用PB连接数据库实现了学生数据的查询功能,在实验过程中我遇到了很多问题。
首先,由于前两次实验的马虎大意,在做实验时总是忘记连接数据库导致总是查询不到。
其次,在建立数据库时,由于数据类型的定义错误使得模糊查询功能失败,这些错误使我了解到在编程开发过程中一定要认真仔细,在编程过程中任何一个微小的错误都可能导致任务的失败。
虽然这次实验并不是一帆风顺的完成了,但在程序出现问题、解决问题的过程中我收获了很多,在解决问题的过程中与同学进行了多次的讨论,给自己学习上带来了收获。