Maintenance Module E9.05.701 -- PM Planning Jobs

Hello all;

We have just implemented the Maintenance Module after a year plus of testing / customizing and trying to get a good working environmental fit for our company.
We are one week into it and have discovered that a new Preventative maintenance job will not be generated until the previous job has been completed / closed.
What our maintenance team would like to see is a new Preventative maintenance job generated every Monday for certain pieces of equipment… Has anyone out there ever set anything up like this or have a suggestion as to how we could accomplish this?

Any feedback is appreciated.
Thanks much!
Carol

We are planning on tackling the maintenance module one of these years…
Looks like we need to be friends :grinning: lol

Hi Carol,

We don’t use the maintenance module but I attended a central pa user group meeting the other week where its use was discussed. It is my understanding that a process is run in the background to generate jobs. Are you running the process? Here are my notes from the presentation, in case it is at all helpful; It was presented by Mercer Sisson, past president of the Epicor users group (eug). Here are my notes from his presentation, in case they may be helpful:

Preventive Maintenance – we don’t currently have this
Mercer ties the PM to the labor hours used against that resource
Can trigger machine maintenance requirements
Whenever going to do maint it generates a maintenance job
If want to accumulate times based on clockins have to link resource / resource groups to equipment
Need to do initial setup of equipment type, status and location
Mercer made equipment types that correlated with resource groups
Then added others such as hvac, tooling, misc production, misc nonprod, etc.
Status setup (i.e., inactive, offline, etc.) does nothing for the calendar / resource
Bug don’t get labor entry to kick of pm job, mercer did bpm
Process runs in background is it time to create a new pm job?
Equip maint Labor Interface option (this is where mercer bpm goes I think) bug in 9, in10??
Equipm maint, can setup maintenance plan
Theres a maint log in the equipment tracker that shows all jobs related to the equipment
Could create a maintenance materials warehouse
Can do job template for the maint job, could have one template, “fix it” maint guy could add matls
In e10 can filter on maint jobs too in dialog
Maint job entry, allows you to input the meter reading
Topics: is it regular maintenance, etc.
If the maint process is run based on calendar and not meter reading, it works without bpm

Nancy

Will be totally happy to help when you decide to tackle it. We have faced many challenges and have more to come I am sure!

Thanks Nancy for the input. The BPM sounds interesting … I am going to check into that a little further and see if I can get something to work.
They are currently using the calendar and have the plan set to trigger every 7 days, however, if the previous week’s job has not been marked as complete the processor does not generate a new job.

Thanks again …

Carol

Hi Carol,

Is the work scope the same every week?
Not sure why they would need/want another job, if last week’s wasn’t completed/closed.
If the work scope differs, you could use multiple maintenance plans with the appropriate frequency on each.
We are paperless with the Maintenance jobs. We have created an updateable dashboard where they can see what is still open, indicate they are working on something (we are not using MES to collect labor) and then close the jobs when they have completed the work.
We have the Maintenance Plan Processor run every Sunday evening and most plans have a 6 or 7 day trigger.
That way the dashboard only shows a weeks worth of new PMs, plus any past due outstanding ones and any open repair request jobs.
Not sure if that helps or not, but thought I would share.

Good luck,
Jean

Jean,

Thanks for the input. I have passed this information on to the maintenance team to review and hopefully some of the suggestions you have provided will bring about a resolution.
I have a question about the updateable dashboard-- how do they indicate in the dashboard whether or not they are working on the job? Is it an area where they can put in comments?
Thanks again!
Carol

Carol,
We use JobHead.ShortChar02 to indicate which Maintenance employee picked up the job, JobHead.CommentText for any comments and JobHead.JobHeld to indicate if the job is on hold.
We are employing a few BPMs to make it all work for us.
For example, we have a BPM to automatically fill in Resolution Topic data from Issue Topic data as we are using very basic Topics (PM or Repair) at this time.
We also have BPMs sending emails when a repair request is entered, approved/rejected, completed.
We are on 9.05.702a and the maintenance department seems to be happy with the solution.

