This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Search Multi Property by alias to get their ID

Hi all,

I am trying to set (flag) a property (called attached) within object class to yes (true). I do have a vbscript that works (within workflow state) but only for single properties list. I don't know how to make it work for MULTI properties list. Is there a way i can loop between all individual objects by Alias on the list (that i have added on the form) and set their attached property to true?


option explicit

'Define variables
Dim titleTypedValue
Dim oPropVal: Set oPropVal = CreateObject("MFilesAPI.PropertyValue")
Dim oProp: Set oProp = vault.PropertyDefOperations
Dim oPropValsCurrent: Set oPropValsCurrent = CreateObject("MFilesAPI.PropertyValues")
Dim IsAttached
Dim Ref
Dim Prop

'Get ID of Property
Set Ref = SearchForObject("Milestone", 1)

'Call "ATTACHTED" property and get latest version of property
set IsAttached = vault.ObjectPropertyOperations.GetProperties (Ref.ObjVer, true)

'Set "ATTACHTED" Property value to true (Yes)
oPropVal.PropertyDef = oProp.GetPropertyDefIDByAlias("Attached")

oPropVal.TypedValue.SetValue MFDatatypeBoolean, true
oPropValsCurrent.Add -1, oPropVal

'Apply the new properties value
Vault.ObjectPropertyOperations.SetProperties Ref.ObjVer, oPropValsCurrent


'********************************************************************************************************************
'Search For Object method
function SearchForObject(PropertyID, Index)

Dim oPropertyValsSearch: set oPropertyValsSearch = vault.ObjectPropertyOperations.GetProperties (Objver, true)
Dim EmpName
Dim titleProperty
titleProperty = 1055

EmpName = oPropertyValsSearch.SearchForPropertyByAlias(vault, PropertyID , true).Value.DisplayValue


' Find the title property of the current object.
Dim titleSearch
Set titleSearch = CreateObject("MFilesAPI.SearchCondition")
Dim titleExpression
Set titleExpression = CreateObject("MFilesAPI.Expression")
titleExpression.SetPropertyValueExpression titleproperty, 0, Nothing

Dim titleTypedValue
Set titleTypedValue = CreateObject("MFilesAPI.TypedValue")
titleTypedValue.SetValue MFDatatypeText ,EmpName
titleSearch.Set titleExpression, MFConditiontypeEqual, titleTypedValue

Dim SearchResults
Set SearchResults = Vault.ObjectSearchOperations.SearchForObjectsByCondition(titleSearch, false)

Dim oObjID: set oObjID = SearchResults.Item(Index)

set SearchForObject = oObjID

end function
Parents

  • Make sure the line
    oPropVal.PropertyDef = Vault.PropertyDefOperations.GetPropertyDefIDByAlias("Attached_Milestone")
    produces the correct result. There could be typo in the Alias or elsewhere.

    Well I guess I was too tired yesterday that I mistyped the alias on the boolean property. Many many thanks for you guidance, finally got it to work.

    Just a quick note to say that I agree with Karl at Bright Ideas: the issue (now) is that the property isn't correctly resolved.

    The "GetPropertyIDByAlias" method returns -1 if it can't resolve the alias to an ID for some reason. Typically this is because the alias you've given it ("Attached_Milestone") is incorrect (not on the property, mistyped, etc.). It can also be if multiple property definitions have the same alias.

    You could debug this value by throwing an error:

    Err.Raise MFScriptCancel, Vault.PropertyDefOperations.GetPropertyDefIDByAlias("Attached_Milestone")


    Alternatively you could hard-code the ID here for a moment, just to prove that it's this line which is failing:

    oPropVal.PropertyDef = 1024


    Regards,

    Craig.


    Craig, thanks for your explaining the problem and debug tips.


    Here the final code for anyone who may need it:

    'Declare required variables
    Dim iOTChild : iOTChild = vault.ObjectTypeOperations.GetObjectTypeIDByAlias("Milestone") 'Object type
    Dim iPDSiblings : iPDSiblings = vault.PropertyDefOperations.GetPropertyDefIDByAlias("Milestones") 'Property (Multi, From list)
    Dim oSibling : set oSibling = CreateObject("MFilesAPI.Lookup")
    Dim oSiblings : set oSiblings = PropertyValues.SearchForProperty(iPDSiblings).TypedValue.GetValueAsLookups()
    Dim oObjID: set oObjID = CreateObject("MFilesAPI.ObjID")
    Dim oPropVal: Set oPropVal = CreateObject("MFilesAPI.PropertyValue")
    Dim CheckedOutObjeactVersion
    'Get property
    oPropVal.PropertyDef = vault.PropertyDefOperations.GetPropertyDefIDByAlias("Attachted_Milestone")
    'Sets the value of a typed value to True (Yes)
    oPropVal.TypedValue.SetValue MFDatatypeBoolean, true

    'Loop thru each milestone
    For Each oSibling in oSiblings
    oObjID.SetIDs iOTChild, oSibling.Item

    'Checks out the Milestone object
    set CheckedOutObjeactVersion = vault.ObjectOperations.CheckOut(oObjID)

    'Sets the specified property value (Object must be checked out first).
    vault.ObjectPropertyOperations.SetProperty CheckedOutObjeactVersion.ObjVer, oPropVal

    'Checks in the Milestone object back again.
    vault.ObjectOperations.CheckIn(CheckedOutObjeactVersion.ObjVer)
    Next
