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

Windows编程

开发平台:

Visual C++

  1. // AddIndexDlg.cpp : implementation file--dialog to let user specify
  2. // querydefs
  3. //
  4. // This is a part of the Microsoft Foundation Classes C++ library.
  5. // Copyright (C) 1992-1998 Microsoft Corporation
  6. // All rights reserved.
  7. //
  8. // This source code is only intended as a supplement to the
  9. // Microsoft Foundation Classes Reference and related
  10. // electronic documentation provided with the library.
  11. // See these sources for detailed information regarding the
  12. // Microsoft Foundation Classes product.
  13. #include "stdafx.h"
  14. #include "DAOTable.h"
  15. #include "AddQyDlg.h"
  16. #include "querydef.h"
  17. #ifdef _DEBUG
  18. #define new DEBUG_NEW
  19. #undef THIS_FILE
  20. static char THIS_FILE[] = __FILE__;
  21. #endif
  22. /////////////////////////////////////////////////////////////////////////////
  23. // CAddQueryDlg dialog
  24. // default constructor
  25. CAddQueryDlg::CAddQueryDlg(CWnd* pParent /*=NULL*/)
  26. : CDialog(CAddQueryDlg::IDD, pParent)
  27. {
  28. // call centralized initialization function
  29. initializer();
  30. }
  31. // constructor that will generally be called to create the dialog
  32. //
  33. // IN: pDatabase--pointer to an open database object
  34. // IN: strQueryName--name of query to add or view
  35. // IN: pParent--pointer to parent of the dialog
  36. //
  37. CAddQueryDlg::CAddQueryDlg(CDaoDatabase *pDatabase, CString strQueryName, CWnd* pParent)
  38. : CDialog(CAddQueryDlg::IDD, pParent)
  39. {
  40. // call centralized initialization function
  41. initializer();
  42. // initialize and set members to incoming parameters
  43. m_pDatabase = pDatabase;
  44. m_pQueryDef = NULL;
  45. m_QI.m_strName = strQueryName;
  46. }
  47. // initialize members of the class and the querydef info struct
  48. void CAddQueryDlg::initializer()
  49. {
  50. //{{AFX_DATA_INIT(CAddQueryDlg)
  51. //}}AFX_DATA_INIT
  52. // querydef info struct
  53. m_QI.m_strName = _T("");
  54. m_QI.m_bUpdatable = FALSE;
  55. m_QI.m_strSQL = _T("");
  56. }
  57. void CAddQueryDlg::DoDataExchange(CDataExchange* pDX)
  58. {
  59. CDialog::DoDataExchange(pDX);
  60. //{{AFX_DATA_MAP(CAddQueryDlg)
  61. //}}AFX_DATA_MAP
  62. // since mapping directly to query info struct, must be
  63. // outside of wizard block
  64. DDX_Text(pDX, IDC_TABLE_NAME, m_QI.m_strName);
  65. DDX_Check(pDX, IDC_UPDATABLE, m_QI.m_bUpdatable);
  66. DDX_Text(pDX, IDC_SQL, m_QI.m_strSQL);
  67. }
  68. BEGIN_MESSAGE_MAP(CAddQueryDlg, CDialog)
  69. //{{AFX_MSG_MAP(CAddQueryDlg)
  70. ON_BN_CLICKED(IDC_ADD_QUERY_DEF, OnAddQueryDef)
  71. ON_BN_CLICKED(IDC_DELETE_QUERYDEF, OnDeleteQuerydef)
  72. ON_BN_CLICKED(IDOK, OnDone)
  73. ON_BN_CLICKED(IDC_MODIFY_QUERY_DEF, OnModifyQueryDef)
  74. //}}AFX_MSG_MAP
  75. END_MESSAGE_MAP()
  76. /////////////////////////////////////////////////////////////////////////////
  77. // CAddQueryDlg message handlers
  78. BOOL CAddQueryDlg::OnInitDialog()
  79. {
  80. CDialog::OnInitDialog();
  81. // user either specified new query or existing query
  82. if(IsExistentQuery(m_pDatabase, m_QI.m_strName))
  83. {
  84. // user specified existing query, so populate
  85. // dialog with information from the query
  86. //
  87. // get querydef info by name
  88. getQueryInfo(m_pDatabase, &m_QI, -1, FALSE);
  89. // now try to open the querydef
  90. openQueryDef(m_pDatabase, &m_pQueryDef, m_QI.m_strName);
  91. UpdateData(FALSE);
  92. }
  93. // set focus to the SQL edit box
  94. CEdit *pEdit = (CEdit *)GetDlgItem(IDC_SQL);
  95. pEdit->SetFocus();
  96. return FALSE;  // return TRUE unless you set the focus to a control
  97. }
  98. // user selected to add the specified querydef to the collection of
  99. // querydefs
  100. void CAddQueryDlg::OnAddQueryDef()
  101. {
  102. // get data from the dialog
  103. UpdateData(TRUE);
  104. // cache any existing querydef
  105. CDaoQueryDef *pCacheQueryDef = m_pQueryDef;
  106. if (m_pQueryDef != NULL)
  107. m_pQueryDef = NULL;
  108. // create the querydef and append it to the collection
  109. m_pQueryDef = new CDaoQueryDef(m_pDatabase);
  110. // if success on creating and saving new querydef, then proceed with
  111. // this querydef, otherwise restore the original querydef
  112. if(createSetAndSaveNewQueryDef (m_pDatabase, &m_pQueryDef, &m_QI))
  113. {
  114. // get the information on the new query and display
  115. getQueryInfo(m_pDatabase, &m_QI, -1, FALSE);
  116. UpdateData(FALSE);
  117. // don't need cached object
  118. if (pCacheQueryDef != NULL)
  119. delete pCacheQueryDef;
  120. }
  121. else
  122. {
  123. // delete the newly allocated querydef object and reset pointer
  124. // to cached object
  125. delete m_pQueryDef;
  126. m_pQueryDef = pCacheQueryDef;
  127. }
  128. }
  129. // user selected to delete the current query--prompt for acceptance
  130. void CAddQueryDlg::OnDeleteQuerydef()
  131. {
  132. // get values from control
  133. UpdateData(TRUE);
  134. // can only delete existing queries
  135. if (IsExistentQuery(m_pDatabase, m_QI.m_strName))
  136. {
  137. // is user sure?
  138. if (IDYES == AfxMessageBox(_T("Delete current query?"), MB_YESNO))
  139. {
  140. // only react if field is deleted!
  141. if (deleteQuery(m_pDatabase, m_QI.m_strName))
  142. {
  143. // set the initial state
  144. initializer();
  145. // update the dialog controls to erase deleted info
  146. UpdateData(FALSE);
  147. }
  148. }
  149. }
  150. // since query has been delete, cleanup and exit the dialog
  151. delete m_pQueryDef;
  152. EndDialog(0);
  153. }
  154. // user is done viewing or specifying the query--prompt so new query
  155. // that hasn't been added will not be lost--based solely on SQL string
  156. // having changed
  157. void CAddQueryDlg::OnDone()
  158. {
  159. // by default, simply exit
  160. int retCode = IDYES;
  161. // if user has entered a new sql string, then warn them they will lose
  162. // it if it is not explicitly added
  163. //
  164. // compare the current sql string with the original
  165. CString sql;
  166. CEdit *pEdit = (CEdit *)GetDlgItem(IDC_SQL);
  167. pEdit->GetWindowText(sql);
  168. // if sql in edit and in querydef info differ, then prompt
  169. if (sql != m_QI.m_strSQL)
  170. {
  171. CString prompt;
  172. // what to say in the prompt depends on if this is an existing
  173. // query or a new one
  174. if(IsExistentQuery(m_pDatabase, m_QI.m_strName))
  175. {
  176. // existing queries -- will lose any modifications
  177. prompt = _T("SQL modifications will be ignored unless you select Modify.  Continue anyway?");
  178. }
  179. else
  180. {
  181. // new queries -- will lose unless added
  182. prompt = _T("New query will be ignored unless you select Add.  Continue anyway?");
  183. }
  184. retCode = AfxMessageBox(prompt, MB_YESNO);
  185. }
  186. // either there never was a change in the sql or the user has
  187. // chosen not to record the change
  188. if (retCode == IDYES)
  189. {
  190. // cleanup
  191. delete m_pQueryDef;
  192. // end the dialog
  193. CDialog::EndDialog(0);
  194. }
  195. }
  196. // even after appending to a collection, querydef properties are updatable
  197. // user has selected to update
  198. void CAddQueryDlg::OnModifyQueryDef()
  199. {
  200. // cache old name (i.e. user may have modified name and we need to use
  201. // name to determine if this a new or existing query)
  202. CString oldName = m_QI.m_strName;
  203. // get new data from dialog (possibly including new name)
  204. UpdateData(TRUE);
  205. // only proceed if this is an existing query (use old name to determine this)
  206. if (!IsExistentQuery(m_pDatabase, oldName))
  207. {
  208. AfxMessageBox(_T("Can not modify a query that has not been added to the collection."));
  209. // return since can't modify non-existent query
  210. return;
  211. }
  212. // attempt to modify the querydef with the new information
  213. // only if the modification succeeds do we allow the name to change,
  214. // else reset it to the old name to avoid "losing" this query
  215. // by setting its name to an invalid value
  216. if (!modifyQueryDef (m_pDatabase, m_pQueryDef, &m_QI))
  217. m_QI.m_strName = oldName;
  218. }