home *** CD-ROM | disk | FTP | other *** search
- // EmployeeView.cpp : implementation of the CEmployeeView class
- //
-
- #include "stdafx.h"
- #include "Employee.h"
-
- #include "EmployeePaySet.h"
- #include "EmployeePersonalSet.h"
- #include "EmployeeDoc.h"
- #include "EmployeeView.h"
-
- void DDX_FieldText( CDataExchange * pDX, UINT nID,
- TIMESTAMP_STRUCT & date, CRecordset * pSet )
- {
- CString strDate;
- HRESULT hr;
-
- // When saving, we need to build a TIMESTAMP_STRUCT from a CString
- if ( pDX->m_bSaveAndValidate )
- {
- pDX->PrepareEditCtrl( nID );
- pDX->m_pDlgWnd->GetDlgItem( nID )->
- GetWindowText( strDate );
-
- // BEGIN LAB
- // END LAB
-
- }
- else
- {
- if ( 12 < date.month && 31 < date.day ) //Uninitialized date
- strDate = "";
- else
- strDate.Format( "%u/%u/%u",
- date.month, date.day, date.year );
- pDX->m_pDlgWnd->GetDlgItem( nID )->
- SetWindowText( strDate );
- }
- }
-
- void DDV_Date( CDataExchange * pDX, TIMESTAMP_STRUCT & date,
- CRecordset * pSet )
- {
- if ( ! pDX->m_bSaveAndValidate )
- return;
- HRESULT hr;
-
- // BEGIN lab
- // END lab
-
- }
-
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
-
- /////////////////////////////////////////////////////////////////////////////
- // CEmployeeView
-
-
- IMPLEMENT_DYNCREATE(CEmployeeView, CRecordView)
-
- BEGIN_MESSAGE_MAP(CEmployeeView, CRecordView)
- //{{AFX_MSG_MAP(CEmployeeView)
- ON_COMMAND(ID_RECORD_ADD, OnRecordAdd)
- ON_COMMAND(ID_RECORD_CLEAR, OnRecordClear)
- ON_COMMAND(ID_RECORD_DELETE, OnRecordDelete)
- ON_UPDATE_COMMAND_UI(ID_RECORD_ADD, OnUpdateRecordAdd)
- ON_UPDATE_COMMAND_UI(ID_RECORD_DELETE, OnUpdateRecordDelete)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
-
- /////////////////////////////////////////////////////////////////////////////
- // CEmployeeView construction/destruction
-
- CEmployeeView::CEmployeeView()
- : CRecordView(CEmployeeView::IDD)
- {
- //{{AFX_DATA_INIT(CEmployeeView)
- m_pSet = NULL;
- m_pEmplInfoSet = NULL;
- //}}AFX_DATA_INIT
- // TODO: add construction code here
- }
-
- CEmployeeView::~CEmployeeView()
- {
- }
-
- void CEmployeeView::DoDataExchange(CDataExchange* pDX)
- {
- CRecordView::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(CEmployeeView)
- DDX_FieldText(pDX, IDC_FNAME, m_pSet->m_First_Name, m_pSet);
- DDX_FieldText(pDX, IDC_LNAME, m_pSet->m_Last_Name, m_pSet);
- DDX_FieldText(pDX, IDC_EMP_NO, m_pSet->m_Employee_Number, m_pSet);
- DDX_FieldText(pDX, IDC_DEPT, m_pSet->m_Department__, m_pSet);
- DDX_FieldText(pDX, IDC_PAY_TYPE, m_pSet->m_Employee_Pay_Type, m_pSet);
- DDX_FieldText(pDX, IDC_HOUR_RATE, m_pSet->m_Hourly_Rate, m_pSet);
- //}}AFX_DATA_MAP
-
- //Ensure pointer is valid
- if ( NULL != m_pEmplInfoSet )
- {
- DDX_FieldText(pDX, IDC_BIRTH, m_pEmplInfoSet->m_Birthdate, m_pEmplInfoSet);
- DDV_Date( pDX, m_pEmplInfoSet->m_Birthdate, m_pEmplInfoSet );
- DDX_FieldText(pDX, IDC_MARITAL_STATUS, m_pEmplInfoSet->m_Sex___Marital_Status, m_pEmplInfoSet);
- DDX_FieldText(pDX, IDC_HEIGHT, m_pEmplInfoSet->m_Height, m_pEmplInfoSet);
- DDX_FieldText(pDX, IDC_WEIGHT, m_pEmplInfoSet->m_Weight, m_pEmplInfoSet);
- }
- }
-
- BOOL CEmployeeView::PreCreateWindow(CREATESTRUCT& cs)
- {
- // TODO: Modify the Window class or styles here by modifying
- // the CREATESTRUCT cs
-
- return CRecordView::PreCreateWindow(cs);
- }
-
- void CEmployeeView::OnInitialUpdate()
- {
- m_pSet = GetDocument( )->GetEmployeePaySet( );
- m_pEmplInfoSet = GetDocument( )->GetEmployeeInfoSet( );
-
- GetParentFrame( )->RecalcLayout( );
- ResizeParentToFit( FALSE );
-
- try
- {
- //Open the primary table
- m_pSet->Open( );
- m_pEmplInfoSet->m_EmployeeNumberParam
- = m_pSet->m_Employee_Number; //Set join param
- //Open foreign table
- m_pEmplInfoSet->Open( );
- }
- catch( CException * pEx )
- {
- pEx->ReportError( );
- pEx->Delete( );
- return;
- }
-
- UpdateData( FALSE );
- SetAddMode( FALSE );
-
- CRecordView::OnInitialUpdate( );
- }
-
- /////////////////////////////////////////////////////////////////////////////
- // CEmployeeView diagnostics
-
- #ifdef _DEBUG
- void CEmployeeView::AssertValid() const
- {
- CRecordView::AssertValid();
- }
-
- void CEmployeeView::Dump(CDumpContext& dc) const
- {
- CRecordView::Dump(dc);
- }
-
- CEmployeeDoc* CEmployeeView::GetDocument() // non-debug version is inline
- {
- ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CEmployeeDoc)));
- return (CEmployeeDoc*)m_pDocument;
- }
- #endif //_DEBUG
-
- /////////////////////////////////////////////////////////////////////////////
- // CEmployeeView database support
- CRecordset* CEmployeeView::OnGetRecordset()
- {
- return m_pSet;
- }
-
- /////////////////////////////////////////////////////////////////////////////
- // CEmployeeView message handlers
-
- BOOL CEmployeeView::OnMove(UINT nIDMoveCommand)
- {
- if ( IsAddMode( ) )
- AddRecordCancel( );
- if ( ! UpdateData( TRUE ) )
- return FALSE; //Bad data: We don't want to move
- m_pSet->SetFieldDirty( NULL ); //Otherwise DB update won't occur
-
- BOOL bMove = CRecordView::OnMove(nIDMoveCommand); //Primary table updated
-
- if ( bMove ) //If successful update the foreign info
- {
- m_pEmplInfoSet->Edit( ); //Turn on edit mode
- m_pEmplInfoSet->SetFieldDirty( NULL ); //Mark the fields dirty
- m_pEmplInfoSet->Update( );
- m_pEmplInfoSet->m_EmployeeNumberParam =
- m_pSet->m_Employee_Number;
- m_pEmplInfoSet->Requery( ); //Find foreign record
- UpdateData( FALSE ); //Display foreign record
- }
- return bMove;
- }
-
- void CEmployeeView::OnRecordAdd()
- {
- CDatabase * pDB = m_pSet->m_pDatabase;
- BOOL bTrans = pDB->CanTransact( );
- if ( UpdateData( TRUE ) ) //Scrape the screen data into memory
- try
- {
- m_pEmplInfoSet->m_Employee_Number =
- m_pSet->m_Employee_Number; //Update the foreign table emp num
- m_pSet->Update( );
- m_pEmplInfoSet->Update( );
- if ( bTrans )
- {
- BOOL bCommitOk = pDB->CommitTrans( );
- if ( ! bCommitOk ||
- SQL_CB_PRESERVE != pDB->GetCursorCommitBehavior( ) ) //See TN068
- {
- m_pSet->Close( );
- m_pEmplInfoSet->Close( );
- m_pSet->Open( );
- m_pEmplInfoSet->Open( );
- }
- }
- SetAddMode( FALSE );
- OnRecordClear( ); //Set up to add the next record
- } //End try
- catch ( CDBException * pEx )
- {
- pEx->ReportError( );
- pEx->Delete( );
- if ( bTrans )
- {
- pDB->Rollback( );
-
- m_pSet->Close( ); //Assume worst case
- m_pEmplInfoSet->Close( );
-
- pDB->BeginTrans( ); //Start trans, again
- m_pSet->Open( );
- m_pEmplInfoSet->Open( );
-
- m_pSet->AddNew( );
- m_pEmplInfoSet->AddNew( );
- } //End if bTrans
- } //End catch
- }
-
- void CEmployeeView::OnRecordClear( )
- {
- CDatabase * pDB = m_pSet->m_pDatabase;
- //Cannot transact across multiple databases
- ASSERT ( m_pEmplInfoSet->m_pDatabase == pDB );
-
- if ( IsAddMode( ) )
- {
- m_pSet->CancelUpdate( );
- m_pEmplInfoSet->CancelUpdate( );
- }
- else if ( pDB->CanTransact( ) )
- {
- if ( SQL_CB_PRESERVE == pDB->GetCursorCommitBehavior( ) ) //See TN068
- pDB->BeginTrans( );
- else //Cannot have an open recordset to start transaction
- {
- m_pSet->Close( );
- m_pEmplInfoSet->Close( );
- pDB->BeginTrans( );
- m_pSet->Open( );
- m_pEmplInfoSet->Open( );
- }
- } //End can transact
- m_pSet->AddNew( );
- m_pEmplInfoSet->AddNew( );
- SetAddMode( );
- UpdateData( FALSE );
- }
-
- void CEmployeeView::OnRecordDelete()
- {
- CDatabase * pDB = m_pSet->m_pDatabase;
- BOOL bTrans =
- m_pSet->CanTransact( );
- if ( bTrans )
- pDB->BeginTrans( );
- try
- {
- m_pEmplInfoSet->Delete( );
- m_pSet->Delete( );
- if ( bTrans )
- pDB->CommitTrans( );
- }
- catch( CDBException * pEx )
- {
- pEx->ReportError( );
- pEx->Delete( );
- if ( bTrans )
- pDB->Rollback( );
- } //End catch
-
- m_pSet->Close( ); //Assume minimal ODBC support
- m_pEmplInfoSet->Close( );
- m_pSet->Open( );
- m_pEmplInfoSet->Open( );
-
- m_pSet->Requery( ); //Get a record
- m_pEmplInfoSet->m_EmployeeNumberParam = m_pSet->m_Employee_Number;
- m_pEmplInfoSet->Requery( ); //Get related data
- UpdateData( FALSE ); //Show the data
- }
-
- void CEmployeeView::OnUpdateRecordAdd(CCmdUI* pCmdUI)
- {
- pCmdUI->Enable( IsAddMode( ) );
- }
-
- void CEmployeeView::OnUpdateRecordDelete(CCmdUI* pCmdUI)
- {
- pCmdUI->Enable( ! IsAddMode( ) );
- }
-
- void CEmployeeView::SetAddMode( BOOL bAddMode)
- {
- m_bAddMode = bAddMode;
- CEdit * pField = ( CEdit * ) GetDlgItem( IDC_EMP_NO );
- pField->SetReadOnly( ! bAddMode );
- if ( bAddMode )
- {
- pField = ( CEdit * ) GetDlgItem( IDC_FNAME );
- pField->SetFocus( );
- }
- }
-
- BOOL CEmployeeView::IsAddMode()
- {
- return m_bAddMode;
- }
-
- void CEmployeeView::AddRecordCancel()
- {
- if ( ! IsAddMode( ) )
- return;
- SetAddMode( FALSE );
- m_pSet->CancelUpdate( );
- m_pEmplInfoSet->CancelUpdate( );
-
- CDatabase * pDB = m_pSet->m_pDatabase;
- if ( pDB->CanTransact( ) )
- {
- pDB->Rollback( );
- if ( SQL_CB_DELETE == pDB->GetCursorRollbackBehavior( ) )
- {
- m_pSet->Close( );
- m_pEmplInfoSet->Close( );
- m_pSet->Open( );
- m_pEmplInfoSet->Open( );
- }
- m_pSet->Requery( );
- m_pEmplInfoSet->m_EmployeeNumberParam =
- m_pSet->m_Employee_Number;
- m_pEmplInfoSet->Requery( );
- }
- UpdateData( FALSE );
- }
-