Reply

  • Make sure the line
    oPropVal.PropertyDef = Vault.PropertyDefOperations.GetPropertyDefIDByAlias("Attached_Milestone")
    produces the correct result. There could be typo in the Alias or elsewhere.

    Well I guess I was too tired yesterday that I mistyped the alias on the boolean property. Many many thanks for you guidance, finally got it to work.

    Just a quick note to say that I agree with Karl at Bright Ideas: the issue (now) is that the property isn't correctly resolved.

    The "GetPropertyIDByAlias" method returns -1 if it can't resolve the alias to an ID for some reason. Typically this is because the alias you've given it ("Attached_Milestone") is incorrect (not on the property, mistyped, etc.). It can also be if multiple property definitions have the same alias.

    You could debug this value by throwing an error:

    Err.Raise MFScriptCancel, Vault.PropertyDefOperations.GetPropertyDefIDByAlias("Attached_Milestone")


    Alternatively you could hard-code the ID here for a moment, just to prove that it's this line which is failing:

    oPropVal.PropertyDef = 1024


    Regards,

    Craig.


    Craig, thanks for your explaining the problem and debug tips.


    Here the final code for anyone who may need it:

    'Declare required variables
    Dim iOTChild : iOTChild = vault.ObjectTypeOperations.GetObjectTypeIDByAlias("Milestone") 'Object type
    Dim iPDSiblings : iPDSiblings = vault.PropertyDefOperations.GetPropertyDefIDByAlias("Milestones") 'Property (Multi, From list)
    Dim oSibling : set oSibling = CreateObject("MFilesAPI.Lookup")
    Dim oSiblings : set oSiblings = PropertyValues.SearchForProperty(iPDSiblings).TypedValue.GetValueAsLookups()
    Dim oObjID: set oObjID = CreateObject("MFilesAPI.ObjID")
    Dim oPropVal: Set oPropVal = CreateObject("MFilesAPI.PropertyValue")
    Dim CheckedOutObjeactVersion
    'Get property
    oPropVal.PropertyDef = vault.PropertyDefOperations.GetPropertyDefIDByAlias("Attachted_Milestone")
    'Sets the value of a typed value to True (Yes)
    oPropVal.TypedValue.SetValue MFDatatypeBoolean, true

    'Loop thru each milestone
    For Each oSibling in oSiblings
    oObjID.SetIDs iOTChild, oSibling.Item

    'Checks out the Milestone object
    set CheckedOutObjeactVersion = vault.ObjectOperations.CheckOut(oObjID)

    'Sets the specified property value (Object must be checked out first).
    vault.ObjectPropertyOperations.SetProperty CheckedOutObjeactVersion.ObjVer, oPropVal

    'Checks in the Milestone object back again.
    vault.ObjectOperations.CheckIn(CheckedOutObjeactVersion.ObjVer)
    Next
Children
No Data