⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stugradeview.cpp

📁 成绩管理系统
💻 CPP
📖 第 1 页 / 共 3 页
字号:
        szSQL="SELECT 班级名称,学生基本信息.学号,姓名,课程名称,考试名称,成绩,专业名称,系名 FROM 成绩表,学生基本信息,考试类型代码,班级信息,课程信息,专业信息,系别信息 WHERE 系别信息.系别代码 = 专业信息.所属系别 AND 专业信息.专业代码 = 班级信息.所属专业 AND 成绩表.学号 = 学生基本信息.学号 AND 成绩表.考试代码 = 考试类型代码.考试代码 AND 学生基本信息.所属班级 = 班级信息.班级代码 AND 成绩表.课程代码 = 课程信息.课程代码 AND ((考试类型代码.考试名称 = '补考成绩' AND 成绩<60) or (考试类型代码.考试名称 = '总评成绩' AND 成绩<40)) ";
	}   
   curSQL = szSQL;
	int state = RefreshGradeList(szSQL);
	if (state==0)
		MessageBox("此条件没有重修记录!","重修",MB_OK|MB_ICONINFORMATION);
	
}

void CSTUGRADEView::OnGoodGrade() //评优秀
{
	CString szSQL;
   	CDlgGrade dlg; int b_Np;
    CString b_Sno,b_Sname,b_Cname,b_Ename,b_Score,b_School; //b_Score为合格分数线//*Np,*school树层数和各值
	dlg.m_nFlag = 4; //评优标志
    dlg.b_Sno = &b_Sno; 
	dlg.b_Sname = &b_Sname;
	dlg.b_Cname = &b_Cname;
	dlg.b_Ename = &b_Ename;
	dlg.b_Score = &b_Score;
	dlg.b_Np = &b_Np;
    dlg.b_School = &b_School;
	dlg.pListCtrl=(CListCtrl*)GetDlgItem(IDC_GradeLIST);
	int ask = dlg.DoModal();
	if (ask == 1)  //确定的话
	{ 
		CString szSQLlast;
		szSQL="SELECT 班级名称,学生基本信息.学号,姓名,课程名称,考试名称,成绩,专业名称,系名 FROM 成绩表,学生基本信息,考试类型代码,班级信息,课程信息,专业信息,系别信息 WHERE 系别信息.系别代码 = 专业信息.所属系别 AND 专业信息.专业代码 = 班级信息.所属专业 AND 成绩表.学号 = 学生基本信息.学号 AND 成绩表.考试代码 = 考试类型代码.考试代码 AND 学生基本信息.所属班级 = 班级信息.班级代码 AND 成绩表.课程代码 = 课程信息.课程代码 ";
		szSQLlast.Format(" AND 成绩>=%s",b_Score);	  
		szSQL += szSQLlast;

		szSQLlast.Format(" AND 考试名称 = '%s'",b_Ename);
		szSQL += szSQLlast;
	//	AfxMessageBox(szSQL);
		if ((b_Sno!="所有...") && (b_Sname != "所有..."))
		{   
			szSQLlast.Format(" AND 成绩表.学号 = '%s'",b_Sno);
			szSQL += szSQLlast;
		}
        if (b_Cname!="所有...")  //有课程限制
		{
			szSQLlast.Format(" AND 课程名称='%s'",b_Cname);
			szSQL += szSQLlast;
		}
		if (b_Np)  //学院树层  0层全校
		{
            if (b_Np==1)  //学院
			{
				szSQLlast.Format(" AND 系名 = '%s'",b_School);
				szSQL += szSQLlast;	
			}
			if (b_Np==2)  //专业
			{
				szSQLlast.Format(" AND 专业名称 = '%s'",b_School);
				szSQL += szSQLlast;	
			}
			if (b_Np==3)  //班级
			{
				szSQLlast.Format(" AND 班级名称 = '%s'",b_School);
				szSQL += szSQLlast;	
			}
		}	//end (b_Np)
	}
	else //默认取消时取		总评成绩>=80
	{
        szSQL="SELECT 班级名称,学生基本信息.学号,姓名,课程名称,考试名称,成绩,专业名称,系名 FROM 成绩表,学生基本信息,考试类型代码,班级信息,课程信息,专业信息,系别信息 WHERE 系别信息.系别代码 = 专业信息.所属系别 AND 专业信息.专业代码 = 班级信息.所属专业 AND 成绩表.学号 = 学生基本信息.学号 AND 成绩表.考试代码 = 考试类型代码.考试代码 AND 学生基本信息.所属班级 = 班级信息.班级代码 AND 成绩表.课程代码 = 课程信息.课程代码 AND 考试类型代码.考试名称 = '总评成绩' AND 成绩>=80 ";
	}   
    curSQL = szSQL;
	int state = RefreshGradeList(szSQL);
	if (state==0)
		MessageBox("此条件没有优秀学生记录!","优秀",MB_OK|MB_ICONINFORMATION);	

	
}

