// STAT.cpp : implementation file // #include "stdafx.h" #include "sp.h" #include "STAT.h" #include "ContactsViewDlg.h" #include "PerfTimer.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 ///////////////////////////////////////////////////////////////////////////// // STAT IMPLEMENT_DYNCREATE(STAT, CFormView) STAT::STAT() : CFormView(STAT::IDD) , m_bFreshStatsAwait(false) , m_strStats(_T("")) { //{{AFX_DATA_INIT(STAT) //}}AFX_DATA_INIT m_pApp = (CSpApp*)AfxGetApp(); //Initialize recordset pointer rs=m_pApp->rsPool->GetRS("STAT RS"); cbrs=m_pApp->rsPool->GetRS("STAT CBRS"); brs=m_pApp->rsPool->GetRS("STAT brs"); rsPrint=m_pApp->rsPool->GetRSPrint("STAT RSPRINT"); m_bShowDescription=true; m_nFldCount=0; m_strSelectedView="0"; dv.sqlcriteria="WHERE (((wo.closed)>Date()-45));"; FirstRun=true;//indicates first time filling the view m_pApp->m_bRefreshStatScreen=true;//refresh stat screen on activate m_nCX=0; } STAT::~STAT() { DeActivate(); //AfxMessageBox("STAT::~STAT()"); } void STAT::DoDataExchange(CDataExchange* pDX) { CFormView::DoDataExchange(pDX); //{{AFX_DATA_MAP(STAT) DDX_Control(pDX, IDC_BTNCLIENTNOTES, m_btnClientNotes); DDX_Control(pDX, IDC_BTNREFRESH, m_btnRefresh); DDX_Control(pDX, IDC_BTNNEWWO, m_btnNewSTWO); DDX_Control(pDX, IDC_BTNNEWQWO, m_btnNewQWO); DDX_Control(pDX, IDC_BTNEDITWONUM, m_btnEditWO); DDX_Control(pDX, IDC_BTNPRINT, m_btnPrint); DDX_Control(pDX, IDC_lblContactInfo, m_lblContactInfo); DDX_Control(pDX, IDC_EDWONUM, m_edWONumber); DDX_Control(pDX, IDC_CBVIEWS, m_cbViews); DDX_Control(pDX, IDC_LBLCHOOSEFIELDS, m_lblChooseDisplayFields); DDX_Control(pDX, IDC_LBLSAVEVIEW, m_lblSaveView); DDX_Control(pDX, IDC_LBLDELETEVIEW, m_lblDeleteView); DDX_Control(pDX, IDC_RPTDISPATCH, m_rc); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(STAT, CFormView) //{{AFX_MSG_MAP(STAT) ON_BN_CLICKED(IDC_BTNDONE, OnBtndone) ON_BN_CLICKED(IDC_LBLSAVEVIEW, OnLblsaveview) ON_BN_CLICKED(IDC_LBLDELETEVIEW, OnLbldeleteview) ON_BN_CLICKED(IDC_LBLCHOOSEFIELDS, OnLblchoosefields) ON_CBN_CLOSEUP(IDC_CBVIEWS, OnCloseupCbviews) ON_BN_CLICKED(IDC_BTNNEWWO, OnBtnnewwo) ON_BN_CLICKED(IDC_BTNNEWQWO, OnBtnnewqwo) ON_BN_CLICKED(IDC_BTNPRINT, OnBtnprint) ON_BN_CLICKED(IDC_BTNEDITWONUM, OnBtneditwonum) ON_BN_CLICKED(IDC_BTNREFRESH, OnBtnrefresh) ON_BN_CLICKED(IDC_BTNCLIENTNOTES, OnBtnclientnotes) ON_WM_SIZE() ON_NOTIFY(RVN_ITEMDRAWPREVIEW, IDC_RPTDISPATCH, OnRvnItemDrawPreview) ON_NOTIFY(RVN_ITEMDBCLICK, IDC_RPTDISPATCH, OnRvnItemDbClick) ON_NOTIFY(RVN_ITEMCLICK, IDC_RPTDISPATCH, OnRvnItemClick) ON_NOTIFY(RVN_COLUMNCLICK, IDC_RPTDISPATCH, OnColumnClick) //}}AFX_MSG_MAP ON_WM_MOUSEMOVE() ON_WM_HELPINFO() END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // STAT diagnostics #ifdef _DEBUG void STAT::AssertValid() const { CFormView::AssertValid(); } void STAT::Dump(CDumpContext& dc) const { CFormView::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // STAT message handlers void STAT::OnInitialUpdate() { CString q; CFormView::OnInitialUpdate(); //ShowWindow(FALSE); #ifdef _WTF_ AfxMessageBox("STAT::OnInitialUpdate\r\nTOP. CALLING ALLOWED"); #endif //no sense doing this if it's not going to be //accessed if(m_pApp->Allowed(RSTAT,false)==0) return; //TEST DEC 5th changed to not refresh above #ifdef _WTF_ AfxMessageBox("STAT::OnInitialUpdate\r\n1"); #endif CWaitCursor wait; //Set the initial sort order for the columns for(int xx=0;xxm_lusrID); rs->QueryReadOnly(q); rs->FetchField("statview",&m_strSelectedView); if(m_strSelectedView.IsEmpty()) { //some users have deleted the default view //so make sure it can't be deleted m_strSelectedView="1"; } FillViewList(); //"Hyperlink-o-size" labels m_lblDeleteView.SetTextColor(RGB(0,0,255)); m_lblDeleteView.SetFontUnderline(TRUE); m_lblDeleteView.SetLink(TRUE); m_lblDeleteView.SetLinkCursor(m_pApp->hcHand); m_lblDeleteView.SetLinkURL(""); m_lblSaveView.SetTextColor(RGB(0,0,255)); m_lblSaveView.SetFontUnderline(TRUE); m_lblSaveView.SetLink(TRUE); m_lblSaveView.SetLinkCursor(m_pApp->hcHand); m_lblSaveView.SetLinkURL(""); m_lblChooseDisplayFields.SetTextColor(RGB(0,0,255)); m_lblChooseDisplayFields.SetFontUnderline(TRUE); m_lblChooseDisplayFields.SetLink(TRUE); m_lblChooseDisplayFields.SetLinkCursor(m_pApp->hcHand); m_lblChooseDisplayFields.SetLinkURL(""); //m_lblContactInfo.SetFontSize(6); // m_lblContactInfo.SetBkColor(RGB(255,255,255)); //m_lblContactInfo.SetFontBold(TRUE); m_ilReport.Create(IDB_REPORT, 16, 1, RGB(255,0,255)); m_rc.SetImageList(&m_ilReport); int y=0; RVCOLUMN rvc; rvc.iWidth = 120; rvc.nFormat = RVCF_TEXT|RVCF_LEFT; rvc.lpszText = "Client"; m_rc.DefineColumn(y, &rvc); rvc.nFormat = RVCF_TEXT|RVCF_CENTER;//center the dates rvc.lpszText = "SchedDate"; m_rc.DefineColumn(++y, &rvc); rvc.lpszText = "SchedEndDate"; m_rc.DefineColumn(++y, &rvc); rvc.lpszText = "SchedTech"; m_rc.DefineColumn(++y, &rvc); rvc.nFormat = RVCF_TEXT|RVCF_LEFT; rvc.lpszText = "EntryDate"; m_rc.DefineColumn(++y, &rvc); rvc.lpszText = "LastActivity"; m_rc.DefineColumn(++y, &rvc); //Checkmark rvc.nFormat = RVCF_TEXT|RVCF_SUBITEM_IMAGE|RVCF_CENTER; //rvc.iImage = 2; rvc.lpszText = "Onsite"; m_rc.DefineColumn(++y, &rvc); rvc.lpszText = "Closed"; m_rc.DefineColumn(++y, &rvc); rvc.nFormat = RVCF_TEXT|RVCF_LEFT; rvc.lpszText = "ClosedDate"; m_rc.DefineColumn(++y, &rvc); rvc.lpszText = "Postal"; m_rc.DefineColumn(++y, &rvc); rvc.lpszText = "City"; m_rc.DefineColumn(++y, &rvc); rvc.lpszText = "WO#"; m_rc.DefineColumn(++y, &rvc); rvc.lpszText = "Zone"; m_rc.DefineColumn(++y, &rvc); rvc.lpszText = "Invoice"; m_rc.DefineColumn(++y, &rvc); rvc.lpszText = "Date"; m_rc.DefineColumn(++y, &rvc); rvc.lpszText = "Status"; m_rc.DefineColumn(++y, &rvc); rvc.lpszText = "OurRef#"; m_rc.DefineColumn(++y, &rvc); rvc.lpszText = "ClientRef#"; m_rc.DefineColumn(++y, &rvc); //Last modified 07/30/2001 - added category/type column //COLUMNMOD rvc.lpszText = "Category"; m_rc.DefineColumn(++y, &rvc); rvc.lpszText = "Project"; m_rc.DefineColumn(++y, &rvc); //ADD NEW COLUMNS JUST BEFORE HERE IN FUTURE ++y; m_nFldCount=y; //did we forget to increment the column count //defined in the header? ASSERT(!(m_nFldCount>STATCOLUMNCOUNT)); //DisplayColumns(); //FillView(); /*//removed this code as causing an error when default //view was deleted cbrs->Query("SELECT statusviews.id FROM statusviews WHERE (((statusviews.default)=True));"); long lData; cbrs->FetchField("id",&lData); m_strSelectedView.Format("%u",lData); */ OnCloseupCbviews(); //ShowWindow(TRUE); //ShowWindow(SW_MAXIMIZE); FirstRun=false; //unlock the recordsets DeActivate(); } void STAT::OnBtndone() { //CDialog::OnOK(); } //********************************************* void STAT::FillView() { #ifdef _DEBUG // CPerfTimer pTimer; // pTimer.Start(TRUE); #endif //Added Oct 4th 2002 if(m_pApp->m_bDefShowHGridOnMainScreen) m_rc.ModifyStyle(0,RVS_SHOWHGRID); else m_rc.ModifyStyle(RVS_SHOWHGRID,0); if(!m_pApp->m_bRefreshStatScreen) return; m_pApp->m_bRefreshStatScreen=false; //Added Oct 5th 2002. //gets stats if enabled so they can be displayed at top when //a wo is not selected in the list GetStats(); //Show stats now so that display is never empty at the top //safe to do so because the list is just about to be //refreshed anyway so there is no way a user will have //a selection from the workorder list at this point (or at least in a few //milliseconds anyway) m_bFreshStatsAwait=false; m_lblContactInfo.SetWindowText(m_strStats); CString q,qbrs,strData,str,parameters,strBriefs,strWONotes; long lData,lWOID,T1,T2,T3,T4;/* Added t1 to t4 Oct 10 2002 to more properly format schedtech display*/ COleDateTime dtData,dtClosed,dtScheduled,dtEntry; bool bData,bHasText,bQuick,bIsScheduled; bool bAbort=false,bPrompt=true;//abort fetch, prompt if > 250 records int nContinuePromptChoice; int x=0; int y=0; int probnum,lines; int x2=0; CWaitCursor cWait; //"PARAMETERS" -way to complex to pass parameters, so //putting them in the datastream instead. if(dv.preview) parameters="True AS zShowNotes, "; else parameters="False AS zShowNotes, "; str.Format("\"%s\" AS zCurrentUser, ",m_pApp->m_strCurrentUserName); parameters = parameters + str; //TODO: only shows main tech, should it be modified to show all techs? //Last modified 07/30/2001 - added category/type column //COLUMNMOD /* q.Format("SELECT %s IIf([wo].[anytime]=True,[wo].[created],[wo].[starttime]) AS cdate, wo.notes AS wonotes, wo.invoice, " "IIf(IsNull([company]),[clients]![last] & \", \" & [clients]![first],[company]) AS clientcompany, " "wo.anytime, wo.starttime, wo.stoptime, users.initials, wo.created, wo.modified, " "wo.onsite, wo.closed, wo.prob_found, wo.prob_reported, wo.action_taken, clients.postal, " "clients.city, zones.name AS zonename, wo.quick, wo.id, wo.ourref, wo.clientrefnum, probstat.notes AS wostatus, wotypes.category, projects.name AS projname " "FROM (((((wo LEFT JOIN users ON wo.assigntech = users.id) LEFT JOIN clients ON " "wo.client = clients.id) LEFT JOIN zones ON clients.czone = zones.id) LEFT JOIN " "projects ON wo.project = projects.id)LEFT JOIN probstat ON wo.status = probstat.id) LEFT JOIN wotypes ON wo.type = wotypes.id %s %s;",parameters, dv.sqlcriteria, dv.sqlorderby); */ q.Format("SELECT %s " "IIf([wo].[anytime]=True,[wo].[created],[wo].[starttime]) AS cdate, wo.notes AS wonotes, " "wo.invoice, clients.company AS clientcompany, wo.anytime, wo.starttime, wo.stoptime, users.initials, " "users_1.initials AS INIT2, users_2.initials AS INIT3, users_3.initials AS INIT4, wo.created, wo.modified, wo.onsite, " "wo.assigntech AS T1, wo.assigntech2 AS T2, wo.assigntech3 AS T3, wo.assigntech4 AS T4, " "wo.closed, wo.prob_found, wo.prob_reported, wo.action_taken, clients.postal, clients.city, " "zones.name AS zonename, wo.quick, wo.id, wo.ourref, wo.clientrefnum, probstat.notes AS wostatus, " "wotypes.category, projects.name AS projname " "FROM ((((((((wo LEFT JOIN users ON wo.assigntech = users.id) LEFT JOIN clients ON wo.client = " "clients.id) LEFT JOIN zones ON clients.czone = zones.id) LEFT JOIN projects ON wo.project = projects.id) " "LEFT JOIN probstat ON wo.status = probstat.id) LEFT JOIN wotypes ON wo.type = wotypes.id) " "LEFT JOIN users AS users_1 ON wo.assigntech2 = users_1.id) LEFT JOIN users AS users_2 ON wo.assigntech3 = users_2.id) " "LEFT JOIN users AS users_3 ON wo.assigntech4 = users_3.id " "%s %s;",parameters, dv.sqlcriteria, dv.sqlorderby); #ifdef _DEBUG //m_pApp->ShowStuff(q); #endif ASSERT(rs!=NULL); rs->QueryReadOnly(q); lsNotes.RemoveAll(); m_rc.DeleteAllItems(); if(rs->IsEmpty()) { DeActivate(); return; } do{ bHasText=false; y=0; RVITEM rvi; //WORKORDER BRIEF DESCRIPTIONS LOOP HERE //If not quick workorder: Loop through all prob records for current workorder //gather up all briefs and insert into strData for processing as normal rs->FetchField("quick",&bQuick); rs->FetchField("id",&lData); strData.Format("%u",lData); strBriefs.Empty(); if(!bQuick)//not quick wo { if(!m_pApp->m_bShowProblemActionFields) { probnum=0; rs->FetchField("wonotes",&strWONotes); if(!strWONotes.IsEmpty()) { //probnum=1; //strWONotes.Replace("&","&&"); strBriefs=strWONotes+"\r\n"; //covered in case no problems bHasText=true; lines=17; } /* qbrs.Format("SELECT probs.brief FROM probs WHERE " "(((probs.wolink)=%s) AND ((probs.brief)<>\"\")) ORDER BY probs.id;",strData); */ qbrs.Format("SELECT probs.brief, probstat.notes AS STATUS " "FROM probs LEFT JOIN probstat ON probs.status = probstat.id " "WHERE (((probs.brief)<>\"\") AND ((probs.wolink)=%s)) " "ORDER BY probs.id;",strData); #ifdef _DEBUG //m_pApp->ShowStuff(qbrs); #endif brs->QueryReadOnly(qbrs); if(!brs->IsEmpty()) { strData.Empty(); do { probnum++; strData.Format(" %i)",probnum); if(probnum>1) strBriefs+="\r\n"; strBriefs+=strData; brs->FetchField("STATUS",&strData); if(!strData.IsEmpty()) { strData=" <" + strData + "> "; } strBriefs=strBriefs+strData;//+ "\r\n"; brs->FetchField("brief",&strData); //strData.Replace("&","&&"); strBriefs=strBriefs+strData;//+ "\r\n"; }while(brs->MoveForward()); if(!strBriefs.IsEmpty()) { bHasText=true; if(!strWONotes.IsEmpty()) probnum++; lines=probnum*17; //lines=(strBriefs.GetLength()/64)*20; //if(lines<17) lines=17; } } }//alternate view else//it's a securenet view { bHasText=true; //problem reported rs->FetchField("prob_reported",&strData); strData.Replace("&","&&"); strBriefs="Problem reported: " + strData +"\r\n"; //problem found rs->FetchField("prob_found",&strData); strData.Replace("&","&&"); strBriefs+="\r\nProblem found: " + strData +"\r\n"; //Action Taken rs->FetchField("action_taken",&strData); strData.Replace("&","&&"); strBriefs+="\r\nAction taken: " + strData; strBriefs.TrimRight('\r'); strBriefs.TrimRight('\n'); x2=0; lines=0; while (x2!=-1) { x2=strBriefs.Find('\r',x2); if(x2!=-1) x2++; lines+=15; } lines = m_rc.PreviewHeight(m_rc.GetFont(), strBriefs); lines = lines<0 ? 56:lines; lines+=10; }//securenet view } if(x==0) lsNotes.AddHead(strBriefs); else lsNotes.AddTail(strBriefs); //CLIENT if(!rs->FetchField("clientcompany",&strData)) { DeActivate(); return; } strData.Replace("&","&&"); rvi.iItem = x; rvi.iSubItem = y; rvi.nMask = RVIM_PREVIEW|RVIM_TEXT|RVIM_LPARAM; if(dv.preview && bHasText) rvi.nPreview = lines;//show first line only else rvi.nPreview = 0; //Original with incorrect use of GetBuffer (and missing releasebuffer) //rvi.lpszText = strData.GetBuffer(strData.GetLength()); //m_rc.InsertItem(&rvi); //02/19/2003 - GetBuffer / ReleaseBuffer change rvi.lpszText = strData.GetBuffer(0); m_rc.InsertItem(&rvi); strData.ReleaseBuffer(); //SCHEDULE DATE AND TIME rs->FetchField("anytime",&bData);//see if it's scheduled bIsScheduled=!bData;//added 10/10/2002 for use by sched tech below if(!bData || bQuick) { //start date if(bQuick)//added 11/03/00 strData=""; else { rs->FetchField("starttime",&dtData); strData=dtData.Format(); } rvi.iSubItem = ++y; rvi.lParam = x; //Original with incorrect use of GetBuffer (and missing releasebuffer) //rvi.lpszText = strData.GetBuffer(strData.GetLength()); //m_rc.SetItem(&rvi); //02/19/2003 - GetBuffer / ReleaseBuffer change rvi.lpszText = strData.GetBuffer(0); m_rc.SetItem(&rvi); strData.ReleaseBuffer(); //end date if(bQuick) strData=""; else { rs->FetchField("stoptime",&dtData); strData=dtData.Format(); } rvi.iSubItem = ++y; rvi.lParam = x; //Original with incorrect use of GetBuffer (and missing releasebuffer) //rvi.lpszText = strData.GetBuffer(strData.GetLength()); //m_rc.SetItem(&rvi); //02/19/2003 - GetBuffer / ReleaseBuffer change rvi.lpszText = strData.GetBuffer(0); m_rc.SetItem(&rvi); strData.ReleaseBuffer(); } else {//anytime, so indicate with a --- strData=" --- "; rvi.iSubItem = ++y; m_rc.SetItem(&rvi); rvi.iSubItem = ++y; m_rc.SetItem(&rvi); } //SCHED TECH //modified 8/23/2001 to support multi techs strData.Empty(); if(bIsScheduled ||bQuick) { rs->FetchField("T1",&T1); rs->FetchField("T2",&T2); rs->FetchField("T3",&T3); rs->FetchField("T4",&T4); if(0==T1) str="?"; else { rs->FetchField("initials",&str); } if(!str.IsEmpty()) strData=str; if(0==T2) str="?"; else { rs->FetchField("INIT2",&str); } if(!str.IsEmpty()) strData+=", " + str; if(0==T3) str="?"; else { rs->FetchField("INIT3",&str); } if(!str.IsEmpty()) strData+=", " + str; if(0==T4) str="?"; else { rs->FetchField("INIT4",&str); } if(!str.IsEmpty()) strData+=", " + str; if(strData.IsEmpty()) strData="---"; if(bQuick) strData="*"+strData;//indicating it's a quick workorder strData.TrimLeft(','); }//if scheduled else strData="---"; //rvi.iTextColor //Original with incorrect use of GetBuffer (and missing releasebuffer) //rvi.lpszText = strData.GetBuffer(strData.GetLength()); //02/19/2003 - GetBuffer / ReleaseBuffer change rvi.lpszText = strData.GetBuffer(0); rvi.iSubItem = ++y; m_rc.SetItem(&rvi); strData.ReleaseBuffer(); //ENTRY DATE rs->FetchField("created",&dtData); strData=dtData.Format();//VAR_DATEVALUEONLY); rvi.iSubItem = ++y; rvi.lParam = x; //Original with incorrect use of GetBuffer (and missing releasebuffer) //rvi.lpszText = strData.GetBuffer(strData.GetLength()); //m_rc.SetItem(&rvi); //02/19/2003 - GetBuffer / ReleaseBuffer change rvi.lpszText = strData.GetBuffer(0); m_rc.SetItem(&rvi); strData.ReleaseBuffer(); //Last activity DATE rs->FetchField("modified",&dtData); strData=dtData.Format(VAR_DATEVALUEONLY); rvi.iSubItem = ++y; rvi.lParam = x; //Original with incorrect use of GetBuffer (and missing releasebuffer) //rvi.lpszText = strData.GetBuffer(strData.GetLength()); //m_rc.SetItem(&rvi); //02/19/2003 - GetBuffer / ReleaseBuffer change rvi.lpszText = strData.GetBuffer(0); m_rc.SetItem(&rvi); strData.ReleaseBuffer(); //ONSITE rs->FetchField("onsite",&bData); rvi.nMask = RVIM_IMAGE |RVIM_CHECK; rvi.nState = 0;//RVIS_BOLD; rvi.iSubItem = ++y; rvi.lParam = x; //rvi.iImage = 2; rvi.iCheck = bData ? TRUE : FALSE; rvi.lpszText = "Check"; m_rc.SetItem(&rvi); //CLOSED CHECK / CLOSED DATE rs->FetchField("closed",&dtClosed); if(dtClosed.GetYear()==1968)//still open { //isn't closed rvi.nMask = RVIM_IMAGE |RVIM_CHECK; rvi.nState = 0;//RVIS_BOLD; rvi.iSubItem = ++y; rvi.lParam = x; //rvi.iImage = 2; rvi.iCheck = FALSE; rvi.lpszText = "Check"; m_rc.SetItem(&rvi); strData="open"; } else { //is closed rvi.nMask = RVIM_IMAGE |RVIM_CHECK; rvi.nState = 0;//RVIS_BOLD; rvi.iSubItem = ++y; rvi.lParam = x; //rvi.iImage = 2; rvi.iCheck = TRUE; rvi.lpszText = "Check"; m_rc.SetItem(&rvi); //v1.9.4.4 - apparently an overwhelming majority of people //want to see the time as well as the date for closed so... // strData=dtClosed.Format(VAR_DATEVALUEONLY); strData=dtClosed.Format(); } //date rvi.nMask = RVIM_TEXT; rvi.iSubItem = ++y; rvi.lParam = x; /*rvi.lpszText = strData.GetBuffer(strData.GetLength()); m_rc.SetItem(&rvi);*/ //02/19/2003 - GetBuffer / ReleaseBuffer change rvi.lpszText = strData.GetBuffer(0); m_rc.SetItem(&rvi); strData.ReleaseBuffer(); //POSTAL CODE rs->FetchField("postal",&strData); rvi.nMask = RVIM_TEXT; rvi.iSubItem = ++y; rvi.lParam = x; /*rvi.lpszText = strData.GetBuffer(strData.GetLength()); m_rc.SetItem(&rvi);*/ //02/19/2003 - GetBuffer / ReleaseBuffer change rvi.lpszText = strData.GetBuffer(0); m_rc.SetItem(&rvi); strData.ReleaseBuffer(); //CITY rs->FetchField("city",&strData); rvi.nMask = RVIM_TEXT; rvi.iSubItem = ++y; rvi.lParam = x; /*rvi.lpszText = strData.GetBuffer(strData.GetLength()); m_rc.SetItem(&rvi);*/ //02/19/2003 - GetBuffer / ReleaseBuffer change rvi.lpszText = strData.GetBuffer(0); m_rc.SetItem(&rvi); strData.ReleaseBuffer(); //WORKORDER ID rs->FetchField("quick",&bData); rs->FetchField("id",&lData); lWOID=lData;//added 11/20/2002 used by DATE column quick work order query below strData.Format("%u",lData); if(bData) strData=strData+"*";//language neutral depiction of quick workorder rvi.nMask = RVIM_TEXT; rvi.iSubItem = ++y; rvi.lParam = x; /*rvi.lpszText = strData.GetBuffer(strData.GetLength()); m_rc.SetItem(&rvi);*/ //02/19/2003 - GetBuffer / ReleaseBuffer change rvi.lpszText = strData.GetBuffer(0); m_rc.SetItem(&rvi); strData.ReleaseBuffer(); //CZONE rs->FetchField("zonename",&strData); rvi.nMask = RVIM_TEXT; rvi.iSubItem = ++y; rvi.lParam = x; /*rvi.lpszText = strData.GetBuffer(strData.GetLength()); m_rc.SetItem(&rvi);*/ //02/19/2003 - GetBuffer / ReleaseBuffer change rvi.lpszText = strData.GetBuffer(0); m_rc.SetItem(&rvi); strData.ReleaseBuffer(); //INVOICE rs->FetchField("invoice",&strData); rvi.nMask = RVIM_TEXT; rvi.iSubItem = ++y; rvi.lParam = x; /*rvi.lpszText = strData.GetBuffer(strData.GetLength()); m_rc.SetItem(&rvi);*/ //02/19/2003 - GetBuffer / ReleaseBuffer change rvi.lpszText = strData.GetBuffer(0); m_rc.SetItem(&rvi); strData.ReleaseBuffer(); //DATE- combined entry date for quick or non booked standard // sched date for open standard if(!bQuick) rs->FetchField("cdate",&dtData); else//added 11/03/00//changed 11/20/2002 (is supposed to be quick work order start date not closed date) { //strData=dtClosed.Format(VAR_DATEVALUEONLY); qbrs.Format("SELECT labor.start FROM labor RIGHT JOIN (probs RIGHT " "JOIN wo ON probs.wolink = wo.id) ON labor.link " "= probs.id WHERE (((wo.id)=%u));",lWOID); brs->QueryReadOnly(qbrs); if(!brs->IsEmpty()) { brs->FetchField("start",&dtData); } } strData=dtData.Format(VAR_DATEVALUEONLY); rvi.nMask = RVIM_TEXT; rvi.iSubItem = ++y; rvi.lParam = x; /*rvi.lpszText = strData.GetBuffer(strData.GetLength()); m_rc.SetItem(&rvi);*/ //02/19/2003 - GetBuffer / ReleaseBuffer change rvi.lpszText = strData.GetBuffer(0); m_rc.SetItem(&rvi); strData.ReleaseBuffer(); //STATUS rs->FetchField("wostatus",&strData); rvi.nMask = RVIM_TEXT; rvi.iSubItem = ++y; rvi.lParam = x; //rvi.iTextColor /*rvi.lpszText = strData.GetBuffer(strData.GetLength()); m_rc.SetItem(&rvi); */ //02/19/2003 - GetBuffer / ReleaseBuffer change rvi.lpszText = strData.GetBuffer(0); m_rc.SetItem(&rvi); strData.ReleaseBuffer(); //OURREF rs->FetchField("ourref",&strData); rvi.nMask = RVIM_TEXT; rvi.iSubItem = ++y; rvi.lParam = x; /*rvi.lpszText = strData.GetBuffer(strData.GetLength()); m_rc.SetItem(&rvi);*/ //02/19/2003 - GetBuffer / ReleaseBuffer change rvi.lpszText = strData.GetBuffer(0); m_rc.SetItem(&rvi); strData.ReleaseBuffer(); //clientREF rs->FetchField("clientrefnum",&strData); rvi.nMask = RVIM_TEXT; rvi.iSubItem = ++y; rvi.lParam = x; /*rvi.lpszText = strData.GetBuffer(strData.GetLength()); m_rc.SetItem(&rvi);*/ //02/19/2003 - GetBuffer / ReleaseBuffer change rvi.lpszText = strData.GetBuffer(0); m_rc.SetItem(&rvi); strData.ReleaseBuffer(); //Last modified 07/30/2001 - added category/type and project column //COLUMNMOD rs->FetchField("category",&strData); rvi.nMask = RVIM_TEXT; rvi.iSubItem = ++y; rvi.lParam = x; /*rvi.lpszText = strData.GetBuffer(strData.GetLength()); m_rc.SetItem(&rvi);*/ //02/19/2003 - GetBuffer / ReleaseBuffer change rvi.lpszText = strData.GetBuffer(0); m_rc.SetItem(&rvi); strData.ReleaseBuffer(); //project name rs->FetchField("projname",&strData); rvi.nMask = RVIM_TEXT; rvi.iSubItem = ++y; rvi.lParam = x; /*rvi.lpszText = strData.GetBuffer(strData.GetLength()); m_rc.SetItem(&rvi);*/ //02/19/2003 - GetBuffer / ReleaseBuffer change rvi.lpszText = strData.GetBuffer(0); m_rc.SetItem(&rvi); strData.ReleaseBuffer(); //NEW COLUMNS BEFORE HERE x++; //overflow handler here if((x % 250)==0 && bPrompt==true) { nContinuePromptChoice=AfxMessageBox( "There's a lot of data here!\r\n" "You can configure your view to display less records\r\n\r\n" "Do you want to be prompted again after another 250 records [Yes/No] ...\r\n" "or cancel retrieving data now? [Cancel]",MB_YESNOCANCEL); if(nContinuePromptChoice==IDCANCEL) bAbort=true; if(nContinuePromptChoice==IDNO) bPrompt=false; cWait.Restore();//go back to a wait cursor } }while(rs->MoveForward() && !bAbort); #ifdef _DEBUG /* CString strPerf; pTimer.Stop(); strPerf.Format("Time: %.3f",pTimer.Elapsed()); AfxMessageBox(strPerf); */ #endif //clear the recordsets DeActivate(); } //************************************************ void STAT::OnRvnItemDbClick(NMHDR* pNMHDR, LRESULT* pResult) { CString str; LPNMREPORTVIEW lpnmrv = (LPNMREPORTVIEW)pNMHDR; if(lpnmrv->iItem >=0)//-1 if clicked on invalid { str=m_rc.GetItemText(lpnmrv->iItem,11); if(str.Right(1)=='*')//quick workorder { str.Remove('*'); CSimpleWODlg qwo; qwo.SetWorkorderID(&str); qwo.DoModal(); } else { CWOHeaderDlg wo; wo.SetWorkorderID(str); wo.DoModal(); } } *pResult = FALSE; FillView(); } //************************************************ // USED TO RETRIEVE ADDRESS AND CONTACT INFO //************************************************ void STAT::OnRvnItemClick(NMHDR* pNMHDR, LRESULT* pResult) { CString strWOID,q, strData, strDisplay; LPNMREPORTVIEW lpnmrv = (LPNMREPORTVIEW)pNMHDR; if(lpnmrv->iItem >=0)//-1 if clicked on invalid { strWOID=m_rc.GetItemText(lpnmrv->iItem,11); //remove asterisk which is appended to quick workorder //numbers strWOID.Remove('*'); //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 wo LEFT JOIN clients ON wo.client = clients.id " "WHERE (((wo.id)=%s));",strWOID); cbrs->QueryReadOnly(q); 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); } //Indicate that stats are available to be displayed //since this function just overwrote the stats display m_bFreshStatsAwait=true; *pResult = FALSE; } //******************************************** void STAT::OnRvnItemDrawPreview(NMHDR* pNMHDR, LRESULT* pResult) { CString strText; LPNMRVDRAWPREVIEW lpnmrvdp = (LPNMRVDRAWPREVIEW)pNMHDR; strText=lsNotes.GetAt(lsNotes.FindIndex(lpnmrvdp->iItem)); CReportCtrl& rc = m_rc; CDC dc; dc.Attach(lpnmrvdp->hDC); if(lpnmrvdp->nState&RVIS_SELECTED) dc.SetTextColor(::GetFocus()==rc.m_hWnd ? GetSysColor(COLOR_HIGHLIGHTTEXT):GetSysColor(COLOR_HIGHLIGHT)); else dc.SetTextColor(GetSysColor(COLOR_HIGHLIGHT)); lpnmrvdp->rect.left += 40; lpnmrvdp->rect.top += 2; lpnmrvdp->rect.bottom -= 2; dc.DrawText(strText, &lpnmrvdp->rect, DT_LEFT|DT_END_ELLIPSIS|DT_WORDBREAK|DT_NOPREFIX|DT_EXPANDTABS); dc.Detach(); *pResult = FALSE; } //************************************** //void STAT::OnOK() //{} //SET ORDER BY CLAUSE DEPENDING ON CLICK HERE void STAT::OnColumnClick(NMHDR* pNMHDR, LRESULT* pResult) { CWaitCursor Wait; int x; CString str; CFlatHeaderCtrl* header; header=m_rc.GetHeaderCtrl(); dv.sqlorderby.Empty(); //FIND CLICKED COLUMN str=header->m_szHotItemText; if(str=="Client") { x=0; goto OUTTAHERE; } if(str=="SchedDate") { x=1; goto OUTTAHERE; } if(str=="SchedEndDate") { x=2; goto OUTTAHERE; } if(str=="Date") //here because it's more common { x=14; goto OUTTAHERE; } if(str=="SchedTech") { x=3; goto OUTTAHERE; } if(str=="EntryDate") { x=4; goto OUTTAHERE; } if(str=="LastActivity") { x=5; goto OUTTAHERE; } if(str=="Onsite") { x=6; goto OUTTAHERE; } if(str=="Closed") { x=7; goto OUTTAHERE; } if(str=="ClosedDate") { x=8; goto OUTTAHERE; } if(str=="Postal") { x=9; goto OUTTAHERE; } if(str=="City") { x=10; goto OUTTAHERE; } if(str=="WO#") { x=11; goto OUTTAHERE; } if(str=="Zone") { x=12; goto OUTTAHERE; } if(str=="Invoice") { x=13; goto OUTTAHERE; } if(str=="Status") { x=15; goto OUTTAHERE; } if(str=="OurRef#") { x=16; goto OUTTAHERE; } if(str=="OurRef#") { x=16; goto OUTTAHERE; } if(str=="ClientRef#") { x=17; goto OUTTAHERE; } //Last modified 07/30/2001 - added category/type column //COLUMNMOD if(str=="Category") { x=18; goto OUTTAHERE; } if(str=="Project") { x=19; goto OUTTAHERE; } OUTTAHERE:; bColumnSortAsc[x]=!bColumnSortAsc[x]; switch(x) {//DESC case 0://client dv.sqlorderby="ORDER BY IIf(IsNull([company]),[clients]![last] & \", \" & [clients]![first],[company])"; break; case 1://scheddate dv.sqlorderby="ORDER BY starttime"; break; case 2://schedenddate dv.sqlorderby="ORDER BY stoptime"; break; case 3://schedtech dv.sqlorderby="ORDER BY users.initials"; break; case 4://entrydate dv.sqlorderby="ORDER BY wo.created"; break; case 5://lastactivity dv.sqlorderby="ORDER BY wo.modified"; break; case 6://onsite dv.sqlorderby="ORDER BY onsite"; break; case 7://closed dv.sqlorderby="ORDER BY closed"; break; case 8://closeddate dv.sqlorderby="ORDER BY closed"; break; case 9://postal dv.sqlorderby="ORDER BY postal"; break; case 10://city dv.sqlorderby="ORDER BY city"; break; case 11://wo# dv.sqlorderby="ORDER BY wo.id"; break; case 12://ZONE <-one of the underlying //tenets of this universe is that the word //ZONE must be capitalized at all times :) dv.sqlorderby="ORDER BY zones.name"; break; case 13://invoice dv.sqlorderby="ORDER BY invoice"; break; case 14://DATE Combined date dv.sqlorderby="ORDER BY IIf([wo].[anytime]=True,[wo].[created],[wo].[starttime])"; break; case 15://STATUS dv.sqlorderby="ORDER BY probstat.notes"; break; case 16://OURREF dv.sqlorderby="ORDER BY wo.ourref"; break; //wo.ourref, probstat.notes AS wostatus case 17://customer REF dv.sqlorderby="ORDER BY wo.clientrefnum"; break; //Last modified 07/30/2001 - added category/type and project column //COLUMNMOD case 18://CATEGORY dv.sqlorderby="ORDER BY wotypes.category"; break; case 19://PROJECT dv.sqlorderby="ORDER BY projects.name"; break; } if(!bColumnSortAsc[x]) dv.sqlorderby+=" DESC"; header->SetSortColumn(header->GetHotIndex(),bColumnSortAsc[x]); *pResult = TRUE;//TRUE means we handled it here thanks anyway OnBtnrefresh(); } //*************************************** void STAT::DisplayColumns() { if(dv.client!=0) m_rc.ActivateColumn(0, 0); else m_rc.DeactivateColumn(0); if(dv.schedstart!=0) m_rc.ActivateColumn(1, 1); else m_rc.DeactivateColumn(1); if(dv.schedenddate!=0) m_rc.ActivateColumn(2, 2); else m_rc.DeactivateColumn(2); if(dv.schedtech!=-2) m_rc.ActivateColumn(3, 3); else m_rc.DeactivateColumn(3); if(dv.wocreateddate!=0) m_rc.ActivateColumn(4, 4); else m_rc.DeactivateColumn(4); if(dv.lastactivity!=0) m_rc.ActivateColumn(5, 5); else m_rc.DeactivateColumn(5); if(dv.onsite!=0) m_rc.ActivateColumn(6, 6); else m_rc.DeactivateColumn(6); if(dv.closed!=0) m_rc.ActivateColumn(7, 7); else m_rc.DeactivateColumn(7); if(dv.closeddate!=0) m_rc.ActivateColumn(8, 8); else m_rc.DeactivateColumn(8); if(dv.postal!=0) m_rc.ActivateColumn(9, 9); else m_rc.DeactivateColumn(9); if(dv.city!=0) m_rc.ActivateColumn(10, 10); else m_rc.DeactivateColumn(10); if(dv.workorder!=0) m_rc.ActivateColumn(11, 11); else m_rc.DeactivateColumn(11); if(dv.zone!=0) m_rc.ActivateColumn(12, 12); else m_rc.DeactivateColumn(12); if(dv.invoice!=0) m_rc.ActivateColumn(13, 13); else m_rc.DeactivateColumn(13); if(dv.date!=0) m_rc.ActivateColumn(14, 14); else m_rc.DeactivateColumn(14); if(dv.status!=0) m_rc.ActivateColumn(15, 15); else m_rc.DeactivateColumn(15); if(dv.ourrefnumber!=0) m_rc.ActivateColumn(16, 16); else m_rc.DeactivateColumn(16); if(dv.custrefnumber!=0) m_rc.ActivateColumn(17, 17); else m_rc.DeactivateColumn(17); //Last modified 07/30/2001 - added category/type and project column //COLUMNMOD if(dv.category!=0) m_rc.ActivateColumn(18, 18); else m_rc.DeactivateColumn(18); //project if(dv.project!=0) m_rc.ActivateColumn(19, 19); else m_rc.DeactivateColumn(19); } //************************************ void STAT::OnLblsaveview() { CString str,newviewname,q; CGetStringDlg d; bool overwrite=false;//indicates if overwriting an existing view or it/s a new view newviewname=m_cbViews.GetCurrentRowText(); d.Setup("Enter a view name:",&newviewname); if(d.DoModal()==IDCANCEL) return; if(newviewname=="< default >") { AfxMessageBox("You can not overwrite the default view"); return; } q.Format("SELECT statusviews.viewname FROM statusviews " "WHERE (((statusviews.viewname)=\"%s\"));",newviewname); cbrs->QueryReadOnly(q); if(!cbrs->IsEmpty()) { str.Format("Overwrite existing \"%s\" view with new settings?",newviewname); if(AfxMessageBox(str,MB_YESNO)!=IDYES) { DeActivate(); return; } else overwrite=true; } dv.viewname=newviewname; //GET PROFILE m_rc.WriteProfile(&dv.viewprofile); if(overwrite) { q.Format("SELECT statusviews.* FROM statusviews " "WHERE (((statusviews.viewname)=\"%s\"));",dv.viewname); cbrs->Query(q); } else {//add new record q.Format("SELECT statusviews.* FROM statusviews WHERE (((statusviews.id)=0));"); cbrs->Query(q); cbrs->AddNewRecord(); } //UPDATE EACH FIELD cbrs->UpdateField("viewname",&dv.viewname); cbrs->UpdateField("viewprofile",&dv.viewprofile); cbrs->UpdateField("client",&dv.client); cbrs->UpdateField("zone",&dv.zone); cbrs->UpdateField("postal",&dv.postal); cbrs->UpdateField("city",&dv.city); cbrs->UpdateField("workorder",&dv.workorder); cbrs->UpdateField("invoice",&dv.invoice); cbrs->UpdateField("closed",&dv.closed); cbrs->UpdateField("closeddate",&dv.closeddate); cbrs->UpdateField("date",&dv.date); cbrs->UpdateField("ourref",&dv.ourrefnumber); cbrs->UpdateField("status",&dv.status); cbrs->UpdateField("onsite",&dv.onsite); cbrs->UpdateField("schedstart",&dv.schedstart); cbrs->UpdateField("scheddatestart",&dv.scheddatestart); cbrs->UpdateField("scheddateend",&dv.scheddateend); cbrs->UpdateField("schedenddate",&dv.schedenddate); cbrs->UpdateField("schedtech",&dv.schedtech); cbrs->UpdateField("wocreatedate",&dv.wocreateddate); cbrs->UpdateField("woentrydate",&dv.woentrydate); cbrs->UpdateField("woentrydatetype",&dv.woentrydatetype); cbrs->UpdateField("lastactivity",&dv.lastactivity); cbrs->UpdateField("sqlcriteria",&dv.sqlcriteria); cbrs->UpdateField("sqlorderby",&dv.sqlorderby); cbrs->UpdateField("preview",&dv.preview); //Last modified 07/30/2001 - added category/type and project column //COLUMNMOD cbrs->UpdateField("category",&dv.category); cbrs->UpdateField("project",&dv.project); //created days cbrs->UpdateField("createddays",&dv.lCreatedDays); //SAVE cbrs->SaveRecord(); //REFRESH PICK LIST FillViewList(); if(!overwrite) { q.Format("SELECT statusviews.id FROM statusviews " "WHERE (((statusviews.viewname)=\"%s\"));",dv.viewname); cbrs->QueryReadOnly(q); cbrs->FetchField("id",&dv.id); //CENTRE ON NEW VIEW m_cbViews.Select(dv.id); } DeActivate(); } //****************************************** void STAT::OnLbldeleteview() { CString q; q=m_cbViews.GetCurrentRowText(); if(q=="< default >") { AfxMessageBox("You can not delete the default view"); return; } q.Format("DELETE statusviews.*, statusviews.id " "FROM statusviews " "WHERE (((statusviews.id)=%s));",m_cbViews.GetCurrentRowID()); cbrs->Ex(q); cbrs->Close(); ///cbrs=NULL; FillViewList(); OnCloseupCbviews(); } //****************************************** void STAT::OnLblchoosefields() { CDispatchFieldsDlg d; d.SetReturnVariable(&dv); if(d.DoModal()==IDOK) { m_pApp->m_bRefreshStatScreen=true; DisplayColumns(); FillView(); } if(AfxMessageBox("Do you want to save changes to this view?",MB_YESNO) ==IDYES) OnLblsaveview(); } //================================ void STAT::FillViewList() { CString strData,strIndex; long lData; m_cbViews.Clear(); cbrs->QueryReadOnly("SELECT statusviews.* FROM statusviews ORDER BY statusviews.viewname;"); if(cbrs->IsEmpty()) { DeActivate(); return; } do{ cbrs->FetchField("id",&lData); cbrs->FetchField("viewname",&strData); strIndex.Format("%u",lData); m_cbViews.AddRow(strData,strIndex); }while(cbrs->MoveForward()); //user may have deleted view one //so select first in list instead if(m_strSelectedView=="1") m_cbViews.SetCurSel(0); else m_cbViews.Select(m_strSelectedView); DeActivate(); } //=============================== void STAT::OnCloseupCbviews() { CString str,q; str=m_cbViews.GetCurrentRowID(); if(!FirstRun && str==m_strSelectedView) { return;//no change } //save users new view preference m_strSelectedView=str; q.Format("UPDATE users SET users.statview = \"%s\" " "WHERE (((users.id)=%u));",str,m_pApp->m_lusrID); cbrs->Ex(q); //load settings for this view then q.Format("SELECT statusviews.* FROM statusviews WHERE (((statusviews.id)=%s));",m_strSelectedView); cbrs->QueryReadOnly(q); if(cbrs->IsEmpty()) { DeActivate(); return; } //UPDATE EACH FIELD cbrs->FetchField("viewname",&dv.viewname); cbrs->FetchField("viewprofile",&dv.viewprofile); cbrs->FetchField("client",&dv.client); cbrs->FetchField("zone",&dv.zone); cbrs->FetchField("postal",&dv.postal); cbrs->FetchField("city",&dv.city); cbrs->FetchField("workorder",&dv.workorder); cbrs->FetchField("invoice",&dv.invoice); cbrs->FetchField("closed",&dv.closed); cbrs->FetchField("closeddate",&dv.closeddate); cbrs->FetchField("onsite",&dv.onsite); cbrs->FetchField("schedstart",&dv.schedstart); cbrs->FetchField("date",&dv.date); cbrs->FetchField("ourref",&dv.ourrefnumber); cbrs->FetchField("custref",&dv.custrefnumber); cbrs->FetchField("status",&dv.status); cbrs->FetchField("scheddatestart",&dv.scheddatestart); cbrs->FetchField("scheddateend",&dv.scheddateend); cbrs->FetchField("woentrydate",&dv.woentrydate); cbrs->FetchField("woentrydatetype",&dv.woentrydatetype); cbrs->FetchField("schedenddate",&dv.schedenddate); cbrs->FetchField("schedtech",&dv.schedtech); cbrs->FetchField("wocreatedate",&dv.wocreateddate); cbrs->FetchField("lastactivity",&dv.lastactivity); cbrs->FetchField("sqlcriteria",&dv.sqlcriteria); cbrs->FetchField("sqlorderby",&dv.sqlorderby); cbrs->FetchField("preview",&dv.preview); cbrs->FetchField("virtualreport",&dv.virtualreport); //Last modified 07/30/2001 - added category/type column //COLUMNMOD cbrs->FetchField("category",&dv.category); cbrs->FetchField("project",&dv.project); // created days 10/11/2002 cbrs->FetchField("createddays",&dv.lCreatedDays); DeActivate(); //modified 07/30/2001 was set to x<17 explicitly changed to STATCOLUMNCOUNT for(int x=0;xAllowed(RWORKORDER,true); if(x!=1)//no write allowed { m_pApp->SecurityWarning(); return; } CWOHeaderDlg wo; wo.SetWorkorderID("0"); if(wo.DoModal()==IDOK) { m_pApp->m_bRefreshStatScreen=true; FillView(); } } void STAT::OnBtnnewqwo() { int x=m_pApp->Allowed(RWORKORDER,true); if(x!=1)//no write allowed { m_pApp->SecurityWarning(); return; } CString temp="0"; //This is to work around a bug, if previous //qwo deleted a workorder //the next save goes gibberish for some reason? //Recordset corruption probably, this fixes CSimpleWODlg qwo; qwo.SetWorkorderID(&temp); if(qwo.DoModal()==IDOK) { m_pApp->m_bRefreshStatScreen=true; FillView(); } } void STAT::OnBtnprint() { CString q,parameters,str; if(dv.preview) parameters="True AS zShowNotes, "; else parameters="False AS zShowNotes, "; str.Format("\"%s\" AS zCurrentUser, ",m_pApp->m_strCurrentUserName); parameters = parameters + str; /*PRISTINE VERSION OF 1.9.3.0 query q.Format("SELECT %s " "IIf([wo].[anytime]=True,[wo].[created],[wo].[starttime]) AS cdate, probs.id AS PROBID, " "probs.brief, probs.notes AS PROBDETAILS, wo.clientcontact, wo.notes AS wonotes, wo.invoice, " "IIf(IsNull([company]),[clients]![last] & \", \" & [clients]![first],[company]) AS clientcompany, " "wo.anytime, wo.starttime, wo.stoptime, users.initials, users_1.initials AS INIT2, " "users_2.initials AS INIT3, users_3.initials AS INIT4, wo.created, wo.modified, wo.onsite, " "wo.closed, wo.prob_found, wo.prob_reported, wo.action_taken, clients.postal, clients.city, " "clients.technotes, clients.generalnotes, clients.acctnumber, zones.name AS zonename, wo.quick, " "wo.id, wo.ourref, wo.clientrefnum, probstat.notes AS wostatus " "FROM (((probs RIGHT JOIN (((((wo LEFT JOIN users ON wo.assigntech = users.id) LEFT JOIN " "clients ON wo.client = clients.id) LEFT JOIN zones ON clients.czone = zones.id) LEFT JOIN " "projects ON wo.project = projects.id) LEFT JOIN probstat ON wo.status = probstat.id) ON probs.wolink = wo.id) " "LEFT JOIN users AS users_1 ON wo.assigntech2 = users_1.id) LEFT JOIN users AS users_2 " "ON wo.assigntech3 = users_2.id) LEFT JOIN users AS users_3 ON wo.assigntech4 = users_3.id %s %s;",parameters, dv.sqlcriteria, dv.sqlorderby); */ q.Format("SELECT %s " "IIf([wo].[anytime]=True,[wo].[created],[wo].[starttime]) AS cdate, probs.id AS PROBID, " "probs.brief, probs.notes AS PROBDETAILS, wo.clientcontact, wo.notes AS wonotes, wo.invoice, " "IIf(IsNull([company]),[clients]![last] & \", \" & [clients]![first],[company]) AS clientcompany, " "wo.anytime, wo.starttime, wo.stoptime, users.initials, users_1.initials AS INIT2, " "users_2.initials AS INIT3, users_3.initials AS INIT4, wo.created, wo.modified, wo.onsite, " "wo.closed, wo.prob_found, wo.prob_reported, wo.action_taken, clients.postal, clients.city, " "clients.technotes, clients.generalnotes, clients.acctnumber, zones.name AS zonename, wo.quick, " "wo.id, wo.ourref, wo.clientrefnum, probstat.notes AS wostatus " "FROM wotypes RIGHT JOIN ((((probs RIGHT JOIN (((((wo LEFT JOIN users ON wo.assigntech = users.id) LEFT JOIN " "clients ON wo.client = clients.id) LEFT JOIN zones ON clients.czone = zones.id) LEFT JOIN " "projects ON wo.project = projects.id) LEFT JOIN probstat ON wo.status = probstat.id) ON probs.wolink = wo.id) " "LEFT JOIN users AS users_1 ON wo.assigntech2 = users_1.id) LEFT JOIN users AS users_2 " "ON wo.assigntech3 = users_2.id) LEFT JOIN users AS users_3 ON wo.assigntech4 = users_3.id) ON wotypes.id=wo.type " "%s %s;",parameters, dv.sqlcriteria, dv.sqlorderby); #ifdef _DEBUG m_pApp->ShowStuff(q); #endif rsPrint->Close(); rsPrint->QueryReadOnly(q); rsPrint->QueryReadOnly(q); m_pApp->PrintCMReportRDC(dv.virtualreport,rsPrint->RecordSetPointer()); #ifdef _DEBUG m_pApp->CreateTTX("wostatus.ttx",rsPrint->RecordSetPointer()); #endif // DeActivate(); } void STAT::Activate() { #ifdef _WTF_ AfxMessageBox("STAT activate"); #endif rs=m_pApp->rsPool->GetRS("STAT RS"); cbrs=m_pApp->rsPool->GetRS("STAT CBRS"); brs=m_pApp->rsPool->GetRS("STAT brs"); rsPrint=m_pApp->rsPool->GetRSPrint("STAT RSPRINT"); //AfxMessageBox("Activate"); //ShowWindow(SW_MAXIMIZE); //if were supposed to refresh the stat screen then.. FillView(); //Hide add wo buttons if not allowed int x=m_pApp->Allowed(RWORKORDER,true); if(x!=1)//no write allowed { m_btnNewQWO.EnableWindow(FALSE); m_btnNewSTWO.EnableWindow(FALSE); } } void STAT::DeActivate() { //AfxMessageBox("Deactivate"); #ifdef _WTF_ AfxMessageBox("STAT activate"); #endif //AfxMessageBox("STAT::DeActivate()"); m_pApp->rsPool->ReleaseRS(&rs->m_nID); m_pApp->rsPool->ReleaseRS(&cbrs->m_nID); m_pApp->rsPool->ReleaseRS(&brs->m_nID); m_pApp->rsPool->ReleaseRS(&rsPrint->m_nID); //AfxMessageBox("DONE: STAT::DeActivate()"); } void STAT::OnBtneditwonum() { CString q; CString strWO; bool bquick; m_edWONumber.GetWindowText(strWO); if(strWO.IsEmpty()) return; q.Format("SELECT wo.quick FROM wo WHERE (((wo.id)=%s));",strWO); cbrs->QueryReadOnly(q); if(cbrs->IsEmpty()) { q.Format("There is no workorder %s",strWO); AfxMessageBox(q); DeActivate(); return; } cbrs->FetchField("quick",&bquick); cbrs->Close(); if(bquick) { CSimpleWODlg qwo; qwo.SetWorkorderID(&strWO); qwo.DoModal(); } else { CWOHeaderDlg wo; wo.SetWorkorderID(strWO); wo.DoModal(); } FillView(); } void STAT::OnBtnrefresh() { m_pApp->m_bRefreshStatScreen=true; FillView(); } void STAT::DoHelp() { //AfxGetApp()->WinHelp(IDD_STAT_FORM); //AfxMessageBox("here's your help."); } void STAT::OnBtnclientnotes() { CString strWorkorderID,q; int x; long lClient; x=m_rc.GetFirstSelectedItem(); if(x<0) { AfxMessageBox("No list item is selected"); return;//no selection } strWorkorderID=m_rc.GetItemText(x,11); strWorkorderID.Remove('*'); q.Format("SELECT wo.client FROM wo " "WHERE (((wo.id)=%s));",strWorkorderID); brs->Query(q); if(brs->IsEmpty()) { AfxMessageBox("Can't locate a client for that workorder"); DeActivate(); return; } brs->FetchField("client",&lClient); DeActivate(); q.Format("%u",lClient); CContactsViewDlg d; d.Setup(q); d.DoModal(); } void STAT::LayoutControls() { CRect rectCtl; GetWindowRect(rectStat); int nOffset=rectStat.top; int nLastBottom,nRight,nLeft; int nHeight,nWidth; m_rc.GetWindowRect(rectCtl); rectCtl.right=rectStat.right-73; rectCtl.top-=nOffset; rectCtl.left=13; rectCtl.bottom=rectStat.bottom-70-nOffset; m_rc.MoveWindow(rectCtl,TRUE); nLastBottom=rectCtl.bottom; nRight=rectCtl.right; m_btnEditWO.GetWindowRect(rectCtl); nWidth=rectCtl.Width(); rectCtl.right=nRight; rectCtl.left=nRight-nWidth; rectCtl.top-=nOffset; rectCtl.bottom-=nOffset; m_btnEditWO.MoveWindow(rectCtl,TRUE); m_edWONumber.GetWindowRect(rectCtl); nWidth=rectCtl.Width(); rectCtl.right=nRight; rectCtl.left=nRight-nWidth; rectCtl.top-=nOffset; rectCtl.bottom-=nOffset; m_edWONumber.MoveWindow(rectCtl,TRUE); nLeft=rectCtl.left; //set contact field to grow to the right m_lblContactInfo.GetWindowRect(rectCtl); //nWidth=rectCtl.Width(); rectCtl.right=nLeft-5; //rectCtl.left=nRight-nWidth; rectCtl.top-=nOffset; rectCtl.bottom-=nOffset; m_lblContactInfo.MoveWindow(rectCtl,TRUE); m_btnNewQWO.GetWindowRect(rectCtl); nHeight=rectCtl.Height(); rectCtl.bottom=nLastBottom+25; rectCtl.top=rectCtl.bottom-nHeight; m_btnNewQWO.MoveWindow(rectCtl,TRUE); nLastBottom=rectCtl.bottom; m_btnNewSTWO.GetWindowRect(rectCtl); nHeight=rectCtl.Height(); rectCtl.bottom=nLastBottom; rectCtl.top=rectCtl.bottom-nHeight; m_btnNewSTWO.MoveWindow(rectCtl,TRUE); m_btnRefresh.GetWindowRect(rectCtl); nHeight=rectCtl.Height(); rectCtl.bottom=nLastBottom; rectCtl.top=rectCtl.bottom-nHeight; m_btnRefresh.MoveWindow(rectCtl,TRUE); m_btnClientNotes.GetWindowRect(rectCtl); nHeight=rectCtl.Height(); rectCtl.bottom=nLastBottom; rectCtl.top=rectCtl.bottom-nHeight; m_btnClientNotes.MoveWindow(rectCtl,TRUE); m_btnPrint.GetWindowRect(rectCtl); nHeight=rectCtl.Height(); rectCtl.bottom=nLastBottom; rectCtl.top=rectCtl.bottom-nHeight; m_btnPrint.MoveWindow(rectCtl,TRUE); } void STAT::OnSize(UINT nType, int cx, int cy) { CFormView::OnSize(nType, cx, cy); if(cx>m_nCX)//to cut down on number of times called { m_nCX=cx; if(m_btnPrint.m_hWnd) { LayoutControls(); } } } void STAT::OnMouseMove(UINT nFlags, CPoint point) { if(m_bFreshStatsAwait) { m_bFreshStatsAwait=false; m_lblContactInfo.SetWindowText(m_strStats); } CFormView::OnMouseMove(nFlags, point); } // Fetches useful stats from database do display at top //called by FillView when there is a refresh required in the view only void STAT::GetStats(void) { long lWOCount=0; long lOpenCount=0; if(rs->QueryReadOnly("SELECT Count(wo.id) AS WOCOUNT FROM wo;")) { rs->FetchField("WOCOUNT",&lWOCount); if(lWOCount<1) { m_strStats.Format("\t There are no work orders entered in AyaNova. Stats not available"); m_bFreshStatsAwait=true; return; } if(rs->QueryReadOnly("SELECT Count(wo.id) AS OPENCOUNT FROM wo GROUP BY wo.closed HAVING (((wo.closed)=#3/12/1968#));")) { if(rs->IsEmpty()) lOpenCount=0; else rs->FetchField("OPENCOUNT", &lOpenCount); } } m_strStats.Format("\t%u total workorders in AyaNova, %u are open",lWOCount,lOpenCount); m_bFreshStatsAwait=true; } BOOL STAT::OnHelpInfo(HELPINFO* pHelpInfo) { WinHelp (0x00020000 + IDD_STAT_FORM,HELP_CONTEXT); return TRUE; }