//extern wxDbList WXDLLEXPORT *PtrBegDbList; /* from db.cpp, used in getting back error results from db connections */
+#if wxUSE_NEW_GRID
+#include <wx/grid.h>
+#include <wx/generic/gridctrl.h>
+#include <wx/dbgrid.h>
+
+#define CHOICEINT
+#endif
+
#include "dbtest.h" /* Header file for this demonstration program */
#include "listdb.h" /* Code to support the "Lookup" button on the editor dialog */
#endif
-const char *GetExtendedDBErrorMsg(wxDb *pDb, char *ErrFile, int ErrLine)
-{
- static wxString msg;
- msg = wxT("");
-
- wxString tStr;
-
- if (ErrFile || ErrLine)
- {
- msg += wxT("File: ");
- msg += ErrFile;
- msg += wxT(" Line: ");
- tStr.Printf(wxT("%d"),ErrLine);
- msg += tStr.c_str();
- msg += wxT("\n");
- }
-
- msg.Append (wxT("\nODBC errors:\n"));
- msg += wxT("\n");
-
- // Display errors for this connection
- int i;
- for (i = 0; i < DB_MAX_ERROR_HISTORY; i++)
- {
- if (pDb->errorList[i])
- {
- msg.Append(pDb->errorList[i]);
- if (wxStrcmp(pDb->errorList[i],wxT("")) != 0)
- msg.Append(wxT("\n"));
- // Clear the errmsg buffer so the next error will not
- // end up showing the previous error that have occurred
- wxStrcpy(pDb->errorList[i],wxT(""));
- }
- }
- msg += wxT("\n");
-
- return msg.c_str();
-} // GetExtendedDBErrorMsg
-
-
bool DataTypeSupported(wxDb *pDb, SWORD datatype)
{
wxDbSqlTypeInfo sqlTypeInfo;
- bool breakpoint = FALSE;
+ bool breakpoint = false;
if (pDb->GetDataTypeInfo(datatype, sqlTypeInfo))
- breakpoint = TRUE;
+ breakpoint = true;
return breakpoint;
file_menu->Append(FILE_CREATE, wxT("&Create CONTACT table"));
file_menu->Append(FILE_RECREATE_TABLE, wxT("&Recreate CONTACT table"));
file_menu->Append(FILE_RECREATE_INDEXES, wxT("&Recreate CONTACT indexes"));
+#if wxUSE_NEW_GRID
+ file_menu->Append(FILE_DBGRID_TABLE, wxT("&Open DB Grid example"));
+#endif
file_menu->Append(FILE_EXIT, wxT("E&xit"));
wxMenu *edit_menu = new wxMenu;
params.DirPath[0] = 0;
// Show the frame
- DemoFrame->Show(TRUE);
+ DemoFrame->Show(true);
// Passing NULL for the SQL environment handle causes
// the wxDbConnectInf constructor to obtain a handle
if (!wxStrlen(params.ODBCSource))
{
wxDELETE(DbConnectInf);
- return(FALSE);
+ return(false);
}
DbConnectInf->SetDsn(params.ODBCSource);
DemoFrame->BuildParameterDialog(NULL);
wxDELETE(DbConnectInf);
wxMessageBox(wxT("Now exiting program.\n\nRestart program to try any new settings."),wxT("Notice..."),wxOK | wxICON_INFORMATION);
- return(FALSE);
+ return(false);
}
DemoFrame->BuildEditorDialog();
// Show the frame
DemoFrame->Refresh();
- return TRUE;
+ return true;
} // DatabaseDemoApp::OnInit()
tStr.Printf(wxT("Unable to open the parameter file '%s' for reading.\n\nYou must specify the data source, user name, and\npassword that will be used and save those settings."),PARAM_FILENAME);
wxMessageBox(tStr,wxT("File I/O Error..."),wxOK | wxICON_EXCLAMATION);
- return FALSE;
+ return false;
}
wxChar buffer[1000+1];
fclose(paramFile);
- return TRUE;
+ return true;
} // DatabaseDemoApp::ReadParamFile()
wxString tStr;
tStr.Printf(wxT("Unable to write/overwrite '%s'."),PARAM_FILENAME);
wxMessageBox(tStr,wxT("File I/O Error..."),wxOK | wxICON_EXCLAMATION);
- return FALSE;
+ return false;
}
fputs(wxGetApp().params.ODBCSource, paramFile);
fputc(wxT('\n'), paramFile);
fclose(paramFile);
- return TRUE;
+ return true;
} // DatabaseDemoApp::WriteParamFile()
void DatabaseDemoApp::CreateDataTable(bool recreate)
{
- bool Ok = TRUE;
+ bool Ok = true;
if (recreate)
Ok = (wxMessageBox(wxT("Any data currently residing in the table will be erased.\n\nAre you sure?"),wxT("Confirm"),wxYES_NO|wxICON_QUESTION) == wxYES);
wxBeginBusyCursor();
- bool success = TRUE;
+ bool success = true;
Contact->GetDb()->RollbackTrans(); // Make sure the current cursor is in a known/stable state
{
wxEndBusyCursor();
wxString tStr;
- tStr = wxT("Error creating CONTACTS table.\nTable was not created.\n\n");
- tStr += GetExtendedDBErrorMsg(Contact->GetDb(),__FILE__,__LINE__);
- wxMessageBox(tStr,wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
- success = FALSE;
+ tStr = wxT("Error creating CONTACTS table.\nTable was not created.\n\n");
+ wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),Contact->GetDb(),__FILE__,__LINE__),
+ wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+
+ success = false;
}
else
{
{
wxEndBusyCursor();
wxString tStr;
- tStr = wxT("Error creating CONTACTS indexes.\nIndexes will be unavailable.\n\n");
- tStr += GetExtendedDBErrorMsg(Contact->GetDb(),__FILE__,__LINE__);
- wxMessageBox(tStr,wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
- success = FALSE;
+ tStr = wxT("Error creating CONTACTS indexes.\nIndexes will be unavailable.\n\n");
+ wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),Contact->GetDb(),__FILE__,__LINE__),
+ wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+
+ success = false;
}
}
while (wxIsBusy())
EVT_MENU(FILE_CREATE, DatabaseDemoFrame::OnCreate)
EVT_MENU(FILE_RECREATE_TABLE, DatabaseDemoFrame::OnRecreateTable)
EVT_MENU(FILE_RECREATE_INDEXES, DatabaseDemoFrame::OnRecreateIndexes)
+#if wxUSE_NEW_GRID
+ EVT_MENU(FILE_DBGRID_TABLE, DatabaseDemoFrame::OnDbGridTable)
+#endif
EVT_MENU(FILE_EXIT, DatabaseDemoFrame::OnExit)
EVT_MENU(EDIT_PARAMETERS, DatabaseDemoFrame::OnEditParameters)
EVT_MENU(HELP_ABOUT, DatabaseDemoFrame::OnAbout)
void DatabaseDemoFrame::OnCreate(wxCommandEvent& event)
{
- wxGetApp().CreateDataTable(FALSE);
+ wxGetApp().CreateDataTable(false);
} // DatabaseDemoFrame::OnCreate()
void DatabaseDemoFrame::OnRecreateTable(wxCommandEvent& event)
{
- wxGetApp().CreateDataTable(TRUE);
+ wxGetApp().CreateDataTable(true);
} // DatabaseDemoFrame::OnRecreate()
while (wxIsBusy())
wxEndBusyCursor();
wxString tStr;
- tStr = wxT("Error creating CONTACTS indexes.\nNew indexes will be unavailable.\n\n");
- tStr += GetExtendedDBErrorMsg(wxGetApp().Contact->GetDb(),__FILE__,__LINE__);
- wxMessageBox(tStr,wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+ tStr = wxT("Error creating CONTACTS indexes.\nNew indexes will be unavailable.\n\n");
+ wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__FILE__,__LINE__),
+ wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+
}
else
wxMessageBox(wxT("Index(es) were successfully recreated."),wxT("Notice..."),wxOK | wxICON_INFORMATION);
} // DatabaseDemoFrame::OnRecreateIndexes()
+#if wxUSE_NEW_GRID
+void DatabaseDemoFrame::OnDbGridTable(wxCommandEvent& )
+{
+ DbGridFrame *frame = new DbGridFrame(this);
+ if (frame->Initialize())
+ {
+ frame->Show();
+ }
+}
+#endif
+
void DatabaseDemoFrame::OnExit(wxCommandEvent& event)
{
Close();
JoinDate.second = 0;
JoinDate.fraction = 0;
NativeLanguage = langENGLISH;
- IsDeveloper = FALSE;
+ IsDeveloper = false;
Contributions = 0;
LinesOfCode = 0L;
} // Ccontact::Initialize
if (!wxDbFreeConnection(GetDb()))
{
wxString tStr;
- tStr = wxT("Unable to Free the Ccontact data table handle\n\n");
- tStr += GetExtendedDBErrorMsg(GetDb(),__FILE__,__LINE__);
- wxMessageBox(tStr,wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+ tStr = wxT("Unable to Free the Ccontact data table handle\n\n");
+
+ wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__FILE__,__LINE__),
+ wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
}
}
} // Ccontract destructor
* functions to interface to the data structure used to store records in
* memory, and for all the column definitions that define the table structure
*/
-void Ccontact::SetupColumns()
+void Ccontact::SetupColumns()
{
// NOTE: Columns now are 8 character names, as that is all dBase can support. Longer
// names can be used for other database engines
- SetColDefs ( 0,wxT("NAME"), DB_DATA_TYPE_VARCHAR, Name, SQL_C_CHAR, sizeof(Name), TRUE, TRUE); // Primary index
- SetColDefs ( 1,wxT("ADDRESS1"), DB_DATA_TYPE_VARCHAR, Addr1, SQL_C_CHAR, sizeof(Addr1), FALSE,TRUE);
- SetColDefs ( 2,wxT("ADDRESS2"), DB_DATA_TYPE_VARCHAR, Addr2, SQL_C_CHAR, sizeof(Addr2), FALSE,TRUE);
- SetColDefs ( 3,wxT("CITY"), DB_DATA_TYPE_VARCHAR, City, SQL_C_CHAR, sizeof(City), FALSE,TRUE);
- SetColDefs ( 4,wxT("STATE"), DB_DATA_TYPE_VARCHAR, State, SQL_C_CHAR, sizeof(State), FALSE,TRUE);
- SetColDefs ( 5,wxT("POSTCODE"), DB_DATA_TYPE_VARCHAR, PostalCode, SQL_C_CHAR, sizeof(PostalCode), FALSE,TRUE);
- SetColDefs ( 6,wxT("COUNTRY"), DB_DATA_TYPE_VARCHAR, Country, SQL_C_CHAR, sizeof(Country), FALSE,TRUE);
- SetColDefs ( 7,wxT("JOINDATE"), DB_DATA_TYPE_DATE, &JoinDate, SQL_C_TIMESTAMP, sizeof(JoinDate), FALSE,TRUE);
- SetColDefs ( 8,wxT("IS_DEV"), DB_DATA_TYPE_INTEGER, &IsDeveloper, SQL_C_BOOLEAN(IsDeveloper), sizeof(IsDeveloper), FALSE,TRUE);
- SetColDefs ( 9,wxT("CONTRIBS"), DB_DATA_TYPE_INTEGER, &Contributions, SQL_C_USHORT, sizeof(Contributions), FALSE,TRUE);
- SetColDefs (10,wxT("LINE_CNT"), DB_DATA_TYPE_INTEGER, &LinesOfCode, SQL_C_ULONG, sizeof(LinesOfCode), FALSE,TRUE);
- SetColDefs (11,wxT("LANGUAGE"), DB_DATA_TYPE_INTEGER, &NativeLanguage, SQL_C_ENUM, sizeof(NativeLanguage), FALSE,TRUE);
+ SetColDefs ( 0,wxT("NAME"), DB_DATA_TYPE_VARCHAR, Name, SQL_C_CHAR, sizeof(Name), true, true); // Primary index
+ SetColDefs ( 1,wxT("ADDRESS1"), DB_DATA_TYPE_VARCHAR, Addr1, SQL_C_CHAR, sizeof(Addr1), false,true);
+ SetColDefs ( 2,wxT("ADDRESS2"), DB_DATA_TYPE_VARCHAR, Addr2, SQL_C_CHAR, sizeof(Addr2), false,true);
+ SetColDefs ( 3,wxT("CITY"), DB_DATA_TYPE_VARCHAR, City, SQL_C_CHAR, sizeof(City), false,true);
+ SetColDefs ( 4,wxT("STATE"), DB_DATA_TYPE_VARCHAR, State, SQL_C_CHAR, sizeof(State), false,true);
+ SetColDefs ( 5,wxT("POSTCODE"), DB_DATA_TYPE_VARCHAR, PostalCode, SQL_C_CHAR, sizeof(PostalCode), false,true);
+ SetColDefs ( 6,wxT("COUNTRY"), DB_DATA_TYPE_VARCHAR, Country, SQL_C_CHAR, sizeof(Country), false,true);
+ SetColDefs ( 7,wxT("JOINDATE"), DB_DATA_TYPE_DATE, &JoinDate, SQL_C_TIMESTAMP, sizeof(JoinDate), false,true);
+ SetColDefs ( 8,wxT("IS_DEV"), DB_DATA_TYPE_INTEGER, &IsDeveloper, SQL_C_BOOLEAN(IsDeveloper), sizeof(IsDeveloper), false,true);
+ SetColDefs ( 9,wxT("CONTRIBS"), DB_DATA_TYPE_INTEGER, &Contributions, SQL_C_UTINYINT, sizeof(Contributions), false,true);
+ SetColDefs (10,wxT("LINE_CNT"), DB_DATA_TYPE_INTEGER, &LinesOfCode, SQL_C_ULONG, sizeof(LinesOfCode), false,true);
+ SetColDefs (11,wxT("LANGUAGE"), DB_DATA_TYPE_INTEGER, &NativeLanguage, SQL_C_ENUM, sizeof(NativeLanguage), false,true);
#if wxODBC_BLOB_EXPERIMENT > 0
- SetColDefs (12,wxT("PICTURE"), DB_DATA_TYPE_BLOB, Picture, SQL_LONGVARBINARY, sizeof(Picture), FALSE,TRUE);
+ SetColDefs (12,wxT("PICTURE"), DB_DATA_TYPE_BLOB, Picture, SQL_LONGVARBINARY, sizeof(Picture), false,true);
#endif
} // Ccontact::SetupColumns
wxString indexName;
wxDbIdxDef idxDef[2];
- bool Ok = TRUE;
+ bool Ok = true;
wxStrcpy(idxDef[0].ColName, "IS_DEV");
- idxDef[0].Ascending = TRUE;
+ idxDef[0].Ascending = true;
wxStrcpy(idxDef[1].ColName, "NAME");
- idxDef[1].Ascending = TRUE;
+ idxDef[1].Ascending = true;
indexName = GetTableName();
indexName += "_IDX1";
- Ok = CreateIndex(indexName.c_str(), TRUE, 2, idxDef, recreate);
+ Ok = CreateIndex(indexName.c_str(), true, 2, idxDef, recreate);
return Ok;
} // Ccontact::CreateIndexes()
SetOrderByClause(wxT(""));
if (!Query())
- return(FALSE);
+ return(false);
// Fetch the record
return(GetNext());
// Since the ::OnCommand() function is overridden, this prevents the widget
// detection in ::OnCommand() until all widgets have been initialized to prevent
// uninitialized pointers from crashing the program
- widgetPtrsSet = FALSE;
+ widgetPtrsSet = false;
- initialized = FALSE;
+ initialized = false;
SetMode(mView);
- Show(FALSE);
+ Show(false);
} // CeditorDlg constructor
if (!wxGetApp().Contact->Query())
{
wxString tStr;
- tStr = wxT("ODBC error during Query()\n\n");
- tStr += GetExtendedDBErrorMsg(wxGetApp().Contact->GetDb(),__FILE__,__LINE__);
- wxMessageBox(tStr,wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+ tStr = wxT("ODBC error during Query()\n\n");
+ wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__FILE__,__LINE__),
+ wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+
SetMode(mView);
return;
}
if (!wxGetApp().Contact->Query())
{
wxString tStr;
- tStr = wxT("ODBC error during Query()\n\n");
- tStr += GetExtendedDBErrorMsg(wxGetApp().Contact->GetDb(),__FILE__,__LINE__);
- wxMessageBox(tStr,wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+ tStr = wxT("ODBC error during Query()\n\n");
+ wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__FILE__,__LINE__),
+ wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+
return;
}
// Display the first record from the query set
if (!wxGetApp().Contact->Query())
{
wxString tStr;
- tStr = wxT("ODBC error during Query()\n\n");
- tStr += GetExtendedDBErrorMsg(wxGetApp().Contact->GetDb(),__FILE__,__LINE__);
- wxMessageBox(tStr,wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+ tStr = wxT("ODBC error during Query()\n\n");
+ wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__FILE__,__LINE__),
+ wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
return;
}
if (!wxGetApp().Contact->GetNext())
wxGetApp().Contact->Initialize();
PutData();
- pResetBtn->Enable(FALSE);
+ pResetBtn->Enable(false);
return;
} // Reset button
/* wxChar *orderBy */ wxT("NAME"),
/* wxDb *pDb */ wxGetApp().READONLY_DB,
/* const wxString &defDir */ wxGetApp().DbConnectInf->GetDefaultDir(),
- /* bool distinctValues */ TRUE);
+ /* bool distinctValues */ true);
if (ListDB_Selection && wxStrlen(ListDB_Selection))
{
if (!wxGetApp().Contact)
{
wxMessageBox(wxT("Unable to instantiate an instance of Ccontact"),wxT("Error..."),wxOK | wxICON_EXCLAMATION);
- return FALSE;
+ return false;
}
// Check if the table exists or not. If it doesn't, ask the user if they want to
wxGetApp().DbConnectInf->GetDefaultDir()))
{
wxString tStr;
- tStr.Printf(wxT("Unable to open the table '%s'.\n\nTable may need to be created...?\n\n"),CONTACT_TABLE_NAME);
- tStr += GetExtendedDBErrorMsg(wxGetApp().Contact->GetDb(),__FILE__,__LINE__);
- wxMessageBox(tStr,wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
-
- bool createTable = (wxMessageBox(wxT("Do you wish to try to create/clear the CONTACTS table?"),wxT("Confirm"),wxYES_NO|wxICON_QUESTION) == wxYES);
+ tStr.Printf(wxT("Unable to open the table '%s'. The table may\nneed to be created.\n\nDo you wish to try to create/clear the table?\n\n"),CONTACT_TABLE_NAME);
+ bool createTable = (wxMessageBox(tStr.c_str(),wxT("Confirm"),wxYES_NO|wxICON_QUESTION) == wxYES);
if (!createTable)
{
// Close();
- return FALSE;
+ return false;
}
else
- wxGetApp().CreateDataTable(FALSE);
+ wxGetApp().CreateDataTable(false);
}
// Tables must be "opened" before anything other than creating/deleting table can be done
{
wxString tStr;
tStr.Printf(wxT("Unable to open the table '%s' (likely due to\ninsufficient privileges of the logged in user).\n\n"),CONTACT_TABLE_NAME);
- tStr += GetExtendedDBErrorMsg(wxGetApp().Contact->GetDb(),__FILE__,__LINE__);
- wxMessageBox(tStr,wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+
+ wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__FILE__,__LINE__),
+ wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
}
else
#endif
{
wxString tStr;
tStr.Printf(wxT("Unable to open the table '%s' as the table\ndoes not appear to exist in the tablespace available\nto the currently logged in user.\n\n"),CONTACT_TABLE_NAME);
- tStr += GetExtendedDBErrorMsg(wxGetApp().Contact->GetDb(),__FILE__,__LINE__);
- wxMessageBox(tStr,wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+ wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__FILE__,__LINE__),
+ wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
}
- return FALSE;
+ return false;
}
// Build the dialog
// Now that all the widgets on the panel are created, its safe to allow ::OnCommand() to
// handle all widget processing
- widgetPtrsSet = TRUE;
+ widgetPtrsSet = true;
// Setup the orderBy and where clauses to return back a single record as the result set,
// as there will only be one record being shown on the dialog at a time, this optimizes
wxGetApp().Contact->SetWhereClause(wxT(""));
// Perform the Query to get the result set.
- // NOTE: If there are no rows returned, that is a valid result, so Query() would return TRUE.
- // Only if there is a database error will Query() come back as FALSE
+ // NOTE: If there are no rows returned, that is a valid result, so Query() would return true.
+ // Only if there is a database error will Query() come back as false
if (!wxGetApp().Contact->Query())
{
wxString tStr;
- tStr = wxT("ODBC error during Query()\n\n");
- tStr += GetExtendedDBErrorMsg(wxGetApp().Contact->GetDb(),__FILE__,__LINE__);
- wxMessageBox(tStr,wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
- return FALSE;
+ tStr = wxT("ODBC error during Query()\n\n");
+ wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__FILE__,__LINE__),
+ wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+ return false;
}
// Since Query succeeded, now get the row that was returned
SetMode(mView);
PutData();
- Show(TRUE);
+ Show(true);
- initialized = TRUE;
- return TRUE;
+ initialized = true;
+ return true;
} // CeditorDlg::Initialize()
void CeditorDlg::SetMode(enum DialogModes m)
{
- bool edit = FALSE;
+ bool edit = false;
mode = m;
switch (mode)
{
case mCreate:
case mEdit:
- edit = TRUE;
+ edit = true;
break;
case mView:
case mSearch:
- edit = FALSE;
+ edit = false;
break;
default:
break;
pDeveloperRadio->SetSelection(wxGetApp().Contact->IsDeveloper);
- return TRUE;
+ return true;
} // Ceditor::PutData()
* Reads the data out of all the widgets on the dialog. Some data evaluation is done
* to ensure that there is a name entered and that the date field is valid.
*
- * A return value of TRUE means that valid data was retrieved from the dialog, otherwise
+ * A return value of true means that valid data was retrieved from the dialog, otherwise
* invalid data was found (and a message was displayed telling the user what to fix), and
* the data was not placed into the appropraite fields of Ccontact
*/
if (!wxStrcmp((const wxChar*) tStr,wxT("")))
{
wxMessageBox(wxT("A name is required for entry into the contact table"),wxT("Notice..."),wxOK | wxICON_INFORMATION);
- return FALSE;
+ return false;
}
- bool invalid = FALSE;
+ bool invalid = false;
int mm,dd,yyyy;
int first, second;
tStr = pJoinDateTxt->GetValue();
if (tStr.Freq(wxT('/')) != 2)
- invalid = TRUE;
+ invalid = true;
// Find the month, day, and year tokens
if (!invalid)
// Force Year 2000 compliance
if (!invalid && (yyyy < 1000))
- invalid = TRUE;
+ invalid = true;
// Check the token ranges for validity
if (!invalid)
{
if (yyyy > 9999)
- invalid = TRUE;
+ invalid = true;
else if ((mm < 1) || (mm > 12))
- invalid = TRUE;
+ invalid = true;
else
{
if (dd < 1)
- invalid = TRUE;
+ invalid = true;
else
{
int days[12] = {31,28,31,30,31,30,
31,31,30,31,30,31};
if (dd > days[mm-1])
{
- invalid = TRUE;
+ invalid = true;
if ((dd == 29) && (mm == 2))
{
if (((yyyy % 4) == 0) && (((yyyy % 100) != 0) || ((yyyy % 400) == 0)))
- invalid = FALSE;
+ invalid = false;
}
}
}
else
{
wxMessageBox(wxT("Improper date format. Please check the date\nspecified and try again.\n\nNOTE: Dates are in american format (MM/DD/YYYY)"),wxT("Notice..."),wxOK | wxICON_INFORMATION);
- return FALSE;
+ return false;
}
tStr = pNameTxt->GetValue();
wxGetApp().Contact->NativeLanguage = (enum Language) pNativeLangChoice->GetSelection();
wxGetApp().Contact->IsDeveloper = pDeveloperRadio->GetSelection() > 0;
- return TRUE;
+ return true;
} // CeditorDlg::GetData()
* try to insert/update the data to the table based on the current 'mode' the dialog
* is set to.
*
- * A return value of TRUE means the insert/update was completed successfully, a return
- * value of FALSE means that Save() failed. If returning FALSE, then this function
+ * A return value of true means the insert/update was completed successfully, a return
+ * value of false means that Save() failed. If returning false, then this function
* has displayed a detailed error message for the user.
*/
bool CeditorDlg::Save()
{
- bool failed = FALSE;
+ bool failed = false;
// Read the data in the widgets of the dialog to get the user's data
if (!GetData())
- failed = TRUE;
+ failed = true;
// Perform any other required validations necessary before saving
if (!failed)
if (result == DB_ERR_INTEGRITY_CONSTRAINT_VIOL)
{
wxString tStr;
- tStr = wxT("A duplicate key value already exists in the table.\nUnable to save record\n\n");
- tStr += GetExtendedDBErrorMsg(wxGetApp().Contact->GetDb(),__FILE__,__LINE__);
- wxMessageBox(tStr,wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+ tStr = wxT("A duplicate key value already exists in the table.\nUnable to save record\n\n");
+ wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__FILE__,__LINE__),
+ wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
}
else
{
// Some other unexpected error occurred
wxString tStr;
- tStr = wxT("Database insert failed\n\n");
- tStr += GetExtendedDBErrorMsg(wxGetApp().Contact->GetDb(),__FILE__,__LINE__);
- wxMessageBox(tStr,wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+ tStr = wxT("Database insert failed\n\n");
+ wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__FILE__,__LINE__),
+ wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
}
}
}
if (!wxGetApp().Contact->UpdateWhere(wxGetApp().Contact->whereStr))
{
wxString tStr;
- tStr = wxT("Database update failed\n\n");
- tStr += GetExtendedDBErrorMsg(wxGetApp().Contact->GetDb(),__FILE__,__LINE__);
- wxMessageBox(tStr,wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
- failed = TRUE;
+ tStr = wxT("Database update failed\n\n");
+ wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__FILE__,__LINE__),
+ wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+ failed = true;
}
}
if (!wxGetApp().Contact->Query())
{
wxString tStr;
- tStr = wxT("ODBC error during Query()\n\n");
- tStr += GetExtendedDBErrorMsg(wxGetApp().Contact->GetDb(),__FILE__,__LINE__);
- wxMessageBox(tStr,wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+ tStr = wxT("ODBC error during Query()\n\n");
+ wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__FILE__,__LINE__),
+ wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
- return(FALSE);
+ return(false);
}
if (wxGetApp().Contact->GetNext())
{
PutData();
- return(TRUE);
+ return(true);
}
else
- return(FALSE);
+ return(false);
} // CeditorDlg::GetRec()
// Since the ::OnCommand() function is overridden, this prevents the widget
// detection in ::OnCommand() until all widgets have been initialized to prevent
// uninitialized pointers from crashing the program
- widgetPtrsSet = FALSE;
+ widgetPtrsSet = false;
pParamODBCSourceMsg = new wxStaticText(this, PARAMETER_DIALOG_SOURCE_MSG, wxT("ODBC data sources:"), wxPoint( 10, 10), wxSize( -1, -1), 0, wxT("ParamODBCSourceMsg"));
pParamODBCSourceList = new wxListBox(this, PARAMETER_DIALOG_SOURCE_LISTBOX, wxPoint( 10, 29), wxSize(285, 150), 0, 0, wxLB_SINGLE|wxLB_ALWAYS_SB, wxDefaultValidator, wxT("ParamODBCSourceList"));
// Now that all the widgets on the panel are created, its safe to allow ::OnCommand() to
// handle all widget processing
- widgetPtrsSet = TRUE;
+ widgetPtrsSet = true;
- saved = FALSE;
+ saved = false;
savedParamSettings = wxGetApp().params;
Centre(wxBOTH);
while (wxIsBusy())
wxEndBusyCursor();
- Show(FALSE);
+ Show(false);
SetReturnCode(0); // added so BoundsChecker would not report use of uninitialized variable
this->Destroy();
if (GetParent() != NULL) // The parameter dialog was not called during startup due to a missing cfg file
tStr += wxT("\nNew parameters will take effect the next time the program is started.");
wxMessageBox(tStr,wxT("Notice..."),wxOK | wxICON_INFORMATION);
- saved = TRUE;
+ saved = true;
Close();
}
return;
pParamUserNameTxt->SetValue(wxGetApp().params.UserName);
pParamPasswordTxt->SetValue(wxGetApp().params.Password);
pParamDirPathTxt->SetValue(wxGetApp().params.DirPath);
- return TRUE;
+ return true;
} // CparameterDlg::PutData()
wxString errmsg;
errmsg.Printf(wxT("ODBC Data source name is longer than the data structure to hold it.\n'Cparameter.ODBCSource' must have a larger character array\nto handle a data source with this long of a name\n\nThe data source currently selected is %d characters long."),tStr.Length());
wxMessageBox(errmsg,wxT("Internal program error..."),wxOK | wxICON_EXCLAMATION);
- return FALSE;
+ return false;
}
wxStrcpy(wxGetApp().params.ODBCSource, tStr);
}
else
- return FALSE;
+ return false;
tStr = pParamUserNameTxt->GetValue();
if (tStr.Length() > (sizeof(wxGetApp().params.UserName)-1))
wxString errmsg;
errmsg.Printf(wxT("User name is longer than the data structure to hold it.\n'Cparameter.UserName' must have a larger character array\nto handle a data source with this long of a name\n\nThe user name currently specified is %d characters long."),tStr.Length());
wxMessageBox(errmsg,wxT("Internal program error..."),wxOK | wxICON_EXCLAMATION);
- return FALSE;
+ return false;
}
wxStrcpy(wxGetApp().params.UserName, tStr);
wxString errmsg;
errmsg.Printf(wxT("Password is longer than the data structure to hold it.\n'Cparameter.Password' must have a larger character array\nto handle a data source with this long of a name\n\nThe password currently specified is %d characters long."),tStr.Length());
wxMessageBox(errmsg,wxT("Internal program error..."),wxOK | wxICON_EXCLAMATION);
- return FALSE;
+ return false;
}
wxStrcpy(wxGetApp().params.Password,tStr);
wxString errmsg;
errmsg.Printf(wxT("DirPath is longer than the data structure to hold it.\n'Cparameter.DirPath' must have a larger character array\nto handle a data source with this long of a name\n\nThe password currently specified is %d characters long."),tStr.Length());
wxMessageBox(errmsg,wxT("Internal program error..."),wxOK | wxICON_EXCLAMATION);
- return FALSE;
+ return false;
}
wxStrcpy(wxGetApp().params.DirPath,tStr);
- return TRUE;
+ return true;
} // CparameterDlg::GetData()
if (!GetData())
{
wxGetApp().params = savedParamSettings;
- return FALSE;
+ return false;
}
wxGetApp().WriteParamFile(wxGetApp().params);
- return TRUE;
+ return true;
} // CparameterDlg::Save()
colInf = 0;
dbTable = 0;
masterTableName = tblName[0];
- widgetPtrsSet = FALSE;
+ widgetPtrsSet = false;
pDB = pDb;
// Initialize the WHERE clause from the string passed in
pQueryHintGrp = new wxStaticBox(this, QUERY_DIALOG_HINT_GROUP, wxT(""), wxPoint( 10, 291), wxSize(377, 40), 0, wxT("QueryHintGrp"));
pQueryHintMsg = new wxStaticText(this, QUERY_DIALOG_HINT_MSG, wxT(""), wxPoint( 16, 306), wxSize( -1, -1), 0, wxT("QueryHintMsg"));
- widgetPtrsSet = TRUE;
+ widgetPtrsSet = true;
// Initialize the dialog
wxString qualName;
pQueryCol2Choice->Append(wxT("VALUE -->"));
{
wxEndBusyCursor();
wxString tStr;
- tStr = wxT("ODBC error during GetColumns()\n\n");
- tStr += GetExtendedDBErrorMsg(pDb,__FILE__,__LINE__);
- wxMessageBox(tStr,wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+ tStr = wxT("ODBC error during GetColumns()\n\n");
+ wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__FILE__,__LINE__),
+ wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
return;
}
pQueryCol2Choice->SetSelection(0);
pQueryOperatorChoice->SetSelection(0);
- pQueryValue2Msg->Show(FALSE);
- pQueryValue2Txt->Show(FALSE);
+ pQueryValue2Msg->Show(false);
+ pQueryValue2Txt->Show(false);
pQueryHintMsg->SetLabel(langQRY_EQ);
}
// Hide the value2 widget
- pQueryValue2Msg->Show(FALSE); // BETWEEN will show this widget
- pQueryValue2Txt->Show(FALSE); // BETWEEN will show this widget
+ pQueryValue2Msg->Show(false); // BETWEEN will show this widget
+ pQueryValue2Txt->Show(false); // BETWEEN will show this widget
// Disable the NOT operator for <, <=, >, >=
switch((qryOp) pQueryOperatorChoice->GetSelection())
case qryOpLE:
case qryOpGE:
pQueryNotCheck->SetValue(0);
- pQueryNotCheck->Enable(FALSE);
+ pQueryNotCheck->Enable(false);
break;
default:
- pQueryNotCheck->Enable(TRUE);
+ pQueryNotCheck->Enable(true);
break;
}
case qryOpGT:
case qryOpLE:
case qryOpGE:
- pQueryCol2Choice->Enable(TRUE);
+ pQueryCol2Choice->Enable(true);
if (pQueryCol2Choice->GetSelection()) // Column name is highlighted
{
- pQueryValue1Msg->Show(FALSE);
- pQueryValue1Txt->Show(FALSE);
+ pQueryValue1Msg->Show(false);
+ pQueryValue1Txt->Show(false);
}
else // "Value" is highlighted
{
- pQueryValue1Msg->Show(TRUE);
- pQueryValue1Txt->Show(TRUE);
+ pQueryValue1Msg->Show(true);
+ pQueryValue1Txt->Show(true);
pQueryValue1Txt->SetFocus();
}
break;
case qryOpCONTAINS:
case qryOpLIKE:
pQueryCol2Choice->SetSelection(0);
- pQueryCol2Choice->Enable(FALSE);
- pQueryValue1Msg->Show(TRUE);
- pQueryValue1Txt->Show(TRUE);
+ pQueryCol2Choice->Enable(false);
+ pQueryValue1Msg->Show(true);
+ pQueryValue1Txt->Show(true);
pQueryValue1Txt->SetFocus();
break;
case qryOpBETWEEN:
pQueryCol2Choice->SetSelection(0);
- pQueryCol2Choice->Enable(FALSE);
- pQueryValue2Msg->Show(TRUE);
- pQueryValue2Txt->Show(TRUE);
- pQueryValue1Msg->Show(TRUE);
- pQueryValue1Txt->Show(TRUE);
+ pQueryCol2Choice->Enable(false);
+ pQueryValue2Msg->Show(true);
+ pQueryValue2Txt->Show(true);
+ pQueryValue1Msg->Show(true);
+ pQueryValue1Txt->Show(true);
pQueryValue1Txt->SetFocus();
break;
}
{
if (pQueryCol2Choice->GetSelection()) // Column name is highlighted
{
- pQueryValue1Msg->Show(FALSE);
- pQueryValue1Txt->Show(FALSE);
+ pQueryValue1Msg->Show(false);
+ pQueryValue1Txt->Show(false);
}
else // "Value" is highlighted
{
- pQueryValue1Msg->Show(TRUE);
- pQueryValue1Txt->Show(TRUE);
+ pQueryValue1Msg->Show(true);
+ pQueryValue1Txt->Show(true);
pQueryValue1Txt->SetFocus();
}
return;
while (wxIsBusy())
wxEndBusyCursor();
- Show(FALSE);
+ Show(false);
SetReturnCode(1); // added so BoundsChecker would not report use of uninitialized variable
this->Destroy();
int col1Idx = pQueryCol1Choice->GetSelection();
- bool quote = FALSE;
+ bool quote = false;
if (colInf[col1Idx].sqlDataType == SQL_VARCHAR ||
oper == qryOpBEGINS ||
oper == qryOpCONTAINS ||
oper == qryOpLIKE)
- quote = TRUE;
+ quote = true;
if (pQueryCol2Choice->GetSelection()) // Column name
s += pQueryCol2Choice->GetStringSelection();
if (!dbTable->Open())
{
wxString tStr;
- tStr = wxT("ODBC error during Open()\n\n");
- tStr += GetExtendedDBErrorMsg(dbTable->GetDb(),__FILE__,__LINE__);
- wxMessageBox(tStr,wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+ tStr = wxT("ODBC error during Open()\n\n");
+ wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__FILE__,__LINE__),
+ wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
return;
}
}
if (where.Freq(wxT('(')) != where.Freq(wxT(')')))
{
wxMessageBox(wxT("There are mismatched parenthesis in the constructed where clause"),wxT("Error..."),wxOK | wxICON_EXCLAMATION);
- return(FALSE);
+ return(false);
}
// After a wxMessageBox, the focus does not necessarily return to the
// window which was the focus when the message box popped up, so return
// focus to the Query dialog for certain
SetFocus();
- return(TRUE);
+ return(true);
} // CqueryDlg::ValidateWhereClause()
void DisplayDbDiagnostics(wxDb *pDb)
{
wxString s, t;
- bool comma = FALSE;
+ bool comma = false;
s = langDBINF_DB_NAME;
s += pDb->dbInf.dbmsName;
}
s += "\n";
- comma = FALSE;
+ comma = false;
s += langDBINF_TXN_ISOLATION_OPTS;
if (pDb->dbInf.txnIsolationOptions & SQL_TXN_READ_UNCOMMITTED)
{s += langDBINF_READ_UNCOMMITTED; comma++;}
#endif
s += "\n";
- comma = FALSE;
+ comma = false;
s += langDBINF_FETCH_DIRS;
if (pDb->dbInf.fetchDirections & SQL_FD_FETCH_NEXT)
{s += langDBINF_NEXT; comma++;}
{if (comma++) s += ", "; s += langDBINF_BOOKMARK;}
s += "\n";
- comma = FALSE;
+ comma = false;
s += langDBINF_LOCK_TYPES;
if (pDb->dbInf.lockTypes & SQL_LCK_NO_CHANGE)
{s += langDBINF_NO_CHANGE; comma++;}
{if (comma++) s += ", "; s += langDBINF_UNLOCK;}
s += "\n";
- comma = FALSE;
+ comma = false;
s += langDBINF_POS_OPERS;
if (pDb->dbInf.posOperations & SQL_POS_POSITION)
{s += langDBINF_POSITION; comma++;}
{if (comma++) s += ", "; s += langDBINF_ADD;}
s += "\n";
- comma = FALSE;
+ comma = false;
s += langDBINF_POS_STMTS;
if (pDb->dbInf.posStmts & SQL_PS_POSITIONED_DELETE)
{s += langDBINF_POS_DEL; comma++;}
{if (comma++) s += ", "; s += langDBINF_SELECT_FOR_UPD;}
s += "\n";
- comma = FALSE;
+ comma = false;
s += langDBINF_SCROLL_CONCURR;
if (pDb->dbInf.scrollConcurrency & SQL_SCCO_READ_ONLY)
{s += langDBINF_READ_ONLY; comma++;}
{if (comma++) s += ", "; s += langDBINF_OPT_VALUES;}
s += "\n";
- comma = FALSE;
+ comma = false;
s += langDBINF_SCROLL_OPTS;
if (pDb->dbInf.scrollOptions & SQL_SO_FORWARD_ONLY)
{s += langDBINF_FWD_ONLY; comma++;}
{if (comma++) s += ", "; s += langDBINF_MIXED;}
s += "\n";
- comma = FALSE;
+ comma = false;
s += langDBINF_STATIC_SENS;
if (pDb->dbInf.staticSensitivity & SQL_SS_ADDITIONS)
{s += langDBINF_ADDITIONS; comma++;}
} // DisplayDbDiagnostics()
+#if wxUSE_NEW_GRID
+
+BEGIN_EVENT_TABLE(DbGridFrame, wxFrame)
+ // EVT_CLOSE(DbGridFrame::OnCloseWindow)
+END_EVENT_TABLE()
+
+
+DbGridFrame::DbGridFrame(wxWindow *parent)
+ : wxFrame (parent, -1, wxT("Database Table"),
+ wxDefaultPosition, wxSize(400, 325))
+{
+ initialized = false;
+}
+
+
+void DbGridFrame::OnCloseWindow(wxCloseEvent& event)
+{
+ this->Destroy();
+}
+
+
+bool DbGridFrame::Initialize()
+{
+ wxGrid *grid = new wxGrid(this, -1, wxDefaultPosition);
+
+ grid->RegisterDataType(wxGRID_VALUE_DATETIME,
+ new wxGridCellDateTimeRenderer(_T("%d %b %Y")),
+ new wxGridCellTextEditor);
+#ifdef CHOICEINT
+ grid->RegisterDataType(wxGRID_VALUE_CHOICEINT,
+ new wxGridCellEnumRenderer,
+ new wxGridCellEnumEditor);
+
+ wxString NativeLangChoice( wxString::Format("%s:%s,%s,%s,%s,%s",wxGRID_VALUE_CHOICEINT,
+ wxT("English"),
+ wxT("French"),
+ wxT("German"),
+ wxT("Spanish"),
+ wxT("Other") ));
+#endif
+
+ // Columns must match the sequence specified in SetColDef() calls
+ wxDbGridColInfo* cols =
+ new wxDbGridColInfo( 0,wxGRID_VALUE_STRING,wxT("Name"),
+ new wxDbGridColInfo( 1,wxGRID_VALUE_STRING,wxT("Address 1"),
+ new wxDbGridColInfo( 2,wxGRID_VALUE_STRING,wxT("Address 2"),
+ new wxDbGridColInfo( 3,wxGRID_VALUE_STRING,wxT("City"),
+ new wxDbGridColInfo( 4,wxGRID_VALUE_STRING,wxT("State"),
+ new wxDbGridColInfo( 5,wxGRID_VALUE_STRING,wxT("PostCode"),
+ new wxDbGridColInfo( 6,wxGRID_VALUE_STRING,wxT("Country"),
+ new wxDbGridColInfo( 7,wxGRID_VALUE_DBAUTO,wxT("Join Date"),
+ new wxDbGridColInfo( 8,wxGRID_VALUE_BOOL, wxT("Developer"),
+ new wxDbGridColInfo( 9,wxGRID_VALUE_NUMBER,wxT("Contributions"),
+ new wxDbGridColInfo(10,wxGRID_VALUE_NUMBER,wxT("Lines Of Code"),
+#ifdef CHOICEINT
+ new wxDbGridColInfo(11,NativeLangChoice, wxT("Native Language"),NULL))))))))))));
+#else
+ new wxDbGridColInfo(11,wxGRID_VALUE_NUMBER,wxT("Native Language"),NULL))))))))))));
+#endif
+
+ Ccontact *Contact = new Ccontact();
+ //wxGetApp().Contact
+
+ if (!Contact)
+ {
+ wxMessageBox(wxT("Unable to instantiate an instance of Ccontact"), wxT("Error..."), wxOK | wxICON_EXCLAMATION);
+ return false;
+ }
+
+ if (!Contact->Open())
+ {
+ if (Contact->GetDb()->TableExists(CONTACT_TABLE_NAME, Contact->GetDb()->GetUsername(),
+ wxGetApp().DbConnectInf->GetDefaultDir()))
+ {
+ wxString tStr;
+ tStr.Printf(wxT("Unable to open the table '%s'.\n\n"),CONTACT_TABLE_NAME);
+ wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__FILE__,__LINE__),
+ wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+ }
+
+ return false;
+ }
+
+ // Execute the following query using the cursor designated
+ // for full table query
+ Contact->SetRowMode(wxDbTable::WX_ROW_MODE_QUERY);
+
+ if (!Contact->Query())
+ {
+ wxString tStr;
+ tStr = wxT("ODBC error during Query()\n\n");
+ wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__FILE__,__LINE__),
+ wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+ return false;
+ }
+
+ // No data has been read in from the database yet, so
+ // we need to initialize the data members to valid values
+ // so Fit() can correctly size the grid
+ Contact->Initialize();
+
+ wxDbGridTableBase* db = new wxDbGridTableBase(Contact, cols, wxUSE_QUERY, true);
+
+ delete cols;
+
+ grid->SetTable(db,true);
+ grid->SetMargins(0, 0);
+ grid->Fit();
+ wxSize size = grid->GetSize();
+ size.x += 10;
+ size.y += 10;
+ SetClientSize(size);
+ initialized = true;
+ return true;
+} // DbGridFrame::Initialize()
+#endif // #if wxUSE_NEW_GRID
/*
TEST CODE FOR TESTING THE wxDbCreateDataSource() FUNCTION
int result = 0;
- result = wxDbCreateDataSource(wxT("Microsoft Access Driver (*.mdb)"),wxT("GLT-TEST2"),wxT("GLT-Descrip"),FALSE,wxT(""),this);
+ result = wxDbCreateDataSource(wxT("Microsoft Access Driver (*.mdb)"),wxT("GLT-TEST2"),wxT("GLT-Descrip"),false,wxT(""),this);
if (!result)
{
// check for errors caused by ConfigDSN based functions