How can I develop applications using VAF?

Hello, I've developed an application using VAF on my own and added it to my library, but it's not working. Finding resources related to VAF is very limited. How can I improve my skills in this area? My current goal with the code is to automatically open a document based on the given class workflow and state. If I can achieve this, I'd like to create a system that automatically opens documents every day at 8:00 AM.

Vault Application.cs

using System;
using MFiles.VAF.Common;
using MFiles.VAF.Core;
using MFilesAPI;

namespace PersonelDenemeVAF
{
    public class VaultApplication : ConfigurableVaultApplicationBase<Configuration>
    {
        [MFConfiguration("PersonelDenemeVAF", "Configuration")]
        private Configuration config = new Configuration();

        /// <summary>
        /// Nesne check-in olduğunda tetiklenir.
        /// Konfigürasyondaki workflow ve state ile karşılaştırma yapılır.
        /// </summary>
        [EventHandler(MFEventHandlerType.MFEventHandlerAfterCheckInChanges)]
        public void AfterCheckIn(EventHandlerEnvironment env)
        {
            try
            {
                var obj = new ObjVerEx(env.Vault, env.ObjVer);

                // Eğer bu zaten otomatik oluşturulmuş sınıf ise işlemi atla (sonsuz döngü önleme)
                if (obj.Class == this.config.Class.ID)
                    return;

                // Workflow ve State property değerlerini oku
                var workflowProp = obj.GetProperty(MFBuiltInPropertyDef.MFBuiltInPropertyDefWorkflow);
                var stateProp = obj.GetProperty(MFBuiltInPropertyDef.MFBuiltInPropertyDefState);

                int currentWorkflowID = workflowProp?.TypedValue.GetLookupID() ?? -1;
                int currentStateID = stateProp?.TypedValue.GetLookupID() ?? -1;

                // Önceki versiyonu al (version > 1 ise)
                int prevStateID = -1;
                if (env.ObjVer.Version > 1)
                {
                    var prevObjVer = new ObjVer();
                    prevObjVer.SetIDs(env.ObjVer.Type, env.ObjVer.ID, env.ObjVer.Version - 1);
                    var prevObj = new ObjVerEx(env.Vault, prevObjVer);
                    var prevStateProp = prevObj.GetProperty(MFBuiltInPropertyDef.MFBuiltInPropertyDefState);
                    prevStateID = prevStateProp?.TypedValue.GetLookupID() ?? -1;
                }

                // Workflow ve state değişimini kontrol et
                // prevStateID == -1 → önceki versiyon yoksa tetikle
                // prevStateID != currentStateID → state değişmişse tetikle
                if (currentWorkflowID == this.config.Workflow.ID &&
                    currentStateID == this.config.WorkflowState.ID &&
                    (prevStateID != this.config.WorkflowState.ID || prevStateID == -1))
                {
                    // Yeni nesne için property değerlerini hazırla
                    var builder = new MFPropertyValuesBuilder(env.Vault)
                        .SetClass(this.config.Class)
                        .SetWorkflowState(this.config.Workflow, this.config.WorkflowState);

                    env.Vault.ObjectOperations.CreateNewObjectEx(
                        (int)MFBuiltInObjectType.MFBuiltInObjectTypeDocument, // Doküman tipi
                        builder.Values,
                        new SourceObjectFiles(),
                        false,   // SFD değil
                        true,    // Check-in yap
                        null     // ACL
                    );

                    SysUtils.ReportInfoToEventLog(
                        $"PersonelDenemeVAF: Workflow={this.config.Workflow.Alias} ve State={this.config.WorkflowState.Alias} için otomatik doküman oluşturuldu.");
                }
            }
            catch (Exception ex)
            {
                SysUtils.ReportErrorToEventLog($"PersonelDenemeVAF - Hata: {ex.Message}", ex);
            }
        }
    }
}
Configuration.cs

using System;
using System.Runtime.Serialization;
using MFiles.VAF.Configuration;

namespace PersonelDenemeVAF
{
    [DataContract]
    public class Configuration
    {
        [DataMember(Order = 1)]
        [MFClass(Required = true)]
        [JsonConfEditor(
            Label = "Class",
            HelpText = "Kullanılacak Class (Sınıf).",
            DefaultValue = "PersonelDenemeDegerlendirme")]
        public MFIdentifier Class { get; set; }
            = "PersonelDenemeDegerlendirme";

        [DataMember(Order = 2)]
        [MFWorkflow(Required = true)]
        [JsonConfEditor(
            Label = "Workflow",
            HelpText = "Nesneye atanacak Workflow.",
            DefaultValue = "PersonelDenemeWorkflow")]
        public MFIdentifier Workflow { get; set; }
            = "PersonelDenemeWorkflow";

