11. One Identity скрипт по импорту пользователей

6 ноября 2020 г.

13:55

#If Not SCRIPTDEBUGGER Then

References VI.DataImport.dll

Imports System.Collections.Generic

Imports System.IO

Imports System.Globalization

Imports VI.DB.Entities

Imports VI.DB.Specialized

Imports VI.DataImport

#End If

Public Sub CCC_Person_Import (ByVal dfImport As DataFileImport)

' Standard variables

Dim logSection As IDisposable

' Table

Dim table = Connection.Tables("Person")

' Line counter

Dim counter As New LineCounter()

' Value provider

Dim lineData As New LineValueProvider(New String() {"ID", "FName", "LName", "SiteRegion", "OrigCostCenter", "ZeroFilledCostCenter", "Department", "employee_status", "Company", "DefaultYardID", "DefaultSiteID", "ExceptSiteID", "Title", "ExceptTitle", "ExceptTelephone", "ExceptFax", "UID_PersonHead","JobCode","JobCodeText", "JobCodeType", "", ""})

' Import from an external database

Dim lineProvider As ILineProvider

Dim dbLineProvider As New DbLineProvider()

dbLineProvider.ProviderName = "System.Data.SqlClient.SqlClientFactory, System.Data, Version=[REDACTED_IP], Culture=neutral, PublicKeyToken=b77a5c561934e089"

dbLineProvider.ConnectionString = "Data Source=" + Connection.GetConfigParm("Custom\DataImport\EmployeeImport\dataSource") _

+ ";Initial Catalog=" + Connection.GetConfigParm("Custom\DataImport\EmployeeImport\catalog") _

+ ";User ID=" + Connection.GetConfigParm("Custom\DataImport\EmployeeImport\user") + ";Password=" + dfIMport.Options + ";Pooling=False"

dbLineProvider.TimeZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time")

' SQL statement

Dim statement As New PlainSqlStatement()

statement.Statement = "select ID,FName,LName,SiteRegion,OrigCostCenter,ZeroFilledCostCenter,Department,employee_status,Company,DefaultYardID,DefaultSiteID,ExceptSiteID,Title,ExceptTitle,ExceptTelephone,ExceptFax,UID_PersonHead,JobCode, JobCodeText, JobCodeType " & _

" from [dbo].[CCC_D1_Employee_Build]"

'0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

'DefaultSiteID = CustomProperty08

'ExceptSiteID = CustomProperty03

dbLineProvider.Statement = statement

lineProvider = dbLineProvider

'

' Configure column resolution

'

' Column indices

Const iPersonnelNumber = 0

Const iFirstName = 1

Const iLastName = 2        

Const iCustomProperty02 = 3

Const iCustomProperty04 = 4

Const iUID_ProfitCenter = 5

Const iUID_Department = 6

Const iCustomProperty10 = 7

Const iCompanyMember = 8

Const iCustomProperty01 = 9

Const iCustomProperty08 = 10

Const iCustomProperty03 = 11

Const iPersonalTitle = 12

Const iCustomProperty05 = 13

Const iCustomProperty06 = 14

Const iCustomProperty07 = 15

Const iUID_PersonHead = 16

Const iCCC_JobCode = 17

Const iCCC_JobCodeText = 18

Const iCCC_JobCodeType = 19

' Resolver to get column data from import data

Dim columnCompanyMember As IResolveImportValue = New ResolveImportValueSimple("CompanyMember")

Dim columnCustomProperty01 As IResolveImportValue = New ResolveImportValueSimple("CustomProperty01")

Dim columnCustomProperty02 As IResolveImportValue = New ResolveImportValueSimple("CustomProperty02")

Dim columnCustomProperty03 As IResolveImportValue = New ResolveImportValueSimple("CustomProperty03")

Dim columnCustomProperty04 As IResolveImportValue = New ResolveImportValueSimple("CustomProperty04")

Dim columnCustomProperty05 As IResolveImportValue = New ResolveImportValueSimple("CustomProperty05")

Dim columnCustomProperty06 As IResolveImportValue = New ResolveImportValueSimple("CustomProperty06")

Dim columnCustomProperty07 As IResolveImportValue = New ResolveImportValueSimple("CustomProperty07")

Dim columnCustomProperty08 As IResolveImportValue = New ResolveImportValueSimple("CustomProperty08")

Dim columnCustomProperty09 As IResolveImportValue = New ResolveImportValueSimple("CustomProperty09")

