📄 stugradeview.cpp
字号:
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 + -