Jean,

Thanks … the email sounds like a great idea, however, they had requested that I build an updateable dashboard that allows them to bring up all the requests, they can highlight the rows/requests they want to approve and click an Approve button or reject, rather than view each request individually.
On the 2nd tab they can view the jobs they approved and Engineer and Release them all at once. I don’t know how I could tie a BPM to the dashboard. I am sure it would all be custom code in the BPM (and I am not that savvy with the ABL code) Perhaps when we get to E10 I can attempt it.

I may borrow some of your ideas though…. Thanks again.
Carol

i built a dashboard exactly like that, called it sort of a maintenance management console, it emulated job status maintenance, they could approve requests, release jobs, close jobs, assign jobs see everyone’s queue…it was a bit of a beast to build but it streamlined their process and made the task of navigating 5 different forms down to one, they’ll love you for it if you make the effort.

Rob,

I did actually build one for them, and yes you are right, it was a beast and took some time, but they love it. They can sort the requests by department, each maintenance supervisor can look at their department’s requests, make sure there are no duplicates and approve all at one time. They can then engineer and release them all with the click of a button. A great time saver for them!
I just added another tab, at their request, that lists all released / open jobs that they can sort by department so that the supervisor can further break down by request date, etc. (this is where I thought it would be nice if they could just add comments right in the dashboard… which I think they can if I make that an updateable field in the BAQ and in the dashboard.) this would eliminate the need for putting in the “resolution” (Job Comment Text) at the completion of the job.

As we get going, I am sure we will find more ways to streamline…. All suggestions are good!!

Thanks
Carol

1 Like

i hung all that job closing stuff on the end activity form they use in MES, as well as let them enter meter readings etc… even close the job. If MES detects they are ending a maintenance job it changes the look of the form for this purpose so everyone else doesn’t have to look at their mess…

Rob,

That sounds wonderful! Would you mind sharing how you did that. The best work around I came up with was adding a button to the End Activity which will open the Maint Job Entry and they can enter their resolution and topic which are required fields and they complete the job there (custom button).
I have not been able to set read only for the “Job Comment text” to false. It reverts back to true, no matter what I have tried.

We are actually have someone review to ensure that all material are issued and then closing the jobs once again on an updateable custom dashboard. The custom “complete job” brings all of the jobs maintenance personnel have checked and the allow a certain time frame to elapse before closing the job.

Still doing tweaks here and there … trying to get the best performance for the team

i can share some of it yes, I’ll try and get something on here this week…

That would be great Rob … thanks much!!

Carol

