Join the #BuildWithBuildAgent Challenge! Get recognized, earn exclusive swag, and inspire the ServiceNow Community with what you can build using Build Agent.  Join the Challenge.

Copy the Program with different name and different Project number with same deatils.

Prabhu6
Tera Guru

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).

Prabhu6_0-1715797356979.png

 

Please Help help

 

Thank you

Prabhu 

1 ACCEPTED SOLUTION

Bert_c1
Kilo Patron

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.

View solution in original post

3 REPLIES 3

Bert_c1
Kilo Patron

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.

 

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).. 

Bert_c1
Kilo Patron

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.