EAM PM Schedule Upload

Description

EAM PM Schedule Upload creates and updates Oracle EAM preventive-maintenance schedule definitions from Excel – the PM header plus its activity group and scheduling rules (Day Interval, Runtime Meter, List Date) and optional last-service readings – via the standard Oracle EAM public API. Uploading defines the schedules; the work orders themselves are generated by a separate concurrent program.

When to use it

  • Mass-create new preventive-maintenance schedules for many assets/activities instead of entering them one at a time.
  • Roll out a standard maintenance regime (same activity + rule pattern) across a fleet of assets.
  • Bulk-edit header attributes (work-order status, lead time, effective dates, rescheduling behaviour) on existing PM schedules.
  • Bulk-load Day Interval, Runtime Meter or List Date scheduling rules.
  • Seed last-service readings so the next due date calculates correctly.
  • After every upload, run the EAM Generate PM Work Orders concurrent program to generate the actual work orders.

Before you start

  • Blitz Report is installed and you are signed in to a responsibility with access to an EAM-enabled inventory organization.
  • The asset exists as a maintainable asset, and the activity is already associated with that asset.
  • For meter rules / last-service rows, the meter (counter) exists for that asset and is flagged for use in scheduling.

Step 1 – Choose a mode, set the parameters and download

In Blitz Report, open EAM PM Schedule Upload, choose an Upload Mode (Create for an empty template, or Create, Update to download existing schedules to edit), and set the parameters:

ParameterPurpose
Upload ModeCreate or Create, Update. Default is Create.
OrganizationThe EAM-enabled inventory organization.
Update Activities / Update Rules / Update Last ServiceIn Create, Update mode, choose which child sections to include in the download.

Run the upload to download and open the Excel file. Each schedule is automatically handled as a create or an update depending on whether it already exists.

Step 2 – Enter the schedules

Use one row per piece; repeat the Organization Code + Schedule Name + Asset + Activity on each row of the same schedule. On the header enter the Asset Number, Activity, Set Name, Schedule Type, effective dates and Work Order Status. Add activity-group rows and scheduling rule rows (day interval, runtime meter, or list date) as needed.

Step 3 – Validate and Save

Click Validate and Save. This checks for missing required values and runs the upload’s validation, then saves the file. Correct anything it flags before continuing.

Step 4 – Upload and view the result

Back in Blitz Report, click Upload and select your saved file. This submits the Blitz Upload request, which creates or updates each PM schedule. When it finishes, a result report opens showing each row as success or error.

Step 5 – Generate the work orders

Uploading only defines the schedules. To generate the actual maintenance work orders, schedule or run the EAM Generate PM Work Orders concurrent program.

What’s produced

  • Created and updated preventive-maintenance schedule definitions with their activities and rules.
  • A result report listing every row with a status (success or error) and a message.

Common questions

I uploaded a PM schedule but no work orders appeared. Why?
That’s expected. Uploading only defines the schedule. Run the EAM Generate PM Work Orders concurrent program to generate the work orders.

Can I delete a PM schedule with this upload?
No – it only creates and updates PM schedules.

If I update a schedule and only change the header, will my existing rules be lost?
No. When you don’t supply rule/activity rows on an update, the upload re-applies the schedule’s existing rules. But if you do supply rules, the update replaces the whole rule set with what you provide – include every rule you want to keep.

I entered a new Set Name and it was created automatically – is that right?
Yes. If the Set Name you type doesn’t already exist, the upload creates it. Reference an existing Set Name to avoid creating a new one.

My Activity isn’t in the dropdown for the asset I picked.
The activity must already be associated with that asset. Create the association first in EAM, then re-download the template.

Troubleshooting