@cpelowski, sorry for the delay, been slammed here. There is a lot of code here and much of it was written when i was much greener, so there’s much that could be improved, but it works and who has the time? Anyhow this should give you an idea of one way you can dynamically change the way the End Activity form can look based on the TYPE of activity it is closing (Production, Setup, Indirent, Maitenance, etc, etc) the out of the box solution is a disaster in my opinion, but business needs vary much so who knows. Any questions just ping me. Also, and i can’t recall at the moment, i probably am using Service Connect called work flows from BPM’s for some things as well. You’ll have to dig through it and look (#thepriceoffreecode)

using System;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Windows.Forms;
using Erp.UI;
using Ice.Lib.Customization;
using Ice.Lib.ExtendedProps;
using Ice.Lib.Framework;
using Ice.Lib.Searches;
using Ice.UI.FormFunctions;
using System.Reflection;
using Erp.BO;
using Erp.Adapters;

public class Script
{
	// ** Wizard Insert Location - Do Not Remove 'Begin/End Wizard Added Module Level Variables' Comments! **
	// Begin Wizard Added Module Level Variables **

	private EpiDataView edvEnd;
	private Ice.Proxy.Lib.BOReaderImpl _bor;
	// End Wizard Added Module Level Variables **

	// Add Custom Module Level Variables Here **

	public void InitializeCustomCode()
	{
		// ** Wizard Insert Location - Do not delete 'Begin/End Wizard Added Variable Initialization' lines **
		// Begin Wizard Added Variable Initialization

		this.edvEnd = ((EpiDataView)(this.oTrans.EpiDataViews["End"]));
		this.edvEnd.EpiViewNotification += new EpiViewNotification(this.edvEnd_EpiViewNotification);
		_bor = WCFServiceSupport.CreateImpl<Ice.Proxy.Lib.BOReaderImpl>((Ice.Core.Session)oTrans.Session, Epicor.ServiceModel.Channels.ImplBase<Ice.Contracts.BOReaderSvcContract>.UriPath);
		// End Wizard Added Variable Initialization

		// Begin Wizard Added Custom Method Calls

		this.btnOK_c.Click += new System.EventHandler(this.btnOK_c_Click);
		// End Wizard Added Custom Method Calls
	}

	public void DestroyCustomCode()
	{
		// ** Wizard Insert Location - Do not delete 'Begin/End Wizard Added Object Disposal' lines **
		// Begin Wizard Added Object Disposal

		this.edvEnd.EpiViewNotification -= new EpiViewNotification(this.edvEnd_EpiViewNotification);
		this.edvEnd = null;
		this.btnOK_c.Click -= new System.EventHandler(this.btnOK_c_Click);
		// End Wizard Added Object Disposal

		// Begin Custom Code Disposal

		// End Custom Code Disposal
	}

	private void EndActForm_Load(object sender, EventArgs args)
	{
		EpiNumericEditor nbrCurrent = default(EpiNumericEditor);		
		nbrCurrent = (EpiNumericEditor)csm.GetNativeControlReference("f1fdcf24-066d-424e-9b59-319a804854fa");
		nbrCurrent.Select();
	}

	private void edvEnd_EpiViewNotification(EpiDataView view, EpiNotifyArgs args)
	{
		// ** Argument Properties and Uses **
		// view.dataView[args.Row]["FieldName"]
		// args.Row, args.Column, args.Sender, args.NotifyType
		// NotifyType.Initialize, NotifyType.AddRow, NotifyType.DeleteRow, NotifyType.InitLastView, NotifyType.InitAndResetTreeNodes
		EpiNumericEditor nbrSetupComplete = default(EpiNumericEditor);
		nbrSetupComplete = (EpiNumericEditor)csm.GetNativeControlReference("31799c26-7331-45b0-a723-9cc464175117");
		EpiNumericEditor nbrCurrent = default(EpiNumericEditor);		
		nbrCurrent = (EpiNumericEditor)csm.GetNativeControlReference("f1fdcf24-066d-424e-9b59-319a804854fa");
		EpiLabel lblQty = default(EpiLabel);
		lblQty = (EpiLabel)csm.GetNativeControlReference("53d41874-cf29-4443-bb36-11e815fd39b8");
		EpiLabel lblComplete = default(EpiLabel);
		lblComplete = (EpiLabel)csm.GetNativeControlReference("55820b74-2163-40f4-a07b-1923db92789d");
		EpiCheckBox chkComplete = default(EpiCheckBox);
		chkComplete = (EpiCheckBox)csm.GetNativeControlReference("6456654a-e39c-486b-bfdb-7a4cc16fe4ec");
		EpiLabel lblRequest = default(EpiLabel);
		lblRequest = (EpiLabel)csm.GetNativeControlReference("01afa84f-db71-4d05-8b42-a5bf71364846");
		EpiCheckBox chkRequest = default(EpiCheckBox);
		chkRequest = (EpiCheckBox)csm.GetNativeControlReference("4626a6f0-1447-4643-80ba-fe4a07b36d45");
		EpiLabel lblSetupComplete = default(EpiLabel);        
		lblSetupComplete = (EpiLabel)csm.GetNativeControlReference("36ce8184-b5ef-49de-a726-203cb1f4e6ca");
		EpiButton btnTag = default(EpiButton); 
		btnTag = (EpiButton)csm.GetNativeControlReference("3ef505d1-a726-441b-9587-ccae4bf27426");
		EpiButton btnOK = default(EpiButton);
		btnOK = (EpiButton)csm.GetNativeControlReference("025fc115-fee3-4973-946e-ba209189d62e");
		EpiButton btnInspData = default(EpiButton);
		btnInspData = (EpiButton)csm.GetNativeControlReference("f1f42268-64b7-46e8-914e-0f29042aed45");
		BAQCombo bcomboTopic = default(BAQCombo);
		bcomboTopic = (BAQCombo)csm.GetNativeControlReference("c255dcbd-6bc4-411f-87cd-693b073e6cef");
		if ((args.NotifyType == EpiTransaction.NotifyType.Initialize))
		{
			if ((args.Row > -1))
			{
				if ((Convert.ToString(edvEnd.dataView[args.Row]["LaborType"]) == "I")) 
				{
					chkRequest.Visible = false;
					chkRequest.Enabled = false;
					lblQty.Width = 0;
					nbrCurrent.Width = 0;
					lblSetupComplete.Width = 0;
					nbrSetupComplete.Width = 0;
					chkComplete.Visible = false;
					chkComplete.Enabled = false;
					lblComplete.Width = 0;
					chkComplete.Width = 0;
					txtLaborNotes.Visible = true;
					txtLaborNotes.Enabled = true;
					txtLaborNotes.TabIndex = 1;
					txtLaborNotes.Focus();
					lblLaborNotes.Enabled = true;
					lblLaborNotes.Visible = true;
					lblLaborNotes.Text = "Indirect Code:";
					lblLaborNotes.Left = 90;
					lblLaborNotes.Top = 44;
					edvEnd.dataView[edvEnd.Row]["ShortChar02"] = txtLaborNotes.Value;
					txtLaborNotes.Left = 196;
					txtLaborNotes.Top = 44;
					btnInspData.Visible = false;
					btnTag.EpiBinding = "";
					btnTag.Enabled = false;
					btnTag.Visible = false;
					chkJobClose.Visible = false;
					chkJobClose.Enabled = false;
					lblJobClose.Visible = false;
					lblJobClose.Enabled = false;
					bcomboTopic.Visible = false;
					bcomboTopic.Enabled = false;
					lblTopic.Visible = false;
					lblTopic.Enabled = false;
						if (txtLaborNotes.Value == null) 
						{
							edvEnd.dataView[edvEnd.Row]["ShortChar02"] = "";
							intMeter.Visible = false;
							intMeter.Enabled = false;
							lblMeter.Visible = false;
							lblMeter.Enabled = false;
						}
				} 
				else if ((Convert.ToString(edvEnd.dataView[args.Row]["LaborType"]) == "S") & (Convert.ToString(edvEnd.dataView[args.Row]["JobType"]) == "Manufacture")) 
				{
					//msgbox (edvend.dataview(args.row)("labortype"))
					nbrCurrent.Width = 0;
					nbrSetupComplete.Focus();
					nbrSetupComplete.TabIndex = 1;
					nbrCurrent.TabIndex = 900;
					lblQty.Visible = false;
					nbrCurrent.Enabled = false;
					nbrCurrent.Visible = false;
					lblComplete.Visible = false;
					chkComplete.Visible = false;
					lblRequest.Visible = false;
					chkRequest.Visible = false;
					btnTag.EpiBinding = "";
					btnTag.Enabled = false;
					btnTag.Visible = false;					
					txtLaborNotes.Visible = false;
					txtLaborNotes.Enabled = false;
					lblLaborNotes.Enabled = false;
					lblLaborNotes.Visible = false;
					chkJobClose.Visible = false;
					chkJobClose.Enabled = false;
					lblJobClose.Visible = false;
					lblJobClose.Enabled = false;
					bcomboTopic.Visible = false;
					bcomboTopic.Enabled = false;
					lblTopic.Visible = false;
					lblTopic.Enabled = false;
					intMeter.Visible = false;
					intMeter.Enabled = false;
					lblMeter.Visible = false;
					lblMeter.Enabled = false;
				} 
				else if ((Convert.ToString(edvEnd.dataView[args.Row]["LaborType"]) == "P") & (Convert.ToString(edvEnd.dataView[args.Row]["JobType"]) != "Maintenance")) 
				{
					//msgbox (edvend.dataview(args.row)("labortype"))
					nbrCurrent.Focus();
					btnTag.Refresh();
					lblSetupComplete.Width = 0;
					lblSetupComplete.Enabled = false;
					lblSetupComplete.Visible = false;
					nbrSetupComplete.Visible = false;
					nbrSetupComplete.Width = 0;
					txtLaborNotes.Visible = false;
					txtLaborNotes.Enabled = false;
					lblLaborNotes.Visible = false;
					lblLaborNotes.Enabled = false;
					btnTag.Visible = true;
					btnTag.Enabled = true;
					btnTag.TabIndex = 2;
					btnOK.Height = 0;
					btnOK.Width = 0;
					//btnOK.Visible = false;
					chkJobClose.Visible = false;
					chkJobClose.Enabled = false;
					lblJobClose.Visible = false;
					lblJobClose.Enabled = false;
					bcomboTopic.Visible = false;
					bcomboTopic.Enabled = false;
					lblTopic.Visible = false;
					lblTopic.Enabled = false;
					intMeter.Visible = false;
					intMeter.Enabled = false;
					lblMeter.Visible = false;
					lblMeter.Enabled = false;
				} 
				else if ((Convert.ToString(edvEnd.dataView[args.Row]["LaborType"]) == "S") & (Convert.ToString(edvEnd.dataView[args.Row]["JobType"]) == "Maintenance")) 
				{
					txtLaborNotes.Top = 14;
					txtLaborNotes.Left = 320;
					txtLaborNotes.Width = 320;
					txtLaborNotes.Height = 110;
					txtLaborNotes.Visible = true;
					txtLaborNotes.Enabled = true;
					btnTag.Refresh();
					lblSetupComplete.Width = 0;
					lblSetupComplete.Enabled = false;
					lblSetupComplete.Visible = false;
					nbrSetupComplete.Visible = false;
					nbrSetupComplete.Width = 0;
					btnTag.Visible = true;
					btnTag.Enabled = true;
					btnTag.TabIndex = 2;
					btnTag.EpiBinding = "";
					btnTag.Enabled = false;
					btnTag.Visible = false;
					nbrCurrent.Top = 130;
					nbrCurrent.Left = 540;
					chkJobClose.Visible = true;
					chkJobClose.Enabled = true;
					lblJobClose.Visible = true;
					lblJobClose.Enabled = true;
					bcomboTopic.Visible = true;
					bcomboTopic.Enabled = true;
					bcomboTopic.Left = 135;
					bcomboTopic.Top = 40;
					lblTopic.Visible = true;
					lblTopic.Enabled = true;
					lblLaborNotes.Visible = true;
					lblLaborNotes.Enabled = true;
					lblLaborNotes.Left = 215;
					lblLaborNotes.Top = 15;
					intMeter.Visible = true;
					intMeter.Enabled = true;
					intMeter.Left = 295;
					intMeter.Top = 132;
					lblMeter.Visible = true;
					lblMeter.Enabled = true;
				}
			}
		}		
	}

	private void btnOK_c_Click(object sender, System.EventArgs args)
	{
		// ** Place Event Handling Code Here **
		EpiNumericEditor intQty = (EpiNumericEditor)csm.GetNativeControlReference("f1fdcf24-066d-424e-9b59-319a804854fa");
		EpiNumericEditor intSetup = (EpiNumericEditor)csm.GetNativeControlReference("31799c26-7331-45b0-a723-9cc464175117");		
		if (edvEnd.dataView[edvEnd.Row]["LaborType"].ToString() == "P" & (Convert.ToString(edvEnd.dataView[edvEnd.Row]["JobType"]) == "Manufacture")) 
		{
			string strJobNum = edvEnd.dataView[edvEnd.Row]["JobNum"].ToString();
			string intAssy = edvEnd.dataView[edvEnd.Row]["AssemblySeq"].ToString();
			string intOprSeq = edvEnd.dataView[edvEnd.Row]["OprSeq"].ToString();
			string whereclause = "JobNum = '" + strJobNum + "' and" + " AssemblySeq = " + intAssy + " and OprSeq = " + intOprSeq;
			//MessageBox.Show(whereclause);
	        DataSet dsJobOper = _bor.GetRows("Erp:BO:JobOperSearch", "JobNum = '" + strJobNum + "' and" + " AssemblySeq = " + intAssy + " and OprSeq = " + intOprSeq, "RunQty, QtyCompleted");
	        if (dsJobOper.Tables[0].Rows.Count > 0)
	        {	
				int intRemaining = Convert.ToInt32(dsJobOper.Tables[0].Rows[0]["RunQty"]) - Convert.ToInt32(dsJobOper.Tables[0].Rows[0]["QtyCompleted"]);
				int intRunQty = Convert.ToInt32(dsJobOper.Tables[0].Rows[0]["RunQty"]);
				int intComplete = Convert.ToInt32(dsJobOper.Tables[0].Rows[0]["QtyCompleted"]);
				if (Convert.ToInt32(dsJobOper.Tables[0].Rows[0]["QtyCompleted"]) + Convert.ToInt32(intQty.Value) <= Convert.ToInt32(dsJobOper.Tables[0].Rows[0]["RunQty"]))
				{
					//MessageBox.Show(dsJobOper.Tables[0].Rows[0]["QtyCompleted"].ToString());
					EpiButton btnOK = (EpiButton)csm.GetNativeControlReference("025fc115-fee3-4973-946e-ba209189d62e");
					btnOK.PerformClick();
				}
				else
				{
					MessageBox.Show("You attempted to claim " + Convert.ToString(intQty.Value) + " Parts.  There have been " + Convert.ToString(intComplete) 
						+ " parts previously completed already.  You can only claim up to " + Convert.ToString(intRemaining) 
						+ " parts.  The total required quantity for this operation is " + intRunQty.ToString() + ".");
					intQty.Value = 0;
					intQty.Focus();	
				}			
			}
		}
		else if ((Convert.ToString(edvEnd.dataView[edvEnd.Row]["LaborType"]) == "S") & (Convert.ToString(edvEnd.dataView[edvEnd.Row]["JobType"]) == "Manufacture")) 
		{
			string strJobNum = edvEnd.dataView[edvEnd.Row]["JobNum"].ToString();
			string intAssy = edvEnd.dataView[edvEnd.Row]["AssemblySeq"].ToString();
			string intOprSeq = edvEnd.dataView[edvEnd.Row]["OprSeq"].ToString();
	        DataSet dsJobOperS = _bor.GetRows("Erp:BO:JobOperSearch", "JobNum = '" + strJobNum + "' and" + " AssemblySeq = " + intAssy + " and OprSeq = " + intOprSeq, "SetupPctComplete");
	        if (dsJobOperS.Tables[0].Rows.Count > 0)
	        {	
				int intSetupRemaining = 100 - Convert.ToInt32(dsJobOperS.Tables[0].Rows[0]["SetupPctComplete"]);
				//MessageBox.Show(dsJobOperS.Tables[0].Rows[0]["SetupPctComplete"].ToString() + " / " + intSetupRemaining.ToString());
				if (Convert.ToInt32(intSetup.Value) >= Convert.ToInt32(dsJobOperS.Tables[0].Rows[0]["SetupPctComplete"]))
				{
					//MessageBox.Show(dsJobOper.Tables[0].Rows[0]["QtyCompleted"].ToString());
					EpiButton btnOK = (EpiButton)csm.GetNativeControlReference("025fc115-fee3-4973-946e-ba209189d62e");
					btnOK.PerformClick();
				}
				else
				{
					MessageBox.Show("You attempted to claim " + Convert.ToInt32(intSetup.Value) + "% against this setup.  This setup was previously claimed as " + Convert.ToInt32(dsJobOperS.Tables[0].Rows[0]["SetupPctComplete"]) + "% complete.  You must claim more than the previous value reported.");
					intSetup.Value = 0;
					intSetup.Focus();	
				}		
			}
		}
		else if ((Convert.ToString(edvEnd.dataView[edvEnd.Row]["LaborType"]) == "I")) 
		{
			EpiButton btnOK = (EpiButton)csm.GetNativeControlReference("025fc115-fee3-4973-946e-ba209189d62e");
			btnOK.PerformClick();
		}
		else if ((Convert.ToString(edvEnd.dataView[edvEnd.Row]["LaborType"]) == "S") & (Convert.ToString(edvEnd.dataView[edvEnd.Row]["JobType"]) == "Maintenance"))
		{
			if (Convert.ToInt32(intQty.Value) <= 1)
			{
                EpiButton btnOK = (EpiButton)csm.GetNativeControlReference("025fc115-fee3-4973-946e-ba209189d62e");
                if (!(bool)edvEnd.dataView[edvEnd.Row]["CheckBox01"])
                {
                    btnOK.PerformClick();
                }
                if ((bool)edvEnd.dataView[edvEnd.Row]["CheckBox01"] && (decimal)intQty.Value == 1)
                {
                    btnOK.PerformClick();
                    claimMaintJobCmplt();
                }
                if ((bool)edvEnd.dataView[edvEnd.Row]["CheckBox01"] && (decimal)intQty.Value == 0)
                {
                    MessageBox.Show("You must claim Qty of 1 to complete the operation in order to make the job elibible for closing");
                    return;
                }
			}
			else
			{
				MessageBox.Show("You can only claim 0 or 1 for Maintenance Operations.");
				intQty.Value = 0;
				intQty.Focus();		
			}
		}
	}

    private void claimMaintJobCmplt()
    {
        int meter = Convert.ToInt32(edvEnd.dataView[edvEnd.Row]["Number03"]);
        string resolution = edvEnd.dataView[edvEnd.Row]["ShortChar02"].ToString();
        string laborNote = edvEnd.dataView[edvEnd.Row]["LaborNote"].ToString();
        string jobNum = edvEnd.dataView[edvEnd.Row]["JobNum"].ToString();
        string whereClause = edvEnd.dataView[edvEnd.Row]["JobNum"].ToString();
        JobEntryAdapter adpJobEntry = new JobEntryAdapter(oTrans);
        adpJobEntry.BOConnect();
        JobEntryDataSet jeds;
        adpJobEntry.GetByID(whereClause);
        jeds = adpJobEntry.JobEntryData;
        jeds.JobHead[0].ResTopicID1 = resolution;
        jeds.JobHead[0].CommentText = laborNote;
        jeds.JobHead[0].NewMeter = meter;
        jeds.JobHead[0].JobClosed = true;
        jeds.JobHead[0].RowMod = "U";
        adpJobEntry.Update();
        recordMeter();
    }

    private void recordMeter()
    {

    }

Rob,

Thanks, I totally understand. I will dig into it (definitely worth the price).
We are testing everything out in one department to start. So far things have been going fairly smooth … of course just because I said that all “H—“ will break loose.
Anyway, thanks again!!

Carol

Hello,
I created a PM plan which should generate a new maintenance job every 2 days based on the ‘template job’ I created with resources and operations.
but it is not generating new maintenance jobs.
I also cannot check the preventative check box when creating PM jobs in job entry.
Any help would be appreciated. thankyou.