void CSTUGRADEView::OnCentGRADE() //计算生成每个学生的总学分
{
	int showorno = MessageBox("系统可能已生成每个学生总学分,但数据可能未更新,确定要重新统计总学分吗?","学分统计",MB_YESNO|MB_ICONQUESTION);
	if (showorno == IDYES)
	{   int i=0;
       	struct StuCent  //定义学生对应学分结构体
		{
			CString Sno;
			double TCent;
		}Stu[10000];  //10000个学生
         ////////////先删除临时表////////
		        CString szSQLdel="DELETE FROM T_分科学分";
				CString	szSQLdelstu="UPDATE 学生基本信息 SET 总得学分 = NULL ";

				try{
					 pFrame->ExecSQL(szSQLdel);
					 pFrame->ExecSQL(szSQLdelstu);
				}catch(_com_error e)///捕捉异常
				{	} 
         ////////////////////////////
		CString szSQL="SELECT 学号, 课程代码 FROM 成绩表 GROUP BY 学号,课程代码";  //把所有学生和它选课  一个个选出来   
		int Cent=0 ;
		_RecordsetPtr p_set,p_set1; 
		p_set.CreateInstance(__uuidof( Recordset ));
		p_set1.CreateInstance(__uuidof( Recordset ));
		p_set->Open((LPCSTR)szSQL,RS_PARAM); 
		while (!p_set->adoEOF)
		{   CString szSno,szCno;
			bool CnoOK=false;  //此科学分有无
			double Grade=0;  
			 szSno  = (char*) ((_bstr_t) p_set->Fields->Item["学号"]->Value); 
			 szCno  = (char*) ((_bstr_t) p_set->Fields->Item["课程代码"]->Value);    
			CString SQL1;
			SQL1.Format("SELECT 成绩 FROM 成绩表,考试类型代码 WHERE 成绩表.考试代码 = 考试类型代码.考试代码 AND 考试类型代码.考试名称 = '总评成绩' AND (学号='%s') AND (课程代码 = '%s')",szSno,szCno);
            p_set1->Open((LPCSTR)SQL1,RS_PARAM);
			if (!p_set1->adoEOF) Grade = atof((char*) ((_bstr_t) p_set1->Fields->Item["成绩"]->Value));
			if (p_set1->State == adStateOpen) p_set1->Close();
			if ( Grade >= 60 )  
				CnoOK = true;  //此学生此科总评成绩OK 有学分
			else 
			{  //看补考过了没有		        	
				SQL1.Format("SELECT 成绩 FROM 成绩表,考试类型代码 WHERE 成绩表.考试代码 = 考试类型代码.考试代码 AND 考试类型代码.考试名称 = '补考成绩' AND (学号='%s') AND (课程代码 = '%s')",szSno,szCno);
				p_set1->Open((LPCSTR)SQL1,RS_PARAM);
				if (!p_set1->adoEOF) Grade = atof((char*) ((_bstr_t) p_set1->Fields->Item["成绩"]->Value));
				if (p_set1->State == adStateOpen) p_set1->Close();
				if ( Grade >= 60 )
					CnoOK = true;  //此学生此科补考成绩OK 有学分
				else 
				{  //看重修过了没有
					SQL1.Format("SELECT 成绩 FROM 成绩表,考试类型代码 WHERE 成绩表.考试代码 = 考试类型代码.考试代码 AND 考试类型代码.考试名称 = '重修成绩' AND (学号='%s') AND (课程代码 = '%s')",szSno,szCno);
					p_set1->Open((LPCSTR)SQL1,RS_PARAM);
					if (!p_set1->adoEOF) Grade = atof((char*) ((_bstr_t) p_set1->Fields->Item["成绩"]->Value));
					if (p_set1->State == adStateOpen)
						p_set1->Close();
					if ( Grade >= 60 ) 
						CnoOK = true;  //此学生此科重修成绩OK 有学分,真狗屎!
				}
			}
			
			if (CnoOK)  //这个课程号有学分有效!  //把它放在临时表中,统计有用
			{	
				double CnoCent=0;	//查不到课程学分取0			
			    CString szSQLcno,szSQLinto,SCen,Course;				
				szSQLcno.Format("SELECT * FROM 课程信息 WHERE (课程代码 = '%s')",szCno);
                p_set1->Open((LPCSTR)szSQLcno,RS_PARAM);
				if (!p_set1->adoEOF)  
				{
					CnoCent = atof((char*) ((_bstr_t) p_set1->Fields->Item["学分"]->Value));
					Course = ((char*) ((_bstr_t) p_set1->Fields->Item["课程名称"]->Value));
				}
				p_set1->Close();
				SCen.Format("%f",CnoCent);
                szSQLinto.Format("INSERT INTO T_分科学分 VALUES ('%s', '%s', '%s')", szSno ,Course,SCen);
				try{
					 pFrame->ExecSQL(szSQLinto);
				}catch(_com_error e)///捕捉异常
				{
					CString errormessage;
					errormessage.Format("无法统计总学分!\r\n错误信息:%s",e.ErrorMessage());
				//	AfxMessageBox(errormessage);///显示错误信息
				} 

				if (Stu[i].Sno!=szSno)
				{
					i++;   //所以学生结构体从1起
					Stu[i].Sno=szSno;
                    Stu[i].TCent=CnoCent;
				}
				else
				{
                    Stu[i].TCent+=CnoCent;
				}
			}			
			p_set->MoveNext();  
		}	//end while
		p_set->Close();
          // 有 从1到i 个学生有总学分 //插入!!!
		for (int k=1;k<=i;k++)
		{
			CString UpSQL,totalCent;
			totalCent.Format("%f",Stu[k].TCent);
			UpSQL.Format("UPDATE 学生基本信息 SET 总得学分 = %s WHERE (学号 = '%s')",totalCent,Stu[k].Sno);
            HRESULT hr;	
			try{
		    	hr = pFrame->ExecSQL(UpSQL);
			}catch(_com_error e)///捕捉异常
			{
			CString errormessage;
			errormessage.Format("无法统计总学分!\r\n错误信息:%s",e.ErrorMessage());
			AfxMessageBox(errormessage);///显示错误信息
			} 
		}		
	}	
	//显示
	
    POSITION pos = pFrame->pDocTemp4->GetFirstDocPosition();
	if(pos)
	{
		CDocument *pDoc = pFrame->pDocTemp4->GetNextDoc(pos);
		pos = pDoc->GetFirstViewPosition();
		::BringWindowToTop(pDoc->GetNextView(pos)->GetParentFrame()->m_hWnd);
	}
	else
		pFrame->pDocTemp4->OpenDocumentFile(NULL);
}

