// LoanersEditDlg.cpp : implementation file // #include "stdafx.h" #include "sp.h" #include "LoanersEditDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CLoanersEditDlg dialog CLoanersEditDlg::CLoanersEditDlg(CWnd* pParent /*=NULL*/) : CDialog(CLoanersEditDlg::IDD, pParent) { //{{AFX_DATA_INIT(CLoanersEditDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT m_pApp = (CSpApp*)AfxGetApp(); //Initialize recordset pointer rs=m_pApp->rsPool->GetRS("CLoanersEditDlg"); rs2=m_pApp->rsPool->GetRS("CLoanersEditDlg rs2"); cfm = new CgzCurrencyFormatter; m_strRentalID.Empty(); m_strSelClient="0"; m_strSelUnit="0"; m_strSelPart="0"; } CLoanersEditDlg::~CLoanersEditDlg() { m_pApp->rsPool->ReleaseRS(&rs->m_nID); m_pApp->rsPool->ReleaseRS(&rs2->m_nID); delete cfm; } void CLoanersEditDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CLoanersEditDlg) DDX_Control(pDX, IDC_EDREF, m_edRef); DDX_Control(pDX, IDC_BTNCANCEL, m_btnCancel); DDX_Control(pDX, IDC_DTDATEDUE, m_dtDateDue); DDX_Control(pDX, IDC_EDNOTES, m_edNotes); DDX_Control(pDX, IDC_EDLOANEDTO, m_edLoanedTo); DDX_Control(pDX, IDC_EDDESCRIPTION, m_edDescription); DDX_Control(pDX, IDC_EDCHARGES, m_edCharges); DDX_Control(pDX, IDC_DTDATERETURN, m_dtDateReturn); DDX_Control(pDX, IDC_DTDATEOUT, m_dtDateOut); DDX_Control(pDX, IDC_CKRETURNED, m_ckReturned); DDX_Control(pDX, IDC_CBUNIT, m_cbUnits); DDX_Control(pDX, IDC_CBPART, m_cbParts); DDX_Control(pDX, IDC_CBCLIENT, m_cbClient); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CLoanersEditDlg, CDialog) //{{AFX_MSG_MAP(CLoanersEditDlg) ON_BN_CLICKED(IDC_BTNDONE, OnBtndone) ON_EN_KILLFOCUS(IDC_EDCHARGES, OnKillfocusEdcharges) ON_CBN_CLOSEUP(IDC_CBPART, OnCloseupCbpart) ON_CBN_CLOSEUP(IDC_CBUNIT, OnCloseupCbunit) ON_EN_KILLFOCUS(IDC_EDDESCRIPTION, OnKillfocusEddescription) ON_BN_CLICKED(IDC_BTNCANCEL, OnBtncancel) ON_BN_CLICKED(IDC_CKRETURNED, OnCkreturned) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CLoanersEditDlg message handlers BOOL CLoanersEditDlg::OnInitDialog() { CDialog::OnInitDialog(); Security(); FillListBoxes(); FillFields(); m_edRef.SetLimitText(80); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } //pass in rental id to indicate editing: void CLoanersEditDlg::SetRentalID(CString *strRentalID) { if(strRentalID!=NULL) m_strRentalID=*strRentalID; } void CLoanersEditDlg::FillFields() { COleCurrency crCharges; COleDateTime dtOut,dtDue,dtReturned; bool bReturned; long lPart,lUnit,lClient; CString q,strData,strDescription,strLoanedTo,strNotes,strRef; if(m_strRentalID.IsEmpty()) return; q.Format("SELECT rentals.* FROM rentals " "WHERE (((rentals.id)=%s));",m_strRentalID); rs->Query(q); //Fetch the fields: rs->FetchField("partlink",&lPart); rs->FetchField("unitlink",&lUnit); rs->FetchField("clientlink",&lClient); rs->FetchField("loanedto",&strLoanedTo); rs->FetchField("description",&strDescription); rs->FetchField("dateout",&dtOut); rs->FetchField("datedue",&dtDue); rs->FetchField("datereturn",&dtReturned); rs->FetchField("charges",&crCharges); rs->FetchField("returned",&bReturned); rs->FetchField("notes",&strNotes); rs->FetchField("ref",&strRef); //CHARGES m_edCharges.SetWindowText(cfm->Format(crCharges)); //CLIENT m_cbClient.Select(lClient); //LOANED TO m_edLoanedTo.SetWindowText(strLoanedTo); //UNIT m_cbUnits.Select(lUnit); //PART m_cbParts.Select(lPart); //ITEM DESCRIPTION m_edDescription.SetWindowText(strDescription); //OUT DATE m_dtDateOut.SetTime(dtOut); //DUE DATE m_dtDateDue.SetTime(dtDue); //RETURNED DATE m_dtDateReturn.SetTime(dtReturned); //RETURNED FLAG m_ckReturned.SetCheck(bReturned ? TRUE : FALSE); m_dtDateReturn.EnableWindow(bReturned ? TRUE : FALSE); //REFERENCE m_edRef.SetWindowText(strRef); //NOTES m_edNotes.SetWindowText(strNotes); } void CLoanersEditDlg::FillListBoxes() { CString strData; CString strIndex; CString q; long lData; m_cbParts.Clear(); m_cbParts.AddRow(" ","0"); rs->QueryReadOnly("SELECT parts.id, [partnumber] & \" - \" " "& [description] AS name FROM parts " "WHERE (((parts.active)=True)) ORDER BY parts.partnumber;"); if(!rs->IsEmpty()) { rs->MoveFirst(); do { rs->FetchField("name",&strData); rs->FetchField("id",&lData); strIndex.Format("%u",lData); m_cbParts.AddRow(strData,strIndex); }while(rs->MoveForward()); } m_cbParts.Select(m_strSelPart); //========================================== //CLIENTS LIST m_cbClient.Clear(); m_cbClient.AddRow(" ","0"); rs->QueryReadOnly("SELECT clients.id,clients.isheadoffice, IIf(IsNull([company]),[last] & \", \" & [first],[company]) AS name " "FROM clients WHERE (((clients.isheadoffice)=False)) ORDER BY IIf(IsNull([company]),[last] & \", \" & [first],[company]);"); if(!rs->IsEmpty()) { do { rs->FetchField("name",&strData); rs->FetchField("id",&lData); strIndex.Format("%u",lData); m_cbClient.AddRow(strData,strIndex); }while(rs->MoveForward()); } m_cbClient.Select(m_strSelClient); //============================================ //FILL UNIT LIST: m_cbUnits.Clear(); m_cbUnits.AddRow(" < No unit >","0"); rs->QueryReadOnly("SELECT units.id, [sn] & \" - \" & [company_person] & \" \" & [unitmodels].[description] & \" \" & [unitmodels].[model] AS name " "FROM (units LEFT JOIN unitmodels ON units.model = unitmodels.id) LEFT JOIN nonclients ON unitmodels.manufacturer = nonclients.id " "WHERE (((units.loaner)=True)) " "ORDER BY units.sn;"); if(!rs->IsEmpty()) { do { rs->FetchField("name",&strData); strData.TrimRight("- "); rs->FetchField("id",&lData); strIndex.Format("%u",lData); //see if it's out right now q.Format("SELECT rentals.unitlink FROM rentals " "WHERE (((rentals.returned)=False) AND ((rentals.unitlink)=%u));",lData); rs2->QueryReadOnly(q); if(!rs2->IsEmpty())//out strData="z_Out: " + strData; m_cbUnits.AddRow(strData,strIndex); }while(rs->MoveForward()); } m_cbUnits.Select(m_strSelUnit); } //**************************************************** //Saving/updating and exit void CLoanersEditDlg::OnBtndone() { if(m_bReadOnly) CDialog::OnOK(); COleCurrency crCharges; COleDateTime dtOut,dtDue,dtReturned; bool bReturned; long lPart,lUnit,lClient; CString q,strData,strDescription,strLoanedTo,strNotes,strRef; //CHARGES m_edCharges.GetWindowText(strData); crCharges.ParseCurrency(strData); //CLIENT strData=m_cbClient.GetCurrentRowID(); lClient=atol(strData); //LOANED TO m_edLoanedTo.GetWindowText(strLoanedTo); //UNIT strData=m_cbUnits.GetCurrentRowID(); lUnit=atol(strData); //PART strData=m_cbParts.GetCurrentRowID(); lPart=atol(strData); //ITEM DESCRIPTION m_edDescription.GetWindowText(strDescription); //OUT DATE m_dtDateOut.GetTime(dtOut); //DUE DATE m_dtDateDue.GetTime(dtDue); //RETURNED DATE m_dtDateReturn.GetTime(dtReturned); //RETURNED FLAG bReturned=m_ckReturned.GetCheck() ? true : false; //REFERENCE m_edRef.GetWindowText(strRef); //NOTES m_edNotes.GetWindowText(strNotes); //Validation and judging: "Whose cuisine will reign supreme?" if(lClient==0 && strLoanedTo.IsEmpty()) { AfxMessageBox("You need to indicate who has this equipment"); return; } if(lUnit==0 && lPart ==0 && strDescription.IsEmpty()) { AfxMessageBox("You haven't indicated what item this record refers to"); return; } if(m_strRentalID.IsEmpty()) {//Add new record q="SELECT rentals.* FROM rentals " "WHERE (((rentals.id)=0));"; } else { //update existing record q.Format("SELECT rentals.* FROM rentals " "WHERE (((rentals.id)=%s));",m_strRentalID); } rs->Query(q); //Add a record if necessary if(m_strRentalID.IsEmpty()) rs->AddNewRecord(); //Update the fields: rs->UpdateField("partlink",&lPart); rs->UpdateField("unitlink",&lUnit); rs->UpdateField("clientlink",&lClient); rs->UpdateField("loanedto",&strLoanedTo); rs->UpdateField("description",&strDescription); rs->UpdateField("dateout",&dtOut); rs->UpdateField("datedue",&dtDue); rs->UpdateField("datereturn",&dtReturned); rs->UpdateField("charges",&crCharges); rs->UpdateField("returned",&bReturned); rs->UpdateField("ref",&strRef); rs->UpdateField("notes",&strNotes); rs->SaveRecord(); //this is just to flush the update through //rs->Query("SELECT rentals.* from rentals WHERE rentals.id=0;"); //modified Jan 10 2000 as proper flush is now //guranteed with a close rs->Close(); CDialog::OnOK(); } //Validate charges as entered void CLoanersEditDlg::OnKillfocusEdcharges() { CString strData; COleCurrency crData; m_edCharges.GetWindowText(strData); crData.ParseCurrency(strData); m_edCharges.SetWindowText(cfm->Format(crData)); } void CLoanersEditDlg::OnCloseupCbpart() { m_strSelPart=m_cbParts.GetCurrentRowID(); //erase other two fields if(m_strSelPart!="0") { m_strSelUnit="0"; m_cbUnits.Select(m_strSelUnit); m_edDescription.SetWindowText(""); } } void CLoanersEditDlg::OnCloseupCbunit() { m_strSelUnit=m_cbUnits.GetCurrentRowID(); //erase other two fields if(m_strSelUnit!="0") { m_strSelPart="0"; m_cbParts.Select(m_strSelPart); m_edDescription.SetWindowText(""); } } void CLoanersEditDlg::OnKillfocusEddescription() { CString strData; m_edDescription.GetWindowText(strData); if(strData.GetLength()>1) { m_strSelUnit="0"; m_strSelPart="0"; m_cbParts.Select(m_strSelPart); m_cbUnits.Select(m_strSelUnit); } } void CLoanersEditDlg::OnBtncancel() { CDialog::OnCancel(); } void CLoanersEditDlg::OnOK(){} void CLoanersEditDlg::OnCkreturned() { m_dtDateReturn.EnableWindow(m_ckReturned.GetCheck()); } void CLoanersEditDlg::Security() { int x=m_pApp->Allowed(RLOANERS,true); m_bReadOnly=false; if(x==2)//read only { m_bReadOnly=true; m_btnCancel.ShowWindow(FALSE); m_cbClient.EnableWindow(FALSE); m_cbParts.EnableWindow(FALSE); m_cbUnits.EnableWindow(FALSE); m_ckReturned.EnableWindow(FALSE); m_dtDateDue.EnableWindow(FALSE); m_dtDateOut.EnableWindow(FALSE); m_dtDateReturn.EnableWindow(FALSE); m_edCharges.SetReadOnly(TRUE); m_edDescription.SetReadOnly(TRUE); m_edLoanedTo.SetReadOnly(TRUE); m_edNotes.SetReadOnly(TRUE); } if(x==0) { m_pApp->SecurityWarning(); CDialog::OnCancel(); } }