Create a Deferred Event Generation Operation from a Script


We are migrating a client from 6.1.2 to 7.1.1. In their 6.1.2 environment they have a script that creates deferred operations to generate an event for process generation using classes from the VI.DB.DeferredOperations namespace. Here is the code snippet:


Dim newEffDate As DateTime = resEffectiveDate.AddHours(1.0)

Dim saveTask As DeferredOperations.DeferredJobGenTask
saveTask = New DeferredOperations.DeferredJobGenTask("SAVE_LATER", params)

Dim op As DeferredOperations.DeferredOperation
op = New DeferredOperations.DeferredOperation(obj, saveTask, newEffDate)


However, v7.1.1 does not have the DeferredOperation and DeferredJobGenTask classes. Is there an alternative approach to get this done in v7.1.1?


This is similar to the forum post below where the OP is trying to create deferred operations to save objects instead of generating events:


Thanks in advance,


  • Hi Febin,

    just to ensure that everyone knows how-to do it.


    How-to create deferred operations in V7


    Starting with version 7 the deferred operations had to be restructured for the new object layer. An usage analysis led to the conclusion that the costs for keeping the class VI.DB.DeferredOperations.DeferredOperation in the compatibility layer were too high to keep it.

    Migration from 6 to 7

    If you used the class VI.DB.DeferredOperations.DeferredOperation in your scripts in version 6 or below, you have to change the usage accordingly in version 7.


    The following two code samples demonstrate the use of the class VI.DB.DeferredOperations.DeferredBlock in version 7.

    Sample: Using a Deferred Block for IEntities

    ' Create a new DeferredBlock for a point in time.
    Using New VI.DB.DeferredOperations.DeferredBlock(Session, DateTime.UtcNow.AddDays(45), "Optional description for operation")
        ' Operations done here are done deferred
        Dim dbObj = Session.Source().CreateNew("PersonInOrg")
        Using uow = Session.StartUnitOfWork()
        End Using
    End Using

    Sample: Using a deferred block for ISingleDBObjects

    ' Create a new DeferredBlock for a point in time.
    Using New VI.DB.DeferredOperations.DeferredBlock(Connection, DateTime.UtcNow.AddDays(45), "Optional description for operation")
        ' Operations done here are done deferred
        Dim dbObj = Connection.CreateSingle("PersonInOrg")
    End Using
  • In reply to Markus Weiss-Ehlers:

    Thanks Markus. This is very close to what I need. However, I need to defer the generation of an event on an ISingleDBObject (obj in my code above).

    I know the IUnitOfWork has a Generate method that lets you generate an event. Is there something similar for ISingleDBObject?

  • In reply to fmoideen:

    The deferred operations do not support this.

    But you can generate an event with the start time of the first process step set to the future.

    The following code sample demonstrates this for ISingleDBObject and for IEntity.

        Imports System.Collections.Generic
    #End If
    Public Sub SDK_GenerateEvent_StartingInTheFuture()
        Dim htParameter = New Dictionary(Of String, Object)(StringComparer.OrdinalIgnoreCase) ' Dictionary for any additional parameters
        Dim dbObj As ISingleDbObject = Connection.CreateSingle("DialogTimeZone""QBM-FF60FBBFC1C18061DF4456004F7B34D2")
        ' Add parameter __STARTTIME with the start time of your choice.
        ' OPTION 1: Generation using ISingleDBObject
        VI.DB.JobGeneration.JobGen.Generate(dbObj, "UPDATEUTCOFFSET", htParameter)
         ' OPTION 2: Generation using UnitOfWork and iEntity
        Using uow As IUnitOfWork = Session.StartUnitOfWork()
            uow.Generate(dbObj.GetEntity(), "UPDATEUTCOFFSET", htParameter)
            ' Commit the changes         uow.Commit()     End Using End Sub
  • In reply to Markus Weiss-Ehlers:

    Thanks Markus!

    This is definitely a great solution.