void CSTUGRADEView::OntogetherGRADE() //生成总评成绩
{ 
	int showorno = MessageBox("系统可能已生成总评成绩,确定要重新生成总评成绩吗?","生成总评",MB_YESNO|MB_ICONQUESTION);
	if (showorno == IDYES)
	{
		int ption;  //平时成绩占的比例,这里放大了100倍,一会记得除
		CDLGpption dlg;
		dlg.pption=&ption;
		int a = dlg.DoModal();
		if (a==IDOK)  // 默认设置  0.3 平时 + 0.7 考试
		{   //先删除原有的总评成绩
			CString szSQL="DELETE FROM 成绩表 WHERE (考试代码 = '05')";
			HRESULT hr;	
			try{
				hr = pFrame->ExecSQL(szSQL);
			}catch(_com_error e)///捕捉异常
			{
				CString errormessage;
				errormessage.Format("无法生成总评成绩!\r\n错误信息:%s",e.ErrorMessage());
				AfxMessageBox(errormessage);///显示错误信息
			} 			
			//按组分//把所有学生和它选课  一个个选出来
			szSQL="SELECT 学号, 课程代码 FROM 成绩表 WHERE (考试代码 = '01') OR (考试代码 = '02') GROUP BY 学号, 课程代码";
			
			_RecordsetPtr p_set,p_set1,p_set2; 
			p_set.CreateInstance(__uuidof( Recordset ));
			p_set1.CreateInstance(__uuidof( Recordset ));
			p_set2.CreateInstance(__uuidof( Recordset ));
			
			p_set->Open((LPCSTR)szSQL,RS_PARAM); 
			
			while (!p_set->adoEOF)  //一个个学号来!
			{  
				double totalG=0,pGrd=0,zGrd=0;
				CString szSno  = (char*) ((_bstr_t) p_set->Fields->Item["学号"]->Value); 
				CString szCno  = (char*) ((_bstr_t) p_set->Fields->Item["课程代码"]->Value);    
				CString SQL1,SQL2;
				SQL1.Format("SELECT 成绩 FROM 成绩表 WHERE (考试代码 = '01') AND (学号 = '%s') AND (课程代码 = '%s')",szSno,szCno);
				SQL2.Format("SELECT 成绩 FROM 成绩表 WHERE (考试代码 = '02') AND (学号 = '%s') AND (课程代码 = '%s')",szSno,szCno);
				p_set1->Open((LPCSTR)SQL1,RS_PARAM);
				p_set2->Open((LPCSTR)SQL2,RS_PARAM);
				if (!p_set1->adoEOF) pGrd = atof((char*) ((_bstr_t) p_set1->Fields->Item["成绩"]->Value));
				if (!p_set2->adoEOF) zGrd = atof((char*) ((_bstr_t) p_set2->Fields->Item["成绩"]->Value));
				p_set1->Close();
				p_set2->Close();
				//比例计算总评
				totalG=pGrd*ption/100;
				totalG+=zGrd*(100-ption)/100;
				CString szSQLtotal,CtotalG;
				CtotalG.Format("%f",totalG);
				szSQLtotal.Format("INSERT INTO 成绩表 VALUES ('%s','%s','05',%s)",szSno,szCno,CtotalG);
				HRESULT hr;	
				try{
					hr = pFrame->ExecSQL(szSQLtotal);
				}catch(_com_error e)///捕捉异常
				{
					CString errormessage;
					errormessage.Format("无法生成总评成绩!\r\n错误信息:%s",e.ErrorMessage());
					AfxMessageBox(errormessage);///显示错误信息
				} 
				p_set->MoveNext();
			}
		}
	}//end 重新生成
    curSQL = "SELECT 班级名称,学生基本信息.学号,姓名,课程名称,考试名称,成绩,专业名称,系名 FROM 成绩表,学生基本信息,考试类型代码,班级信息,课程信息,专业信息,系别信息 WHERE 系别信息.系别代码 = 专业信息.所属系别 AND 专业信息.专业代码 = 班级信息.所属专业 AND 成绩表.学号 = 学生基本信息.学号 AND 成绩表.考试代码 = 考试类型代码.考试代码 AND 学生基本信息.所属班级 = 班级信息.班级代码 AND 成绩表.课程代码 = 课程信息.课程代码 AND 考试名称 = '总评成绩'";
	RefreshGradeList(curSQL);
}

