There are many questions when we want to do one action using Synchro Script.
First step is to learn from Synchro Help.
Second, you can always search from Synchro Community page:
SYNCHRO Construction Solution - Bentley Communities
Here we have some example script that may help you to start your script learning journey.
TASK ASSIGN_UF ("MHour" , FLOAT , 0 ) TASK ASSIGN_UF ("MHour" , FLOAT , SUM(RESOURCE.UFV ("MHour") )
TASK (NUM_CHILDREN>0) ASSIGN_UF ("MHour" ,FLOAT, SUM (CHILD.UFV ("MHour") )
RESOURCE ASSIGN_UF("[SYNC]Volume", FLOAT, UFV("Volume"))
3D (EXIST UFV("WBS_A")) ASSIGN_UF ("WBS",STRING,STRING(UFV("WBS_A")))
GROUP ASSIGN_UF(MODIFY_UF_NAME , "TASK NAME" , STRING , EACH (TASK.PROPERTY("Name")))
TASK ASSIGN_UF("Synchro Delay", FLOAT, (PROPERTY("Planned Start") - PROPERTY("BL Early Start")) / ( 3600*24 ) )
TASK ( PROPERTY("Actual Duration") <= PROPERTY("Planned Duration") ) ASSIGN_UF ("ALERT" , STRING , "OFF" ) TASK ( PROPERTY("Actual Duration") > PROPERTY("Planned Duration") ) ASSIGN_UF ("ALERT" , STRING , "ON" )
TASK(SELECTED) ASSIGN_UF("Task Complete Quantity ", DOUBLE, SUM(RESOURCE(STATUS_NAME("Default category")=="Status Name").UFV("Complete Quantity")))
RESOURCE(SELECTED AND NUM_CHILDREN == 0) ASSIGN_UF ("Level" ,STRING, PARENT.PARENT.UFV("Level")) RESOURCE(SELECTED AND NUM_CHILDREN == 0) ASSIGN_UF ("Level" ,STRING, PARENT.UFV("Level"))
RESOURCE ASSIGN_UF ("Isometric", STRING, CHILD(NUM_CHILDREN == 0 AND EXIST UFV("Isometric") >= "").UFV("Isometric"))
TASK(SELECTED AND STRING(UFV("Material Status")) == "No Material" ).RESOURCE (NOT STATUS_HISTORY("Material Status") >="No Material") SET_PROPERTY (STATUS_NAME , "Material Status::Construction Component::"+ "No Material")
TASK(SELECTED AND STRING(UFV("Material Status")) == "Partially Allocatted" ).RESOURCE (NOT STATUS_HISTORY("Material Status") >="Partially Allocatted") SET_PROPERTY (STATUS_NAME , "Material Status::Construction Component::"+ "Partially Allocatted")
TASK(SELECTED AND STRING(UFV("Material Status")) == "Fully Allocated" ).RESOURCE (NOT STATUS_HISTORY("Material Status") >="Fully Allocated") SET_PROPERTY (STATUS_NAME , "Material Status::Construction Component::"+ "Fully Allocated")
TASK(SELECTED AND PROPERTY("% Complete") = 0 ).RESOURCE (NOT STATUS_HISTORY("Installation Status") >="Not Started") SET_PROPERTY (STATUS_NAME , "Installation Status::Construction Component::"+ "Not Started")
TASK(SELECTED AND PROPERTY("% Complete") >0 AND PROPERTY("% Complete") <=25 ).RESOURCE (NOT STATUS_HISTORY("Installation Status") >=">0% and <=25%") SET_PROPERTY (STATUS_NAME , "Installation Status::Construction Component::"+ ">0% and <=25%")
TASK(SELECTED AND PROPERTY("% Complete") >25 AND PROPERTY("% Complete") <=50 ).RESOURCE (NOT STATUS_HISTORY("Installation Status") >=">25% and <=50%") SET_PROPERTY (STATUS_NAME , "Installation Status::Construction Component::"+ ">25% and <=50%")
TASK(SELECTED AND PROPERTY("% Complete") >50 AND PROPERTY("% Complete") <=75 ).RESOURCE (NOT STATUS_HISTORY("Installation Status") >=">50% and <=75%") SET_PROPERTY (STATUS_NAME , "Installation Status::Construction Component::"+ ">50% and <=75%")
TASK(SELECTED AND PROPERTY("% Complete") >75 AND PROPERTY("% Complete") <=100 ).RESOURCE (NOT STATUS_HISTORY("Installation Status") >=">75% and <=100%") SET_PROPERTY (STATUS_NAME , "Installation Status::Construction Component::"+ ">75% and <=100%")
TASK(SELECTED AND PROPERTY("% Complete") == 100).RESOURCE (NOT STATUS_HISTORY("Installation Status") >="Completed") SET_PROPERTY (STATUS_NAME , "Installation Status::Construction Component::"+ "Completed")
TASK.RESOURCE ASSIGN_GROUP_BY_ID EACH TASK NAME
RESOURCE (EXIST UFV ("Work Package")) ASSIGN_GROUP_BY_ID (UFV ("Work Package"))
GROUP UNASSIGN_OBJECT RESOURCE GROUP ASSIGN_OBJECT VAR TASK (NAME == $0.NAME).RESOURCE
TASK SET_PROPERTY (NAME, "Install " + " - " + UFV("Category"))
TASK SET_PROPERTY(PROPERTY("Actual Direct Cost"),PROPERTY("Budgeted Direct Cost")*PROPERTY("% Complete")/100)
RESOURCE(NAME=="Concrete").ASSIGNMENT SET_PROPERTY (PLANNED_WORK, TASK.UFV("[SYNC]Volume"))
RESOURCE (NAME=="Concrete").ASSIGNMENT SET_PROPERTY (ACTUAL_WORK, PROPERTY("Planned Units") * TASK.PROPERTY("% Complete") / 100)
TASK(SELECTED.ASSIGNMENT SET_PROPERTY(ACTUAL_WORK, PROPERTY("Planned Units") * TASK.PROPERTY("% Complete")/100)
TASK(SELECTED).ASSIGNMENT SET_PROPERTY (PROPERTY("Appearance Profile"), ALL_USE_PROFILE( NAME == "Concrete" ))
TASK.ASSIGNMENT (RESOURCE.UFV("Structural Material")>="Concrete" OR RESOURCE.UFV("Type")>="Concrete" OR RESOURCE.UFV("Material")>="Concrete" ) SET_PROPERTY ( PROPERTY("Appearance Profile"), ALL_USE_PROFILE( NAME == "Concrete" ))
TASK SET_PROPERTY (PHYSICALVOL_SH, "Cubic metre", UFV("Total Volume"))
TASK(SELECTED) SET_PROPERTY(PHYSICALVOL_SH, "Ton", SUM (3D.UFV("Weight.FLOAT")) /2000.0)
RESOURCE ASSIGN_UF ("Volume", STRING,3D_CALCULATE_VOLUME(3D))) TASK ASSIGN_UF ("Volume", FLOAT , 3D_CALCULATE_VOLUME(3D)) TASK SET_PROPERTY(PHYSICALVOL_SH, "Cubic metre", UFV("Volume"))
TASK SET_PROPERTY(PROPERTY("Task_Duration”), STRING(SUM(RESOURCE.UFV("TheDuration"))) + "h"))
TASK SET_PROPERTY(TASK_DURATION , ( (TASK_DURATION + "7.99h") / ( 3600*8 ) ) * (3600*8))
Or to 4 hours
TASK SET_PROPERTY(TASK_DURATION , ((TASK_DURATION + "3.99h")/(3600*4 )*(3600*4)))
TASK SET_PROPERTY(PROPERTY("Budgeted Direct Cost"), SUM(RESOURCE.UFV("Pris")))
Assign 3D Object to Resource ==> Where 3D and Resource have Common Information, example: UFV("Id")
RESOURCE (COUNT(3D)==0 AND NUM_CHILDREN==0) ASSIGN_OBJECT(VAR 3D(NUM_CHILDREN==0 AND UFV("Id")==$0.UFV("Id")))
Assign Cost Code:
RESOURCE (SELECTED).ASSIGNMENT SET_PROPERTY (STRING_PROPERTY("Cost Code"),$0.UFV("COST") )
hi Sagar,
I checked, Looks like it is not possible to bring the Task Finished Date to Resource Status Date,
The Resource Status will use Data Date or Latest Date of the Resource Status.
Others, please share if you have solution.
Best regards,
Indrawan Wijaya
Hi Indrawan Wijaya,These are some really good scripts, I just had one request here. Can you please edit this script (mentioned below) so that it can copy the task's Finish date as Status Date, instead of putting Data date by default to all the resources?Script - TASK(SELECTED AND PROPERTY("% Complete") == 100).RESOURCE (NOT STATUS_HISTORY("Installation Status") >="Completed") SET_PROPERTY (STATUS_NAME , "Installation Status::Construction Component::"+ "Completed")Thanks
Unassign All Resources by resource type
Example for material resources:
TASK UNASSIGN_OBJECT(VAR RESOURCE(TYPE ==4))
Was trying to change the resource type via Script, do you know if it is possible? It seems not supported yet. Here is the Script we were trying: RESOURCE(SELECTED) SET_PROPERTY(TYPE, ENUM:EQUIPMENT)
To push Human Resource Assignments (ID and Resource name) to task UFs for excel exporting and reporting. This allows for schedule reports to exclude 3D resources and only include the Human Resources loaded/assigned in the schedule.
TASK(SELECTED) ASSIGN_UF("Human Resource IDs", STRING, ASSIGNMENT(RESOURCE.TYPE==ENUM:HUMAN)RESOURCE.USER_ID)TASK(SELECTED) ASSIGN_UF("Human Resources", STRING, ASSIGNMENT(RESOURCE.TYPE==ENUM:HUMAN)RESOURCE.NAME)
To push Budgeted Labor Units, Actual Labor Units, and Remaining Labor Units to task UFs that can be shown in the task table to excel exporting and reporting:
BLU:
TASK(SELECTED) ASSIGN_UF("Budgeted Labor Units", FLOAT, ASSIGNMENT(RESOURCE.TYPE==ENUM:HUMAN).PLANNED_WORK)
ALU:
TASK(SELECTED) ASSIGN_UF("Actual Labor Units", FLOAT, ASSIGNMENT(RESOURCE.TYPE==ENUM:HUMAN).ACTUAL_WORK)
RLU:
TASK(SELECTED) ASSIGN_UF("Remaining Labor Units", FLOAT, ASSIGNMENT(RESOURCE.TYPE==ENUM:HUMAN).REMAINING_WORK)
To compare Duration at Completion and Estimated Duration in a UF to filter on for Gap Analysis'
TASK(SELECTED) ASSIGN_UF("Duration at Completion - Duration", FLOAT, (((PROPERTY("Duration")-PROPERTY("Duration At Completion"))/36000)
To push selected task's Driving Predecessor ID, Name, Logic Type, and Lag to 4 difference Task UF's
TASK(SELECTED) ASSIGN_UF("Driving Predecessor ID", STRING, LINK(DRIVING).PREDECESSOR.USER_ID)TASK(SELECTED) ASSIGN_UF("Driving Predecessor", STRING, LINK(DRIVING).PREDECESSOR.NAME)TASK(SELECTED) ASSIGN_UF("Driving Predecessor Logic Type", STRING, (LINK(DRIVING).STRING_PROPERTY("Type"))TASK(SELECTED) ASSIGN_UF("Driving Predecessor Lag", STRING, (LINK(DRIVING).LAG)/36000)
Indrawan Wijaya is the best as he took the action to post it, and invested efforts in documentation, while I had the same idea but never took any action.
This is really nice work Indrawan....Thanks for sharing. @Jacqueline you always best in this
Thanks for sharing! I wish I could contribute, but it will help some of our users in the Netherlands
Indrawan Wijaya You beat me on this - I literally have a draft in a word document but seems that you have advanced a lot further. Great job! I am going to repost this on LinkedIn.
Hi All,
Please feel free to add more Script example here.
Here I got one from our Synchro Forum.
To change Task Property (Progress Type to Manual)
TASK SET_PROPERTY(STRING_PROPERTY("Progress Type" ), "Manual"))