// SimpleWODlg.cpp : implementation file // #include "stdafx.h" #include "sp.h" #include "SimpleWODlg.h" #include "RatesDlg.h" #include "ContactsViewDlg.h" #include "probstatdlg.h" #include #include ".\simplewodlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif //#define _EAF 1 #define _STARTING_PRINT_COMMAND_ID 32299 ///////////////////////////////////////////////////////////////////////////// // CSimpleWODlg dialog CSimpleWODlg::CSimpleWODlg(CWnd* pParent /*=NULL*/) : CDialog(CSimpleWODlg::IDD, pParent) , m_pSubMenu(NULL) , m_bShowQueriesOnPrint(false) , m_bAlertPopup(false) { //{{AFX_DATA_INIT(CSimpleWODlg) //}}AFX_DATA_INIT m_pApp = (CSpApp*)AfxGetApp(); /* rs=new GZRset("Quick workorder screen error:"); rs->SetConnect(m_pApp->strConnectString); cbrs=new GZRset("Quick workorder screen contract RS error:"); cbrs->SetConnect(m_pApp->strConnectString); rsPrint=new GZRset("Quick workorder screen rsPrint error:",true); rsPrint->SetConnect(m_pApp->strConnectString); //create the extra recordsets to facilitate quick //saves later on rsProb=new GZRset("Quick workorder screen Prob table error:"); rsLabor=new GZRset("Quick workorder screen Labour table error:"); rsProb->SetConnect(m_pApp->strConnectString); rsLabor->SetConnect(m_pApp->strConnectString); */ //Initialize recordset pointer rs=m_pApp->rsPool->GetRS("CSimpleWODlg RS"); cbrs=m_pApp->rsPool->GetRS("CSimpleWODlg CBRS"); rsProb=m_pApp->rsPool->GetRS("CSimpleWODlg RSPROB"); rsLabor=m_pApp->rsPool->GetRS("CSimpleWODlg RSLABOR"); rsPrint=m_pApp->rsPool->GetRSPrint("CSimpleWODlg RSPRINT"); //not editing as far as known m_bEditing=false; m_strSelectedRate.Empty(); m_strSelectedTravelRate.Empty(); m_strSelectedTech.Empty(); m_strSelClient.Empty(); m_strWorkorderID="0"; } CSimpleWODlg::~CSimpleWODlg() { m_pApp->rsPool->ReleaseRS(&rsLabor->m_nID); m_pApp->rsPool->ReleaseRS(&rs->m_nID); m_pApp->rsPool->ReleaseRS(&cbrs->m_nID); m_pApp->rsPool->ReleaseRS(&rsPrint->m_nID); m_pApp->rsPool->ReleaseRS(&rsProb->m_nID); //_CrtDumpMemoryLeaks(); } void CSimpleWODlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CSimpleWODlg) DDX_Control(pDX, IDC_DATEPICKER2, m_dtEndDate); DDX_Control(pDX, IDC_LBLTECHNOTES, m_lblTechNotes); DDX_Control(pDX, IDC_HISTORY, m_lblHistory); DDX_Control(pDX, IDC_EDOURREFNUMBER2, m_edOurRefNum); DDX_Control(pDX, IDC_CBSTATUS, m_cbStatus); DDX_Control(pDX, IDC_lblContactInfo, m_lblContactInfo); DDX_Control(pDX, IDC_EDCLIENTREFNUM, m_edClientRefNumber); DDX_Control(pDX, IDC_EDCLIENTCONTACT, m_edClientContact); DDX_Control(pDX, IDC_LBLCONTRACT, m_lblContract); DDX_Control(pDX, IDC_TECH_LABEL, m_lblTechList); DDX_Control(pDX, IDC_TECHLIST, m_cbTechList); DDX_Control(pDX, IDC_TRAVELRATELABEL, m_lblTravelRate); DDX_Control(pDX, IDC_TRAVELRATESLIST, m_cbTravelRates); DDX_Control(pDX, IDC_ONSITE, m_ckOnsite); DDX_Control(pDX, IDC_DATEPICKER, m_dtDate); DDX_Control(pDX, IDC_CLIENTLIST_LABEL, m_lblClients); DDX_Control(pDX, IDC_RATE_LABEL, m_lblRate); DDX_Control(pDX, IDC_LABEL_CATEGORY, m_lblCategory); DDX_Control(pDX, IDC_ENDTIMERLABEL, m_lblEnd); DDX_Control(pDX, IDC_TIMER, m_btnTimer); DDX_Control(pDX, IDC_GENERALNOTES, m_edDetails); DDX_Control(pDX, IDC_INVOICENUM, m_edInvoicedOn); DDX_Control(pDX, IDC_TRAVEL, m_edTravelHours); DDX_Control(pDX, IDC_NC, m_edNCHours); DDX_Control(pDX, IDC_BILL, m_edBillHours); DDX_Control(pDX, IDC_END, m_edEnd); DDX_Control(pDX, IDC_START, m_edStart); DDX_Control(pDX, IDC_TYPE, m_cbTypes); DDX_Control(pDX, IDC_RATESLIST, m_cbRates); DDX_Control(pDX, IDC_CLIENTLIST, m_cbClients); //}}AFX_DATA_MAP DDX_Control(pDX, IDC_ED_DISTANCE, m_edDistance); DDX_Control(pDX, IDC_LBLSTATUS, m_lblStatus); } //IDC_LBLSTATUS BEGIN_MESSAGE_MAP(CSimpleWODlg, CDialog) //{{AFX_MSG_MAP(CSimpleWODlg) ON_BN_CLICKED(IDC_TIMER, OnTimer) ON_BN_CLICKED(IDC_LABEL_CATEGORY, OnLabelCategory) ON_BN_CLICKED(IDC_RATE_LABEL, OnRateLabel) ON_BN_CLICKED(IDC_CLIENTLIST_LABEL, OnClientlistLabel) ON_CBN_CLOSEUP(IDC_TRAVELRATESLIST, OnCloseupTravelrateslist) ON_CBN_CLOSEUP(IDC_RATESLIST, OnCloseupRateslist) ON_BN_CLICKED(IDC_TRAVELHOURSLABEL, OnTravelhourslabel) ON_CBN_CLOSEUP(IDC_TECHLIST, OnCloseupTechlist) ON_CBN_CLOSEUP(IDC_TYPE, OnCloseupType) ON_EN_KILLFOCUS(IDC_TRAVEL, OnKillfocusTravel) ON_EN_KILLFOCUS(IDC_START, OnKillfocusStart) ON_BN_CLICKED(IDC_ONSITE, OnOnsite) ON_EN_KILLFOCUS(IDC_NC, OnKillfocusNc) ON_EN_KILLFOCUS(IDC_INVOICENUM, OnKillfocusInvoicenum) ON_EN_KILLFOCUS(IDC_GENERALNOTES, OnKillfocusGeneralnotes) ON_EN_KILLFOCUS(IDC_END, OnKillfocusEnd) ON_NOTIFY(DTN_DATETIMECHANGE, IDC_DATEPICKER, OnDatetimechangeDatepicker) ON_CBN_CLOSEUP(IDC_CLIENTLIST, OnCloseupClientlist) ON_EN_KILLFOCUS(IDC_BILL, OnKillfocusBill) ON_BN_CLICKED(IDC_LBLCONTRACT, OnLblcontract) ON_EN_KILLFOCUS(IDC_EDCLIENTCONTACT, OnKillfocusEdclientcontact) ON_EN_KILLFOCUS(IDC_EDCLIENTREFNUM, OnKillfocusEdclientrefnum) ON_COMMAND(ID_QUICKWO_DONE, OnQuickwoDone) ON_COMMAND(ID_QUICKWO_CLIENTNOTES, OnQuickwoClientnotes) ON_COMMAND(ID_QUICKWO_DELETE, OnQuickwoDelete) ON_COMMAND(ID_QUICKWO_PRINT, OnQuickwoPrint) ON_COMMAND(ID_QUICKWO_PRINT_DISPATCH, OnQuickwoPrintDispatch) ON_EN_KILLFOCUS(IDC_EDOURREFNUMBER2, OnKillfocusEdourrefnumber2) ON_CBN_CLOSEUP(IDC_CBSTATUS, OnCloseupCbstatus) ON_BN_CLICKED(IDC_HISTORY, OnHistory) ON_BN_CLICKED(IDC_LBLTECHNOTES, OnLbltechnotes) ON_COMMAND(ID_QUICKWO_COSTATUS, OnQuickwoCostatus) ON_NOTIFY(DTN_DATETIMECHANGE, IDC_DATEPICKER2, OnDatetimechangeDatepicker2) ON_BN_CLICKED(IDC_TRAVELRATELABEL, OnTravelratelabel) //}}AFX_MSG_MAP ON_EN_KILLFOCUS(IDC_ED_DISTANCE, OnEnKillfocusEdDistance) ON_COMMAND_RANGE( _STARTING_PRINT_COMMAND_ID, _STARTING_PRINT_COMMAND_ID+100, OnPrintReport ) ON_BN_CLICKED(IDC_LBLSTATUS, OnStatuslabel) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CSimpleWODlg message handlers afx_msg void OnPrintReport( UINT nID ); BOOL CSimpleWODlg::OnInitDialog() { CDialog::OnInitDialog(); m_resize.Create( this ); m_resize.Add(IDC_GENERALNOTES,0,0,0,90); //Use the current width and height as the minimum size m_resize.SetMinimumTrackingSize(); Security(); bool bIsNew=false; CMenu* pMenu=this->GetMenu(); CWaitCursor WAITING; //if(!m_pApp->m_bTech) // AfxMessageBox("Not a tech"); ShowWindow(FALSE); CString str,q; long lData=0; m_bTiming=false; //Contract m_lblContract.SetTextColor(RGB(255,0,0)); m_lblContract.SetFontUnderline(TRUE); m_lblContract.SetFontBold(TRUE); m_lblContract.SetLink(TRUE); m_lblContract.SetLinkCursor(m_pApp->hcHand); m_lblContract.SetLinkURL(""); //Tech notes m_lblTechNotes.SetTextColor(RGB(255,0,0)); m_lblTechNotes.SetFontUnderline(TRUE); m_lblTechNotes.SetFontBold(TRUE); m_lblTechNotes.SetLink(TRUE); m_lblTechNotes.SetLinkCursor(m_pApp->hcHand); m_lblTechNotes.SetLinkURL(""); m_lblHistory.SetTextColor(RGB(0,0,255)); m_lblHistory.SetFontUnderline(TRUE); m_lblHistory.SetLink(TRUE); m_lblHistory.SetLinkCursor(m_pApp->hcHand); m_lblHistory.SetLinkURL(""); //Category hyperlink m_lblCategory.SetTextColor(RGB(0,0,255)); m_lblCategory.SetFontUnderline(TRUE); m_lblCategory.SetLink(TRUE); m_lblCategory.SetLinkCursor(m_pApp->hcHand); //empty url means it will not launch explorer //and can be used as a button instead m_lblCategory.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(""); //Clients dialog hyperlink m_lblClients.SetTextColor(RGB(0,0,255)); m_lblClients.SetFontUnderline(TRUE); m_lblClients.SetLink(TRUE); m_lblClients.SetLinkCursor(m_pApp->hcHand); m_lblClients.SetLinkURL(""); //v1.9.3.0 Status dialog hyperlink m_lblStatus.SetTextColor(RGB(0,0,255)); m_lblStatus.SetFontUnderline(TRUE); m_lblStatus.SetLink(TRUE); m_lblStatus.SetLinkCursor(m_pApp->hcHand); m_lblStatus.SetLinkURL(""); //fill combo boxes FillClientList(); FillRatesList(); FillWOTypesList(); FillTechList(); FillStatusList(); FillReportList(); //AfxMessageBox(m_cbTechList.GetCurrentRowID()); //client contact info display m_lblContactInfo.SetFontBold(TRUE); m_lblContactInfo.SetFontSize(12); //CREATE A NEW WORKORDER IF WERE NOT EDITING AN OLD ONE if(m_strWorkorderID=="0") { //v1.9.4.4 - fix for no techs and trying to make a new work order if(m_cbTechList.GetCount()==0) { //ABORT, no tech AfxMessageBox("There are no active technicians available!\r\n\r\n" "A work order can not be created until there is an active technician\r\n" "entered.\r\n\r\n" "(Use the: Options->Edit->Users&Rights menu sequence.)\r\n",MB_ICONSTOP); CDialog::OnCancel(); return FALSE; } bIsNew=true; //start a new workorder: COleDateTime dtData; dtData=COleDateTime::GetCurrentTime(); q.Format("INSERT INTO wo ( creator, created, modifier, modified ) " "SELECT %u, #%s#,%u, #%s#;",m_pApp->m_lusrID,dtData.Format(_T("%m/%d/%Y %H:%M:%S")),m_pApp->m_lusrID,dtData.Format(_T("%m/%d/%Y %H:%M:%S"))); rs->Ex(q,&lData); rs->Close(); m_strWorkorderID.Format("%u",lData); m_strID.Format("%u",lData); str.Format("Quick WO#: %s",m_strID); SetWindowText(str); // str="Quick Workorder - "+ m_pApp->m_strCurrentUserName; // SetWindowText(str); m_dtDate.SetTime(dtData); m_edNCHours.SetWindowText("0"); m_edTravelHours.SetWindowText("0"); m_edDistance.SetWindowText("0"); m_edBillHours.SetWindowText("0"); m_edStart.SetWindowText("12:00"); m_edEnd.SetWindowText("12:00"); //SET USER DEFAULTS m_ckOnsite.SetCheck(m_pApp->m_bDefOnsite ? TRUE : FALSE); m_cbRates.Select(m_pApp->m_lUsersDefRate); m_cbTravelRates.Select(m_pApp->m_lUsersDefTravelRate); // SET THE DEFAULT STATUS of this new workorder m_cbStatus.Select(m_pApp->m_lDefNewWOStatus); pMenu->ModifyMenu(ID_QUICKWO_DELETE,MF_BYCOMMAND,ID_QUICKWO_DELETE,"Cancel add"); } else//yes we are editing, fill in the fields { //no timer if editing.!@#$@!#$! m_btnTimer.ShowWindow(FALSE); FillFields(); FillRatesList(); } if(m_bEditing) Check4Contract(false); /////////ShowWindow(SW_SHOWMAXIMIZED); //=================================================== // SET WINDOW SIZE TO MATCH WORK AREA ShowWindow(SW_SHOWMAXIMIZED); CRect workarea; SystemParametersInfo(SPI_GETWORKAREA,0,&workarea,0); SetWindowPos(NULL,workarea.left,workarea.top,workarea.Width(),workarea.Height(),SWP_NOZORDER); //=================================================== //added 6/24/2001 to avoid mouse wheel accidental cust change when viewing only if(bIsNew) m_cbClients.SetFocus(); else m_edDetails.SetFocus(); return FALSE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CSimpleWODlg::FillClientList() { CString strData; CString strIndex; CString strHead,q; long lData; m_cbClients.Clear(); m_cbClients.AddRow(" ","0"); lData=0; q.Format("SELECT clients.id, clients.company AS compname FROM clients WHERE (((clients.isheadoffice)=False)) " "ORDER BY clients.company;"); cbrs->QueryReadOnly(q); if(!cbrs->IsEmpty()) { //fill combo box with available clients VERIFY(cbrs->MoveFirst()); VERIFY(cbrs->FetchField("compname",&strData)); VERIFY(cbrs->FetchField("id",&lData)); strIndex.Format("%u",lData); m_cbClients.AddRow(strData,strIndex); while(cbrs->MoveForward()) { VERIFY(cbrs->FetchField("compname",&strData)); VERIFY(cbrs->FetchField("id",&lData)); strIndex.Format("%u",lData); m_cbClients.AddRow(strData,strIndex); } m_cbClients.SetCurSel(0); }//is no records? } void CSimpleWODlg::FillRatesList() { //fill travel and regular rates list boxes CString strData; CString strIndex; long lData; bool bData,bActive; m_cbTravelRates.Clear(); m_cbRates.Clear(); cbrs->QueryReadOnly("SELECT rates.* FROM rates ORDER BY rates.name;"); if(!cbrs->IsEmpty()) { //fill combo box with available RATES do { cbrs->FetchField("travelrate",&bData); cbrs->FetchField("name",&strData); cbrs->FetchField("id",&lData); cbrs->FetchField("active",&bActive); strIndex.Format("%u",lData); if(bData==true)//it's a travel rate { if(bActive) m_cbTravelRates.AddRow(strData,strIndex); else { if(m_strSelectedTravelRate==strIndex)//inactive but selected { strData=" " + strData; m_cbTravelRates.AddRow(strData,strIndex); } } } else//it's a standard rate { if(bActive) m_cbRates.AddRow(strData,strIndex); else { if(m_strSelectedRate==strIndex)//inactive but selected { strData=" " + strData; m_cbRates.AddRow(strData,strIndex); } } } }while(cbrs->MoveForward()); //select default rate if(m_strSelectedRate.IsEmpty()) { m_cbRates.SetCurSel(0); m_strSelectedRate=m_cbRates.GetCurrentRowID(); } else m_cbRates.Select(m_strSelectedRate); //select default travel rate if(m_strSelectedTravelRate.IsEmpty()) { m_cbTravelRates.SetCurSel(0); m_strSelectedTravelRate=m_cbTravelRates.GetCurrentRowID(); } else m_cbTravelRates.Select(m_strSelectedTravelRate); } } void CSimpleWODlg::FillWOTypesList() { CString strData; CString strIndex; long lData; m_cbTypes.Clear(); m_cbTypes.AddRow("< No category >","0"); cbrs->QueryReadOnly("SELECT wotypes.* FROM wotypes ORDER BY wotypes.category;"); if(!cbrs->IsEmpty()) { //fill combo box with available categories cbrs->MoveFirst(); cbrs->FetchField("category",&strData); cbrs->FetchField("id",&lData); strIndex.Format("%u",lData); m_cbTypes.AddRow(strData,strIndex); while(cbrs->MoveForward()) { cbrs->FetchField("category",&strData); cbrs->FetchField("id",&lData); strIndex.Format("%u",lData); m_cbTypes.AddRow(strData,strIndex); } m_cbTypes.SetCurSel(0); } } void CSimpleWODlg::OnTimer() { CString str; double secs; COleDateTimeSpan sp; if(!m_bTiming)//then start the timer { //see if there is a start time already m_edStart.GetWindowText(str); if(!str.IsEmpty()) { if(AfxMessageBox("Reset start time and start timer?\r\nAre you sure?",MB_YESNO)==IDNO) return; } dt1=COleDateTime::GetCurrentTime(); str=dt1.Format(VAR_TIMEVALUEONLY); m_edStart.SetWindowText(str); m_edEnd.SetWindowText("Timing..."); m_btnTimer.SetWindowText("Stop timer"); m_lblEnd.SetFontBold(TRUE); m_lblEnd.SetTextColor(RGB(255,0,0)); m_lblEnd.FlashText(TRUE); m_bTiming=true; } else//stop the timer { dt2=COleDateTime::GetCurrentTime(); str=dt2.Format(VAR_TIMEVALUEONLY); m_edEnd.SetWindowText(str); m_btnTimer.SetWindowText("Timer"); m_lblEnd.SetFontBold(FALSE); m_lblEnd.SetTextColor(RGB(0,0,0)); m_lblEnd.FlashText(FALSE); m_bTiming=false; sp=dt2-dt1; secs=sp.GetTotalMinutes(); secs=secs/60; //strData.Format("%g",fData); //01/31/2003 localization fix for floats //convert float to localized string m_edBillHours.SetWindowText(FtoA(secs)); } } void CSimpleWODlg::OnLabelCategory() { CString str; CWOTypesDlg d; d.SetReturnString(&str); if(d.DoModal()==IDOK) { //fill category list FillWOTypesList(); //select str string; m_cbTypes.Select(str); } } void CSimpleWODlg::OnRateLabel() { CRatesDlg d; if(d.DoModal()==IDOK) FillRatesList(); } //**************************************** void CSimpleWODlg::OnClientlistLabel() { CString str; CClientsDlg d; d.SetReturnString(&str); //Added 08/28/2001 to pre-select client on clients screen d.m_strForceSelection=m_strSelClient; if(d.DoModal()==IDOK) { FillClientList(); m_cbClients.Select(str); } //FillFields(); } //---------------------------------------- //******************************** void CSimpleWODlg::OnOK() { } //************************************************* //Pass in ID of workorder we want to edit/display void CSimpleWODlg::SetWorkorderID(CString *pstrWOID) { //set the workorder to display m_strWorkorderID=*pstrWOID; //flag that were in editing mode if(m_strWorkorderID!="0") m_bEditing=true; } void CSimpleWODlg::OnCloseupTravelrateslist() { m_strSelectedTravelRate=m_cbTravelRates.GetCurrentRowID(); SaveField(&m_cbTravelRates,"travrate",rsLabor); } void CSimpleWODlg::OnCloseupRateslist() { m_strSelectedRate=m_cbRates.GetCurrentRowID(); SaveField(&m_cbRates,"rate",rsLabor); } void CSimpleWODlg::OnTravelhourslabel() { //same deal whichever gets clicked //FUTURE: make it only show travel rates //and vice versa depending on what gets clicked OnRateLabel(); } //fill the fields if this is an editing workorder// void CSimpleWODlg::FillFields() { if(!m_bEditing) return; //m_strWorkorderID CString q,strData,strProblemID; bool bData; float fData; COleDateTime dtData; long lData; q.Format("SELECT wo.* FROM wo WHERE (((wo.id)=%s));",m_strWorkorderID); rs->Query(q); if(rs->IsEmpty()) { AfxMessageBox("Can't find workorder record"); CDialog::OnOK(); return; } strData.Format("Quick WO#: %s",m_strWorkorderID); SetWindowText(strData); //OUR REFERENCE NUMBER rs->FetchField("ourref",&strData); m_edOurRefNum.SetWindowText(strData); //STATUS rs->FetchField("status",&lData); strData.Format("%u",lData); m_cbStatus.Select(strData); //CLIENT rs->FetchField("client",&lData); strData.Format("%u",lData); m_cbClients.Select(strData); m_strSelClient=strData; //CATEGORY rs->FetchField("type",&lData); strData.Format("%u",lData); m_cbTypes.Select(strData); //ONSITE rs->FetchField("onsite",&bData); m_ckOnsite.SetCheck(bData ? TRUE:FALSE); /* //DATE rs->FetchField("closed",&dtData); m_dtDate.SetTime(dtData); */ //CLOSED/OPEN rs->FetchField("closed",&dtData); //commented out 10/11/2002 get from labor table instead //m_dtDate.SetTime(dtData); m_bIsOpen=false; if(dtData.GetYear()==1968)//it's open m_bIsOpen=true; UpdateClosedOpen(); //**************** //commented out 10/11/2002, should get from labor table //not workorder header table ////STARTTIME //rs->FetchField("starttime",&dtData); //strData=dtData.Format(VAR_TIMEVALUEONLY); //m_edStart.SetWindowText(strData); // ////STOPTIME //rs->FetchField("stoptime",&dtData); //added June 23 2001 to support end date values //m_dtEndDate.SetTime(dtData); //*********************** strData=dtData.Format(VAR_TIMEVALUEONLY); m_edEnd.SetWindowText(strData); //INVOICE NUMBER rs->FetchField("invoice",&strData); m_edInvoicedOn.SetWindowText(strData); //CLIENT REFERENCE NUMBER rs->FetchField("clientrefnum",&strData); m_edClientRefNumber.SetWindowText(strData); //CLIENT CONTACT rs->FetchField("clientcontact",&strData); m_edClientContact.SetWindowText(strData); //FETCH THE PROBLEM RECORD FIELDS q.Format("SELECT probs.* FROM probs WHERE (((probs.wolink)=%s));",m_strWorkorderID); rsProb->Query(q); if(rsProb->IsEmpty()) { AfxMessageBox("Can't find workorder problem record\r\nThis quick workorder is damaged or incomplete."); CDialog::OnOK(); return; } //get id rsProb->FetchField("id",&lData); strProblemID.Format("%u",lData); //FETCH THE BILLABLE LABOUR RECORD q.Format("SELECT labor.* FROM labor " "LEFT JOIN rates ON labor.rate = rates.id " "WHERE (((labor.link)=%s));",strProblemID); rsLabor->Query(q); if(rsLabor->IsEmpty()) return; //START rsLabor->FetchField("start",&dtData); strData=dtData.Format(VAR_TIMEVALUEONLY); m_edStart.SetWindowText(strData); m_dtDate.SetTime(dtData); //STOP rsLabor->FetchField("stop",&dtData); strData=dtData.Format(VAR_TIMEVALUEONLY); m_edEnd.SetWindowText(strData); m_dtEndDate.SetTime(dtData); //HOURS rsLabor->FetchField("hours",&fData); //strData.Format("%g",fData); //01/31/2003 localization fix for floats //convert float to localized string m_edBillHours.SetWindowText(FtoA(fData)); //NOCHARGE HOURS rsLabor->FetchField("nchours",&fData); //01/31/2003 localization fix for floats //convert float to localized string m_edNCHours.SetWindowText(FtoA(fData)); //TECHNICIAN rsLabor->FetchField("tech",&lData); m_strSelectedTech.Format("%u",lData); FillTechList(); //RATE rsLabor->FetchField("rate",&lData); strData.Format("%u",lData); m_strSelectedRate=strData; m_cbRates.Select(strData); //DETAILS rsLabor->FetchField("details",&strData); m_edDetails.SetWindowText(strData); //TRAVEL HOURS rsLabor->FetchField("travhours",&fData); //01/31/2003 localization fix for floats //convert float to localized string m_edTravelHours.SetWindowText(FtoA(fData)); //TRAVEL RATE rsLabor->FetchField("travrate",&lData); strData.Format("%u",lData); m_strSelectedTravelRate=strData; m_cbTravelRates.Select(strData); //DISTANCE rsLabor->FetchField("distance",&fData); //01/31/2003 localization fix for floats //convert float to localized string m_edDistance.SetWindowText(FtoA(fData)); q.Format("SELECT wo.* FROM wo WHERE (((wo.id)=%s));",m_strWorkorderID); rs->Query(q); DisplayContactInfo(); } void CSimpleWODlg::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 CSimpleWODlg::OnCloseupTechlist() { m_strSelectedTech=m_cbTechList.GetCurrentRowID(); SaveField(&m_cbTechList,"tech",rsLabor); //added 10/10/2002 to ensure that main workorder list view //shows the tech assigned to the workorder SaveField(&m_cbTechList,"assigntech",rs); //v1.9.4.4 to set rate based on selected tech, not current user id SetClientRates(); } void CSimpleWODlg::OnCloseupType() { SaveField(&m_cbTypes,"type",rs); } void CSimpleWODlg::OnKillfocusTravel() { if(m_edTravelHours.GetModify()==FALSE) return; CString strData; float fData; m_edTravelHours.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 will cause variant to convert to float using locale specific routine //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_edTravelHours.Undo(); m_edTravelHours.SetModify(FALSE); m_edTravelHours.SetFocus(); return; } if(!m_bEditing) return; rsLabor->UpdateField("travhours",&fData); rsLabor->SaveRecord(); m_edTravelHours.SetModify(FALSE); } void CSimpleWODlg::OnEnKillfocusEdDistance() { if( m_edDistance.GetModify()==FALSE) return; CString strData; float fData; 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 vtData(strData); //fData=(float)vtData;//cast variant to float (locale friendly) //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; } //v1.9.4.4 moved down to here so validation occurs even on a new record if(!m_bEditing) return; rsLabor->UpdateField("distance",&fData); rsLabor->SaveRecord(); m_edDistance.SetModify(FALSE); } void CSimpleWODlg::OnKillfocusStart() { //test 10/11/2002, required for saving properly now //if(m_edStart.GetModify()==FALSE) return; COleDateTime dtDate,dtTime; m_dtDate.GetTime(dtDate); CString strData; 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); if(!m_bEditing) return ;//dont attempt to update //REMOVED following block 10/11/2002 //to use labor table for dates exclusively now //save the time only value in the workorder header //rs->UpdateField("starttime",&dtTime); //rs->SaveRecord(); //save the complete date/time in the labor record. Guichy! dtTime.SetDateTime(dtDate.GetYear(),dtDate.GetMonth(),dtDate.GetDay(),dtTime.GetHour(),dtTime.GetMinute(),dtTime.GetSecond()); rsLabor->UpdateField("start",&dtTime); rsLabor->SaveRecord(); m_edStart.SetModify(FALSE); } void CSimpleWODlg::OnOnsite() { SaveField(&m_ckOnsite,"onsite",rs); } void CSimpleWODlg::OnKillfocusNc() { if( m_edNCHours.GetModify()==FALSE) return; CString strData; float fData; //NOCHARGE HOURS m_edNCHours.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) //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_edNCHours.Undo(); m_edNCHours.SetModify(FALSE); m_edNCHours.SetFocus(); return; } //v1.9.4.4 moved down to here so validation occurs even on a new record if(!m_bEditing) return; rsLabor->UpdateField("nchours",&fData); rsLabor->SaveRecord(); m_edNCHours.SetModify(FALSE); } void CSimpleWODlg::OnKillfocusInvoicenum() { SaveField(&m_edInvoicedOn,"invoice",true,rs); } void CSimpleWODlg::OnKillfocusGeneralnotes() { //DETAILS SaveField(&m_edDetails,"details",true,rsLabor); } void CSimpleWODlg::OnKillfocusEnd() { //wo=stoptime,labor=stop //no changes then don't bother //removed 06/23/01 to support end date //because this is called when the end date is changed to handle both end date //and end time //if(m_edEnd.GetModify()!=TRUE) return; COleDateTime dtDate,dtTime; m_dtEndDate.GetTime(dtDate); CString strData; 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); if(!m_bEditing) return ;//dont attempt to update //moved up here 06/23/01 to save full date and time info in both woheader and labour dtTime.SetDateTime(dtDate.GetYear(),dtDate.GetMonth(),dtDate.GetDay(),dtTime.GetHour(),dtTime.GetMinute(),dtTime.GetSecond()); //save the time (and now date value 6/23/01) in the workorder header //rs->UpdateField("stoptime",&dtTime); //rs->SaveRecord(); //save the complete date/time in the labor record. Guichy! //dtTime.SetDateTime(dtDate.GetYear(),dtDate.GetMonth(),dtDate.GetDay(),dtTime.GetHour(),dtTime.GetMinute(),dtTime.GetSecond()); rsLabor->UpdateField("stop",&dtTime); rsLabor->SaveRecord(); m_edEnd.SetModify(FALSE); } //start date void CSimpleWODlg::OnDatetimechangeDatepicker(NMHDR* pNMHDR, LRESULT* pResult) { COleDateTime dtData; m_dtDate.GetTime(dtData); m_dtEndDate.SetTime(dtData); SaveField(&m_dtDate,"closed",rs); SaveField(&m_dtDate,"created",rs); //SaveField(&m_dtDate,"closed",rs); //TEST 10/11/2002 OnKillfocusStart(); //added July 20 2001 as end date still not being saved OnKillfocusEnd(); *pResult = 0; } //end date void CSimpleWODlg::OnDatetimechangeDatepicker2(NMHDR* pNMHDR, LRESULT* pResult) { OnKillfocusEnd(); *pResult = 0; } void CSimpleWODlg::OnCloseupClientlist() { if(m_cbClients.GetCurrentRowID()=="0") return; if(m_bAlertPopup) return; //Added check to avoid repetition if client not changed CString strData; strData=m_cbClients.GetCurrentRowID(); if(strData==m_strSelClient) return; m_strSelClient=m_cbClients.GetCurrentRowID(); SaveField(&m_cbClients,"client",rs); Check4Contract(true); SetClientRates(); DisplayContactInfo(); //Added 10/17/2002 to ensure correct client is selected after a popup //reason being that popping up a dialog box kills focus on the client drop down //which hasn't fully finished updating yet //this cased one of our clients to send a tech to Montreal instead of Toronto //as the previously selected client remained due to the popup causing //the list box to not update to the new client m_cbClients.Select(m_strSelClient); } void CSimpleWODlg::OnKillfocusBill() { if(m_edBillHours.GetModify()==FALSE) return; CString strData; float fData; m_edBillHours.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); try{//v1.9.4.4 added try / catch mechanism to catch dumb-asses entering text in a numeric field 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_edBillHours.Undo(); m_edBillHours.SetModify(FALSE); m_edBillHours.SetFocus(); return; } //v1.9.4.4 moved down to here so validation occurs even on a new record if(!m_bEditing) return; rsLabor->UpdateField("hours",&fData); rsLabor->SaveRecord(); m_edBillHours.SetModify(FALSE); } //************************************************************ //SAVE EDIT CONTROL FIELD //************************************************************ bool CSimpleWODlg::SaveField(CEdit *edControl,CString fldname,bool AllowEmpty,GZRset* rsSet) { if(!m_bEditing) return true;//dont attempt to update CString str; //do nothing if not changed if(edControl->GetModify()!=TRUE) return true; edControl->GetWindowText(str); //dont save empty fields if not allowed to if(!AllowEmpty) { if(str.IsEmpty()) { edControl->Undo(); return false; } } rsSet->UpdateField(fldname,&str); rsSet->SaveRecord(); UpdateModified(); edControl->SetModify(FALSE); return true; } //************************************************************ //SAVE GZCOMBO CONTROL FIELD //************************************************************ bool CSimpleWODlg::SaveField(CgzCombo *cbControl,CString fldname,GZRset* rsSet) { if(!m_bEditing) return true;//dont attempt to update CString str; long lData; str=cbControl->GetCurrentRowID(); if(str.IsEmpty()) return false;//shouldn't happen but... lData=atol(str); rsSet->UpdateField(fldname,&lData); rsSet->SaveRecord(); UpdateModified(); return true; } //************************************************************ //SAVE CheckBox CONTROL FIELD //************************************************************ bool CSimpleWODlg::SaveField(CButton *ckControl,CString fldname,GZRset* rsSet) { if(!m_bEditing) return true;//dont attempt to update bool bData=false; BOOL BData; BData=ckControl->GetCheck(); if(BData==TRUE) bData=true; rsSet->UpdateField(fldname,&bData); rsSet->SaveRecord(); UpdateModified(); return true; } //************************************************************ //SAVE DateTimePicker CONTROL FIELD //************************************************************ bool CSimpleWODlg::SaveField(CDateTimeCtrl *dtControl,CString fldname,GZRset* rsSet) { if(!m_bEditing) return true;//dont attempt to update COleDateTime dtData; dtControl->GetTime(dtData); rsSet->UpdateField(fldname,&dtData); rsSet->SaveRecord(); UpdateModified(); return true; } //************************************************ //UPDATE MODIFIED DATA //************************************************* bool CSimpleWODlg::UpdateModified() { m_pApp->m_bRefreshStatScreen=true; bool bIndexed=false; //updates modified by and modified on fields rs->UpdateField("modifier",&m_pApp->m_lusrID); COleDateTime dtData; dtData=COleDateTime::GetCurrentTime(); rs->UpdateField("modified",&dtData); //flag as now not indexed any longer //note: may not be true if the labour //table parts of this wo were not modified, but //who cares, this is simpler and wont make much //difference in the big picture. rsLabor->UpdateField("indexed",&bIndexed); rsLabor->SaveRecord(); rs->SaveRecord(); return true; } //checks for contract and also checks for tech notes and also popup alert message void CSimpleWODlg::Check4Contract(bool bAlert) { CString q,client,strAlert; client=m_cbClients.GetCurrentRowID(); long lContract,lHeadOffice; //check for contract m_lblContract.ShowWindow(FALSE); m_strClientContractID.Empty(); //See if client has a contract //if so, this will supersede head office so //get contract number and return q.Format("SELECT [clients].[contract], [clients].[headoffice], [clients].[technotes], [clients].[alert] " "FROM clients WHERE ((([clients].[id])=%s) And " "(([clients].[isheadoffice])=False));",client); cbrs->QueryReadOnly(q); ASSERT(!cbrs->IsEmpty()); cbrs->FetchField("contract",&lContract); cbrs->FetchField("headoffice",&lHeadOffice); cbrs->FetchField("technotes",&m_strTechNotes); cbrs->FetchField("alert",&strAlert); if(bAlert) { if(!strAlert.IsEmpty()) { m_bAlertPopup=true; AfxMessageBox(strAlert); m_bAlertPopup=false; } } if(m_strTechNotes.IsEmpty()) m_lblTechNotes.ShowWindow(FALSE); else m_lblTechNotes.ShowWindow(TRUE); if(lContract>0) { m_lblContract.ShowWindow(TRUE); m_strClientContractID.Format("%u",lContract); return; } if(lHeadOffice==0) return;//no head office no point in proceeding //Client has no contract, but does have a head //office which may have a contract... q.Format("SELECT clients.contract " "FROM clients WHERE (((clients.id)=%u));",lHeadOffice); cbrs->QueryReadOnly(q); ASSERT(!cbrs->IsEmpty()); cbrs->FetchField("contract",&lContract); if(lContract>0) { m_lblContract.ShowWindow(TRUE); m_strClientContractID.Format("%u",lContract); } } void CSimpleWODlg::OnLblcontract() { CString q,name,terms; q.Format("SELECT contracts.name, contracts.terms FROM contracts " "WHERE (((contracts.id)=%s));",m_strClientContractID); cbrs->QueryReadOnly(q); if(cbrs->IsEmpty()) { AfxMessageBox("Contract is missing!"); return; } cbrs->FetchField("name",&name); cbrs->FetchField("terms",&terms); q.Format("Contract:\r\n%s\r\n\r\nTerms:\r\n%s",name,terms); AfxMessageBox(q); } //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 CSimpleWODlg::SetClientRates() { CString q; //Dont change a thing if hours were entered m_edBillHours.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_cbClients.GetCurrentRowID()); 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_cbRates.Select(lClientDefRate); else m_cbRates.Select(lSelectedTechDefRate); //Set travel rate if(lClientDefTravelRate!=0) m_cbTravelRates.Select(lClientDefTravelRate); else m_cbTravelRates.Select(lSelectedTechDefTravelRate);//v1.9.4.4 } bool CSimpleWODlg::SaveNewRecord() { m_pApp->m_bRefreshStatScreen=true; long lData,lLink; CString strData,q; COleDateTime dtData,dtTime,dtDate,dtEndDate; bool bData; float fData;//single if(m_cbClients.GetCurrentRowID()=="0") { AfxMessageBox("Please choose a client first"); return false; } rs->Close(); q.Format("SELECT wo.* FROM wo WHERE (((wo.id)=%s));",m_strWorkorderID); rs->Query(q); //otherwise save new record //validate everything //Save the workorder fields //CLIENT lData=atol(m_cbClients.GetCurrentRowID()); ASSERT(lData>0); rs->UpdateField("client",&lData); //CATEGORY lData=atol(m_cbTypes.GetCurrentRowID()); rs->UpdateField("type",&lData); //CLOSED - time workorder closed //keep the date for later on processing //m_dtDate.GetTime(dtDate); //m_dtEndDate.GetTime(dtEndDate); dtDate=COleDateTime::GetCurrentTime(); rs->UpdateField("closed",&dtDate); rs->UpdateField("created",&dtDate); //ONSITE bData= m_ckOnsite.GetCheck() ? true:false; rs->UpdateField("onsite",&bData); //Following block commented out 10/11/2002 //fixed to use labor table times instead ////STARTTIME //m_edStart.GetWindowText(strData); //dtData.ParseDateTime(strData,VAR_TIMEVALUEONLY); //rs->UpdateField("starttime",&dtData); // ////STOPTIME //m_edEnd.GetWindowText(strData); //dtTime.ParseDateTime(strData,VAR_TIMEVALUEONLY); //dtData.SetDateTime(dtEndDate.GetYear(),dtEndDate.GetMonth(),dtEndDate.GetDay(),dtTime.GetHour(),dtTime.GetMinute(),dtTime.GetSecond()); // //rs->UpdateField("stoptime",&dtData); //QUICK - flag this as a quickie workorder //so that it gets displayed on this screen //when selected to view bData=true; rs->UpdateField("quick",&bData); //INVOICE # m_edInvoicedOn.GetWindowText(strData); rs->UpdateField("invoice",&strData); //CLIENT REFERENCE NUMBER m_edClientRefNumber.GetWindowText(strData); rs->UpdateField("clientrefnum",&strData); //OUR REFERENCE NUMBER m_edOurRefNum.GetWindowText(strData); rs->UpdateField("ourref",&strData); //CLIENT CONTACT m_edClientContact.GetWindowText(strData); rs->UpdateField("clientcontact",&strData); //added 10/13/2002 to ensure that main workorder list view //shows the tech assigned to the workorder //ASSIGNTECH //SaveField(&m_cbTechList,"assigntech",rs); lData=atol(m_cbTechList.GetCurrentRowID()); rs->UpdateField("assigntech",&lData); rs->SaveRecord(); rs->Close(); //rs->FetchField("quick",&bData); //ASSERT(bData==TRUE); //Create a problem record //open the probs table, return no records rs->Query("SELECT probs.* FROM probs WHERE (((probs.id)=0));"); rs->AddNewRecord(); ASSERT(!m_strID.IsEmpty()); //SAVE THE WORKORDER ID NUMBER rs->UpdateField("wolink",&m_strID); //STATUS to zero lData=0; rs->UpdateField("status",&lData); //CREATOR rs->UpdateField("creator",&m_pApp->m_lusrID); //CREATED rs->UpdateField("created",&dtDate);//dtdate set earlier //CREATOR rs->UpdateField("modifier",&m_pApp->m_lusrID); //CREATED rs->UpdateField("modified",&dtDate);//dtdate set earlier //Save problem record rs->SaveRecord(); rs->Close(); //get id of problem record q.Format("SELECT probs.id FROM probs " "WHERE (((probs.wolink)=%s) AND " "((probs.status)=0) AND " "((probs.creator)=%u));",m_strID,m_pApp->m_lusrID); rs->Query(q); lLink=0; rs->FetchField("id",&lLink); ASSERT(lLink!=0); //************************************ //************************************ //Use id to create a labour table record //firstly open the labor table in a way that returns no records rs->Query("SELECT labor.* FROM labor WHERE (((labor.link)=0));"); rs->AddNewRecord(); //set labour record fields //LINK TO PROBLEM RECORD rs->UpdateField("link",&lLink); //TECH strData=m_cbTechList.GetCurrentRowID(); lData=atol(strData); rs->UpdateField("tech",&lData); //HOURS m_edBillHours.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_edNCHours.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_edTravelHours.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 vtDatax1(strData); fData=(float)vtDatax1;//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 vtData2(strData); fData=(float)vtData2;//cast variant to float (locale friendly) //fData=(float)atof(strData); rs->UpdateField("distance",&fData); //RATE strData=m_cbRates.GetCurrentRowID(); lData=atol(strData); rs->UpdateField("rate",&lData); //TRAVEL RATE strData=m_cbTravelRates.GetCurrentRowID(); lData=atol(strData); rs->UpdateField("travrate",&lData); //START //this field expects time and also date //so we need to get the time and add back in the date //date is set earlier in this function //moved down to here 10/11/2002 m_dtDate.GetTime(dtDate); m_dtEndDate.GetTime(dtEndDate); m_edStart.GetWindowText(strData); dtTime.ParseDateTime(strData,VAR_TIMEVALUEONLY); dtData.SetDateTime(dtDate.GetYear(),dtDate.GetMonth(),dtDate.GetDay(),dtTime.GetHour(),dtTime.GetMinute(),dtTime.GetSecond()); rs->UpdateField("start",&dtData); //STOP //TODO:validation of conversion m_edEnd.GetWindowText(strData); 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_edDetails.GetWindowText(strData); rs->UpdateField("details",&strData); rs->SaveRecord(); m_bEditing=true;//we are now editing because of save //01/11/2001 changed to: rs->Close(); //changes 08/22/00 added the following //to refresh recordset FillFields(); //and same date as above added this bit return true; } void CSimpleWODlg::OnKillfocusEdclientcontact() { SaveField(&m_edClientContact,"clientcontact",true,rs); } void CSimpleWODlg::OnKillfocusEdclientrefnum() { SaveField(&m_edClientRefNumber,"clientrefnum",true,rs); } //added nov 10th 2000, to ensure //all data is saved before printing void CSimpleWODlg::Flush(bool bClose) { if(bClose) { //Added Nov 10th, deletes rs recordset object //to flush it then calls fillfields at the bottom //to reopen it. rs->Close(); rsLabor->Close(); rsProb->Close(); //m_pApp->Delay(5); } else { //fill the recordsets again FillFields(); } } void CSimpleWODlg::OnQuickwoDone() { CString strData,q; COleDateTime dtData,dtTime,dtDate; //added because clicking a menu item doesn't kill //focus on a control to allow it to update m_ckOnsite.SetFocus(); if(m_cbClients.GetCurrentRowID()=="0") { AfxMessageBox("Please choose a client"); return; } //bail if user is only editing if(m_bEditing) { CDialog::OnOK(); return; } //otherwise save new record SaveNewRecord(); CDialog::OnOK(); } void CSimpleWODlg::OnQuickwoClientnotes() { CContactsViewDlg d; d.Setup(m_cbClients.GetCurrentRowID()); d.DoModal(); } void CSimpleWODlg::OnQuickwoDelete() { CString q; CString msg; //added because clicking a menu item doesn't kill //focus on a control to allow it to update m_ckOnsite.SetFocus(); if(!m_bEditing) { msg="Abandon workorder?\r\nAre you sure?"; if(AfxMessageBox(msg,MB_YESNO)==IDYES) { q.Format("DELETE wo.*, wo.id FROM wo WHERE (((wo.id)=%s));",m_strID); rs->Ex(q); rs->QueryReadOnly("SELECT defaults.* FROM defaults");//just to flush m_pApp->m_bRefreshStatScreen=true; CDialog::OnOK(); } } else { msg="Delete workorder?\r\nAre you sure?"; if(AfxMessageBox(msg,MB_YESNO)==IDYES) { q.Format("DELETE labor.*, probs.wolink " "FROM labor INNER JOIN probs ON labor.link = probs.id " "WHERE (((probs.wolink)=%s));",m_strWorkorderID); rs->Ex(q); q.Format("DELETE probs.wolink, probs.* " "FROM probs " "WHERE (((probs.wolink)=%s));",m_strWorkorderID); rs->Ex(q); q.Format("DELETE wo.*, wo.id FROM wo WHERE (((wo.id)=%s));",m_strWorkorderID); rs->Ex(q); rs->QueryReadOnly("SELECT defaults.* FROM defaults");//just to flush m_pApp->m_bRefreshStatScreen=true; CDialog::OnOK(); } } } void CSimpleWODlg::OnQuickwoPrint() { CString q; CString parameters; //added because clicking a menu item doesn't kill //focus on a control to allow it to update m_ckOnsite.SetFocus(); //Save first if new record if(!m_bEditing) { if(!SaveNewRecord()) return; //kill time here //AfxMessageBox("Record Saved...proceeding to print"); } //close the recordsets Flush(true); parameters.Format("\"%s\" AS zCompName, ",m_pApp->m_strRegCompany); /* q.Format("SELECT %s wo.*, probs.*, labor.*, users.first, users.last, users.initials, clients.* " "FROM (users INNER JOIN (labor INNER JOIN (wo INNER JOIN probs ON wo.id = probs.wolink) ON labor.link = probs.id) ON users.id = labor.tech) LEFT JOIN clients ON wo.client = clients.id " "WHERE (((wo.id)=%s));",parameters,m_strWorkorderID); */ q.Format("SELECT %s wo.id, wo.clientrefnum, wo.clientcontact, clients.company AS clientcompany, Format(wo.closed,\"Short Date\") AS wodate, " "[users]![first] & \" \" & [users]![last] AS wotech, labor.hours, " "labor.travhours, labor.nchours, rates_1.name AS workrate, rates.name " "AS travrate, labor.start AS starttime, " "labor.stop AS stoptime, wo.invoice, labor.details, wo.onsite " "FROM (((users RIGHT JOIN (labor RIGHT JOIN (wo LEFT JOIN probs ON " "wo.id = probs.wolink) ON labor.link = probs.id) ON users.id = " "labor.tech) LEFT JOIN clients ON wo.client = clients.id) LEFT " "JOIN rates ON labor.travrate = rates.id) LEFT JOIN rates AS " "rates_1 ON labor.rate = rates_1.id WHERE (((wo.id)=%s));",parameters,m_strWorkorderID); #ifdef _DEBUG m_pApp->ShowStuff(q); #endif rsPrint->QueryReadOnly(q); rsPrint->QueryReadOnly(q); /* CString strTEST; strTEST=rsPrint->SetFieldToMemo("details"); //m_pApp->ShowStuff(strTEST); */ if(!rsPrint->IsEmpty()) { m_pApp->PrintCMReportRDC("Quick workorder",rsPrint->RecordSetPointer()); #ifdef _DEBUG m_pApp->CreateTTX("QuickWO.ttx",rsPrint->RecordSetPointer()); #endif } //reopen the recordsets Flush(false); } void CSimpleWODlg::OnQuickwoPrintDispatch() { //added because clicking a menu item doesn't kill //focus on a control to allow it to update m_ckOnsite.SetFocus(); CString q; //Save first if new record if(!m_bEditing) { if(!SaveNewRecord()) return; } //print the dispatch format workorder //close all the extra recordsets - Nov 10th 2000 //(U.S. presidential election uncertainty day 3) Flush(true); q.Format("SELECT IIf(IsNull([clients].[company]),[clients].[last] & \", \" & [clients].[first],[clients].[company]) AS clientname, " "IIf(IsNull([clients].[streetaddress]),[clients].[mailaddress],[clients].[streetaddress]) & IIf(IsNull([clients].[city]),\"\"," "[clients].[city]) & IIf(IsNull([clients].[stateprov]),\"\",\", \" & [clients].[stateprov] & " "IIf(IsNull([clients].[postal]),\"\",\" \" & [clients].[postal])) AS address, " "\"Work required: \" & [probs].[brief] & IIf([probs].[unit]<>0,Chr(13) & \"Unit: \" & [nonclients].[company_person] & " "\" \" & [unitmodels].[description] & \" (\" & [unitmodels].[model] & \") SN: \" & [units].[sn],\"\") AS probheader, " "\"%s\" AS compname, wo.id AS wonumber, wo.created, labor.details, probs.notes, IIf(IsNull(contracts_1.name)," "[contracts].[name],contracts_1.name) AS contractinfo, IIf([probs].[unit]<>0,\"Unit: \" & " "[nonclients].[company_person] & \" \" & [unitmodels].[description] & \" (\" & [unitmodels].[model] & \") SN: \" & " "[units].[sn],\"\") AS Equipment, wo.starttime AS [Booked for], probs.brief, clients.mailaddress, clients.streetaddress, " "clients.city, clients.stateprov, clients.postal, clients.country, clients.bizphone, clients.extension, clients.technotes, clients.first, clients.last, wo.clientrefnum, wo.ourref, wo.clientcontact " "FROM (((labor RIGHT JOIN (((units RIGHT JOIN probs ON units.id = probs.unit) LEFT JOIN unitmodels ON " "units.model = unitmodels.id) LEFT JOIN nonclients ON unitmodels.manufacturer = nonclients.id) ON labor.link = " "probs.id) RIGHT JOIN ((wo LEFT JOIN clients ON wo.client = clients.id) LEFT JOIN clients AS headoffices ON " "clients.headoffice = headoffices.id) ON probs.wolink = wo.id) LEFT JOIN contracts ON clients.contract = " "contracts.id) LEFT JOIN contracts AS contracts_1 ON headoffices.contract = contracts_1.id " "WHERE (((wo.id)=%s));",m_pApp->m_strRegCompany,m_strWorkorderID); rsPrint->QueryReadOnly(q); rsPrint->QueryReadOnly(q); if(!rsPrint->IsEmpty()) { #ifdef _DEBUG m_pApp->ShowStuff(q); m_pApp->CreateTTX("wodispqu.ttx",rsPrint->RecordSetPointer()); #endif m_pApp->PrintCMReportRDC("Workorder dispatch (Quick)",rsPrint->RecordSetPointer()); } else { AfxMessageBox("There is no data to print!"); } //reopen the closed recordsets Flush(false); } void CSimpleWODlg::DisplayContactInfo() { CString q, strData, strDisplay; //retrieve contact info based on workorder q.Format( "SELECT clients.first, clients.last, clients.company, " "clients.mailaddress, clients.streetaddress, clients.city, " "clients.stateprov, clients.postal, clients.country, clients.bizphone, " "clients.extension, clients.fax, clients.email " "FROM clients " "WHERE (((clients.id)=%s));",m_strSelClient); cbrs->QueryReadOnly(q); if(cbrs->IsEmpty()) { m_lblContactInfo.SetWindowText(""); return; } strDisplay="[Contact: "; cbrs->FetchField("first",&strData); if(!strData.IsEmpty()) strDisplay+=strData + " "; cbrs->FetchField("last",&strData); strDisplay+=strData+"]"; cbrs->FetchField("bizphone",&strData); if(!strData.IsEmpty()) strDisplay+= "[Phone: " + strData; cbrs->FetchField("extension",&strData); if(!strData.IsEmpty()) strDisplay+=" ext:" + strData; strDisplay+="]"; cbrs->FetchField("fax",&strData); if(!strData.IsEmpty()) strDisplay+="[Fax: " + strData + "]"; cbrs->FetchField("email",&strData); if(!strData.IsEmpty()) strDisplay+="[Email: " + strData + "]"; //Physical address for Lenny and the lock people strDisplay+="[Addr: "; cbrs->FetchField("streetaddress",&strData); if(!strData.IsEmpty()) strDisplay+= strData + ", "; cbrs->FetchField("city",&strData); if(!strData.IsEmpty()) strDisplay+= strData; strDisplay+="]"; m_lblContactInfo.SetWindowText(strDisplay); } void CSimpleWODlg::FillStatusList() { //========================================== //WORKORDER STATUS LIST CString strData; CString strIndex; long lData; //FILL STATUS LIST m_cbStatus.Clear(); //first enter default item strData="< N/A >"; strIndex="0"; m_cbStatus.AddRow(strData,strIndex); cbrs->QueryReadOnly("SELECT probstat.id, probstat.notes FROM probstat ORDER BY probstat.id;"); if(!cbrs->IsEmpty()) { do { cbrs->FetchField("notes",&strData); cbrs->FetchField("id",&lData); strIndex.Format("%u",lData); m_cbStatus.AddRow(strData,strIndex); }while(cbrs->MoveForward()); } m_cbStatus.Select("0"); //============================================ } void CSimpleWODlg::OnKillfocusEdourrefnumber2() { SaveField(&m_edOurRefNum,"ourref",true,rs); } void CSimpleWODlg::OnCloseupCbstatus() { SaveField(&m_cbStatus,"status",rs); } void CSimpleWODlg::OnHistory() { CString q; q.Format("SELECT wo.created, wo.modified, wo.creator, wo.modifier FROM wo " "WHERE (((wo.id)=%s));",m_strWorkorderID); cbrs->QueryReadOnly(q); COleDateTime dtCreated,dtModified; CString modifier,creator; long m,c; //GET RECORD STATUS FIELDS cbrs->FetchField("created",&dtCreated); cbrs->FetchField("modified",&dtModified); cbrs->FetchField("creator",&c); cbrs->FetchField("modifier",&m); creator.Format("%u",c); modifier.Format("%u",m); CStatusDlg d; d.SetValues(&creator,&modifier,&dtCreated,&dtModified); d.DoModal(); } //Show tech notes void CSimpleWODlg::OnLbltechnotes() { m_pApp->ShowStuff(m_strTechNotes); } void CSimpleWODlg::UpdateClosedOpen() { CString strData; strData=m_bIsOpen ? " ":" "; CMenu* pMenu=this->GetMenu(); pMenu->ModifyMenu(ID_QUICKWO_COSTATUS,MF_BYCOMMAND,ID_QUICKWO_COSTATUS,strData); //v1.9.4.2 if(m_bReadOnly) pMenu->EnableMenuItem(ID_QUICKWO_COSTATUS, MF_DISABLED | MF_GRAYED); this->DrawMenuBar(); } void CSimpleWODlg::OnQuickwoCostatus() { CString q, strStatusQ; strStatusQ.Empty(); if(m_bIsOpen) { m_bIsOpen=false; if(m_pApp->m_lDefClosedWOStatus!=0) { m_strSelectedStatus.Format("%u",m_pApp->m_lDefClosedWOStatus); strStatusQ.Format(", wo.status=%s",m_strSelectedStatus); m_cbStatus.Select(m_strSelectedStatus); } } else { m_bIsOpen=true; if(m_pApp->m_lDefReOpenWOStatus!=0) { m_strSelectedStatus.Format("%u",m_pApp->m_lDefReOpenWOStatus); strStatusQ.Format(", wo.status=%s",m_strSelectedStatus); m_cbStatus.Select(m_strSelectedStatus); } } //----- COleDateTime dtData=COleDateTime::GetCurrentTime(); if(m_bIsOpen) dtData.SetDate(1968,03,12); q.Format("UPDATE wo SET wo.closed = #%s# %s WHERE (((wo.id)=%s));",dtData.Format(_T("%m/%d/%Y %H:%M:%S")),strStatusQ,m_strWorkorderID); cbrs->Ex(q); cbrs->Close(); //removed because of some strange voodoo when it says another user is modifying // UpdateModified(); m_pApp->m_bRefreshStatScreen=true; //----- UpdateClosedOpen(); } //added 07/25/01, somehow got missed all along :( void CSimpleWODlg::OnTravelratelabel() { OnRateLabel(); } void CSimpleWODlg::Security() { m_bReadOnly=false; int x=m_pApp->Allowed(RWORKORDER,true); if(x==0)//no access allowed { m_pApp->SecurityWarning(); CDialog::OnCancel(); } if(x==2)//read only { m_bReadOnly=true; m_dtEndDate.EnableWindow(FALSE); m_edOurRefNum.EnableWindow(FALSE); m_cbStatus.EnableWindow(FALSE); m_edClientRefNumber.EnableWindow(FALSE); m_edClientContact.EnableWindow(FALSE); m_cbTechList.EnableWindow(FALSE); m_cbTravelRates.EnableWindow(FALSE); m_ckOnsite.EnableWindow(FALSE); m_dtDate.EnableWindow(FALSE); m_btnTimer.EnableWindow(FALSE); m_edDetails.SetReadOnly(TRUE);//.EnableWindow(FALSE); m_edInvoicedOn.EnableWindow(FALSE); m_edTravelHours.EnableWindow(FALSE); m_edDistance.EnableWindow(FALSE); m_edNCHours.EnableWindow(FALSE); m_edBillHours.EnableWindow(FALSE); m_edEnd.EnableWindow(FALSE); m_edStart.EnableWindow(FALSE); m_cbTypes.EnableWindow(FALSE); m_cbRates.EnableWindow(FALSE); m_cbClients.EnableWindow(FALSE); CMenu* pMenu=this->GetMenu(); pMenu->EnableMenuItem(ID_QUICKWO_DELETE, MF_DISABLED | MF_GRAYED); //v1.9.4.2 pMenu->EnableMenuItem(ID_QUICKWO_COSTATUS, MF_DISABLED | MF_GRAYED); //v1.9.4.4 m_lblCategory.EnableWindow(FALSE); //m_lblProjects.EnableWindow(FALSE); m_lblStatus.EnableWindow(FALSE); //m_lblFind.EnableWindow(FALSE); } //v1.9.4.4 delete option disabled unless a member of managers if(m_pApp->m_lGroupID!=1) { CMenu* pMenu=this->GetMenu(); pMenu->EnableMenuItem(ID_QUICKWO_DELETE, MF_DISABLED | MF_GRAYED); } } void CSimpleWODlg::FillReportList(void) { CString q,strData; UINT uiResourceID=_STARTING_PRINT_COMMAND_ID;/*id's 32289 to 33388 are set aside for what have u, in this case workorder report menu commands*/ q="SELECT rptsmaster.virtualname,rptsmaster.id, rptsmaster.wodisplayorder FROM rptsmaster WHERE " "(((rptsmaster.recordset)=\"woquick\")) ORDER BY rptsmaster.wodisplayorder;"; if(!rs->QueryReadOnly(q)) return; //get the corrent menu location CMenu* pMainMenu = GetMenu(); //CMenu* m_pSubMenu=NULL; for (int i=0;i<(int)pMainMenu->GetMenuItemCount();i++) { m_pSubMenu=pMainMenu->GetSubMenu(i); if(m_pSubMenu && m_pSubMenu->GetMenuItemID(0)== ID_PRINT_PLACEHOLDER) break; } ASSERT(m_pSubMenu); //remove the placeholder m_pSubMenu->RemoveMenu(0,MF_BYPOSITION); //remove old report commands (lazy..I know) m_pSubMenu->RemoveMenu(0,MF_BYPOSITION); m_pSubMenu->RemoveMenu(0,MF_BYPOSITION); //Show query option for manager account only if(m_pApp->m_lusrID==1) { m_pSubMenu->AppendMenu(0,uiResourceID,"SHOW QUERIES ON PRINT"); m_pSubMenu->CheckMenuItem(uiResourceID,MF_UNCHECKED|MF_BYCOMMAND); m_pSubMenu->AppendMenu(MF_SEPARATOR); m_bShowQueriesOnPrint=false; } do{ uiResourceID++; //Add menu item: report name, uiResourceID command rs->FetchField("virtualname",&strData); m_pSubMenu->AppendMenu(0,uiResourceID,strData); }while(rs->MoveForward()); } void CSimpleWODlg::OnPrintReport( UINT nID ) { CString strVirtualReportName,strTTXPath; CString strError; CString q,strQuery; CString strWOID,strRegTo,strSchedTech; CString strShowQuery,strTemp; //see if it's a checkmark that needs to be done if(nID==_STARTING_PRINT_COMMAND_ID)//it's a click on show queries { m_bShowQueriesOnPrint=!m_bShowQueriesOnPrint; if(m_bShowQueriesOnPrint) m_pSubMenu->CheckMenuItem(_STARTING_PRINT_COMMAND_ID,MF_CHECKED|MF_BYCOMMAND); else m_pSubMenu->CheckMenuItem(_STARTING_PRINT_COMMAND_ID,MF_UNCHECKED|MF_BYCOMMAND); return; } m_pSubMenu->GetMenuString(nID,strVirtualReportName,MF_BYCOMMAND); //added because clicking a menu item doesn't kill //focus on a control to allow it to update m_ckOnsite.SetFocus(); //Save first if new record if(!m_bEditing) if(!SaveNewRecord()) return; //close the recordsets Flush(true); q.Format("SELECT rptsmaster.* FROM rptsmaster WHERE (((rptsmaster.virtualname)=\"%s\"));",strVirtualReportName); //Fetch query if(!cbrs->QueryReadOnly(q)) { strError.Format( "Unable to print:\r\n" "%s\r\n" "Can't open rptsmaster table due to the error previously reported\r\n" "by the database driver.",strVirtualReportName); AfxMessageBox(strError); return; } if(!cbrs->FetchField("filename",&strTTXPath)) { strError.Format( "Unable to print:\r\n" "%s\r\n" "can't retrieve report file name due to the error previously reported\r\n" "by the database driver.",strVirtualReportName); AfxMessageBox(strError); return; } strTTXPath.Replace(".rpt",".ttx"); if(!cbrs->FetchField("query",&strQuery)) { strError.Format( "Unable to print:\r\n" "%s\r\n" "Can't retrieve report query due to the error previously reported\r\n" "by the database driver.",strVirtualReportName); AfxMessageBox(strError); return; } if(m_bShowQueriesOnPrint) { strShowQuery.Format("---==< Database queries to aid in report customization >==---\r\n\r\n" "Raw query for:%s\r\n" "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r\n" "%s\r\n" "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r\n\r\n\r\n",strVirtualReportName,strQuery); } //make token substitutions strQuery.Replace("~REGTO",m_pApp->m_strRegCompany); strQuery.Replace("Evaluation",m_pApp->m_strRegCompany); strQuery.Replace("~WOID",m_strWorkorderID); if(m_bShowQueriesOnPrint) { strTemp.Format("Query after tokens replaced for:%s\r\n" "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r\n" "%s\r\n" "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r\n",strVirtualReportName,strQuery); strShowQuery+=strTemp; m_pApp->ShowStuff(strShowQuery); } //run query if(!rsPrint->QueryReadOnly(strQuery)) { strError.Format( "Unable to print:\r\n" "%s\r\n" "due to the error previously reported\r\n" "by the database driver.",strVirtualReportName); AfxMessageBox(strError); return; } //run query again, because it seems to be needed //and was done that way before. //probably some sort of timing issue //but it works and this is the last //maint. release for this tired old code if(!rsPrint->QueryReadOnly(strQuery)) { strError.Format( "Unable to print:\r\n" "%s\r\n" "due to the error previously reported\r\n" "by the database driver.",strVirtualReportName); AfxMessageBox(strError); return; } //call report if(!rsPrint->IsEmpty()) { m_pApp->PrintCMReportRDC(strVirtualReportName,rsPrint->RecordSetPointer()); if(m_pApp->m_lusrID==1)//manager account? m_pApp->CreateTTX(strTTXPath,rsPrint->RecordSetPointer(),true); } //reopen the recordsets Flush(false); } // Convert a float to ascii preserving locale format CString CSimpleWODlg::FtoA(float fData) { _variant_t vItem(fData); _bstr_t bs; VarFormatNumber(&vItem,-1,-2,-2,-2,0,bs.GetAddress()); return CString((BSTR)bs); } void CSimpleWODlg::OnStatuslabel() { CProbStatDlg d; d.DoModal(); FillStatusList(); if(m_strSelectedStatus.IsEmpty()) m_strSelectedStatus="0"; m_cbStatus.Select(m_strSelectedStatus); } // Sets the selected labor rates for a selected tech that isn't the current logged in user (if there isn't a client default) void CSimpleWODlg::SetForeignTechLaborRateDefaults(void) { }