Dim columnCustomProperty10 As IResolveImportValue = New ResolveImportValueSimple("CustomProperty10")

Dim columnFirstName As IResolveImportValue = New ResolveImportValueSimple("FirstName")

Dim columnLastName As IResolveImportValue = New ResolveImportValueSimple("LastName")

Dim columnPersonalTitle As IResolveImportValue = New ResolveImportValueSimple("PersonalTitle")

Dim columnPersonnelNumber As IResolveImportValue = New ResolveImportValueSimple("PersonnelNumber")

' Build a dictionary: The last parameter forces exceptions when duplicate keys are found

Dim columnUID_Department As New ResolveImportValueHashed( _

Connection, _

ObjectWalker.ColDefs(table, "FK(UID_Department).DepartmentName"), False)

' Build a dictionary: The last parameter forces exceptions when duplicate keys are found

Dim columnUID_Locality As New ResolveImportValueHashed( _

Connection, _

ObjectWalker.ColDefs(table, "FK(UID_Locality).Ident_locality"), False)

' Build a dictionary: The last parameter forces exceptions when duplicate keys are found

Dim columnUID_PersonHead As New ResolveImportValueHashed( _

Connection, _

ObjectWalker.ColDefs(table, "FK(UID_PersonHead).PersonnelNumber"), False)        

'Dim columnUID_PersonHead As IResolveImportValue = New ResolveImportValueSimple("UID_PersonHead")

Dim columnCCC_JobCode As IResolveImportValue = New ResolveImportValueSimple("CCC_JobCode")

Dim columnCCC_JobCodeText As IResolveImportValue = New ResolveImportValueSimple("CCC_JobCodeText")

Dim columnCCC_JobCodeType As IResolveImportValue = New ResolveImportValueSimple("CCC_JobCodeType")

' Build a dictionary: The last parameter forces exceptions when duplicate keys are found

Dim columnUID_ProfitCenter As New ResolveImportValueHashed( _

Connection, _

ObjectWalker.ColDefs(table, "FK(UID_ProfitCenter).AccountNumber"), False)

Try

'

' Create a dictionary for the destination table

'

Dim colImport As IEntityCollection

Dim elemsByKey As New Dictionary(Of String, IEntity)(StringComparer.OrdinalIgnoreCase)

Dim imported As New HashSet(Of DbObjectKey)()

