953 lines
22 KiB
C++
953 lines
22 KiB
C++
// 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;y<x;y++)
|
|
{
|
|
q.Format("DELETE pmparts.*, pmparts.pmlink, pmparts.partnum FROM pmparts "
|
|
"WHERE (((pmparts.pmlink)=%s) AND ((pmparts.partnum)=%s));",m_strSelectedPM,m_lbParts.GetSelectedItem(y));
|
|
|
|
if(!rs->Execute(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);
|
|
|
|
}
|
|
}
|