The new PJM project import template OPPORPJMI

4 minute read time.

Some improvements in Sage X3 release 2022 R3 (V12 patch 30), include a new project import template for PJM. This has been requested for by clients in the past for help with importing legacy projects.

A single Import file (Text file) is used to create or update one or multiple projects with the entire structures, including Budgets, Budget lines, Tasks, Task products, Task operations and Operation assignments.

To import specific development needed by Partners or Customers at any level, 7 entry points have been created for this purpose.

The project Import template, OPPORPJMI, comes "greyed out" (editing is disabled) except for the "active" flag. To use a modified template, it has to be duplicated.

The Identifiers section of the template are for all the 7 PJM sections as listed above; 


P = Project, This indicator imports all the fields on the project "front". There are 31 fields for this indicator.


The cost structure of the project consists of the Budget and Budget lines

PB = Project budget, This will import the Budget header  fields.

PBL = Project budget line,

3. PROJECT Task Planning

PT= Project task, Imports the task "header" (main task structure)

PTP = Task products, This imports products linked to a task such as purchases

PTO =Task operation,

PTOA= Operation assignment

Steps to import a project.

The first field for each indicator  is the CRUD (Create, Read, Update, Delete) method to be applied.

The Project (project front page) can be imported first, or in combination with the budget or Task. The import can be repeated to update/create allowed fields.

A caveat. The PJM import template does not export projects. The data to be imported has to be built up manually.

Here is example data for creating a project with Budgets.

"P","C","","ZA011","ZA012","Blade server solution","Blade server","","","","",1,"ZAR","ZAR",,,,0,0,0,"",1,"",1,1,1,1,1,"","",1
"PB","C","B-030",0,"","ZA012","Solution Seting and mounting","Sol. setng",0,"",1,"",""
"PB","C","B-040",0,"","ZA012","Solution shipment on site test","Solution",0,"",1,"",""
"PB","C","B-050",0,"","ZA012","Miscellaneous Expenses","Miscellaneou",0,"",1,"",""
"PB","C","B-060",0,"","ZA012","Installation and acceptance test","Installation",0,"",1,"",""

We can update the project by creating budget lines. Notice the CRUD methods for the already created lines (P and PB) is "U" for update and "C" to create the Budget lines(PBL) to add to the project.

The project number for the project to be updated, ZA0122206000092 is included on the data file.

"P","U","ZA0122206000092","ZA012","ZA012","Blade server solution","Blade server","","","","",1,"ZAR","ZAR",,,,0,0,0,"",1,"",1,1,1,1,1,"","",1
"PBL","C",10,MANAGER,"Time Mnager","HR",16,6061,969.76,"06/08/22",,60.61,,,"Manual",""
"PBL","C",10,MANAGER,"Time Mnager","HR",8,60.61,484.88,"06/08/22",,60.61,,,"Manual",""
"PBL","C",20,STDPRODUCT,"On stock Products",,,,22700.00,"06/08/22",,60.61,,,"Manual",""
"PB","U","B-030",0,"","ZA012","Solution Seting and mounting","Sol. setng",0,"",1,"",""
"PBL","C",10,TECHNICIAN,"Time of Technician","HR",32,31.60,1011.20,"06/08/22",,31.60,,,"Manual",""
"PBL","C",20,MANAGER,"Time of Manager","HR",32,60.61,1939.52,"06/08/22",,60.61,,,"Manual",""
"PB","U","B-040",0,"","ZA012","Solution shipment on site test","Solution",0,"",1,"",""
"PBL","C",10,STDPRODUCT,"On stock Products",,,,5000.00,"06/08/22",,,,,"Manual",""
"PBL","C",20,TECHNICIAN,"Time of Technician","HR",8,31.60,252.80,"06/08/22",,31.60,,,"Manual",""
"PB","U","B-050",0,"","ZA012","Miscellaneous Expenses","Miscellaneou",0,"",1,"",""
"PBL","C",10,TRAVEL,"Expenses - Travel",,,,2000.00,"06/08/22",,,,,"Manual",""
"PB","C","B-060",0,"","ZA012","Installation and acceptance test","Installation",0,"",1,"",""

The Budget lines have now been created

The project could have been created with Budgets and Budget lines in one fell swoop, by importing the data with all lines set to CRUD method "C" on the import data.

Next, we add some tasks, currently empty as shown below.

The data will be the project line with "U" method and the task lines in creation mode, "C" as below.

 "P","U","ZA0122206000092","ZA012","ZA012","Blade server solution","Blade server","","","","",1,"ZAR","ZAR",,,,0,0,0,"",1,"",1,1,1,1,1,"","",1
"PT","C","DESIGN","T-010",0,"","ZA012","Server specification based on customer requirement","Server speci","08/04/22","08/12/22",,,1,"B-010",,"R1",1,"",""
"PT","C","MIXED","T-020",0,"","ZA012","Material purchase","Material pur","08/04/22","08/12/22",8,,1,"B-020",,"R1",1,"",""
"PT","C","MIXED","T-030",0,"","ZA012","Server Assembly and test","***.&Test","08/04/22","08/12/22",8,,1,"B-030",,"R1",1,"",""
"PT","C","MIXED","T-040",0,"","ZA012","Solution Shipment ","Solution Shi","08/04/22","08/12/22",8,,1,"B-040",,"R1",1,"",""
"PT","C","MIXED","T-050",0,"","ZA012","On site server implementation and test","On site serv","08/04/22","08/12/22",8,,1,"B-050",,"R1",1,"",""
"PT","C","MIXED","T-060",0,"","ZA012","Travel and sundries","Meetings","08/04/22","08/12/22",8,,1,"B-050",,"R1",1,"",""

The Tasks were created

The Task Products PTP, Operations PTO, and Operation Assignments PTOA, can be added similarly.

Note that for this import data set, only n-1 budgets/tasks, were created if n lines were in the imported data.

I do not yet understand why. And as already pointed out earlier, the template does not export project data like the other templates where one gets the data structure.

If a project has custom fields, 7 new entry points have been created to help with importing that data.


To manage specific properties, two steps must be done first: 

1. Add the new properties in the corresponding import table (cf. Page 8 : Indicators).

2. Duplicate and update the Import/Export template to add the new properties. 

A property must be added in the X3 Class if this property is not empty in the import file in the following manner

If [F:OPJI]<SpecificProperty> <> AVOID.ACHAR Then
OPPOR.<SpecificProperty> = [F:OPJI]<SpecificProperty>
If [F:OPJI]<SpecificProperty> <> 0 Then
OPPOR.<SpecificProperty> = [F:OPJI]<SpecificProperty>
If [F:OPJI]<SpecificProperty> <> [0/0/0] Then
OPPOR.<SpecificProperty> = [F:OPJI]<SpecificProperty>

Have fun playing with this long awaited and useful new improvement for PJM.