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.