CRSFORM.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:4k
源码类别:

Windows编程

开发平台:

Visual C++

  1. // crsform.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "enroll.h"
  5. #include "coursset.h"
  6. #include "addform.h"
  7. #include "crsform.h"
  8. #include "sectset.h"
  9. #include "enroldoc.h"
  10. #include "mainfrm.h"
  11. #include "resource.h"
  12. #ifdef _DEBUG
  13. #undef THIS_FILE
  14. static char BASED_CODE THIS_FILE[] = __FILE__;
  15. #endif
  16. /////////////////////////////////////////////////////////////////////////////
  17. // CCourseForm
  18. IMPLEMENT_DYNCREATE(CCourseForm, CAddForm)
  19. CCourseForm::CCourseForm()
  20. : CAddForm(CCourseForm::IDD)
  21. {
  22. //{{AFX_DATA_INIT(CCourseForm)
  23. m_pSet = NULL;
  24. //}}AFX_DATA_INIT
  25. }
  26. CCourseForm::~CCourseForm()
  27. {
  28. }
  29. void CCourseForm::DoDataExchange(CDataExchange* pDX)
  30. {
  31. CRecordView::DoDataExchange(pDX);
  32. //{{AFX_DATA_MAP(CCourseForm)
  33. DDX_Control(pDX, IDC_COURSEID, m_ctlCourseID);
  34. DDX_FieldText(pDX, IDC_COURSEID, m_pSet->m_CourseID, m_pSet);
  35. DDX_FieldText(pDX, IDC_HOURS, m_pSet->m_Hours, m_pSet);
  36. DDX_FieldText(pDX, IDC_TITLE, m_pSet->m_CourseTitle, m_pSet);
  37. //}}AFX_DATA_MAP
  38. }
  39. BOOL CCourseForm::OnMove(UINT nIDMoveCommand)
  40. {
  41. BOOL bWasAddMode = FALSE;
  42. CString strCourseID;
  43. if (m_bAddMode == TRUE)
  44. {
  45. m_ctlCourseID.GetWindowText(strCourseID);
  46. bWasAddMode = TRUE;
  47. }
  48. if (CAddForm::OnMove(nIDMoveCommand))
  49. {
  50. m_ctlCourseID.SetReadOnly(TRUE);
  51. if (bWasAddMode == TRUE)
  52. {
  53. CUpdateHint hint;
  54. hint.m_strCourse = strCourseID;
  55. GetDocument()->UpdateAllViews(this, HINT_ADD_COURSE, &hint);
  56. }
  57. return TRUE;
  58. }
  59. return FALSE;
  60. }
  61. BEGIN_MESSAGE_MAP(CCourseForm, CAddForm)
  62. //{{AFX_MSG_MAP(CCourseForm)
  63. ON_COMMAND(ID_RECORD_ADD, OnRecordAdd)
  64. ON_COMMAND(ID_RECORD_DELETE, OnRecordDelete)
  65. ON_COMMAND(ID_RECORD_REFRESH, OnRecordRefresh)
  66. //}}AFX_MSG_MAP
  67. END_MESSAGE_MAP()
  68. /////////////////////////////////////////////////////////////////////////////
  69. // CCourseForm message handlers
  70. CRecordset* CCourseForm::OnGetRecordset()
  71. {
  72. return m_pSet;
  73. }
  74. void CCourseForm::OnInitialUpdate()
  75. {
  76. CEnrollDoc* pDoc = (CEnrollDoc*)GetDocument();
  77. CDatabase* pDatabase = pDoc->GetDatabase();
  78. if (!pDatabase->IsOpen())
  79. return;
  80. m_pSet = &pDoc->m_courseSetForForm;
  81. m_pSet->m_strSort = "CourseID";
  82. m_pSet->m_pDatabase = pDatabase;
  83. CRecordView::OnInitialUpdate();
  84. }
  85. void CCourseForm::OnRecordAdd()
  86. {
  87. CAddForm::RecordAdd();
  88. m_ctlCourseID.SetReadOnly(FALSE);
  89. }
  90. void CCourseForm::OnRecordDelete()
  91. {
  92. // The STDREG.MDB Student Registration database in Access Format
  93. // does not require a programmatic validation to
  94. // assure that a course is not deleted if any sections exist.
  95. // That is because the STDREG.MDB database has been pre-built with
  96. // such an referential integrity rule.  If the user tries to
  97. // delete a course that has a section, a CDBException will be
  98. // thrown, and ENROLL will display the SQL error message
  99. // informing the user that the course cannot be deleted.
  100. //
  101. // A Student Registration database initialized by the STDREG
  102. // tool will not have any such built-in referential integrity
  103. // rules.  For such databases, the following code assumes the
  104. // burden of assuring that the course is not deleted if a section
  105. // exists.  The reason that STDREG does not add referential
  106. // integrity checks to the Student Registration database is that
  107. // some databases such as SQL Server do not offer SQL, via ODBC,
  108. // for creating referential integrity rules such as "FOREIGN KEY".
  109. //
  110. // The deletion of a course is not the only place ENROLL
  111. // needs a programmatic referential integrity check.  Another example
  112. // is a check that a duplicate course or seciton is not added.
  113. // For simplicity, ENROLL does not make these other checks.
  114. CEnrollDoc* pDoc = (CEnrollDoc*)GetDocument();
  115. CSectionSet sectionSet;
  116. sectionSet.m_pDatabase = pDoc->GetDatabase();
  117. sectionSet.m_strFilter = "CourseID = ?";
  118. sectionSet.m_strCourseIDParam = m_pSet->m_CourseID;
  119. BOOL b = sectionSet.Open();
  120. if (!sectionSet.IsEOF())
  121. {
  122. AfxMessageBox(IDS_CANNOT_DELETE_COURSE_WITH_SECTION);
  123. return;
  124. }
  125. CUpdateHint hint;
  126. hint.m_strCourse = m_pSet->m_CourseID;
  127. if (CAddForm::RecordDelete())
  128. GetDocument()->UpdateAllViews(this, HINT_DELETE_COURSE, &hint);
  129. }
  130. void CCourseForm::OnRecordRefresh()
  131. {
  132. if (m_bAddMode == TRUE)
  133. m_ctlCourseID.SetReadOnly(TRUE);
  134. CAddForm::RecordRefresh();
  135. }