// PMDlg.cpp : implementation file // #include "stdafx.h" #include "sp.h" #include "PMDlg.h" #include "partsdlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CPMDlg dialog CPMDlg::CPMDlg(CWnd* pParent /*=NULL*/) : CDialog(CPMDlg::IDD, pParent) { //{{AFX_DATA_INIT(CPMDlg) //}}AFX_DATA_INIT m_bAddMode=false; m_pApp= (CSpApp*)AfxGetApp(); rs=new GZRset("Error: PM dialog"); rs->SetConnect(m_pApp->strConnectString); cbrs=new GZRset("Error: PM dialog combo box recordset\r\n"); cbrs->SetConnect(m_pApp->strConnectString); m_strSelectedPM.Empty(); m_strCriteria.Empty(); m_bNoRecord=true; } //********************************* CPMDlg::~CPMDlg() { delete rs; delete cbrs; } void CPMDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CPMDlg) DDX_Control(pDX, IDC_CKAUTOWO, m_ckAutoWO); DDX_Control(pDX, IDC_EDADVANCE, m_edAdvance); DDX_Control(pDX, IDC_LBLADVANCE, m_lblAdvance); DDX_Control(pDX, IDC_LBPARTSREQ, m_lbParts); DDX_Control(pDX, IDC_LBLQUANT, m_lblQuantity); DDX_Control(pDX, IDC_LBLPARTSLIST, m_lblPartsList); DDX_Control(pDX, IDC_CKREPEAT, m_ckRepeat); DDX_Control(pDX, IDC_LBLMETERMONTHS, m_lblMeterMonths); DDX_Control(pDX, IDC_CKONCEONLY, m_ckOnceOnly); DDX_Control(pDX, IDC_CKMETER, m_ckMeter); DDX_Control(pDX, IDC_CKAGE, m_ckAge); DDX_Control(pDX, IDC_EDQUANTITY, m_edQuantity); DDX_Control(pDX, IDC_BTNREMOVEPART, m_btnRemovePart); DDX_Control(pDX, IDC_LBLPMLIST, m_lblPMList); DDX_Control(pDX, IDC_LBLPART, m_lblPart); DDX_Control(pDX, IDC_LBLNEXTSERVICEDATE, m_lblNextServiceDate); DDX_Control(pDX, IDC_LBLAGEMETER, m_lblAgeMeter); DDX_Control(pDX, IDC_EDNOTES, m_edNotes); DDX_Control(pDX, IDC_EDMETERMONTHS, m_edMeterMonths); DDX_Control(pDX, IDC_EDDESCRIPTION, m_edDescription); DDX_Control(pDX, IDC_DTNEXTSERVICE, m_dtNextService); DDX_Control(pDX, IDC_CKACTIVE, m_ckActive); DDX_Control(pDX, IDC_CBPMLIST, m_cbPMList); DDX_Control(pDX, IDC_CBPARTS, m_cbParts); DDX_Control(pDX, IDC_BTNDONE, m_btnDone); DDX_Control(pDX, IDC_BTNDELETE, m_btnDelete); DDX_Control(pDX, IDC_BTNADDPART, m_btnAddPart); DDX_Control(pDX, IDC_BTNADD, m_btnAdd); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CPMDlg, CDialog) //{{AFX_MSG_MAP(CPMDlg) ON_BN_CLICKED(IDC_BTNDONE, OnBtndone) ON_BN_CLICKED(IDC_BTNREMOVEPART, OnBtnremovepart) ON_BN_CLICKED(IDC_BTNADDPART, OnBtnaddpart) ON_BN_CLICKED(IDC_BTNADD, OnBtnadd) ON_BN_CLICKED(IDC_BTNDELETE, OnBtndelete) ON_CBN_CLOSEUP(IDC_CBPARTS, OnCloseupCbparts) ON_CBN_CLOSEUP(IDC_CBPMLIST, OnCloseupCbpmlist) ON_BN_CLICKED(IDC_CKACTIVE, OnCkactive) ON_NOTIFY(DTN_DATETIMECHANGE, IDC_DTNEXTSERVICE, OnDatetimechangeDtnextservice) ON_EN_KILLFOCUS(IDC_EDDESCRIPTION, OnKillfocusEddescription) ON_EN_KILLFOCUS(IDC_EDMETERMONTHS, OnKillfocusEdmetermonths) ON_EN_KILLFOCUS(IDC_EDNOTES, OnKillfocusEdnotes) ON_BN_CLICKED(IDC_LBLPART, OnLblpart) ON_BN_CLICKED(IDC_CKAGE, OnCkage) ON_BN_CLICKED(IDC_CKMETER, OnCkmeter) ON_BN_CLICKED(IDC_CKONCEONLY, OnCkonceonly) ON_BN_CLICKED(IDC_CKREPEAT, OnCkrepeat) ON_EN_KILLFOCUS(IDC_EDADVANCE, OnKillfocusEdadvance) ON_BN_CLICKED(IDC_CKAUTOWO, OnCkautowo) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CPMDlg message handlers void CPMDlg::SetMode(bool clientmode) { m_bClientMode=clientmode; //false=model record //true =client record } //************************************* BOOL CPMDlg::OnInitDialog() { CDialog::OnInitDialog(); // ShowWindow(SW_MAXIMIZE); //make "hyperlinks" m_lblPart.SetTextColor(RGB(0,0,255)); m_lblPart.SetFontUnderline(TRUE); m_lblPart.SetLink(TRUE); m_lblPart.SetLinkCursor(m_pApp->hcHand); m_lblPart.SetLinkURL(""); ASSERT(!m_strCriteria.IsEmpty());//would mean no criteria was passed if(m_strCriteria.IsEmpty()) { AfxMessageBox("Error in PMSCHEDULE dialog, no Model or Client criteria."); CDialog::OnCancel(); } if(m_bClientMode==true) { m_lblAgeMeter.ShowWindow(FALSE); m_ckAge.ShowWindow(FALSE); m_ckMeter.ShowWindow(FALSE); m_lblNextServiceDate.ShowWindow(TRUE); m_dtNextService.ShowWindow(TRUE); m_ckRepeat.SetWindowText("Repeat at interval"); m_ckOnceOnly.SetWindowText("Service once only next service date"); m_lblMeterMonths.SetWindowText("Repeat interval (months):"); } else { m_lblAgeMeter.ShowWindow(TRUE); m_ckAge.ShowWindow(TRUE); m_ckMeter.ShowWindow(TRUE); m_lblNextServiceDate.ShowWindow(FALSE); m_dtNextService.ShowWindow(FALSE); m_ckRepeat.SetWindowText("Repeat every reading / age interval"); m_ckOnceOnly.SetWindowText("Service once only at reading / age"); m_lblMeterMonths.SetWindowText("Repeat interval (meter/months):"); } FillPartsList(); FillPMList(); Security(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } //************************************** void CPMDlg::SetCriteria(CString strID) { ASSERT(!strID.IsEmpty()); m_strCriteria=strID; } //*************************************** void CPMDlg::FillPMList() { CString strData,strType,q; CString strIndex; long lData; m_cbPMList.Clear(); //are we doing this for a client or a model? if(m_bClientMode) strType="client"; else strType="model"; //select all schedule records for this //client or unit model q.Format("SELECT pmschedules.* FROM pmschedules " "WHERE (((pmschedules.%s)=%s)) " "ORDER BY pmschedules.description;",strType,m_strCriteria); rs->QueryReadOnly(q); if(rs->IsEmpty()) { m_bNoRecord=true; ClearFields(); return; } m_bNoRecord=false; rs->MoveFirst(); do { rs->FetchField("description",&strData); rs->FetchField("id",&lData); strIndex.Format("%u",lData); m_cbPMList.AddRow(strData,strIndex); }while(rs->MoveForward()); //pretend user has selected so that other fields get filled in if(m_strSelectedPM.IsEmpty()) //first time in { m_cbPMList.SetCurSel(0); m_strSelectedPM=m_cbPMList.GetCurrentRowID(); } else//something valid was selected before so stick with it m_cbPMList.Select(m_strSelectedPM); FillFields(); } //************************************* void CPMDlg::FillPartsList() { CString strData; CString strIndex; long lData; m_cbParts.Clear(); cbrs->QueryReadOnly("SELECT parts.id, [partnumber] & \" - \" " "& [description] AS name FROM parts " "ORDER BY parts.partnumber;"); if(cbrs->IsEmpty()) return; cbrs->MoveFirst(); do { cbrs->FetchField("name",&strData); cbrs->FetchField("id",&lData); strIndex.Format("%u",lData); m_cbParts.AddRow(strData,strIndex); }while(cbrs->MoveForward()); m_cbParts.SetCurSel(0); } //*********************************** void CPMDlg::OnBtndone() { CDialog::OnOK(); } //*********************************** void CPMDlg::OnBtnremovepart() { CString str,q; if(m_bNoRecord) return; int x = m_lbParts.SelectionCount(); if(x==0) return; //Loop through and delete each item for(int y=0;yExecute(q)) break; } FillRequiredPartsList(); } //check for and fill in required parts lb void CPMDlg::FillRequiredPartsList() { CString strData,q; CString strIndex; long lData; m_lbParts.Clear(); if(m_bNoRecord) return; q.Format("SELECT parts.id, \"Quantity: \" & [quantity] & \" of \" & [partnumber] & \" - (\" & [description] & \")\" AS name " "FROM pmparts LEFT JOIN parts ON pmparts.partnum = parts.id " "WHERE (((pmparts.pmlink)=%s));",m_strSelectedPM); cbrs->QueryReadOnly(q); if(cbrs->IsEmpty()) return; cbrs->MoveFirst(); do { cbrs->FetchField("name",&strData); cbrs->FetchField("id",&lData); strIndex.Format("%u",lData); m_lbParts.AddRow(strData,strIndex); }while(cbrs->MoveForward()); } //************************************************* void CPMDlg::OnBtnaddpart() { CString q,strData; float fData; if(m_bNoRecord) return; m_edQuantity.GetWindowText(strData); fData=(float)atof(strData); q.Format("SELECT pmparts.pmlink FROM pmparts " "WHERE (((pmparts.pmlink)=%s) AND ((pmparts.partnum)=%s));",m_strSelectedPM,m_cbParts.GetCurrentRowID()); cbrs->QueryReadOnly(q); if(!cbrs->IsEmpty())//trying to dupe...tsk tsk { AfxMessageBox("The same part can only be in the list once\r\n" "If you want to change the quantity on a part in the list\r\n" "You will need to delete it first and then re-add\r\n" "with the correct quantity"); return; } //take the value selected and insert it q.Format("INSERT INTO pmparts ( pmlink, partnum, quantity ) " "SELECT %s, %s, %f;",m_strSelectedPM,m_cbParts.GetCurrentRowID(),fData); cbrs->Execute(q); cbrs->Close(); FillRequiredPartsList(); } //************************************************** void CPMDlg::OnBtnadd() { CString strData,q; bool bData; float fData,fZero; long lData; COleDateTime dtData; fZero=0; if(!m_bAddMode) { //Go Add mode m_bAddMode=true; m_lblPart.ShowWindow(FALSE); m_lblPMList.ShowWindow(FALSE); m_cbPMList.ShowWindow(FALSE); m_lbParts.ShowWindow(FALSE); m_btnRemovePart.ShowWindow(FALSE); m_btnAddPart.ShowWindow(FALSE); m_cbParts.ShowWindow(FALSE); m_lblPartsList.ShowWindow(FALSE); m_lblQuantity.ShowWindow(FALSE); m_edQuantity.ShowWindow(FALSE); m_btnDone.ShowWindow(FALSE); m_btnAdd.SetWindowText("SAVE"); m_btnDelete.SetWindowText("CANCEL"); ClearFields(); } else { //Save and go edit mode //DESCRIPTION m_edDescription.GetWindowText(strData); if(strData.IsEmpty()) { AfxMessageBox("Description is required to proceed"); return; } if(!rs->AddNewRecord()) return; rs->UpdateField("description",&strData); //UNITBASED bData=m_bClientMode ? false : true; rs->UpdateField("unitbased",&bData); //CLIENT if(m_bClientMode) lData=atol(m_strCriteria); else lData=0; rs->UpdateField("client",&lData); //MODEL if(!m_bClientMode) lData=atol(m_strCriteria); else lData=0; rs->UpdateField("model",&lData); //AGEBASED bData=m_ckAge.GetCheck() ? true : false; rs->UpdateField("agebased",&bData); //AGEMONTHS / METER m_edMeterMonths.GetWindowText(strData); fData=(float)atof(strData); if(bData)//is age { rs->UpdateField("agemonths",&fData); rs->UpdateField("meter",&fZero); } else {//is metric rs->UpdateField("meter",&fData); rs->UpdateField("agemonths",&fZero); } //CYCLICAL bData=m_ckRepeat.GetCheck() ? true : false; rs->UpdateField("cyclical",&bData); //NOTES m_edNotes.GetWindowText(strData); rs->UpdateField("notes",&strData); //NEXTDATE m_dtNextService.GetTime(dtData); rs->UpdateField("nextdate",&dtData); //ACTIVE bData=m_ckActive.GetCheck() ? true : false; rs->UpdateField("active",&bData); //ADVANCE WARNING m_edAdvance.GetWindowText(strData); if(strData.IsEmpty()) strData="1"; lData=atol(strData); if(lData==0) lData=1; rs->UpdateField("advancewarning",&lData); //CREATOR FIELDS dtData=COleDateTime::GetCurrentTime(); rs->UpdateField("creator",&m_pApp->m_lusrID); rs->UpdateField("created",&dtData); rs->UpdateField("modifier",&m_pApp->m_lusrID); rs->UpdateField("modified",&dtData); if(!rs->SaveRecord()) return; m_bAddMode=false; m_cbPMList.ShowWindow(TRUE); m_lblPart.ShowWindow(TRUE); m_lblPMList.ShowWindow(TRUE); m_lbParts.ShowWindow(TRUE); m_btnRemovePart.ShowWindow(TRUE); m_btnAddPart.ShowWindow(TRUE); m_cbParts.ShowWindow(TRUE); m_lblPartsList.ShowWindow(TRUE); m_lblQuantity.ShowWindow(TRUE); m_edQuantity.ShowWindow(TRUE); m_btnDone.ShowWindow(TRUE); m_btnAdd.SetWindowText("Add"); m_btnDelete.SetWindowText("Delete"); FillPMList(); } } //*********************************************** void CPMDlg::OnBtndelete() { CString q; if(m_bAddMode) {//Cancel add mode m_bAddMode=false; m_lblPart.ShowWindow(TRUE); m_lblPMList.ShowWindow(TRUE); m_lbParts.ShowWindow(TRUE); m_btnRemovePart.ShowWindow(TRUE); m_btnAddPart.ShowWindow(TRUE); m_cbParts.ShowWindow(TRUE); m_lblPartsList.ShowWindow(TRUE); m_lblQuantity.ShowWindow(TRUE); m_edQuantity.ShowWindow(TRUE); m_cbPMList.ShowWindow(TRUE); m_btnDone.ShowWindow(TRUE); m_btnAdd.SetWindowText("Add"); m_btnDelete.SetWindowText("Delete"); FillPMList(); } if(m_bNoRecord) return; if(AfxMessageBox("Permanently delete this PM record?",MB_YESNO)!=IDYES) return; //delete PM entry q.Format("DELETE pmschedules.*, pmschedules.id FROM pmschedules " "WHERE (((pmschedules.id)=%s));",m_strSelectedPM); if(!rs->Execute(q)) return; //Delete parts list enty if any q.Format("DELETE pmparts.*, pmparts.pmlink FROM pmparts " "WHERE (((pmparts.pmlink)=%s));",m_strSelectedPM); rs->Execute(q); m_strSelectedPM.Empty(); FillPMList(); } //************************************************ void CPMDlg::OnCloseupCbparts() { //do nothing, nothing necessary in this case } //************************************************ void CPMDlg::OnCloseupCbpmlist() { m_strSelectedPM=m_cbPMList.GetCurrentRowID(); FillFields(); } //****************************************** void CPMDlg::OnCkactive() { SaveField(&m_ckActive,"active"); } //******************************** void CPMDlg::OnDatetimechangeDtnextservice(NMHDR* pNMHDR, LRESULT* pResult) { SaveField(&m_dtNextService,"nextdate"); *pResult = 0; } //************************************* void CPMDlg::OnKillfocusEddescription() { SaveField(&m_edDescription,"description",false); if(!m_bAddMode) FillPMList(); } //************************************* void CPMDlg::OnKillfocusEdmetermonths() { if(m_bAddMode || m_bNoRecord) return; CString strData; bool bData; float fData,fZero; fZero=0; bData=m_ckAge.GetCheck() ? true : false; //AGEMONTHS / METER m_edMeterMonths.GetWindowText(strData); fData=(float)atof(strData); if(bData)//is age { rs->UpdateField("agemonths",&fData); rs->UpdateField("meter",&fZero); } else {//is metric rs->UpdateField("meter",&fData); rs->UpdateField("agemonths",&fZero); } rs->SaveRecord(); UpdateModified(); } //***************************** void CPMDlg::OnKillfocusEdnotes() { SaveField(&m_edNotes,"notes",true); } //************************************ void CPMDlg::OnLblpart() { CPartsDlg d; if(d.DoModal()==IDOK) FillPartsList(); } //fill fields void CPMDlg::FillFields() { CString strData,q; COleDateTime dtData; bool bData; float fData; long lData; ClearFields(); q.Format("SELECT pmschedules.* FROM pmschedules " "WHERE (((pmschedules.id)=%s));",m_cbPMList.GetCurrentRowID()); rs->QueryReadOnly(q); if(rs->IsEmpty()) return; //DESCRIPTION rs->FetchField("description",&strData); m_edDescription.SetWindowText(strData); //AGEBASED rs->FetchField("agebased",&bData); m_ckAge.SetCheck(bData ? TRUE : FALSE); m_ckMeter.SetCheck(!m_ckAge.GetCheck()); //AGEMONTHS if(bData)//is age based rs->FetchField("agemonths",&fData); else//is metric rs->FetchField("meter",&fData); strData.Format("%1.2f",fData); m_edMeterMonths.SetWindowText(strData); //CYCLICAL rs->FetchField("cyclical",&bData); m_ckRepeat.SetCheck(bData ? TRUE : FALSE); m_ckOnceOnly.SetCheck(!m_ckRepeat.GetCheck()); //NOTES rs->FetchField("notes",&strData); m_edNotes.SetWindowText(strData); //NEXTDATE rs->FetchField("nextdate",&dtData); m_dtNextService.SetTime(dtData); //ACTIVE rs->FetchField("active",&bData); m_ckActive.SetCheck(bData ? TRUE : FALSE); //Autoworkorder rs->FetchField("autoworkorder",&bData); m_ckAutoWO.SetCheck(bData ? TRUE : FALSE); //advance warning rs->FetchField("advancewarning",&lData); strData.Format("%u",lData); m_edAdvance.SetWindowText(strData); FillRequiredPartsList(); } //************************************** void CPMDlg::OnCkage() { m_ckMeter.SetCheck(!m_ckAge.GetCheck()); SaveAgeMeterFields(); } //******************************************** void CPMDlg::OnCkmeter() { m_ckAge.SetCheck(!m_ckMeter.GetCheck()); SaveAgeMeterFields(); } //************************************ void CPMDlg::OnCkonceonly() { m_ckRepeat.SetCheck(!m_ckOnceOnly.GetCheck()); if(m_ckRepeat.GetCheck()==FALSE) m_edMeterMonths.SetWindowText("0"); SaveRepeatOnceOnlyFields(); } //********************************************* void CPMDlg::OnCkrepeat() { m_ckOnceOnly.SetCheck(!m_ckRepeat.GetCheck()); SaveRepeatOnceOnlyFields(); } //********************************************** void CPMDlg::OnCkautowo() { SaveField(&m_ckAutoWO,"autoworkorder"); } //************************************************ //UPDATE MODIFIED DATA //************************************************* bool CPMDlg::UpdateModified() { //updates modified by and modified on fields rs->UpdateField("modifier",&m_pApp->m_lusrID); COleDateTime dtData; dtData=COleDateTime::GetCurrentTime(); rs->UpdateField("modified",&dtData); rs->SaveRecord(); return true; } //************************************ void CPMDlg::ClearFields() { m_edNotes.SetWindowText(""); m_edQuantity.SetWindowText(""); m_edMeterMonths.SetWindowText(""); m_edDescription.SetWindowText(""); m_dtNextService.SetTime(COleDateTime::GetCurrentTime()); m_ckRepeat.SetCheck(TRUE); m_ckOnceOnly.SetCheck(FALSE); m_ckMeter.SetCheck(FALSE); m_ckAge.SetCheck(TRUE); m_ckActive.SetCheck(TRUE); m_lbParts.Clear(); } //************************************************************ //SAVE EDIT CONTROL FIELD //************************************************************ bool CPMDlg::SaveField(CEdit *edControl,CString fldname,bool AllowEmpty) { if(m_bAddMode || m_bNoRecord) 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; } } rs->UpdateField(fldname,&str); rs->SaveRecord(); UpdateModified(); return true; } //************************************************************ //SAVE GZCOMBO CONTROL FIELD //************************************************************ bool CPMDlg::SaveField(CgzCombo *cbControl,CString fldname) { if(m_bAddMode || m_bNoRecord) 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); rs->UpdateField(fldname,&lData); rs->SaveRecord(); UpdateModified(); return true; } //************************************************************ //SAVE CheckBox CONTROL FIELD //************************************************************ bool CPMDlg::SaveField(CButton *ckControl,CString fldname) { if(m_bAddMode || m_bNoRecord) return true;//dont attempt to update bool bData=false; BOOL BData; BData=ckControl->GetCheck(); if(BData==TRUE) bData=true; rs->UpdateField(fldname,&bData); rs->SaveRecord(); UpdateModified(); return true; } //************************************************************ //SAVE DateTimePicker CONTROL FIELD //************************************************************ bool CPMDlg::SaveField(CDateTimeCtrl *dtControl,CString fldname) { if(m_bAddMode || m_bNoRecord) return true;//dont attempt to update COleDateTime dtData; dtControl->GetTime(dtData); rs->UpdateField(fldname,&dtData); rs->SaveRecord(); UpdateModified(); return true; } //************************************** void CPMDlg::SaveAgeMeterFields() { bool bData; if(m_bAddMode || m_bNoRecord) return; bData=m_ckAge.GetCheck() ? true : false; rs->UpdateField("agebased",&bData); rs->SaveRecord(); UpdateModified(); } //************************************* void CPMDlg::SaveRepeatOnceOnlyFields() { bool bData; if(m_bAddMode || m_bNoRecord) return; bData=m_ckRepeat.GetCheck() ? true : false; rs->UpdateField("cyclical",&bData); rs->SaveRecord(); UpdateModified(); } void CPMDlg::OnKillfocusEdadvance() { //ADVANCE WARNING if(m_bAddMode || m_bNoRecord) return; CString strData; long lData; m_edAdvance.GetWindowText(strData); if(strData.IsEmpty()) strData="1"; lData=atol(strData); if(lData==0) lData=1; strData.Format("%u",lData); m_edAdvance.SetWindowText(strData); rs->UpdateField("advancewarning",&lData); rs->SaveRecord(); UpdateModified(); } void CPMDlg::Security() { //m_bReadOnly=false; int x=m_pApp->Allowed(RPM,true); if(x==0)//no access allowed { m_pApp->SecurityWarning(); CDialog::OnCancel(); } if(x==2)//read only { // m_bReadOnly=true; m_btnAdd.ShowWindow(FALSE); m_btnDelete.ShowWindow(FALSE); m_btnAddPart.ShowWindow(FALSE); m_btnRemovePart.ShowWindow(FALSE); m_cbParts.EnableWindow(FALSE); m_ckActive.EnableWindow(FALSE); m_ckAge.EnableWindow(FALSE); m_ckMeter.EnableWindow(FALSE); m_ckOnceOnly.EnableWindow(FALSE); m_ckRepeat.EnableWindow(FALSE); m_dtNextService.EnableWindow(FALSE); m_edAdvance.SetReadOnly(TRUE); m_edDescription.SetReadOnly(TRUE); m_edMeterMonths.SetReadOnly(TRUE); m_edNotes.SetReadOnly(TRUE); m_edQuantity.SetReadOnly(TRUE); } }