Hi people,
this is a known issue which is described in this link. Basically DPRObjectOperations are not created when creating synchronisation projects from custom templates, which means AdHoc Provisioning Processes do not work unless the provisioning process operation objects are created.
If you are experiencing this issue right now, I wrote a script which will automatically create the necessary DPRObjectOperation objects for a given Namespace (currently ADS, EX0 and SAP). I thought I'd give back to the community, I hope you can make good use of the script. Feedback on this subject greatly appreciated.
Cheers,
Ryu
Public Sub CCC_Set_AllDPRObjectOperationsForTargetSystem(ByVal dprShellDisplayName As String,
ByVal targetSystem As String,
Optional ByVal provisioningName As String = "Provisioning",
Optional ByVal eventTypes As String = "Insert,Update,Delete",
Optional ByVal deleteDuplicates As Boolean = False)
'==========Note to User==========
' Use script to create DPRObject Operation types for a namespace and Synchronisation Project e.g. ADS, SAP or EX0
' Open a new connection in designer to check that the DPRObjectOperation Objects have been created
' ===For Example CCC_Set_AllDPRObjectOperationsForTargetSystem("SAP Connector(ABC - 404)", "SAP", Nothing, Nothing, Nothing)
' In the above example, the "Provisioning" workflow in the synchronisation project "SAP Connector(ABC - 404)" will be used for "Insert", "Update" and "Delete" operations
' ===For Example CCC_Set_AllDPRObjectOperationsForTargetSystem("Active Directory Connector (XYZ)", "ADS", Nothing, "Insert,Update", Nothing)
' In the above example, the "Provisioning" workflow in the synchronisation project "Active Directory Connector (XYZ)" will be used for "Insert" and "Update" operations
' ===For Example CCC_Set_AllDPRObjectOperationsForTargetSystem("Active Directory Connector (XYZ)", "ADS", "Delete", "Delete", True)
' In the above example, the "Delete" workflow in the synchronisation project "Active Directory Connector (XYZ)" will be used for "Delete" operations.
' Furthermore duplicate entries of entries to be created found in the table DPRObjectOperation will be removed before creating the new entry.
'================================
Dim f As ISqlFormatter = Session.SqlFormatter
Dim whereClause As String = String.Empty
' Get UID_DPRShell (Sync Projects)
Dim uidDPRShell As String = String.Empty
whereClause = f.Comparison("DisplayName", dprShellDisplayName, ValType.String, CompareOperator.Equal, FormatterOptions.IgnoreCase)
If Not Session.Source.TryGetSingleValue("DPRShell", "UID_DPRShell", whereClause, uidDPRShell) Then
Throw New Exception("Could not retrieve a valid UID_DPRShell (Sync Project) from DPRShell by using the condition: DisplayName = " & whereClause)
End If
' Get DPRSystemConnection (Connections) using DPRShell
Dim uidDPRSystemConnection As String = String.Empty
whereClause = f.AndRelation(
f.UidComparison("UID_DPRShell", uidDPRShell),
f.Comparison("Name","ConnectedSystemConnection", ValType.String))
If Not Session.Source.TryGetSingleValue("DPRSystemConnection", "UID_DPRSystemConnection", whereClause, uidDPRSystemConnection) _
Then
Throw New Exception("Could not retrieve a valid UID_DPRSystemConnection (Connections) from DPRSystemConnection by using the condition: UID_DPRShell =" & whereClause)
End If
' Get DPRProjectionConfig (Workflows) using DPRShell
Dim uidDPRProjectionConfig As String = String.Empty
whereClause = f.AndRelation(
f.UidComparison("UID_DPRShell", uidDPRShell),
f.Comparison("Name", provisioningName, ValType.String, CompareOperator.Equal, FormatterOptions.IgnoreCase)
)
If Not Session.Source.TryGetSingleValue("DPRProjectionConfig", "UID_DPRProjectionConfig", whereClause, uidDPRProjectionConfig) Then
Throw New Exception("Could not retrieve a valid UID_DPRProjectionConfig (Workflow) from DPRProjectionConfig by using the condition: " & whereClause)
End If
' Create a list of relevant DialogTables for Namespace
Dim uidDialogTable As String() = Nothing
Select Case UCase(targetSystem)
Case "ADS"
uidDialogTable = {"ADS-T-ADSAccount",
"ADS-T-ADSContact",
"ADS-T-ADSContainer",
"ADS-T-ADSDomain",
"ADS-T-ADSGroup",
"ADS-T-ADSMachine",
"ADS-T-ADSPolicy",
"ADS-T-ADSPrinter"}
Case "EX0"
uidDialogTable = {"EX0-T-EX0DL",
"EX0-T-EX0MailBox",
"EX0-T-EX0MailContact",
"EX0-T-EX0MailUser"}
Case "SAP"
uidDialogTable = {"SAP-T-SAPComFax",
"SAP-T-SAPComPhone",
"SAP-T-SAPComSMTP",
"SAP-T-SAPUser",
"SAP-T-SAPUserExtId",
"SAP-T-SAPUserHasLicence",
"SAP-T-SAPUserHasParameter",
"SAP-T-SAPUserInSAPGrp",
"SAP-T-SAPUserInSAPMandant",
"SAP-T-SAPUserInSAPProfile",
"SAP-T-SAPUserInSAPRole"}
Case Else
Throw New Exception(String.Format("Cannot create DPRObjectOperation objects for Target System""{0}"" . " &
"Please add target system definition to the script ""CCC_Set_AllDPRObjectOperationsForTargetSystem""", targetSystem))
End Select
' Create Operation Types
Dim operationTypes As String() = eventTypes.Split({","}, StringSplitOptions.RemoveEmptyEntries)
For Each operation In operationTypes
For Each table In uidDialogTable
' Create object to be committed
Dim dprobjectOperation As IEntity = Session.Source.CreateNew("DPRObjectOperation")
dprobjectOperation.PutValue("UID_DialogTable", table)
dprobjectOperation.PutValue("UID_DPRProjectionConfig", uidDPRProjectionConfig)
dprobjectOperation.PutValue("UID_DPRSystemConnection", uidDPRSystemConnection)
dprobjectOperation.PutValue("Name", operation)
dprobjectOperation.PutValue("DisplayName", operation)
dprobjectOperation.PutValue("Description", "Default operation generated by CCC_Set_AllDPRObjectOperationsForTargetSystem")
' Check for duplicate
Dim duplicateExists As Boolean = False
Dim duplicate As IEntity = Nothing
Dim qDuplicate = Query.From("DPRObjectOperation").Where(f.AndRelation(
f.UidComparison("UID_DialogTable", table),
f.UidComparison("UID_DPRProjectionConfig", uidDPRProjectionConfig),
f.UidComparison("UID_DPRSystemConnection", uidDPRSystemConnection),
f.Comparison("Name", operation, ValType.String,
CompareOperator.Equal, FormatterOptions.IgnoreCase))) _
.SelectAll
If Session.Source.TryGet(qDuplicate, EntityLoadType.Interactive, duplicate) Then
duplicateExists = True
If deleteDuplicates Then
Using uow As IUnitOfWork = Session.StartUnitOfWork
duplicate.MarkForDeletion()
uow.Put(duplicate)
uow.Commit
End Using
duplicateExists = False
End If
End If
' Create DPRObjectOperation Object
If Not duplicateExists Then
Using uow As IUnitOfWork = Session.StartUnitOfWork
uow.Put(dprobjectOperation)
uow.Commit
End Using
End If
Next
Next
End Sub