ADDQYDLG.CPP
资源名称:MSDN_VC98.zip [点击查看]
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:7k
源码类别:
Windows编程
开发平台:
Visual C++
- // AddIndexDlg.cpp : implementation file--dialog to let user specify
- // querydefs
- //
- // This is a part of the Microsoft Foundation Classes C++ library.
- // Copyright (C) 1992-1998 Microsoft Corporation
- // All rights reserved.
- //
- // This source code is only intended as a supplement to the
- // Microsoft Foundation Classes Reference and related
- // electronic documentation provided with the library.
- // See these sources for detailed information regarding the
- // Microsoft Foundation Classes product.
- #include "stdafx.h"
- #include "DAOTable.h"
- #include "AddQyDlg.h"
- #include "querydef.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- /////////////////////////////////////////////////////////////////////////////
- // CAddQueryDlg dialog
- // default constructor
- CAddQueryDlg::CAddQueryDlg(CWnd* pParent /*=NULL*/)
- : CDialog(CAddQueryDlg::IDD, pParent)
- {
- // call centralized initialization function
- initializer();
- }
- // constructor that will generally be called to create the dialog
- //
- // IN: pDatabase--pointer to an open database object
- // IN: strQueryName--name of query to add or view
- // IN: pParent--pointer to parent of the dialog
- //
- CAddQueryDlg::CAddQueryDlg(CDaoDatabase *pDatabase, CString strQueryName, CWnd* pParent)
- : CDialog(CAddQueryDlg::IDD, pParent)
- {
- // call centralized initialization function
- initializer();
- // initialize and set members to incoming parameters
- m_pDatabase = pDatabase;
- m_pQueryDef = NULL;
- m_QI.m_strName = strQueryName;
- }
- // initialize members of the class and the querydef info struct
- void CAddQueryDlg::initializer()
- {
- //{{AFX_DATA_INIT(CAddQueryDlg)
- //}}AFX_DATA_INIT
- // querydef info struct
- m_QI.m_strName = _T("");
- m_QI.m_bUpdatable = FALSE;
- m_QI.m_strSQL = _T("");
- }
- void CAddQueryDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(CAddQueryDlg)
- //}}AFX_DATA_MAP
- // since mapping directly to query info struct, must be
- // outside of wizard block
- DDX_Text(pDX, IDC_TABLE_NAME, m_QI.m_strName);
- DDX_Check(pDX, IDC_UPDATABLE, m_QI.m_bUpdatable);
- DDX_Text(pDX, IDC_SQL, m_QI.m_strSQL);
- }
- BEGIN_MESSAGE_MAP(CAddQueryDlg, CDialog)
- //{{AFX_MSG_MAP(CAddQueryDlg)
- ON_BN_CLICKED(IDC_ADD_QUERY_DEF, OnAddQueryDef)
- ON_BN_CLICKED(IDC_DELETE_QUERYDEF, OnDeleteQuerydef)
- ON_BN_CLICKED(IDOK, OnDone)
- ON_BN_CLICKED(IDC_MODIFY_QUERY_DEF, OnModifyQueryDef)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////////
- // CAddQueryDlg message handlers
- BOOL CAddQueryDlg::OnInitDialog()
- {
- CDialog::OnInitDialog();
- // user either specified new query or existing query
- if(IsExistentQuery(m_pDatabase, m_QI.m_strName))
- {
- // user specified existing query, so populate
- // dialog with information from the query
- //
- // get querydef info by name
- getQueryInfo(m_pDatabase, &m_QI, -1, FALSE);
- // now try to open the querydef
- openQueryDef(m_pDatabase, &m_pQueryDef, m_QI.m_strName);
- UpdateData(FALSE);
- }
- // set focus to the SQL edit box
- CEdit *pEdit = (CEdit *)GetDlgItem(IDC_SQL);
- pEdit->SetFocus();
- return FALSE; // return TRUE unless you set the focus to a control
- }
- // user selected to add the specified querydef to the collection of
- // querydefs
- void CAddQueryDlg::OnAddQueryDef()
- {
- // get data from the dialog
- UpdateData(TRUE);
- // cache any existing querydef
- CDaoQueryDef *pCacheQueryDef = m_pQueryDef;
- if (m_pQueryDef != NULL)
- m_pQueryDef = NULL;
- // create the querydef and append it to the collection
- m_pQueryDef = new CDaoQueryDef(m_pDatabase);
- // if success on creating and saving new querydef, then proceed with
- // this querydef, otherwise restore the original querydef
- if(createSetAndSaveNewQueryDef (m_pDatabase, &m_pQueryDef, &m_QI))
- {
- // get the information on the new query and display
- getQueryInfo(m_pDatabase, &m_QI, -1, FALSE);
- UpdateData(FALSE);
- // don't need cached object
- if (pCacheQueryDef != NULL)
- delete pCacheQueryDef;
- }
- else
- {
- // delete the newly allocated querydef object and reset pointer
- // to cached object
- delete m_pQueryDef;
- m_pQueryDef = pCacheQueryDef;
- }
- }
- // user selected to delete the current query--prompt for acceptance
- void CAddQueryDlg::OnDeleteQuerydef()
- {
- // get values from control
- UpdateData(TRUE);
- // can only delete existing queries
- if (IsExistentQuery(m_pDatabase, m_QI.m_strName))
- {
- // is user sure?
- if (IDYES == AfxMessageBox(_T("Delete current query?"), MB_YESNO))
- {
- // only react if field is deleted!
- if (deleteQuery(m_pDatabase, m_QI.m_strName))
- {
- // set the initial state
- initializer();
- // update the dialog controls to erase deleted info
- UpdateData(FALSE);
- }
- }
- }
- // since query has been delete, cleanup and exit the dialog
- delete m_pQueryDef;
- EndDialog(0);
- }
- // user is done viewing or specifying the query--prompt so new query
- // that hasn't been added will not be lost--based solely on SQL string
- // having changed
- void CAddQueryDlg::OnDone()
- {
- // by default, simply exit
- int retCode = IDYES;
- // if user has entered a new sql string, then warn them they will lose
- // it if it is not explicitly added
- //
- // compare the current sql string with the original
- CString sql;
- CEdit *pEdit = (CEdit *)GetDlgItem(IDC_SQL);
- pEdit->GetWindowText(sql);
- // if sql in edit and in querydef info differ, then prompt
- if (sql != m_QI.m_strSQL)
- {
- CString prompt;
- // what to say in the prompt depends on if this is an existing
- // query or a new one
- if(IsExistentQuery(m_pDatabase, m_QI.m_strName))
- {
- // existing queries -- will lose any modifications
- prompt = _T("SQL modifications will be ignored unless you select Modify. Continue anyway?");
- }
- else
- {
- // new queries -- will lose unless added
- prompt = _T("New query will be ignored unless you select Add. Continue anyway?");
- }
- retCode = AfxMessageBox(prompt, MB_YESNO);
- }
- // either there never was a change in the sql or the user has
- // chosen not to record the change
- if (retCode == IDYES)
- {
- // cleanup
- delete m_pQueryDef;
- // end the dialog
- CDialog::EndDialog(0);
- }
- }
- // even after appending to a collection, querydef properties are updatable
- // user has selected to update
- void CAddQueryDlg::OnModifyQueryDef()
- {
- // cache old name (i.e. user may have modified name and we need to use
- // name to determine if this a new or existing query)
- CString oldName = m_QI.m_strName;
- // get new data from dialog (possibly including new name)
- UpdateData(TRUE);
- // only proceed if this is an existing query (use old name to determine this)
- if (!IsExistentQuery(m_pDatabase, oldName))
- {
- AfxMessageBox(_T("Can not modify a query that has not been added to the collection."));
- // return since can't modify non-existent query
- return;
- }
- // attempt to modify the querydef with the new information
- // only if the modification succeeds do we allow the name to change,
- // else reset it to the old name to avoid "losing" this query
- // by setting its name to an invalid value
- if (!modifyQueryDef (m_pDatabase, m_pQueryDef, &m_QI))
- m_QI.m_strName = oldName;
- }