void CSTUGRADEView::OnDeleteGrade() //删除成绩
{   
	CListCtrl *pList = (CListCtrl*)GetDlgItem(IDC_GradeLIST);
	if(pList->GetSelectedCount()!=1)
		MessageBox("请先选择一项记录!","删除出错",MB_OK|MB_ICONQUESTION);
	else
	{ 
		int nItem; CString Sno,Cname,Ename,Msg,Sname ,Cno,Eno;
		nItem = pList->GetSelectionMark();
		Sno = pList->GetItemText(nItem,1);
		Cname = pList->GetItemText(nItem,3);
		Ename = pList->GetItemText(nItem,4);
		Sname = pList->GetItemText(nItem,2);
		Msg.Format("确定删除{%s}的<%s>的%s成绩吗?",Sname,Cname,Ename);
		int ans= MessageBox(Msg,"删除记录",MB_OKCANCEL|MB_ICONEXCLAMATION|MB_ICONWARNING|MB_APPLMODAL);
		if (ans == IDOK)
		{  
			CString szSQL;
			//找课程代码
            _RecordsetPtr p_set;
			if(FAILED(p_set.CreateInstance( __uuidof( Recordset ) ) ) )	  
			{ MessageBox("Fail to create recordset instance!",NULL,MB_ICONSTOP);return;
			}
			szSQL.Format("SELECT 课程代码 FROM 课程信息 WHERE (课程名称 = '%s')",Cname);
            try{ 
				p_set->Open((LPCSTR)szSQL,RS_PARAM);
			}
			catch(_com_error e)
			{ CString errormessage;
			errormessage.Format("找不到该课程!\r\n删除错误:%s",e.ErrorMessage());
			AfxMessageBox(errormessage);///显示错误信息
			return;
			}
			if(!p_set->adoEOF)  
				Cno= (char*) ((_bstr_t) p_set->Fields->Item["课程代码"]->Value);
			p_set->Close();
			//找考试代码
			szSQL.Format("SELECT 考试代码 FROM 考试类型代码 WHERE (考试名称 = '%s')",Ename);
			try{ 
				p_set->Open((LPCSTR)szSQL,RS_PARAM);
			}
			catch(_com_error e)
			{ CString errormessage;
			errormessage.Format("找不到此考试类型!\r\n删除错误:%s",e.ErrorMessage());
			AfxMessageBox(errormessage);///显示错误信息
			return;
			}
			if(!p_set->adoEOF)  
				Eno= (char*) ((_bstr_t) p_set->Fields->Item["考试代码"]->Value);
			p_set->Close();
			szSQL.Format("DELETE FROM 成绩表 WHERE (学号 = '%s') AND (课程代码 = '%s') AND (考试代码 = '%s')",Sno,Cno,Eno);
			HRESULT hr;
			try{
				hr = pFrame->ExecSQL(szSQL);
				//if(SUCCEEDED(hr)) AfxMessageBox("添加成绩成功");
			}
			catch(_com_error e)///捕捉异常
			{
				CString errormessage;
				errormessage.Format("无法删除此项成绩!\r\n错误信息:%s",e.ErrorMessage());
				AfxMessageBox(errormessage);///显示错误信息
			} 	
			curSQL="SELECT 班级名称,学生基本信息.学号,姓名,课程名称,考试名称,成绩,专业名称,系名 FROM 成绩表,学生基本信息,考试类型代码,班级信息,课程信息,专业信息,系别信息 WHERE 系别信息.系别代码 = 专业信息.所属系别 AND 专业信息.专业代码 = 班级信息.所属专业 AND 成绩表.学号 = 学生基本信息.学号 AND 成绩表.考试代码 = 考试类型代码.考试代码 AND      学生基本信息.所属班级 = 班级信息.班级代码 AND 成绩表.课程代码 = 课程信息.课程代码 AND (考试名称 <> '总评成绩' and 考试名称 <>'补考成绩' and 考试名称 <>'重修成绩')";
			RefreshGradeList(curSQL);
		}		
	}
}