        [DataMember(Order = 3)]
        [MFState(Required = true)]
        [JsonConfEditor(
            Label = "Başlangıç Workflow State",
            HelpText = "Yeni oluşturulan nesnenin başlangıç state'i.",
            DefaultValue = "PersonelDenemeWorkflow.Baslangic")]
        public MFIdentifier WorkflowState { get; set; }
            = "PersonelDenemeWorkflow.Baslangic";
    }
}
  

Parents
  • What do you mean by "open a document"?  The VAF runs on the server and has no UI.  What exactly do you want to achieve?

  • Currently, VBScript automatically opens documents or objects, but is this possible with VAF? In the VAF configuration section, can I enter the relevant class workflow and its state, and then automatically open a document or object when that state is reached? Also, the documentation for VAF in version 22.12 is limited; there's a possibility VBScript will be phased out in the future, so will the documentation increase then?

  • You want to check the document out and back in again?  What do you mean by open a document?

  • Dim oPersonelValues : Set oPersonelValues = Vault.ObjectPropertyOperations.GetProperty(objver, 3886).TypedValue.GetValueAsLookups()


    Dim oAcl : Set oAcl = Vault.NamedACLOperations.GetNamedACL(156).AccessControlList


    Dim i
    For i = 1 To oPersonelValues.Count
    Dim oPropertyValues : Set oPropertyValues = CreateObject("MFilesAPI.PropertyValues")
    Dim oPropertyValue : Set oPropertyValue = CreateObject("MFilesAPI.PropertyValue")

    ' Class = 343
    oPropertyValue.PropertyDef = MFBuiltInPropertyDefClass
    oPropertyValue.TypedValue.SetValue MFDatatypeLookup , 48
    oPropertyValues.Add -1 , oPropertyValue

    ' Workflow = 248
    oPropertyValue.PropertyDef = 38
    oPropertyValue.TypedValue.SetValue MFDatatypeLookup , 123
    oPropertyValues.Add -1 , oPropertyValue

    ' State = 1230
    oPropertyValue.PropertyDef = 39
    oPropertyValue.TypedValue.SetValue MFDatatypeLookup , 184
    oPropertyValues.Add -1 , oPropertyValue


    oPropertyValue.PropertyDef = 3886
    oPropertyValue.TypedValue.SetValue MFDatatypeMultiSelectLookup , oPersonelValues.Item(i).Item
    oPropertyValues.Add -1 , oPropertyValue


    Dim emptyFiles : Set emptyFiles = CreateObject("MFilesAPI.SourceObjectFiles")

    Vault.ObjectOperations.CreateNewObjectEx _
    125, _
    oPropertyValues, _
    emptyFiles, _
    False, _
    True, _
    oAcl


    Next How can I implement this VBScript structure using VAF?

Reply
  • Dim oPersonelValues : Set oPersonelValues = Vault.ObjectPropertyOperations.GetProperty(objver, 3886).TypedValue.GetValueAsLookups()


    Dim oAcl : Set oAcl = Vault.NamedACLOperations.GetNamedACL(156).AccessControlList


    Dim i
    For i = 1 To oPersonelValues.Count
    Dim oPropertyValues : Set oPropertyValues = CreateObject("MFilesAPI.PropertyValues")
    Dim oPropertyValue : Set oPropertyValue = CreateObject("MFilesAPI.PropertyValue")

    ' Class = 343
    oPropertyValue.PropertyDef = MFBuiltInPropertyDefClass
    oPropertyValue.TypedValue.SetValue MFDatatypeLookup , 48
    oPropertyValues.Add -1 , oPropertyValue

    ' Workflow = 248
    oPropertyValue.PropertyDef = 38
    oPropertyValue.TypedValue.SetValue MFDatatypeLookup , 123
    oPropertyValues.Add -1 , oPropertyValue

    ' State = 1230
    oPropertyValue.PropertyDef = 39
    oPropertyValue.TypedValue.SetValue MFDatatypeLookup , 184
    oPropertyValues.Add -1 , oPropertyValue


    oPropertyValue.PropertyDef = 3886
    oPropertyValue.TypedValue.SetValue MFDatatypeMultiSelectLookup , oPersonelValues.Item(i).Item
    oPropertyValues.Add -1 , oPropertyValue


    Dim emptyFiles : Set emptyFiles = CreateObject("MFilesAPI.SourceObjectFiles")

    Vault.ObjectOperations.CreateNewObjectEx _
    125, _
    oPropertyValues, _
    emptyFiles, _
    False, _
    True, _
    oAcl


    Next How can I implement this VBScript structure using VAF?

Children