home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tricks of the Windows Gam…ming Gurus (2nd Edition)
/
Disc2.iso
/
msdn_vcb
/
samples
/
vc98
/
mfc
/
database
/
daotable
/
addqydlg.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1998-03-26
|
7KB
|
260 lines
// 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;
}