MessageCauseWhat to do
Organization is not accessible or is not EAM enabledThe org isn’t granted to your responsibility or isn’t an EAM organization.Run under a responsibility with access to an EAM-enabled org.
Activity is not associated with the selected assetThe activity has no active association to that asset.Create the asset-activity association in EAM first, then re-download.
At least one Date Rule or Meter Rule is required for Rule Based PM schedulesA Rule Based schedule has no scheduling rule rows.Add at least one Day Interval or Runtime Meter rule row.
Base Date / Base Reading is requiredThe rescheduling point needs a base value you didn’t supply.Fill Base Date (for Base Date) or Base Reading (for Base Meter Reading).
Create / Update PM schedule failed (Oracle message)The Oracle EAM API rejected the data.Read the appended EAM message, correct the offending field and re-upload.
with q_base as (
select
eps.pm_schedule_id,
mp.organization_code,
mp.organization_id,
eps.name schedule_name,
xxen_util.meaning(to_char(nvl(msibk_asset.eam_item_type,msibk_group.eam_item_type)),'MTL_EAM_ASSET_TYPE',700) asset_type,
case when eps.maintenance_object_type=3 then cii.instance_number end asset_number,
nvl(msibk_asset.concatenated_segments,msibk_group.concatenated_segments) asset_group,
nvl(msibk_asset.inventory_item_id,msibk_group.inventory_item_id) asset_group_id,
msibk_act.concatenated_segments activity,
eps.activity_association_id activity_id,
epsn.set_name,
to_char(null) set_name_description,
to_date(null) set_name_end_date,
to_char(null) set_name_local_flag,
decode(eps.type_code,10,'Rule Based',17,'Day Interval',20,'List Dates',xxen_util.meaning(to_char(eps.type_code),'EAM_PM_TYPE',700)) schedule_type,
eps.type_code schedule_type_code,
eps.from_effective_date effective_from,
eps.to_effective_date effective_to,
eps.lead_time lead_time_in_days,
ewsv.work_order_status,
ewsv.status_id work_order_status_id,
xxen_util.meaning(eps.generate_next_work_order,'YES_NO',0) next_wo_only,
eps.generate_next_work_order generate_next_wo,
eps.day_tolerance,
decode(eps.rescheduling_point,1,'Actual Start Date',2,'Actual End Date',3,'Scheduled Start Date',4,'Scheduled End Date',5,'Base Date',6,'Base Meter Reading') use,
eps.rescheduling_point,
eps.base_date,
eps.base_reading,
decode(eps.scheduling_method_code,10,'Start Date',20,'End Date',xxen_util.meaning(to_char(eps.scheduling_method_code),'EAM_PM_SCHEDULING_METHOD',700)) suggest_next_service,
eps.scheduling_method_code scheduling_method,
decode(eps.whichever_first,'Y','First','N','Last') use_date_that_comes,
eps.whichever_first,
eps.interval_per_cycle intervals_per_cycle,
xxen_util.meaning(eps.include_manual,'YES_NO',0) reschedule_manual_work_orders,
eps.include_manual,
xxen_util.meaning(eps.non_scheduled_flag,'YES_NO',0) run_to_failure,
eps.non_scheduled_flag,
xxen_util.meaning(eps.default_implement,'YES_NO',0) default_schedule,
eps.default_implement,
xxen_util.meaning(eps.auto_instantiation_flag,'YES_NO',0) automatic_instantiation,
eps.auto_instantiation_flag auto_instantiation
from
eam_pm_schedulings eps
left join csi_item_instances cii on eps.maintenance_object_type=3 and eps.maintenance_object_id=cii.instance_id and sysdate between nvl(cii.active_start_date,sysdate) and nvl(cii.active_end_date,sysdate)
left join mtl_eam_asset_activities mea on eps.activity_association_id=mea.activity_association_id
left join mtl_system_items_b_kfv msibk_act on mea.asset_activity_id=msibk_act.inventory_item_id and mea.organization_id=msibk_act.organization_id
left join mtl_system_items_b_kfv msibk_asset on cii.inventory_item_id=msibk_asset.inventory_item_id and cii.last_vld_organization_id=msibk_asset.organization_id
left join mtl_system_items_b_kfv msibk_group on eps.maintenance_object_type=2 and eps.maintenance_object_id=msibk_group.inventory_item_id and mea.organization_id=msibk_group.organization_id
join mtl_parameters mp on mp.organization_id=nvl(cii.last_vld_organization_id,mea.organization_id)
left join eam_pm_set_names epsn on eps.set_name_id=epsn.set_name_id
left join eam_wo_statuses_v ewsv on ewsv.status_id=eps.generate_wo_status
where
nvl(eps.tmpl_flag,'N')='N' and
mp.eam_enabled_flag='Y' and
mp.organization_id in (select oav.organization_id from org_access_view oav where oav.resp_application_id=fnd_global.resp_appl_id and oav.responsibility_id=fnd_global.resp_id)
)
select
null action_,
null status_,
null message_,
null modified_columns_,
row_number() over (order by x.organization_code,x.schedule_name,x.pm_schedule_id,x.row_sort,x.child_sort) upload_row,
x.organization_code,
x.organization_id,
x.schedule_name,
x.asset_type,
x.asset_number,
x.asset_group,
x.asset_group_id,
x.activity,
x.activity_id,
x.set_name,
x.set_name_description,
x.set_name_end_date,
x.set_name_local_flag,
x.schedule_type,
x.schedule_type_code,
x.effective_from,
x.effective_to,
x.lead_time_in_days,
x.work_order_status,
x.work_order_status_id,
x.next_wo_only,
x.generate_next_wo,
x.day_tolerance,
x.use,
x.rescheduling_point,
x.base_date,
x.base_reading,
x.suggest_next_service,
x.scheduling_method,
x.use_date_that_comes,
x.whichever_first,
x.intervals_per_cycle,
x.reschedule_manual_work_orders,
x.include_manual,
x.run_to_failure,
x.non_scheduled_flag,
x.default_schedule,
x.default_implement,
x.automatic_instantiation,
x.auto_instantiation,
x.act_activity,
x.act_activity_id,
x.act_interval_multiple,
x.act_allow_repeat,
x.act_day_tolerance,
x.act_next_svc_start,
x.act_next_svc_end,
x.rule_type_dsp,
x.rule_type,
x.rule_day_interval,
x.rule_meter,
x.rule_meter_id,
x.rule_runtime_interval,
x.rule_last_service_reading,
x.rule_effective_reading_from,
x.rule_effective_reading_to,
x.rule_effective_date_from,
x.rule_effective_date_to,
x.rule_list_date,
x.rule_list_date_desc,
x.rule_base_date,
x.lsi_meter,
x.lsi_meter_id,
x.lsi_last_service_reading,
x.lsi_prev_service_reading,
x.lsi_wip_job,
x.lsi_wip_entity_id
from
(
select
qb.*,
to_char(null) act_activity,
to_number(null) act_activity_id,
to_number(null) act_interval_multiple,
to_char(null) act_allow_repeat,
to_number(null) act_day_tolerance,
to_date(null) act_next_svc_start,
to_date(null) act_next_svc_end,
to_char(null) rule_type_dsp,
to_number(null) rule_type,
to_number(null) rule_day_interval,
to_char(null) rule_meter,
to_number(null) rule_meter_id,
to_number(null) rule_runtime_interval,
to_number(null) rule_last_service_reading,
to_number(null) rule_effective_reading_from,
to_number(null) rule_effective_reading_to,
to_date(null) rule_effective_date_from,
to_date(null) rule_effective_date_to,
to_date(null) rule_list_date,
to_char(null) rule_list_date_desc,
to_date(null) rule_base_date,
to_char(null) lsi_meter,
to_number(null) lsi_meter_id,
to_number(null) lsi_last_service_reading,
to_number(null) lsi_prev_service_reading,
to_char(null) lsi_wip_job,
to_number(null) lsi_wip_entity_id,
0 row_sort,
0 child_sort
from
q_base qb
union all
select
qb.*,
msibk_act.concatenated_segments act_activity,
epa.activity_association_id act_activity_id,
epa.interval_multiple act_interval_multiple,
xxen_util.meaning(epa.allow_repeat_in_cycle,'YES_NO',0) act_allow_repeat,
epa.day_tolerance act_day_tolerance,
epa.next_service_start_date act_next_svc_start,
epa.next_service_end_date act_next_svc_end,
to_char(null) rule_type_dsp,
to_number(null) rule_type,
to_number(null) rule_day_interval,
to_char(null) rule_meter,
to_number(null) rule_meter_id,
to_number(null) rule_runtime_interval,
to_number(null) rule_last_service_reading,
to_number(null) rule_effective_reading_from,
to_number(null) rule_effective_reading_to,
to_date(null) rule_effective_date_from,
to_date(null) rule_effective_date_to,
to_date(null) rule_list_date,
to_char(null) rule_list_date_desc,
to_date(null) rule_base_date,
to_char(null) lsi_meter,
to_number(null) lsi_meter_id,
to_number(null) lsi_last_service_reading,
to_number(null) lsi_prev_service_reading,
to_char(null) lsi_wip_job,
to_number(null) lsi_wip_entity_id,
1 row_sort,
epa.activity_association_id child_sort
from
q_base qb,
eam_pm_activities epa,
mtl_eam_asset_activities mea,
mtl_system_items_b_kfv msibk_act
where
qb.pm_schedule_id=epa.pm_schedule_id and
epa.activity_association_id=mea.activity_association_id and
mea.asset_activity_id=msibk_act.inventory_item_id and
mea.organization_id=msibk_act.organization_id and
:p_update_activities='Y'
union all
select
qb.*,
to_char(null) act_activity,
to_number(null) act_activity_id,
to_number(null) act_interval_multiple,
to_char(null) act_allow_repeat,
to_number(null) act_day_tolerance,
to_date(null) act_next_svc_start,
to_date(null) act_next_svc_end,
decode(epsr.rule_type,1,'Day Interval',2,'Runtime Meter',3,'List Date') rule_type_dsp,
epsr.rule_type,
epsr.day_interval rule_day_interval,
ccv.name rule_meter,
epsr.meter_id rule_meter_id,
epsr.runtime_interval rule_runtime_interval,
epsr.last_service_reading rule_last_service_reading,
epsr.effective_reading_from rule_effective_reading_from,
epsr.effective_reading_to rule_effective_reading_to,
epsr.effective_date_from rule_effective_date_from,
epsr.effective_date_to rule_effective_date_to,
epsr.list_date rule_list_date,
epsr.list_date_desc rule_list_date_desc,
epsr.base_date rule_base_date,
to_char(null) lsi_meter,
to_number(null) lsi_meter_id,
to_number(null) lsi_last_service_reading,
to_number(null) lsi_prev_service_reading,
to_char(null) lsi_wip_job,
to_number(null) lsi_wip_entity_id,
2 row_sort,
epsr.rule_id child_sort
from
q_base qb,
eam_pm_scheduling_rules epsr,
csi_counters_vl ccv
where
qb.pm_schedule_id=epsr.pm_schedule_id and
epsr.meter_id=ccv.counter_id(+) and
:p_update_rules='Y'
union all
select
qb.*,
to_char(null) act_activity,
to_number(null) act_activity_id,
to_number(null) act_interval_multiple,
to_char(null) act_allow_repeat,
to_number(null) act_day_tolerance,
to_date(null) act_next_svc_start,
to_date(null) act_next_svc_end,
to_char(null) rule_type_dsp,
to_number(null) rule_type,
to_number(null) rule_day_interval,
to_char(null) rule_meter,
to_number(null) rule_meter_id,
to_number(null) rule_runtime_interval,
to_number(null) rule_last_service_reading,
to_number(null) rule_effective_reading_from,
to_number(null) rule_effective_reading_to,
to_date(null) rule_effective_date_from,
to_date(null) rule_effective_date_to,
to_date(null) rule_list_date,
to_char(null) rule_list_date_desc,
to_date(null) rule_base_date,
ccv.name lsi_meter,
epls.meter_id lsi_meter_id,
epls.last_service_reading lsi_last_service_reading,
epls.prev_service_reading lsi_prev_service_reading,
we.wip_entity_name lsi_wip_job,
epls.wip_entity_id lsi_wip_entity_id,
3 row_sort,
epls.meter_id child_sort
from
q_base qb,
eam_pm_last_service epls,
csi_counters_vl ccv,
wip_entities we
where
qb.activity_id=epls.activity_association_id and
epls.meter_id=ccv.counter_id(+) and
epls.wip_entity_id=we.wip_entity_id(+) and
:p_update_last_service='Y'
) x
where
1=1
Parameter NameSQL textValidation
Upload Mode
:p_upload_mode like '%' || xxen_upload.action_update
LOV
Organization
x.organization_code=:p_organization
LOV
Update Activities
 
LOV
Update Rules
 
LOV
Update Last Service
 
LOV