The M-Files Community will be updated on Tuesday, April 2, 2024 at 10:00 AM EST / 2:00 PM GMT and the update is expected to last for several hours. The site will be unavailable during this time.

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

Updating related property with vbscript

Hi everybody,

We have products with quantities and a mouvment related to a product. We are trying with VBScript to update the product quantity when the mouvment is created.

We are new in VBScript in M-Files so be indulgent.

We wrote this which leads to an error (ObjVer non managed ; yellow line). Maybe we get some real understanding points so thanks in advance for all your help.

Option Explicit


Dim ID_Objet : ID_Objet = GetPropertyID("PD_PROD") 'récupère le numéro de propriété de l'objet

'on récupère l'objet liéPoint down
Dim valeurObjet
Set valeurObjet = PropertyValues.SearchForProperty(ID_Objet).TypedValue.GetValueAsLookup

'on récupère la version qui corrspondPoint down
Dim Objetlier : Set Objetlier = GetOvapsByLookup(valeurObjet)
Dim VERObjerlier : Set VERObjerlier = Objetlier.ObjVer 'récupère l'ObjVer de l'objet lié

Dim ProprietesObjetlier : Set ProprietesObjetlier = Objetlier.Properties 'récupère l'ensemble des propriétés de l'objet lié


Dim ID_METADONNEEObjetlier : ID_METADONNEEObjetlier = GetPropertyID("PD.Quantite") 'récupère l'ID de la métadonnée dans l'objet lié

'récupère la valeur de la métadonnée de l'objet liéePoint down
DIm val_METADONNEEObjetlier : val_METADONNEEObjetlier = ProprietesObjetlier.SearchForProperty(ID_METADONNEEObjetlier).TypedValue.DisplayValue
val_METADONNEEObjetlier = val_METADONNEEObjetlier + 1 'ajoute + 1

Vault.ObjectPropertyOperations.SetProperty VERObjerlier.ObjVer, val_METADONNEEObjetlier 'met à jour l'objet lié avec la nouvelle valeur

Function GetPropertyID(alias)
Dim iID
iID = vault.PropertyDefOperations.GetPropertyDefIDByAlias(alias)
If iID=-1 then
Err.raise MFScriptCancel, "La propriété/métadonnée n'a pas été trouvée (alias :" & alias
End If
GetPropertyID=iID
End Function

Function GetOvapsByLookup( lookup )
Dim oObjID : Set oObjID = CreateObject( "MFilesAPI.ObjID" )
Call oObjID.SetIDs( lookup.ObjectType, lookup.Item )
Dim oObjVer : Set oObjVer = Vault.ObjectOperations.GetLatestObjVer( oObjID,False)
Set GetOvapsByLookup = Vault.ObjectOperations.GetObjectVersionAndProperties(oObjVer)
End Function

Parents
  • If I understand correctly I think you are trying to update another object not the current one being updated. If so, I believe you have to check out the object first then update it , and then check it back in .

    Also I believe the highlighted line is actually incorrect syntax, It looks like you are passing the value you want instead of a PropertyValue object. try the following:

    'récupère la valeur de la métadonnée de l'objet liée
    
    'get the property value
    Dim Property_METADONNEEObjetlier : Property_METADONNEEObjetlier = ProprietesObjetlier.SearchForProperty(ID_METADONNEEObjetlier)
    
    'get the new value
    DIm val_METADONNEEObjetlier : val_METADONNEEObjetlier = Property_METADONNEEObjetlier.TypedValue.DisplayValue
    val_METADONNEEObjetlier = val_METADONNEEObjetlier + 1 'ajoute + 1
    
    'set the new value on the property Value NOTE MAKE SURE U PUT THE CORRECT MFDATATYPE
    Property_METADONNEEObjetlier.Value.SetValue MFDatatypeInteger, val_METADONNEEObjetlier
    
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    'if the above line to set the value does not work you can try creating a new property value object
    'Dim oPropertyValue : Set oPropertyValue = CreateObject("MFilesAPI.PropertyValue")
    'oPropertyValue.PropertyDef = ID_METADONNEEObjetlier
    'oPropertyValue.Value.SetValue MFDatatypeInteger, val_METADONNEEObjetlier
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    
    'Checkout the object you want to update
    Dim checkedOutObjectVersion : Set checkedOutObjectVersion = vault.ObjectOperations.CheckOut(VERObjerlier.ObjVer.objID)
    
    'update properties of checked out object
    Vault.ObjectPropertyOperations.SetProperty checkedOutObjectVersion.ObjVer, Property_METADONNEEObjetlier 'met à jour l'objet lié avec la nouvelle valeur
    
    'check in the checked out object
    vault.ObjectOperations.CheckIn checkedOutObjectVersion.ObjVer

    I can't read French and this is untested code so I am sorry if there are any typos, but this should at least get you a good step in the correct direction. Slight smile