logSection = dfImport.LogSection(#LD("Indexing existing data...")#)

Try

Dim query As Query = Query.From("Person").SelectNone()

' Set keys and values as display items to load them with the collection

query = query.Select("CompanyMember")

query = query.Select("CustomProperty01")

query = query.Select("CustomProperty02")

query = query.Select("CustomProperty03")

query = query.Select("CustomProperty04")

query = query.Select("CustomProperty05")

query = query.Select("CustomProperty06")

query = query.Select("CustomProperty07")

query = query.Select("CustomProperty08")

query = query.Select("CustomProperty09")

query = query.Select("CustomProperty10")

query = query.Select("FirstName")

query = query.Select("LastName")

query = query.Select("PersonalTitle")

query = query.Select("PersonnelNumber")

query = query.Select("UID_Department")

query = query.Select("UID_Locality")

query = query.Select("UID_PersonHead")

query = query.Select("UID_ProfitCenter")

query = query.Select("xmarkedfordeletion")

query = query.Select("CCC_JobCode")

query = query.Select("CCC_JobCodeText")

query = query.Select("CCC_JobCodeType")

' Load the collection

colImport = Session.Source().GetCollection(query, EntityCollectionLoadType.Slim)

' Put the entries in the dictionary

For Each elem In colImport

Dim key As String

key = elem.GetValue("PersonnelNumber").String

If elemsByKey.ContainsKey(key) Then

dfImport.Log(MsgSeverity.Serious, #LD("Duplicate key: {0}", key)#)

Else

elemsByKey.Add(key, elem)

End If

Next

Finally

If Not logSection Is Nothing Then

logSection.Dispose()

logSection = Nothing

End If

End Try

logSection = dfImport.LogSection(#LD("Import data from file")#)

Try

For Each line As Line In lineProvider.GetLines(counter)

' Pay attention to the Stop flag

If StopProcessing Then

dfImport.Log(MsgSeverity.Warning, #LD("Import was stopped.")#)

Exit For

End If

Try

' Get raw data from the current line

Dim key As String

line.Add("Fixed value")

line.Add("Fixed value")

Dim valCCC_JobCode As String

Dim resCCC_JobCode As String

Dim valCCC_JobCodeText As String

Dim resCCC_JobCodeText As String

Dim valCCC_JobCodeType As String

Dim resCCC_JobCodeType As String

Dim valCompanyMember As String

Dim resCompanyMember As String

Dim valCustomProperty01 As String

Dim resCustomProperty01 As String

Dim valCustomProperty02 As String

Dim resCustomProperty02 As String

Dim valCustomProperty03 As String

Dim resCustomProperty03 As String

Dim valCustomProperty04 As String

Dim resCustomProperty04 As String

Dim valCustomProperty05 As String

Dim resCustomProperty05 As String

Dim valCustomProperty06 As String

Dim resCustomProperty06 As String

Dim valCustomProperty07 As String

Dim resCustomProperty07 As String

Dim valCustomProperty08 As String

Dim resCustomProperty08 As String

Dim valCustomProperty09 As String

Dim resCustomProperty09 As String

Dim valCustomProperty10 As String

Dim resCustomProperty10 As String

Dim valFirstName As String

Dim resFirstName As String

Dim valLastName As String

Dim resLastName As String

Dim valPersonalTitle As String

Dim resPersonalTitle As String

Dim valPersonnelNumber As String

Dim resPersonnelNumber As String

Dim valUID_Department As String

Dim resUID_Department As String

Dim valUID_Locality As String

Dim resUID_Locality As String

Dim valUID_PersonHead As String

Dim resUID_PersonHead As String

Dim valUID_ProfitCenter As String

Dim resUID_ProfitCenter As String

valCompanyMember = line.GetValue(iCompanyMember)

valCustomProperty01 = line.GetValue(iCustomProperty01)

valCustomProperty02 = line.GetValue(iCustomProperty02)

valCustomProperty03 = line.GetValue(iCustomProperty03)

valCustomProperty04 = line.GetValue(iCustomProperty04)

valCustomProperty05 = line.GetValue(iCustomProperty05)

valCustomProperty06 = line.GetValue(iCustomProperty06)

valCustomProperty07 = line.GetValue(iCustomProperty07)

valCustomProperty08 = line.GetValue(iCustomProperty08)

valCustomProperty09 = "Fixed value"

valCustomProperty10 = line.GetValue(iCustomProperty10)

valFirstName = line.GetValue(iFirstName)

valLastName = line.GetValue(iLastName)

valPersonalTitle = line.GetValue(iPersonalTitle)

valPersonnelNumber = line.GetValue(iPersonnelNumber)

valUID_Department = line.GetValue(iUID_Department)

valUID_Locality = "Fixed value"

valUID_PersonHead = line.GetValue(iUID_PersonHead)

valUID_ProfitCenter = line.GetValue(iUID_ProfitCenter)

valCCC_JobCode = line.GetValue(iCCC_JobCode)

valCCC_JobCodeText = line.GetValue(iCCC_JobCodeText)

valCCC_JobCodeType = line.GetValue(iCCC_JobCodeType)

'

' Here is the place to check and change raw data

'

lineData.Line = line

Value = valCustomProperty09

' Start of convert script for CustomProperty09

Value="Feed Employee"

' End of convert script for CustomProperty09

valCustomProperty09 = DbVal.ConvertTo(Of String)(Value)

'DefaultSiteID = CustomProperty08

'ExceptSiteID = CustomProperty03

Value = valUID_Locality

'VID_WRITE2LOG("\DC1IAMOPSQAS01\c\$\working\Data_Import_Logs\personimport_locality.log", "Locality value = " & valUID_Locality)

'VID_WRITE2LOG("\DC1IAMOPSQAS01\c\$\working\Data_Import_Logs\personimport_locality.log", "ExceptSiteID = " & valCustomProperty03)

'VID_WRITE2LOG("\DC1IAMOPSQAS01\c\$\working\Data_Import_Logs\personimport_locality.log", "DefaultSiteID = " & valCustomProperty08)

' Start of convert script for UID_Locality

If Not String.IsNullOrEmpty(valCustomProperty03)

'Value = line.GetValue("ExceptSiteID").String

Value = valCustomProperty03

Else

'Value = GetValue("DefaultSiteID").String

Value = valCustomProperty08

End If

' End of convert script for UID_Locality

valUID_Locality = DbVal.ConvertTo(Of String)(Value)

'VID_WRITE2LOG("\DC1IAMOPSQAS01\c\$\working\Data_Import_Logs\personimport_locality.log", "Ending value = " & valUID_Locality)

' Convert raw data to final column data values

resCompanyMember = DbVal.ConvertTo(Of String)(columnCompanyMember.ResolveValue(valCompanyMember), lineProvider.Culture)

resCustomProperty01 = DbVal.ConvertTo(Of String)(columnCustomProperty01.ResolveValue(valCustomProperty01), lineProvider.Culture)

resCustomProperty02 = DbVal.ConvertTo(Of String)(columnCustomProperty02.ResolveValue(valCustomProperty02), lineProvider.Culture)

resCustomProperty03 = DbVal.ConvertTo(Of String)(columnCustomProperty03.ResolveValue(valCustomProperty03), lineProvider.Culture)

resCustomProperty04 = DbVal.ConvertTo(Of String)(columnCustomProperty04.ResolveValue(valCustomProperty04), lineProvider.Culture)

resCustomProperty05 = DbVal.ConvertTo(Of String)(columnCustomProperty05.ResolveValue(valCustomProperty05), lineProvider.Culture)

resCustomProperty06 = DbVal.ConvertTo(Of String)(columnCustomProperty06.ResolveValue(valCustomProperty06), lineProvider.Culture)

resCustomProperty07 = DbVal.ConvertTo(Of String)(columnCustomProperty07.ResolveValue(valCustomProperty07), lineProvider.Culture)

resCustomProperty08 = DbVal.ConvertTo(Of String)(columnCustomProperty08.ResolveValue(valCustomProperty08), lineProvider.Culture)

resCustomProperty09 = DbVal.ConvertTo(Of String)(columnCustomProperty09.ResolveValue(valCustomProperty09), lineProvider.Culture)

resCustomProperty10 = DbVal.ConvertTo(Of String)(columnCustomProperty10.ResolveValue(valCustomProperty10), lineProvider.Culture)

resFirstName = DbVal.ConvertTo(Of String)(columnFirstName.ResolveValue(valFirstName), lineProvider.Culture)

resLastName = DbVal.ConvertTo(Of String)(columnLastName.ResolveValue(valLastName), lineProvider.Culture)

resPersonalTitle = DbVal.ConvertTo(Of String)(columnPersonalTitle.ResolveValue(valPersonalTitle), lineProvider.Culture)

resPersonnelNumber = DbVal.ConvertTo(Of String)(columnPersonnelNumber.ResolveValue(valPersonnelNumber), lineProvider.Culture)

resUID_Department = DbVal.ConvertTo(Of String)(columnUID_Department.ResolveValue(valUID_Department), lineProvider.Culture)

resUID_Locality = DbVal.ConvertTo(Of String)(columnUID_Locality.ResolveValue(valUID_Locality), lineProvider.Culture)

resUID_PersonHead = DbVal.ConvertTo(Of String)(columnUID_PersonHead.ResolveValue(valUID_PersonHead), lineProvider.Culture)

resUID_ProfitCenter = DbVal.ConvertTo(Of String)(columnUID_ProfitCenter.ResolveValue(valUID_ProfitCenter), lineProvider.Culture)

resCCC_JobCode = DbVal.ConvertTo(Of String)(columnCCC_JobCode.ResolveValue(valCCC_JobCode), lineProvider.Culture)

resCCC_JobCodeText = DbVal.ConvertTo(Of String)(columnCCC_JobCodeText.ResolveValue(valCCC_JobCodeText), lineProvider.Culture)

resCCC_JobCodeType = DbVal.ConvertTo(Of String)(columnCCC_JobCodeType.ResolveValue(valCCC_JobCodeType), lineProvider.Culture)

'

' Here is the place to check and change final column data

'

'

' Here starts the standard handling. It is recommended to not change anything beyond this point.

'

'

' Create key for this line

'

key = DbVal.ConvertTo(Of String)(resPersonnelNumber)

Dim elem As IEntity = Nothing

Dim entity As IEntity = Nothing

If elemsByKey.TryGetValue(key, elem) Then

'

' Found -> Update

'

' Mark element for superset handling

imported.Add(New DbObjectKey(table, elem))

' Map values

Dim fullEntity As New Lazy(Of IEntity)(Function() elem.Create(Session))

If DbVal.Compare(elem.GetRaw("CompanyMember"), resCompanyMember, ValType.String) \<> 0 Then

fullEntity.Value.PutValue("CompanyMember", resCompanyMember)

End If

If DbVal.Compare(elem.GetRaw("CustomProperty01"), resCustomProperty01, ValType.String) \<> 0 Then

fullEntity.Value.PutValue("CustomProperty01", resCustomProperty01)

End If

If DbVal.Compare(elem.GetRaw("CustomProperty02"), resCustomProperty02, ValType.String) \<> 0 Then

fullEntity.Value.PutValue("CustomProperty02", resCustomProperty02)

End If                                                

If DbVal.Compare(elem.GetRaw("CustomProperty03"), resCustomProperty03, ValType.String) \<> 0 Then

fullEntity.Value.PutValue("CustomProperty03", resCustomProperty03)

End If

If DbVal.Compare(elem.GetRaw("CustomProperty04"), resCustomProperty04, ValType.String) \<> 0 Then

fullEntity.Value.PutValue("CustomProperty04", resCustomProperty04)

End If

If DbVal.Compare(elem.GetRaw("CustomProperty05"), resCustomProperty05, ValType.String) \<> 0 Then

fullEntity.Value.PutValue("CustomProperty05", resCustomProperty05)

End If

If DbVal.Compare(elem.GetRaw("CustomProperty06"), resCustomProperty06, ValType.String) \<> 0 Then

fullEntity.Value.PutValue("CustomProperty06", resCustomProperty06)

End If

If DbVal.Compare(elem.GetRaw("CustomProperty07"), resCustomProperty07, ValType.String) \<> 0 Then

fullEntity.Value.PutValue("CustomProperty07", resCustomProperty07)

End If

If DbVal.Compare(elem.GetRaw("CustomProperty08"), resCustomProperty08, ValType.String) \<> 0 Then

fullEntity.Value.PutValue("CustomProperty08", resCustomProperty08)

End If

If DbVal.Compare(elem.GetRaw("CustomProperty09"), resCustomProperty09, ValType.String) \<> 0 Then

fullEntity.Value.PutValue("CustomProperty09", resCustomProperty09)

End If

If DbVal.Compare(elem.GetRaw("CustomProperty10"), resCustomProperty10, ValType.String) \<> 0 Then

fullEntity.Value.PutValue("CustomProperty10", resCustomProperty10)

End If

If DbVal.Compare(elem.GetRaw("FirstName"), resFirstName, ValType.String) \<> 0 Then

fullEntity.Value.PutValue("FirstName", resFirstName)

End If

If DbVal.Compare(elem.GetRaw("LastName"), resLastName, ValType.String) \<> 0 Then

fullEntity.Value.PutValue("LastName", resLastName)

End If

If DbVal.Compare(elem.GetRaw("PersonalTitle"), resPersonalTitle, ValType.String) \<> 0 Then

fullEntity.Value.PutValue("PersonalTitle", resPersonalTitle)

End If

If DbVal.Compare(elem.GetRaw("UID_Department"), resUID_Department, ValType.String) \<> 0 Then

fullEntity.Value.PutValue("UID_Department", resUID_Department)

End If

If DbVal.Compare(elem.GetRaw("UID_Locality"), resUID_Locality, ValType.String) \<> 0 Then

fullEntity.Value.PutValue("UID_Locality", resUID_Locality)

End If

If DbVal.Compare(elem.GetRaw("UID_PersonHead"), resUID_PersonHead, ValType.String) \<> 0 Then

fullEntity.Value.PutValue("UID_PersonHead", resUID_PersonHead)

End If

If DbVal.Compare(elem.GetRaw("UID_ProfitCenter"), resUID_ProfitCenter, ValType.String) \<> 0 Then

fullEntity.Value.PutValue("UID_ProfitCenter", resUID_ProfitCenter)

End If

If DbVal.Compare(elem.GetRaw("CCC_JobCode"), resCCC_JobCode, ValType.String) \<> 0 Then

fullEntity.Value.PutValue("CCC_JobCode", resCCC_JobCode)

End If

If DbVal.Compare(elem.GetRaw("CCC_JobCodeText"), resCCC_JobCodeText, ValType.String) \<> 0 Then

fullEntity.Value.PutValue("CCC_JobCodeText", resCCC_JobCodeText)

End If

If DbVal.Compare(elem.GetRaw("CCC_JobCodeType"), resCCC_JobCodeType, ValType.String) \<> 0 Then

fullEntity.Value.PutValue("CCC_JobCodeType", resCCC_JobCodeType)

End If

If fullEntity.IsValueCreated Or elem.IsDeleted() Then

entity = fullEntity.Value

Else

counter.Increment(LineType.Unchanged)

End If

Else

'

' Not found -> Insert

'

entity = Session.Source().CreateNew("Person")

' Fill keys and values

entity.PutValue("CompanyMember", resCompanyMember)

entity.PutValue("CustomProperty01", resCustomProperty01)

entity.PutValue("CustomProperty02", resCustomProperty02)

entity.PutValue("CustomProperty03", resCustomProperty03)

entity.PutValue("CustomProperty04", resCustomProperty04)

entity.PutValue("CustomProperty05", resCustomProperty05)

entity.PutValue("CustomProperty06", resCustomProperty06)

entity.PutValue("CustomProperty07", resCustomProperty07)

entity.PutValue("CustomProperty08", resCustomProperty08)

entity.PutValue("CustomProperty09", resCustomProperty09)

entity.PutValue("CustomProperty10", resCustomProperty10)

entity.PutValue("FirstName", resFirstName)

entity.PutValue("LastName", resLastName)

entity.PutValue("PersonalTitle", resPersonalTitle)

entity.PutValue("PersonnelNumber", resPersonnelNumber)

entity.PutValue("UID_Department", resUID_Department)

entity.PutValue("UID_Locality", resUID_Locality)

entity.PutValue("UID_PersonHead", resUID_PersonHead)

entity.PutValue("UID_ProfitCenter", resUID_ProfitCenter)

entity.PutValue("CCC_JobCode", resCCC_JobCode)

entity.PutValue("CCC_JobCodeText", resCCC_JobCodeText)

entity.PutValue("CCC_JobCodeType", resCCC_JobCodeType)

End If

'

' Additional values can be put into the entity here

'

If Not entity Is Nothing Then

If entity.IsDeleted() Then

' Recall deleted entity

entity.MarkForRecall()

End If

Dim isUpdate As Boolean = entity.IsLoaded

' Save it

If entity.IsDifferent Then

entity.Save(Session)

If isUpdate Then

counter.Increment(LineType.Updated)

Else

counter.Increment(LineType.Inserted)

End If

Else

counter.Increment(LineType.Unchanged)

End If

If elem Is Nothing Then

' Include in our collection to avoid double imports of elements

Dim keyInsert As String

keyInsert = entity.GetValue("PersonnelNumber").String

elemsByKey(keyInsert) = entity

imported.Add(New DbObjectKey(table, entity))

End If

End If

Catch ex As Exception

dfImport.Log(MsgSeverity.Serious, #LD("Error in line {0}: {1}", counter(LineType.Total), ViException.ErrorString(ex))#)

dfImport.Log(MsgSeverity.Serious, #LD("Line data was: {0}", line.ToString())#)

counter.Increment(LineType.Error)

End Try

If (counter(LineType.Total) Mod 100) = 0 Then

dfImport.SetProgressInfo(#LD("{0} lines imported, {1} ignored, {2} inserted, {3} updated, {4} errors", counter(LineType.Total), counter(LineType.Unchanged), counter(LineType.Inserted), counter(LineType.Updated), counter(LineType.Error))#)

End If

Next ' ForEach line

Finally

If Not logSection Is Nothing Then

logSection.Dispose()

logSection = Nothing

End If

End Try

'

' No superset handling

'

Finally

End Try

Using dfImport.LogSection(#LD("Results")#)

dfImport.Log(#LD("{0} lines imported", counter(LineType.Total))#)

dfImport.Log(#LD("{0} header lines", counter(LineType.Header))#)

dfImport.Log(#LD("{0} inserted", counter(LineType.Inserted))#)

dfImport.Log(#LD("{0} changed", counter(LineType.Updated))#)

dfImport.Log(#LD("{0} deleted", counter(LineType.Deleted))#)

dfImport.Log(#LD("{0} not changed", counter(LineType.Unchanged))#)

dfImport.Log(#LD("{0} not found", counter(LineType.NotFound))#)

dfImport.Log(#LD("{0} empty lines", counter(LineType.Empty))#)

dfImport.Log(#LD("{0} errors", counter(LineType.Error))#)

End Using

End Sub

https://www.oneidentity.com/community/identity-manager/f/forum/22079/sync-process-fails-for-user-with-locked-property