7.9.7 学生考试成绩明细查询模块设计
学生考试成绩明细查询模块用来查询不同班级的学生考试明细信息,界面运行结果如图7.18所示。
|
| (点击查看大图)图7.18 考试成绩信息数据查询效果图 |
1.界面设计
(1)在view包下建立文件JF_view_query_grade_mx.java,该文件继承轻量组件JInternalFrame,打开UI设计器设置this的layout属性为BorderLayout类型,其name属性采用默认值borderlayout1,在borderlayout1上放置1个滚动面板组件JScrollPanel和一个面板组件JPanel,其name属性采用系统默认值jScrollPanel1、jPanel1,其中jSplitPanel1的constraints为Center,jPanel1的constraints为north方向。在jScrollPanel1上添加一个JTable表格组件,用来显示班级数据,其name采用系统默认值jTable1。用来显示检索出来的数据。
(2)设置jPanel1的layout为FlowLayOut类型,其默认值为flowlayout1;设置flowlayout1的alignment属性为center,在flowlayout1面板上放置2个JLabel标签组件、2个JComboBox列表框组件和2个JButton按钮组件。其中,设置标签组件和按钮组件的text属性请参照图7.18(考试成绩信息数据查询效果图)的右上方,JTextField组件和JComboBox组件的name属性采用默认,JButton的name属性设置为“jByes”和“jBexit”,然后按照运行结果图调整好组件之间位置。
至此,学生考试明细查询模块的界面设置已经完成,其UI设计器中的组建结构图,如图7.19所示,读者可以参考此图进行界面设计。
|
图7.19 JF_view_query_grade_mx的UI 组件结构图 |
2.代码设计
(1)单击source页打开文件源代码,导入程序所需要的类包,定义不同的String类型变量,定义一个私有方法initsize(),用来初始化列表框中的数据,供用户选择条件参数,代码如下:
/********************************例程7-41 JF_view_query_grade_mx.java******************/ public class JF_view_query_grade_mx extends JInternalFrame { String classid[] = null; String classname[] = null; String examkindid[] = null; String examkindname[] = null; public void initialize(){ RetrieveObject retrieve = new RetrieveObject(); java.util.Vector vdata = new java.util.Vector(); String sqlStr = null; java.util.Collection collection = null; java.util.Iterator iterator = null; sqlStr = "SELECT * FROM tb_examkinds"; collection = retrieve.getTableCollection(sqlStr); iterator = collection.iterator(); examkindid = new String[collection.size()]; examkindname = new String[collection.size()]; int i = 0;
while (iterator.hasNext()) { vdata = (java.util.Vector) iterator.next(); examkindid[i] = String.valueOf(vdata.get(0)); examkindname[i] = String.valueOf(vdata.get(1)); jComboBox1.addItem(vdata.get(1)); i++; } sqlStr = "select * from tb_classinfo"; collection = retrieve.getTableCollection(sqlStr); iterator = collection.iterator(); classid = new String[collection.size()]; classname = new String[collection.size()]; i = 0; while (iterator.hasNext()) { vdata = (java.util.Vector) iterator.next(); classid[i] = String.valueOf(vdata.get(0)); classname[i] = String.valueOf(vdata.get(2)); jComboBox2.addItem(vdata.get(2)); i++; } } |
(2)用户选择“考试类别”和“学生班级”后,单击“确定”按钮,进行成绩明细数据查询。在公共方法jByes_actionPerformed()中,定义一个String类型的局部变量sqlSubject,用来存储考试科目的查询语句;定义一个String类型数组变量tbname,用来为表格模型设置列的名字。定义公共类RetrieveObject的变量retrieve,然后执行retrieve的方法getTableCollection(),其参数为sqlSubject。当结果集中存在数据的时候,定义一个String变量sqlStr,用来生成查询成绩的语句,通过一个循环语句为sqlStr赋值,再定义一个公共类RetrieveObject类型的变量bdt,执行bdt的getTableModel方法,其参数为sqlStr和tbname变量。公共方法jByes_actionPerformed()的详细代码如下:
/*******************************例程7-42 JF_view_query_grade_mx.java******************/ public void jByes_actionPerformed(ActionEvent e) { String sqlSubject = null; java.util.Collection collection = null; Object[] object = null; java.util.Iterator iterator = null; sqlSubject = "SELECT * FROM tb_subject"; RetrieveObject retrieve = new RetrieveObject(); collection = retrieve.getTableCollection(sqlSubject); object = collection.toArray(); String strCode[] = new String[object.length];//定义数组存放考试科目代码 String strSubject[] = new String[object.length]; //定义数组存放考试科目名称 String[] tbname = new String[object.length + 2]; //定义数组存放表格组件的列名 tbname[0] = "学生编号"; tbname[1] = "学生姓名"; String sqlStr = "SELECT stuid, stuname, "; for (int i = 0 ; i < object.length ; i++){ String code = null,subject = null; java.util.Vector vdata = null; vdata = (java.util.Vector)object[i]; code = String.valueOf(vdata.get(0)); subject = String.valueOf(vdata.get(1)); tbname[i+2] = subject; if ( (i + 1) == object.length){ sqlStr = sqlStr + " SUM(CASE code WHEN '" + code + "' THEN grade ELSE 0 END) AS '" + subject + "'"; }else{ sqlStr = sqlStr + " SUM(CASE code WHEN '" + code + "' THEN grade ELSE 0 END) AS '" + subject + "',"; } } String whereStr = " where kind"; //为变量whereStr进行赋值操作生成查询的SQL语句 whereStr = " where kindID = '" + this.examkindid [jComboBox1.getSelectedIndex()] + "' and subString(stuid,1,4) = '" + this.classid[jComboBox2.getSelectedIndex()] + "' "; //为变量sqlStr进行赋值操作生成查询的SQL语句 sqlStr = sqlStr + " FROM tb_gradeinfo_sub " + whereStr + " GROUP BY stuid,stuname "; DefaultTableModel tablemodel = null; appstu.util.RetrieveObject bdt = new appstu.util.RetrieveObject(); tablemodel = bdt.getTableModel(tbname, sqlStr); // 通过对象bdt的getTableModel方法为表格赋值 jTable1.setModel(tablemodel); if (jTable1.getRowCount() <= 0 ){ JOptionPane.showMessageDialog(null,"没有找到满足条件的数据!!!"," 系统提示",JOptionPane.INFORMATION_MESSAGE); } jTable1.setRowHeight(24); jLabel1.setText("共有数据【" + String.valueOf(jTable1.getRowCount())+ "】条"); } |
根据上面的介绍,设计完成学生成绩汇总的查询数据,其设计方法同7.9.7节相似,这里就不再进行叙述。这里笔者只介绍用户单击“确定”按钮时的查询语句,这个方法是通过在程序中动态创建视图然后从视图中进行数据汇总数据的查询,其中方法jByes_actionPerformed()的关键代码如下:
/*******************************例程7-43 JF_view_query_grade_mx.java*******************/ public void jByes_actionPerformed(ActionEvent e) { // 此处省略了考试科目查询代码 String sqlStr = "CREATE VIEW TempView As SELECT stuid, tb_classinfo.className, "; // 此处省略为变量sqlStr生成SQL语句的循环代码 sqlStr = sqlStr + " FROM tb_gradeinfo_sub, tb_classinfo " + whereStr + " GROUP BY stuid,tb_classinfo.className "; appstu.util.JdbcAdapter jdbcAdapter = new appstu.util.JdbcAdapter(); if (jdbcAdapter.BuildeDeleteTempView(sqlStr)){ String[] tbname = new String[object.length + 2]; tbname[0] = "班级名称"; tbname[1] = "学生人数"; String sqlView = null; sqlView = "SELECT className AS 班级名称,COUNT(stuid) AS 学生人数,"; for(int i = 0 ; i < strSubject.length ; i++){ tbname[i+2] = strSubject[i]; if ((i + 1) == strSubject.length){ sqlView = sqlView + "sum(" + strSubject[i] + ") as '" + strSubject[i] + "'"; }else{ sqlView = sqlView + "sum(" + strSubject[i] + ") as '" + strSubject[i] + "',"; } } sqlView = sqlView + " from TempView GROUP BY SUBSTRING(stuid, 1, 4), className"; DefaultTableModel tablemodel = null; appstu.util.RetrieveObject bdt = new appstu.util.RetrieveObject(); tablemodel = bdt.getTableModel(tbname, sqlView); jTable1.setModel(tablemodel); String dropSql = "DROP VIEW TempView "; jdbcAdapter.BuildeDeleteTempView(dropSql); } if (jTable1.getRowCount() <= 0 ){ JOptionPane.showMessageDialog(null,"没有找到满足条件的数据!!!"," 系统提示",JOptionPane.INFORMATION_MESSAGE); } jTable1.setRowHeight(24); jLabel1.setText("共有数据【" + String.valueOf(jTable1.getRowCount())+ "】条"); } |
【责任编辑:
夏书 TEL:(010)68476606】