- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
05-15-2024 11:21 AM - edited 05-15-2024 11:22 AM
Hi Experts,
I want to copy the Program (pm_program), and whatever Projects are added to that Program will be created in New Program but with New Project Num( inside the project data should be same).
Please Help help
Thank you
Prabhu
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
05-16-2024 07:55 AM
Hi @Prabhu6,
If you want to set a new value for 'short_description' update the one line in the script I provided with:
newPrj.short_description='desired text here';
I've added a little bit to my "helper" script to get all fields. But a review is still needed to comment out the any lines that update system fields, if desired.
/*
var dict = new GlideRecord('sys_dictionary');
dict.addEncodedQuery('GOTOname=pm_project^elementISNOTEMPTY^element!=sys_id');
dict.query();
while (dict.next()) {
gs.info("newPrj."+dict.element+ "=prj."+dict.element+";");
}
// get parent table fields
var dict = new GlideRecord('sys_dictionary');
dict.addEncodedQuery('GOTOname=planned_task^elementISNOTEMPTY^element!=sys_id');
dict.query();
while (dict.next()) {
gs.info("newPrj."+dict.element+ "=prj."+dict.element+";");
}
// get parent table fields
var dict = new GlideRecord('sys_dictionary');
dict.addEncodedQuery('GOTOname=task^elementISNOTEMPTY^element!=sys_id^element!=number');
dict.query();
while (dict.next()) {
gs.info("newPrj."+dict.element+ "=prj."+dict.element+";");
}
*/
I suppose if you want a background script to update the 'short_description on a set of records, you can use:
var prj = new GlideRecord('pm_project');
// need a query to identify the desired records, go to a list view, create filter,
// then copy the query for use in the next line
prj.addEncodedQuery('sys_created_onONYesterday@javascript:gs.beginningOfYesterday()@javascript:gs.endOfYesterday()');
prj.query();
while (prj.next()) {
gs.info("Updating: " + prj.number);
prj.short_description = "new text";
prj.update();
}
There is "Project Management" application logic in play here, hopefully you'll be OK. My scripts are based on table schema and general database aspects.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
05-15-2024 06:32 PM - edited 05-15-2024 06:33 PM
What you can do is
1. create a new record in pm_program table, and set the field values to those from the source. Capture the sys_id value of the new record and the sys_id of the original pm_program record.
2. write a script to generate field assignment lines on the new pm_project records for a script that will create the new pm_project records.
3. create the script and run it in scripts background. I tried and here is the script I came up with, after step 2.
// didn't work as intended due to application logic. Needed roles assigned to meet ACL
var copiedPrg = '6a74586197e00210cd57fca6f053aff1';
var newPrg = '6494be73974e4294cd57fca6f053af3b';
var prj = new GlideRecord('pm_project');
// find all pm_project records related to the original pm_project record
prj.addQuery('primary_program', copiedPrg);
prj.query();
while (prj.next()) {
var newPrj = new GlideRecord('pm_project');
newPrj.initialize();
// see fields on newPrj to those on prj
newPrj.goal=prj.goal;
newPrj.score_size=prj.score_size;
newPrj.estimate_to_completion=prj.estimate_to_completion;
newPrj.execution_type=prj.execution_type;
newPrj.schedule=prj.schedule;
newPrj.risk=prj.risk;
newPrj.risk_of_not_performing=prj.risk_of_not_performing;
newPrj.roi=prj.roi;
newPrj.update_score_on_value_change=prj.update_score_on_value_change;
newPrj.primary_portfolio=prj.primary_portfolio;
newPrj.marked_for_delete=prj.marked_for_delete;
newPrj.score=prj.score;
newPrj.score_value=prj.score_value;
newPrj.rate_model=prj.rate_model;
newPrj.npv_value=prj.npv_value;
newPrj.score_risk=prj.score_risk;
newPrj.approved_end_date=prj.approved_end_date;
newPrj.project_manager=prj.project_manager;
newPrj.forecast_cost=prj.forecast_cost;
newPrj.demand=prj.demand;
newPrj.assumptions=prj.assumptions;
newPrj.resources_from_resource_plan=prj.resources_from_resource_plan;
newPrj.business_capabilities=prj.business_capabilities;
newPrj.phase=prj.phase;
newPrj.out_of_scope=prj.out_of_scope;
newPrj.risk_cost=prj.risk_cost;
newPrj.risk_of_performing=prj.risk_of_performing;
// collection record
//newPrj.=prj.;
newPrj.business_unit=prj.business_unit;
newPrj.capex_forecast_cost=prj.capex_forecast_cost;
newPrj.project_schedule_date_format=prj.project_schedule_date_format;
newPrj.goals=prj.goals;
newPrj.opex_forecast_cost=prj.opex_forecast_cost;
newPrj.barriers=prj.barriers;
newPrj.title=prj.title;
newPrj.investment_type=prj.investment_type;
newPrj.business_applications=prj.business_applications;
newPrj.department=prj.department;
newPrj.in_scope=prj.in_scope;
newPrj.update_actual_effort_from_time_card=prj.update_actual_effort_from_time_card;
newPrj.value=prj.value;
newPrj.irr_value=prj.irr_value;
newPrj.business_case=prj.business_case;
newPrj.show_on_program_status_report=prj.show_on_program_status_report;
newPrj.project_type=prj.project_type;
newPrj.opex_estimate_to_completion=prj.opex_estimate_to_completion;
newPrj.time_card_preference=prj.time_card_preference;
newPrj.primary_goal=prj.primary_goal;
newPrj.approved_start_date=prj.approved_start_date;
newPrj.time_component_from_planned=prj.time_component_from_planned;
newPrj.discount_rate=prj.discount_rate;
newPrj.planned=prj.planned;
newPrj.impacted_business_units=prj.impacted_business_units;
newPrj.investment_class=prj.investment_class;
//newPrj.sys_id=prj.sys_id;
newPrj.enablers=prj.enablers;
// use new pm_program sys_id;
newPrj.primary_program=newPrg;
newPrj.capex_estimate_to_completion=prj.capex_estimate_to_completion;
newPrj.strategic_objectives=prj.strategic_objectives;
newPrj.constraint_date=prj.constraint_date;
newPrj.model_id=prj.model_id;
newPrj.opex_cost=prj.opex_cost;
newPrj.allow_dates_outside_schedule=prj.allow_dates_outside_schedule;
newPrj.resource_allocated_cost=prj.resource_allocated_cost;
newPrj.cost=prj.cost;
newPrj.orig_sys_id=prj.orig_sys_id;
newPrj.resource_planned_cost=prj.resource_planned_cost;
newPrj.html_description=prj.html_description;
newPrj.time_constraint=prj.time_constraint;
newPrj.orig_top_task_id=prj.orig_top_task_id;
newPrj.benefits=prj.benefits;
newPrj.remaining_effort=prj.remaining_effort;
newPrj.percent_complete=prj.percent_complete;
newPrj.duration=prj.duration;
newPrj.version=prj.version;
newPrj.end_date=prj.end_date;
newPrj.relation_applied=prj.relation_applied;
newPrj.remaining_duration=prj.remaining_duration;
newPrj.sub_tree_root=prj.sub_tree_root;
newPrj.task=prj.task;
newPrj.critical_path=prj.critical_path;
newPrj.rollup=prj.rollup;
newPrj.start=prj.start;
newPrj.run_calc_brs=prj.run_calc_brs;
// don't set system fields
//newPrj.sys_id=prj.sys_id;
newPrj.start_date_derived_from=prj.start_date_derived_from;
newPrj.end_date_derived_from=prj.end_date_derived_from;
newPrj.actual_benefits=prj.actual_benefits;
newPrj.work_effort=prj.work_effort;
newPrj.work_duration=prj.work_duration;
newPrj.budget_cost=prj.budget_cost;
newPrj.top_portfolio=prj.top_portfolio;
newPrj.time_zone=prj.time_zone;
newPrj.top_program=prj.top_program;
newPrj.top_task=prj.top_task;
newPrj.status=prj.status;
newPrj.phase_type=prj.phase_type;
newPrj.milestone=prj.milestone;
newPrj.capex_cost=prj.capex_cost;
newPrj.start_date=prj.start_date;
newPrj.wbs=prj.wbs;
newPrj.work_cost=prj.work_cost;
newPrj.mpp_task_id=prj.mpp_task_id;
newPrj.time_card_at_top_task=prj.time_card_at_top_task;
newPrj.shadow=prj.shadow;
newPrj.has_conflict=prj.has_conflict;
newPrj.dependency=prj.dependency;
// collection record
// newPrj.=prj.;
newPrj.software_model=prj.software_model;
newPrj.override_status=prj.override_status;
newPrj.schedule_start_date=prj.schedule_start_date;
newPrj.effort=prj.effort;
newPrj.key_milestone=prj.key_milestone;
newPrj.level=prj.level;
newPrj.wbs_order=prj.wbs_order;
newPrj.calculation_type=prj.calculation_type;
newPrj.schedule_end_date=prj.schedule_end_date;
newPrj.end=prj.end;
newPrj.sn_esign_esignature_configuration=prj.sn_esign_esignature_configuration;
newPrj.approval_history=prj.approval_history;
newPrj.location=prj.location;
// Don't set system fields
//newPrj.sys_updated_on=prj.sys_updated_on;
newPrj.urgency=prj.urgency;
newPrj.watch_list=prj.watch_list;
newPrj.sys_domain_path=prj.sys_domain_path;
newPrj.cmdb_ci=prj.cmdb_ci;
newPrj.business_duration=prj.business_duration;
newPrj.user_input=prj.user_input;
newPrj.work_notes_list=prj.work_notes_list;
// collection record
// newPrj.=prj.;
newPrj.comments=prj.comments;
newPrj.opened_at=prj.opened_at;
newPrj.sla_due=prj.sla_due;
newPrj.delivery_plan=prj.delivery_plan;
newPrj.wf_activity=prj.wf_activity;
newPrj.service_offering=prj.service_offering;
newPrj.approval=prj.approval;
newPrj.knowledge=prj.knowledge;
newPrj.sys_updated_by=prj.sys_updated_by;
newPrj.priority=prj.priority;
newPrj.reassignment_count=prj.reassignment_count;
newPrj.order=prj.order;
newPrj.sys_class_name=prj.sys_class_name;
newPrj.assignment_group=prj.assignment_group;
newPrj.calendar_duration=prj.calendar_duration;
newPrj.correlation_display=prj.correlation_display;
newPrj.comments_and_work_notes=prj.comments_and_work_notes;
newPrj.parent=prj.parent;
newPrj.close_notes=prj.close_notes;
newPrj.due_date=prj.due_date;
newPrj.sys_mod_count=prj.sys_mod_count;
newPrj.upon_reject=prj.upon_reject;
newPrj.rejection_goto=prj.rejection_goto;
newPrj.expected_start=prj.expected_start;
newPrj.upon_approval=prj.upon_approval;
newPrj.variables=prj.variables;
newPrj.business_service=prj.business_service;
newPrj.escalation=prj.escalation;
newPrj.additional_assignee_list=prj.additional_assignee_list;
//newPrj.sys_id=prj.sys_id;
newPrj.skills=prj.skills;
newPrj.state=prj.state;
newPrj.closed_by=prj.closed_by;
newPrj.sys_domain=prj.sys_domain;
newPrj.assigned_to=prj.assigned_to;
newPrj.time_worked=prj.time_worked;
newPrj.correlation_id=prj.correlation_id;
newPrj.active=prj.active;
newPrj.work_notes=prj.work_notes;
newPrj.follow_up=prj.follow_up;
//newPrj.sys_created_on=prj.sys_created_on;
newPrj.route_reason=prj.route_reason;
newPrj.universal_request=prj.universal_request;
newPrj.contract=prj.contract;
newPrj.impact=prj.impact;
newPrj.group_list=prj.group_list;
newPrj.company=prj.company;
newPrj.opened_by=prj.opened_by;
newPrj.made_sla=prj.made_sla;
// don't set number
//newPrj.number=prj.number;
newPrj.description=prj.description;
newPrj.closed_at=prj.closed_at;
newPrj.activity_due=prj.activity_due;
newPrj.short_description=prj.short_description;
newPrj.approval_set=prj.approval_set;
newPrj.contact_type=prj.contact_type;
//newPrj.sys_created_by=prj.sys_created_by;
newPrj.delivery_task=prj.delivery_task;
newPrj.work_end=prj.work_end;
newPrj.sn_esign_document=prj.sn_esign_document;
newPrj.work_start=prj.work_start;
newPrj.task_effective_number=prj.task_effective_number;
newPrj.insert();
}
/*
var dict = new GlideRecord('sys_dictionary');
dict.addEncodedQuery('GOTOname=pm_project');
dict.query();
while (dict.next()) {
gs.info("newPrj."+dict.element+ "=prj."+dict.element+";");
}
// get parent table fields
var dict = new GlideRecord('sys_dictionary');
dict.addEncodedQuery('GOTOname=planned_task');
dict.query();
while (dict.next()) {
gs.info("newPrj."+dict.element+ "=prj."+dict.element+";");
}
// get parent table fields
var dict = new GlideRecord('sys_dictionary');
dict.addEncodedQuery('GOTOname=task');
dict.query();
while (dict.next()) {
gs.info("newPrj."+dict.element+ "=prj."+dict.element+";");
}
*/
with script logic to get dictionary records commented-out. Seemed to work for a pm_program record with 2 pm_project records. I had to give the 'project_manager' to the System Administrator so those pm_projects were "linked" to the new pr_program records due to an ACL.
Output follows:
*** Script: Found 2 records to copy.
*** Script: _setScheduleAndTimezone: using schedule 7aa3e10c8f70010040f82ab2f0f9234d
*** Script: Into EntityScorer.updateMetrics -> fb410f3f978e4294cd57fca6f053af34 | pm_project
*** Script: Into ScoreCalculator.getScoringFunction -> pm_project
*** Script: Into ScoreCalculator.getScoringFunction -> pm_project
PPM: [com.snc.planned_task.core.PlannedTaskAPI]PPM Into jsFunction_recalculateTask fb410f3f978e4294cd57fca6f053af34
PPM: [com.snc.planned_task.core.loader.PlannedTaskStructureLoader]PPM Start of Load
PlannedTaskDBService: All Tasks Query: top_task=fb410f3f978e4294cd57fca6f053af34^sys_class_nameNOT INdmn_requirement,sn_grc_issue,rm_doc,dmn_decision,rm_test
PPM: [com.snc.planned_task.core.loader.PlannedTaskStructureLoader]PPM End of Load : - 00:00:00 : 13 :: 13
PPM: [com.snc.planned_task.core.engine.AutomaticRecalculator]PPM End of automatic recalculation : - 00:00:00 : 3
PPM: [com.snc.planned_task.core.datastore.DataStore]Start of Save
PPM: [com.snc.planned_task.core.datastore.DataStore]End of Save : - 00:00:00 : 5 :: 5
Clearing the Record Cache of Planned Task: fb410f3f978e4294cd57fca6f053af34
*** Script: Into PostEngineHandlers fire
*** Script: Portfolio Project not exists. Create new
*** Script: _setScheduleAndTimezone: using schedule 7aa3e10c8f70010040f82ab2f0f9234d
*** Script: Into EntityScorer.updateMetrics -> 73410f3f978e4294cd57fca6f053af50 | pm_project
*** Script: Into ScoreCalculator.getScoringFunction -> pm_project
*** Script: Into ScoreCalculator.getScoringFunction -> pm_project
PPM: [com.snc.planned_task.core.PlannedTaskAPI]PPM Into jsFunction_recalculateTask 73410f3f978e4294cd57fca6f053af50
PPM: [com.snc.planned_task.core.loader.PlannedTaskStructureLoader]PPM Start of Load
PlannedTaskDBService: All Tasks Query: top_task=73410f3f978e4294cd57fca6f053af50^sys_class_nameNOT INdmn_requirement,sn_grc_issue,rm_doc,dmn_decision,rm_test
PPM: [com.snc.planned_task.core.loader.PlannedTaskStructureLoader]PPM End of Load : - 00:00:00 : 15 :: 15
PPM: [com.snc.planned_task.core.engine.AutomaticRecalculator]PPM End of automatic recalculation : - 00:00:00 : 3
PPM: [com.snc.planned_task.core.datastore.DataStore]Start of Save
PPM: [com.snc.planned_task.core.datastore.DataStore]End of Save : - 00:00:00 : 4 :: 4
Clearing the Record Cache of Planned Task: 73410f3f978e4294cd57fca6f053af50
*** Script: Into PostEngineHandlers fire
*** Script: Portfolio Project not exists. Create new
But I got the pm_project records associated with the new pm_program record.
it may work for you.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
05-15-2024 09:05 PM
Wow, Bert. It will help me. If you don't mind, please share one more script with a new project number and a short description of what I want. (whatever I specify short desp for 200+ projects) under the program. ( like background script)..
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
05-16-2024 07:55 AM
Hi @Prabhu6,
If you want to set a new value for 'short_description' update the one line in the script I provided with:
newPrj.short_description='desired text here';
I've added a little bit to my "helper" script to get all fields. But a review is still needed to comment out the any lines that update system fields, if desired.
/*
var dict = new GlideRecord('sys_dictionary');
dict.addEncodedQuery('GOTOname=pm_project^elementISNOTEMPTY^element!=sys_id');
dict.query();
while (dict.next()) {
gs.info("newPrj."+dict.element+ "=prj."+dict.element+";");
}
// get parent table fields
var dict = new GlideRecord('sys_dictionary');
dict.addEncodedQuery('GOTOname=planned_task^elementISNOTEMPTY^element!=sys_id');
dict.query();
while (dict.next()) {
gs.info("newPrj."+dict.element+ "=prj."+dict.element+";");
}
// get parent table fields
var dict = new GlideRecord('sys_dictionary');
dict.addEncodedQuery('GOTOname=task^elementISNOTEMPTY^element!=sys_id^element!=number');
dict.query();
while (dict.next()) {
gs.info("newPrj."+dict.element+ "=prj."+dict.element+";");
}
*/
I suppose if you want a background script to update the 'short_description on a set of records, you can use:
var prj = new GlideRecord('pm_project');
// need a query to identify the desired records, go to a list view, create filter,
// then copy the query for use in the next line
prj.addEncodedQuery('sys_created_onONYesterday@javascript:gs.beginningOfYesterday()@javascript:gs.endOfYesterday()');
prj.query();
while (prj.next()) {
gs.info("Updating: " + prj.number);
prj.short_description = "new text";
prj.update();
}
There is "Project Management" application logic in play here, hopefully you'll be OK. My scripts are based on table schema and general database aspects.