// datadlg.cpp : implementation file // // 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 "dbfetch.h" #include "datadlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CDataDialog dialog CDataDialog::CDataDialog(CWnd* pParent /*=NULL*/) : CDialog(CDataDialog::IDD, pParent) { //{{AFX_DATA_INIT(CDataDialog) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT m_prs = NULL; } void CDataDialog::SetRecordset(CDynamicBulkSet* prs) { ASSERT(prs != NULL); m_prs = prs; } int CDataDialog::DoModal() { ASSERT(m_prs != NULL); return CDialog::DoModal(); } BOOL CDataDialog::OnInitDialog() { BOOL bReturn = CDialog::OnInitDialog(); AddColumns(); FillData(); return bReturn; } void CDataDialog::AddColumns() { ASSERT(m_prs->IsOpen()); // declare a CODBCFieldInfo structure and get a count // of the number of columns in the database CODBCFieldInfo info; int nColumns = m_prs->GetODBCFieldCount(); // for each column, retrieve the field name and // insert the field name in the header for (int nNum = 0; nNum < nColumns; nNum++) { m_prs->GetODBCFieldInfo(nNum, info); if (m_listData.InsertColumn(nNum, info.m_strName, LVCFMT_LEFT, 80) != nNum) { ASSERT(FALSE); return; } } } void CDataDialog::FillData() { ASSERT(m_prs->IsOpen()); // Make sure there are no items m_listData.DeleteAllItems(); // Validate that there is data if (m_prs->IsEOF() && m_prs->IsBOF()) { // Disable all the controls GetDlgItem(IDC_FIRST)->EnableWindow(FALSE); GetDlgItem(IDC_LAST)->EnableWindow(FALSE); GetDlgItem(IDC_NEXT)->EnableWindow(FALSE); GetDlgItem(IDC_PREV)->EnableWindow(FALSE); // Put up a warning dialog and return CString strError; strError.LoadString(IDS_ERROR_NODATA); AfxMessageBox(strError); return; } else { // Enable all the controls GetDlgItem(IDC_FIRST)->EnableWindow(TRUE); GetDlgItem(IDC_LAST)->EnableWindow(TRUE); GetDlgItem(IDC_NEXT)->EnableWindow(TRUE); GetDlgItem(IDC_PREV)->EnableWindow(TRUE); } long* rgLength; LPSTR rgData; // Need to use this to convert LPSTR to UNICODE CString strData; int nFields = m_prs->GetODBCFieldCount(); int nRowsFetched = m_prs->GetRowsFetched(); // Display 1 rowset of data by field for (int nField = 0; nField < nFields; nField++) { // set up the correct data and length arrays rgData = (LPSTR)m_prs->m_ppvData[nField]; rgLength = (long*)m_prs->m_ppvLengths[nField]; for (int nRow = 0; nRow < nRowsFetched; nRow++) { int nStatus = m_prs->GetRowStatus(nRow + 1); // Get the string to display if (nStatus == SQL_ROW_DELETED) strData = _T(""); else if (nStatus == SQL_ROW_NOROW) // Shouldn't get this since rows fetched is checked strData = _T(""); else if (rgLength[nRow] == SQL_NULL_DATA) strData = _T(""); else strData = &rgData[nRow * MAX_TEXT_LEN]; // Set the string (if first column must add) if (nField == 0) m_listData.InsertItem(nRow, strData); else { m_listData.SetItem(nRow, nField, LVIF_TEXT, strData, -1, 0, 0, 0); } } } } void CDataDialog::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDataDialog) DDX_Control(pDX, IDC_DATALIST, m_listData); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CDataDialog, CDialog) //{{AFX_MSG_MAP(CDataDialog) ON_BN_CLICKED(IDC_FIRST, OnFirst) ON_BN_CLICKED(IDC_LAST, OnLast) ON_BN_CLICKED(IDC_NEXT, OnNext) ON_BN_CLICKED(IDC_PREV, OnPrev) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDataDialog message handlers void CDataDialog::OnFirst() { ASSERT(m_prs->IsOpen()); m_prs->MoveFirst(); FillData(); // Disable the correct controls GetDlgItem(IDC_PREV)->EnableWindow(FALSE); } void CDataDialog::OnLast() { ASSERT(m_prs->IsOpen()); m_prs->MoveLast(); FillData(); // Disable the correct controls GetDlgItem(IDC_NEXT)->EnableWindow(FALSE); } void CDataDialog::OnNext() { ASSERT(m_prs->IsOpen()); m_prs->MoveNext(); if (m_prs->IsEOF()) { // Disable the correct controls GetDlgItem(IDC_NEXT)->EnableWindow(FALSE); CString strError; strError.LoadString(IDS_ERROR_EOF); AfxMessageBox(strError); } else FillData(); } void CDataDialog::OnPrev() { ASSERT(m_prs->IsOpen()); m_prs->MovePrev(); if (m_prs->IsBOF()) { // Disable the correct controls GetDlgItem(IDC_PREV)->EnableWindow(FALSE); CString strError; strError.LoadString(IDS_ERROR_BOF); AfxMessageBox(strError); } else FillData(); }