Reply
  • If I understand correctly I think you are trying to update another object not the current one being updated. If so, I believe you have to check out the object first then update it , and then check it back in .

    Also I believe the highlighted line is actually incorrect syntax, It looks like you are passing the value you want instead of a PropertyValue object. try the following:

    'récupère la valeur de la métadonnée de l'objet liée
    
    'get the property value
    Dim Property_METADONNEEObjetlier : Property_METADONNEEObjetlier = ProprietesObjetlier.SearchForProperty(ID_METADONNEEObjetlier)
    
    'get the new value
    DIm val_METADONNEEObjetlier : val_METADONNEEObjetlier = Property_METADONNEEObjetlier.TypedValue.DisplayValue
    val_METADONNEEObjetlier = val_METADONNEEObjetlier + 1 'ajoute + 1
    
    'set the new value on the property Value NOTE MAKE SURE U PUT THE CORRECT MFDATATYPE
    Property_METADONNEEObjetlier.Value.SetValue MFDatatypeInteger, val_METADONNEEObjetlier
    
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    'if the above line to set the value does not work you can try creating a new property value object
    'Dim oPropertyValue : Set oPropertyValue = CreateObject("MFilesAPI.PropertyValue")
    'oPropertyValue.PropertyDef = ID_METADONNEEObjetlier
    'oPropertyValue.Value.SetValue MFDatatypeInteger, val_METADONNEEObjetlier
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    
    'Checkout the object you want to update
    Dim checkedOutObjectVersion : Set checkedOutObjectVersion = vault.ObjectOperations.CheckOut(VERObjerlier.ObjVer.objID)
    
    'update properties of checked out object
    Vault.ObjectPropertyOperations.SetProperty checkedOutObjectVersion.ObjVer, Property_METADONNEEObjetlier 'met à jour l'objet lié avec la nouvelle valeur
    
    'check in the checked out object
    vault.ObjectOperations.CheckIn checkedOutObjectVersion.ObjVer

    I can't read French and this is untested code so I am sorry if there are any typos, but this should at least get you a good step in the correct direction. Slight smile

Children
  • Hi Many thanks for your helpThumbsup. I will try this and keep you informed.


  • Option Explicit

    Dim ID_Objet : ID_Objet = GetPropertyID("PD_PROD") 'récupère le numéro de propriété de l'objet / Get the ID of the lookupfield for the linked object

    Dim valeurObjet 'récupère la valeur de la métadonnée de l'objet lié Get the value of the property
    Set valeurObjet = PropertyValues.SearchForProperty(ID_Objet).TypedValue.GetValueAsLookup

    'on récupère la version qui corrspond Get the actual version 
    Dim Objetlier : Set Objetlier = GetOvapsByLookup(valeurObjet)
    Dim VERObjerlier : Set VERObjerlier = Objetlier.ObjVer

    Dim ProprietesObjetlier : Set ProprietesObjetlier = Objetlier.Properties 'récupère l'ensemble des propriétés de l'objet lié / Get all the propertires of the linked object


    Dim ID_METADONNEEObjetlier : ID_METADONNEEObjetlier = GetPropertyID("PD.Quantite") 'récupère l'ID de la métadonnée dans l'objet lié / get the ID of the property we want to update in the linked object (TPWWTUITLO)

    'récupère la valeur de la métadonnée de l'objet liée/ Get the value of TPWWTUITLO
    DIm val_METADONNEEObjetlier : val_METADONNEEObjetlier = ProprietesObjetlier.SearchForProperty(ID_METADONNEEObjetlier).TypedValue.DisplayValue
    val_METADONNEEObjetlier = val_METADONNEEObjetlier + 1 'ajoute + 1

    'creating a new property value object and set it the new value
    Dim oPropertyValue : Set oPropertyValue = CreateObject("MFilesAPI.PropertyValue")
    oPropertyValue.PropertyDef = ID_METADONNEEObjetlier
    oPropertyValue.Value.SetValue MFDatatypeInteger, val_METADONNEEObjetlier
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

    'Checkout the object you want to update
    Dim checkedOutObjectVersion : Set checkedOutObjectVersion = vault.ObjectOperations.CheckOut(VERObjerlier.objID)

    'update properties of checked out object
    Vault.ObjectPropertyOperations.SetProperty checkedOutObjectVersion.ObjVer, oPropertyValue 'met à jour l'objet lié avec la nouvelle valeur

    'check in the checked out object
    vault.ObjectOperations.CheckIn checkedOutObjectVersion.ObjVer


    Function GetPropertyID(alias)
    Dim iID
    iID = vault.PropertyDefOperations.GetPropertyDefIDByAlias(alias)
    If iID=-1 then
    Err.raise MFScriptCancel, "La propriété/métadonnée n'a pas été trouvée (alias :" & alias
    End If
    GetPropertyID=iID
    End Function

    Function GetOvapsByLookup( lookup )
    Dim oObjID : Set oObjID = CreateObject( "MFilesAPI.ObjID" )
    Call oObjID.SetIDs( lookup.ObjectType, lookup.Item )
    Dim oObjVer : Set oObjVer = Vault.ObjectOperations.GetLatestObjVer( oObjID,False)
    Set GetOvapsByLookup = Vault.ObjectOperations.GetObjectVersionAndProperties(oObjVer)
    End Function