void CSTUGRADEView::OnmodifyGRADE() 
{
	CListCtrl *pList = (CListCtrl*)GetDlgItem(IDC_GradeLIST);
	if(pList->GetSelectedCount()!=1)
		MessageBox("请先选择一项记录!","修改出错",MB_OK|MB_ICONQUESTION);
	else
	{ 
		int nItem; CString Sno,Cname,Ename,Sname ,Score;
		nItem = pList->GetSelectionMark();
		Sno = pList->GetItemText(nItem,1);
		Cname = pList->GetItemText(nItem,3);
		Ename = pList->GetItemText(nItem,4);
		Sname = pList->GetItemText(nItem,2);
		Score = pList->GetItemText(nItem,5);
			CString szSQL;		
       
			CDlgGrade dlg;
			dlg.m_nFlag=0; //修改标志
			dlg.m_Sno=Sno;
			dlg.m_Sname=Sname;		
			dlg.m_Cname=Cname;		
			dlg.m_Ename=Ename;
			dlg.m_Score=Score;			
			dlg.pListCtrl=(CListCtrl*)GetDlgItem(IDC_GradeLIST);
			dlg.DoModal(); 
			
	}
}



void CSTUGRADEView::OnListNext() 
{
	CListCtrl *pList = (CListCtrl*)GetDlgItem(IDC_GradeLIST);
	if(pList->GetSelectedCount()!=1)
	{
		pList->SetSelectionMark(0);
		pList->SetItemState(0, LVIS_SELECTED, LVIS_SELECTED);
		ASSERT(pList->GetItemState(0, LVIS_SELECTED) == LVIS_SELECTED);
	}
	else
	{   int n=pList->GetSelectionMark();
	    if (n!=pList->GetItemCount()-1)
		{   
			pList->SetSelectionMark(n+1);
			pList->SetItemState(n+1, LVIS_SELECTED, LVIS_SELECTED);
	    	ASSERT(pList->GetItemState(n+1, LVIS_SELECTED) == LVIS_SELECTED);
		}
		else 
		{   pList->SetSelectionMark(0);
			pList->SetItemState(0, LVIS_SELECTED, LVIS_SELECTED);
	    	ASSERT(pList->GetItemState(0, LVIS_SELECTED) == LVIS_SELECTED);
	
		}

	}
 
}

void CSTUGRADEView::OnListPrv() 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -