// WoTabLabourEntryDlg.cpp : implementation file // #include "stdafx.h" #include "sp.h" #include "WoTabLabourEntryDlg.h" #include "Ratesdlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif //memory leak debugging help #define _CRTDBG_MAP_ALLOC #include #include ///////////////////////////////////////////////////////////////////////////// // CWoTabLabourEntryDlg dialog CWoTabLabourEntryDlg::CWoTabLabourEntryDlg(CWnd* pParent /*=NULL*/) : CDialog(CWoTabLabourEntryDlg::IDD, pParent) { //{{AFX_DATA_INIT(CWoTabLabourEntryDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT m_pApp = (CSpApp*)AfxGetApp(); /* rs=new GZRset("CWoTabLabourEntry error:"); rs->SetConnect(m_pApp->strConnectString); cbrs=new GZRset("CWoTabLabourEntry CBRS error:"); cbrs->SetConnect(m_pApp->strConnectString); */ //Initialize recordset pointer rs=m_pApp->rsPool->GetRS(" CWoTabLabourEntryDlg (RS)"); cbrs=m_pApp->rsPool->GetRS("CWoTabLabourEntryDlg (CBRS)"); //not editing as far as known m_bEditing=false; m_strSelectedRate.Empty(); m_strSelectedTravelRate.Empty(); m_strSelectedTech.Empty(); m_strProblemID.Empty(); m_strLabourID.Empty(); bModified=false; } ///*************************************** CWoTabLabourEntryDlg::~CWoTabLabourEntryDlg() { m_pApp->rsPool->ReleaseRS(&rs->m_nID); m_pApp->rsPool->ReleaseRS(&cbrs->m_nID); } void CWoTabLabourEntryDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CWoTabLabourEntryDlg) DDX_Control(pDX, IDC_DTDATEEND, m_dtEndDate); DDX_Control(pDX, IDC_LBLTRAVELRATE, m_lblTravelRate); DDX_Control(pDX, IDC_LBLTECH, m_lblTech); DDX_Control(pDX, IDC_LBLRATE, m_lblRate); DDX_Control(pDX, IDC_EDTRAVEL, m_edTravel); DDX_Control(pDX, IDC_EDSTART, m_edStart); DDX_Control(pDX, IDC_EDNOTES, m_edNotes); DDX_Control(pDX, IDC_EDNC, m_edNC); DDX_Control(pDX, IDC_EDEND, m_edEnd); DDX_Control(pDX, IDC_EDBILL, m_edBill); DDX_Control(pDX, IDC_DTDATE, m_dtDate); DDX_Control(pDX, IDC_CBTRAVELRATESLIST, m_cbTravelRatesList); DDX_Control(pDX, IDC_CBTECHLIST, m_cbTechList); DDX_Control(pDX, IDC_CBRATESLIST, m_cbRatesList); DDX_Control(pDX, IDC_BTNDONE, m_btnDone); DDX_Control(pDX, IDC_BTNCANCEL, m_btnCancel); //}}AFX_DATA_MAP DDX_Control(pDX, IDC_ED_DISTANCE, m_edDistance); } BEGIN_MESSAGE_MAP(CWoTabLabourEntryDlg, CDialog) //{{AFX_MSG_MAP(CWoTabLabourEntryDlg) ON_BN_CLICKED(IDC_BTNDONE, OnBtndone) ON_BN_CLICKED(IDC_BTNCANCEL, OnBtncancel) ON_EN_KILLFOCUS(IDC_EDEND, OnKillfocusEdend) ON_EN_KILLFOCUS(IDC_EDSTART, OnKillfocusEdstart) ON_EN_KILLFOCUS(IDC_EDNOTES, OnKillfocusEdnotes) ON_EN_KILLFOCUS(IDC_EDNC, OnKillfocusEdnc) ON_EN_KILLFOCUS(IDC_EDBILL, OnKillfocusEdbill) ON_NOTIFY(DTN_DATETIMECHANGE, IDC_DTDATE, OnDatetimechangeDtdate) ON_CBN_CLOSEUP(IDC_CBRATESLIST, OnCloseupCbrateslist) ON_CBN_CLOSEUP(IDC_CBTECHLIST, OnCloseupCbtechlist) ON_CBN_CLOSEUP(IDC_CBTRAVELRATESLIST, OnCloseupCbtravelrateslist) ON_EN_KILLFOCUS(IDC_EDTRAVEL, OnKillfocusEdtravel) ON_NOTIFY(DTN_DATETIMECHANGE, IDC_DTDATEEND, OnDatetimechangeDtdateend) ON_BN_CLICKED(IDC_LBLRATE, OnLblrate) ON_BN_CLICKED(IDC_LBLTRAVELRATE, OnLbltravelrate) //}}AFX_MSG_MAP ON_EN_KILLFOCUS(IDC_ED_DISTANCE, OnEnKillfocusEdDistance) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CWoTabLabourEntryDlg message handlers void CWoTabLabourEntryDlg::OnOK() { //Enter key avoidance hack } BOOL CWoTabLabourEntryDlg::OnInitDialog() { CDialog::OnInitDialog(); Security(); /* //Techs hyperlink m_lblTech.SetTextColor(RGB(0,0,255)); m_lblTech.SetFontUnderline(TRUE); m_lblTech.SetLink(TRUE); m_lblTech.SetLinkURL(""); */ //Rates dialog hyperlink m_lblRate.SetTextColor(RGB(0,0,255)); m_lblRate.SetFontUnderline(TRUE); m_lblRate.SetLink(TRUE); m_lblRate.SetLinkCursor(m_pApp->hcHand); m_lblRate.SetLinkURL(""); //Travel Rates dialog hyperlink m_lblTravelRate.SetTextColor(RGB(0,0,255)); m_lblTravelRate.SetFontUnderline(TRUE); m_lblTravelRate.SetLink(TRUE); m_lblTravelRate.SetLinkCursor(m_pApp->hcHand); m_lblTravelRate.SetLinkURL(""); //fill combo boxes FillRatesList(); FillTechList(); //Should always have been passed a problem ID number ASSERT(!m_strProblemID.IsEmpty()); //CREATE A NEW LABOUR ITEM IF WERE NOT EDITING AN OLD ONE if(m_bEditing) { FillFields(); FillRatesList(); } else { //go add mode //set defaults m_dtDate.SetTime(COleDateTime::GetCurrentTime()); m_edNC.SetWindowText("0"); m_edTravel.SetWindowText("0"); m_edDistance.SetWindowText("0"); m_edBill.SetWindowText("0"); m_edStart.SetWindowText("12:00"); m_edEnd.SetWindowText("12:00"); CString str; //try to set tech to current user str.Format("%u",m_pApp->m_lusrID); m_cbTechList.Select(str); //SET USER DEFAULTS m_cbRatesList.Select(m_pApp->m_lUsersDefRate); m_cbTravelRatesList.Select(m_pApp->m_lUsersDefTravelRate); SetClientRates(); } return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CWoTabLabourEntryDlg::FillRatesList() { //fill travel and regular rates list boxes bool bAtLeastOneTravelRate = false; CString strData; CString strIndex; long lData; bool bData,bActive; m_cbTravelRatesList.Clear(); m_cbRatesList.Clear(); rs->QueryReadOnly("SELECT rates.* FROM rates ORDER BY rates.name;"); if(!rs->IsEmpty()) { //fill combo box with available categories do { rs->FetchField("travelrate",&bData); rs->FetchField("name",&strData); rs->FetchField("id",&lData); rs->FetchField("active",&bActive); strIndex.Format("%u",lData); if(bData==true)//it's a travel rate { if(bActive) { m_cbTravelRatesList.AddRow(strData,strIndex); bAtLeastOneTravelRate=true; } else { if(m_strSelectedTravelRate==strIndex)//inactive but selected { strData=" " + strData; m_cbTravelRatesList.AddRow(strData,strIndex); } } } else//it's a standard rate { if(bActive) m_cbRatesList.AddRow(strData,strIndex); else { if(m_strSelectedRate==strIndex)//inactive but selected { strData=" " + strData; m_cbRatesList.AddRow(strData,strIndex); } } } }while(rs->MoveForward()); /* if(bData==true)//it's a travel rate { bAtLeastOneTravelRate=true; m_cbTravelRatesList.AddRow(strData,strIndex); } else m_cbRatesList.AddRow(strData,strIndex); while(rs->MoveForward()) { rs->FetchField("travelrate",&bData); rs->FetchField("name",&strData); rs->FetchField("id",&lData); strIndex.Format("%u",lData); if(bData==true)//it's a travel rate { bAtLeastOneTravelRate=true; m_cbTravelRatesList.AddRow(strData,strIndex); } else m_cbRatesList.AddRow(strData,strIndex); } */ //select default rate if(m_strSelectedRate.IsEmpty()) { m_cbRatesList.SetCurSel(0); m_strSelectedRate=m_cbRatesList.GetCurrentRowID(); } else m_cbRatesList.Select(m_strSelectedRate); //select default travel rate if(m_strSelectedTravelRate.IsEmpty()) { m_cbTravelRatesList.SetCurSel(0); m_strSelectedTravelRate=m_cbTravelRatesList.GetCurrentRowID(); } else m_cbTravelRatesList.Select(m_strSelectedTravelRate); } if(!bAtLeastOneTravelRate) AfxMessageBox("Warning: You need at least one travel rate in the system \r\n" "before you enter *any* labor on a standard (this) type of workorder\r\n" "Even if you don't use travel rates enter a \"dummy\" one now.\r\n" "Travel rates only print on workorders if you enter more than\r\n" "zero hours of travel time, but at least one is required to be present\r\n" "internally by AyaNova in order to print workorders."); } void CWoTabLabourEntryDlg::FillTechList() { //10/03/00 - fix for the licensing problem //if the m_strSelected tech isn't in the list then //add it "manually" after filling the list as normal //like this: "* Bob Jones (inactive)" CString strData; CString strIndex; CString q; long lData; m_cbTechList.Clear(); //look for selected tech and see if in inactive list: if(!m_strSelectedTech.IsEmpty()) { q.Format("SELECT users.id, [last] & \", \" & [first] AS fullname " "FROM users " "WHERE (((users.id)=%s) AND ((users.active)=False));",m_strSelectedTech); cbrs->QueryReadOnly(q); if(!cbrs->IsEmpty()) //it's an inactive tech put them in the list "manually" { cbrs->FetchField("fullname",&strData); cbrs->FetchField("id",&lData); strIndex.Format("%u",lData); q=" " + strData; m_cbTechList.AddRow(q,strIndex); } } //change to active only 10/03/00 q="SELECT users.id, [last] & \", \" & [first] AS fullname FROM users " "WHERE (((users.id)<>1) AND ((users.tech)=True) AND ((users.active)=True)) " "ORDER BY users.last;"; //////////////////m_pApp->ShowStuff(q); cbrs->QueryReadOnly(q); if(!cbrs->IsEmpty()) { cbrs->MoveFirst(); cbrs->FetchField("fullname",&strData); cbrs->FetchField("id",&lData); strIndex.Format("%u",lData); m_cbTechList.AddRow(strData,strIndex); while(cbrs->MoveForward()) { cbrs->FetchField("fullname",&strData); cbrs->FetchField("id",&lData); strIndex.Format("%u",lData); m_cbTechList.AddRow(strData,strIndex); } } if(!m_strSelectedTech.IsEmpty()) m_cbTechList.Select(m_strSelectedTech); else {//attempt to select by current user id m_strSelectedTech.Format("%u",m_pApp->m_lusrID); m_cbTechList.Select(m_strSelectedTech); } } void CWoTabLabourEntryDlg::SetUp(CString* clientID, CString *strProblemID, CString *LabourID,bool* IsModified) { m_strProblemID=*strProblemID; m_strLabourID=*LabourID; m_strClientID=*clientID; bModified=IsModified; //if a labour item id was passed then were editing m_bEditing=true; if(m_strLabourID.IsEmpty() || m_strLabourID=="0") m_bEditing=false; } //blah void CWoTabLabourEntryDlg::FillFields() { if(!m_bEditing) return; //m_strWorkorderID CString q,strData,strProblemID; float fData; COleDateTime dtData; long lData; //FETCH LABOUR RECORD q.Format("SELECT labor.* FROM labor " "WHERE (((labor.id)=%s));",m_strLabourID); rs->Query(q); if(rs->IsEmpty()) return; //TECHNICIAN rs->FetchField("tech",&lData); m_strSelectedTech.Format("%u",lData); FillTechList(); //HOURS rs->FetchField("hours",&fData); //01/31/2003 localization fix for floats //convert float to localized string m_edBill.SetWindowText(FtoA(fData)); //NOCHARGE HOURS rs->FetchField("nchours",&fData); //01/31/2003 localization fix for floats //convert float to localized string m_edNC.SetWindowText(FtoA(fData)); //TRAVEL HOURS rs->FetchField("travhours",&fData); //01/31/2003 localization fix for floats //convert float to localized string m_edTravel.SetWindowText(FtoA(fData)); //DISTANCE rs->FetchField("distance",&fData); //01/31/2003 localization fix for floats //convert float to localized string m_edDistance.SetWindowText(FtoA(fData)); //RATE rs->FetchField("rate",&lData); strData.Format("%u",lData); m_strSelectedRate=strData; m_cbRatesList.Select(strData); //TRAVEL RATES rs->FetchField("travrate",&lData); strData.Format("%u",lData); m_strSelectedTravelRate=strData; m_cbTravelRatesList.Select(strData); //STARTTIME rs->FetchField("start",&dtData); strData=dtData.Format(VAR_TIMEVALUEONLY); m_edStart.SetWindowText(strData); //set date to start date m_dtDate.SetTime(dtData); //STOPTIME rs->FetchField("stop",&dtData); strData=dtData.Format(VAR_TIMEVALUEONLY); m_edEnd.SetWindowText(strData); //set end date m_dtEndDate.SetTime(dtData); //NOTES / DETAILS rs->FetchField("details",&strData); m_edNotes.SetWindowText(strData); } void CWoTabLabourEntryDlg::OnBtndone() { long lData; CString strData,q; COleDateTime dtData,dtTime,dtDate,dtEndDate; float fData;//single bool bData;//added 08/21/2001 to set indexed property here //if not editing, add new record rs->Close(); if(!m_bEditing) { q="SELECT labor.* FROM labor WHERE (((labor.link)=0));"; rs->Query(q); if(!rs->AddNewRecord()) { AfxMessageBox("Unable to create new labour record"); return; } } else { //FETCH LABOUR RECORD q.Format("SELECT labor.* FROM labor " "WHERE (((labor.id)=%s));",m_strLabourID); rs->Query(q); if(rs->IsEmpty()) { AfxMessageBox("Can't find this labor record to update it!"); return; } } rs->pTheConnection->BeginTrans(); //Save fields //PROBLEM LINK rs->UpdateField("link",&m_strProblemID); //TECH strData=m_cbTechList.GetCurrentRowID(); lData=atol(strData); rs->UpdateField("tech",&lData); //HOURS m_edBill.GetWindowText(strData); //02/19/2003 Fix crash on empty field if(strData.IsEmpty()) strData="0"; //01/31/2003 convert to a variant bstr _variant_t vtData(strData); fData=(float)vtData;//cast variant to float (locale friendly) //fData=(float)atof(strData); rs->UpdateField("hours",&fData); //NOCHARGE HOURS m_edNC.GetWindowText(strData); //02/19/2003 Fix crash on empty field if(strData.IsEmpty()) strData="0"; //01/31/2003 convert to a variant bstr _variant_t vtData1(strData); fData=(float)vtData1;//cast variant to float (locale friendly) //fData=(float)atof(strData); rs->UpdateField("nchours",&fData); //TRAVEL HOURS m_edTravel.GetWindowText(strData); //02/19/2003 Fix crash on empty field if(strData.IsEmpty()) strData="0"; //01/31/2003 convert to a variant bstr _variant_t vtData2(strData); fData=(float)vtData2;//cast variant to float (locale friendly) //fData=(float)atof(strData); rs->UpdateField("travhours",&fData); //DISTANCE m_edDistance.GetWindowText(strData); //02/19/2003 Fix crash on empty field if(strData.IsEmpty()) strData="0"; //01/31/2003 convert to a variant bstr _variant_t vtData3(strData); fData=(float)vtData3;//cast variant to float (locale friendly) //fData=(float)atof(strData); rs->UpdateField("distance",&fData); //RATE strData=m_cbRatesList.GetCurrentRowID(); lData=atol(strData); rs->UpdateField("rate",&lData); //TRAVEL RATE strData=m_cbTravelRatesList.GetCurrentRowID(); lData=atol(strData); rs->UpdateField("travrate",&lData); //DATE m_dtDate.GetTime(dtDate); //rs->UpdateField("closed",&dtDate); //START m_edStart.GetWindowText(strData); //added 09/20/2000 to catch "Weatherall's bug". if(strData.IsEmpty()) strData="12:00pm"; dtTime.ParseDateTime(strData,VAR_TIMEVALUEONLY); dtData.SetDateTime(dtDate.GetYear(),dtDate.GetMonth(),dtDate.GetDay(),dtTime.GetHour(),dtTime.GetMinute(),dtTime.GetSecond()); rs->UpdateField("start",&dtData); //STOP Time //END DATE m_dtEndDate.GetTime(dtEndDate); m_edEnd.GetWindowText(strData); //added 09/20/2000 to catch "Weatherall's bug". if(strData.IsEmpty()) strData="12:00pm"; dtTime.ParseDateTime(strData,VAR_TIMEVALUEONLY); dtData.SetDateTime(dtEndDate.GetYear(),dtEndDate.GetMonth(),dtEndDate.GetDay(),dtTime.GetHour(),dtTime.GetMinute(),dtTime.GetSecond()); rs->UpdateField("stop",&dtData); //DETAILS m_edNotes.GetWindowText(strData); rs->UpdateField("details",&strData); //08/21/2001 each tab sets it's own indexed status now bData=false; rs->UpdateField("indexed",&bData); rs->SaveRecord(); rs->pTheConnection->CommitTrans(); rs->Close(); //flush through changes or caller wont show updates //rs->QueryReadOnly("SELECT labor.* FROM labor WHERE (((labor.link)=0));"); CDialog::OnOK(); } void CWoTabLabourEntryDlg::OnBtncancel() { //just don't save fields CDialog::OnCancel(); } void CWoTabLabourEntryDlg::OnKillfocusEdend() { COleDateTime dtTime; CString strData; if(m_edEnd.GetModify()==TRUE) *bModified=true; m_edEnd.GetWindowText(strData); if(dtTime.ParseDateTime(strData,VAR_TIMEVALUEONLY)==FALSE) { AfxMessageBox("Invalid time entered.\r\n" "You can enter time in many ways\r\n" "We find it faster to use the period\r\n" "symbol rather than a colon during entry.\r\n\r\n" "Here are some examples of valid entry:\r\n" "22.23 is interpreted as 10:00pm\r\n" "9.0 = 9:00am\r\n" "4.3p = 4:03pm\r\n" "good old fashioned 12:30 still = 12:30pm\r\n" "Outside north america valid entries\r\n" "for your locale may be different"); return; } strData=dtTime.Format(VAR_TIMEVALUEONLY); m_edEnd.SetWindowText(strData); } void CWoTabLabourEntryDlg::OnKillfocusEdstart() { COleDateTime dtTime; CString strData; if(m_edStart.GetModify()==TRUE) *bModified=true; m_edStart.GetWindowText(strData); if(dtTime.ParseDateTime(strData,VAR_TIMEVALUEONLY)==FALSE) { AfxMessageBox("Invalid time entered.\r\n" "You can enter time in many ways\r\n" "We find it faster to use the period\r\n" "symbol rather than a colon during entry.\r\n\r\n" "Here are some examples of valid entry:\r\n" "22.23 is interpreted as 10:00pm\r\n" "9.0 = 9:00am\r\n" "4.3p = 4:03pm\r\n" "good old fashioned 12:30 still = 12:30pm\r\n" "Outside north america valid entries\r\n" "for your locale may be different"); return; } strData=dtTime.Format(VAR_TIMEVALUEONLY); m_edStart.SetWindowText(strData); } void CWoTabLabourEntryDlg::OnKillfocusEdnotes() { if(m_edNotes.GetModify()) *bModified=true; } void CWoTabLabourEntryDlg::OnKillfocusEdnc() { if(!m_edNC.GetModify()) return; //HOURS CString strData; float fData; m_edNC.GetWindowText(strData); if(strData.IsEmpty()) strData="0"; _variant_t vtData(strData); //v1.9.4.4 added try / catch mechanism to catch dumb-asses entering text in a numeric field try { fData=(float)vtData;//cast variant to float (locale friendly) } catch( _com_error &e ) { AfxMessageBox("I could not interpret your entry in the No charge hours field\r\n" "I can't save this field until a valid entry is made.\r\n" "If you want to leave it blank, put a zero in it."); m_edNC.Undo(); m_edNC.SetModify(FALSE); m_edNC.SetFocus(); return; } //entry was cleared so set back to //unmodified so it will check if changed again m_edNC.SetModify(FALSE); *bModified=true; } void CWoTabLabourEntryDlg::OnKillfocusEdbill() { if(!m_edBill.GetModify()) return; //HOURS CString strData; float fData; m_edBill.GetWindowText(strData); if(strData.IsEmpty()) strData="0"; _variant_t vtData(strData); //v1.9.4.4 added try / catch mechanism to catch dumb-asses entering text in a numeric field try { fData=(float)vtData;//cast variant to float (locale friendly) } catch( _com_error &e ) { AfxMessageBox("I could not interpret your entry in the Billable hours field\r\n" "I can't save this field until a valid entry is made.\r\n" "If you want to leave it blank, put a zero in it."); m_edBill.Undo(); m_edBill.SetModify(FALSE); m_edBill.SetFocus(); return; } //entry was cleared so set back to //unmodified so it will check if changed again m_edBill.SetModify(FALSE); *bModified=true; } void CWoTabLabourEntryDlg::OnDatetimechangeDtdate(NMHDR* pNMHDR, LRESULT* pResult) { COleDateTime dtData; m_dtDate.GetTime(dtData); m_dtEndDate.SetTime(dtData); *bModified=true; *pResult = 0; } void CWoTabLabourEntryDlg::OnDatetimechangeDtdateend(NMHDR* pNMHDR, LRESULT* pResult) { *bModified=true; *pResult = 0; } void CWoTabLabourEntryDlg::OnCloseupCbrateslist() { *bModified=true; } void CWoTabLabourEntryDlg::OnCloseupCbtechlist() { *bModified=true; SetClientRates(); } void CWoTabLabourEntryDlg::OnCloseupCbtravelrateslist() { *bModified=true; } void CWoTabLabourEntryDlg::OnKillfocusEdtravel() { if(!m_edTravel.GetModify()) return; //HOURS CString strData; float fData; m_edTravel.GetWindowText(strData); if(strData.IsEmpty()) strData="0"; _variant_t vtData(strData); //v1.9.4.4 added try / catch mechanism to catch dumb-asses entering text in a numeric field try { fData=(float)vtData;//cast variant to float (locale friendly) } catch( _com_error &e ) { AfxMessageBox("I could not interpret your entry in the Travel hours field\r\n" "I can't save this field until a valid entry is made.\r\n" "If you want to leave it blank, put a zero in it."); m_edTravel.Undo(); m_edTravel.SetModify(FALSE); m_edTravel.SetFocus(); return; } //entry was cleared so set back to //unmodified so it will check if changed again m_edTravel.SetModify(FALSE); *bModified=true; } void CWoTabLabourEntryDlg::Security() { int x=m_pApp->Allowed(RWORKORDER,false); if(x==0)//no access allowed { m_pApp->SecurityWarning(); CDialog::OnCancel(); } if(x==2 )//read only//changed01/22/01 allow non tech entry { m_cbRatesList.EnableWindow(FALSE); m_cbTechList.EnableWindow(FALSE); m_cbTravelRatesList.EnableWindow(FALSE); m_dtDate.EnableWindow(FALSE); //v1.9.4.2 m_dtEndDate.EnableWindow(FALSE); m_edBill.SetReadOnly(TRUE); m_edEnd.SetReadOnly(TRUE); m_edNC.SetReadOnly(TRUE); m_edNotes.SetReadOnly(TRUE); m_edStart.SetReadOnly(TRUE); m_edTravel.SetReadOnly(TRUE); m_edDistance.SetReadOnly(TRUE); m_lblRate.EnableWindow(FALSE); m_lblTech.EnableWindow(FALSE); m_lblTravelRate.EnableWindow(FALSE); m_btnCancel.ShowWindow(FALSE); } } //Extensively modified for v1.9.4.4 //now sets rates based on selected tech not current users id //also now skips changing settings if hours are non-zero void CWoTabLabourEntryDlg::SetClientRates() { CString q; //Dont change a thing if hours were entered m_edBill.GetWindowText(q); if(q!="0") return; //long lData; long lClientDefRate,lClientDefTravelRate; long lSelectedTechDefRate,lSelectedTechDefTravelRate; //Get clients default rates q.Format("SELECT clients.defrate, clients.deftravelrate " "FROM clients " "WHERE (((clients.id)=%s));",m_strClientID); cbrs->QueryReadOnly(q); if(cbrs->IsEmpty()) { lClientDefRate=0; lClientDefTravelRate=0; } else { cbrs->FetchField("defrate",&lClientDefRate); cbrs->FetchField("deftravelrate",&lClientDefTravelRate); } cbrs->Close(); //Get selected tech's default rates q.Format("SELECT users.defrate, users.deftravelrate " "FROM users " "WHERE (((users.id)=%s));",m_cbTechList.GetCurrentRowID()); cbrs->QueryReadOnly(q); if(cbrs->IsEmpty()) { lSelectedTechDefRate=0; lSelectedTechDefTravelRate=0; } else { cbrs->FetchField("defrate",&lSelectedTechDefRate); cbrs->FetchField("deftravelrate",&lSelectedTechDefTravelRate); } cbrs->Close(); //Set rate to client or selected tech as appropriate if(lClientDefRate!=0) m_cbRatesList.Select(lClientDefRate); else m_cbRatesList.Select(lSelectedTechDefRate); //Set travel rate if(lClientDefTravelRate!=0) m_cbTravelRatesList.Select(lClientDefTravelRate); else m_cbTravelRatesList.Select(lSelectedTechDefTravelRate);//v1.9.4.4 } /* void CWoTabLabourEntryDlg::SetClientRates() { CString q; long lData; q.Format("SELECT clients.defrate, clients.deftravelrate " "FROM clients " "WHERE (((clients.id)=%s));",m_strClientID); cbrs->QueryReadOnly(q); if(cbrs->IsEmpty()) { return; } cbrs->FetchField("defrate",&lData); if(lData!=0) m_cbRatesList.Select(lData); cbrs->FetchField("deftravelrate",&lData); if(lData!=0) m_cbTravelRatesList.Select(lData); } */ void CWoTabLabourEntryDlg::OnLblrate() { CRatesDlg d; if(d.DoModal()==IDOK) FillRatesList(); } void CWoTabLabourEntryDlg::OnLbltravelrate() { OnLblrate(); } void CWoTabLabourEntryDlg::OnEnKillfocusEdDistance() { if(!m_edDistance.GetModify()) return; //HOURS CString strData; float fData; m_edDistance.GetWindowText(strData); if(strData.IsEmpty()) strData="0"; _variant_t vtData(strData); //v1.9.4.4 added try / catch mechanism to catch dumb-asses entering text in a numeric field try { fData=(float)vtData;//cast variant to float (locale friendly) } catch( _com_error &e ) { AfxMessageBox("I could not interpret your entry in the Distance field\r\n" "I can't save this field until a valid entry is made.\r\n" "If you want to leave it blank, put a zero in it."); m_edDistance.Undo(); m_edDistance.SetModify(FALSE); m_edDistance.SetFocus(); return; } //entry was cleared so set back to //unmodified so it will check if changed again m_edDistance.SetModify(FALSE); *bModified=true; }