AFDatabase.FindChangedItems Method (AFIdentity, Boolean, Int32, Object, Object)
- Last UpdatedNov 18, 2025
- 7 minute read
- PI System
- AF SDK 2024 R2
- Developer
Find all the items that have changed in the AFDatabase of the
specified type.
Namespace: OSIsoft.AF
Assembly: OSIsoft.AFSDK (in OSIsoft.AFSDK.dll) Version: 3.1.1.1182
Syntax
public IList<AFChangeInfo> FindChangedItems( AFIdentity identity, bool searchSandbox, int maxCount, Object cookie, out Object nextCookie )
Public Function FindChangedItems ( identity As AFIdentity, searchSandbox As Boolean, maxCount As Integer, cookie As Object, <OutAttribute> ByRef nextCookie As Object ) As IList(Of AFChangeInfo) Dim instance As AFDatabase Dim identity As AFIdentity Dim searchSandbox As Boolean Dim maxCount As Integer Dim cookie As Object Dim nextCookie As Object Dim returnValue As IList(Of AFChangeInfo) returnValue = instance.FindChangedItems(identity, searchSandbox, maxCount, cookie, nextCookie)
public: IList<AFChangeInfo>^ FindChangedItems( AFIdentity identity, bool searchSandbox, int maxCount, Object^ cookie, [OutAttribute] Object^% nextCookie )
member FindChangedItems : identity : AFIdentity * searchSandbox : bool * maxCount : int * cookie : Object * nextCookie : Object byref -> IList<AFChangeInfo>
Parameters
- identity
- Type: OSIsoft.AFAFIdentity
The AFIdentity of the type of objects should be returned if they have changed. Specifying an identify for any category type (e.g. CategoryElement or CategoryTable) will return changes for all category types. - searchSandbox
- Type: SystemBoolean
If , then items saved to the sandbox but not checked into the database are also searched. Setting this value to is a slower operation, therefore set this parameter to unless you need changed items from the sandbox to be checked. - maxCount
- Type: SystemInt32
The maximum number of changes to be returned. - cookie
- Type: SystemObject
Use the return from a previous call to this method to find all changes since the last call. Pass to return all changes since the database was last loaded or refreshed. Pass an AFTime to find all changes since a particular time. - nextCookie
- Type: SystemObject
An object to pass into the next call to this method to find all changes since the previous call.
Return Value
Type: IListAFChangeInfoReturns a list of AFChangeInfo structures which represent the items that have changed in the server.
Remarks
This method can be used to determine what objects have changed on the server since
a specified time. Changes to the sandbox using ApplyChanges
are not included unless searchSandbox is set to .
Only the objects of the specified AFIdentity type will be checked
and returned.
The AFChangeInfoFindObject or Refresh(PISystem, IEnumerableAFChangeInfo)
methods can be used to find the actual object represented by the returned AFChangeInfo structure.
Examples
// This example demonstrates getting changes made by other users // and refreshing the objects. // Get the System and System Cookie PISystem myPISystem = new PISystems().DefaultPISystem; object sysCookie = myPISystem.GetFindChangedItemsCookie(searchSandbox: false); // Wait for changes to be made... //======================================================= // Find changes made by other users. List<AFChangeInfo> list = new List<AFChangeInfo>(); int resultsPerPage = 1000; while (true) { var results = myPISystem.FindChangedItems(false, true, resultsPerPage, sysCookie, out sysCookie); if ((results?.Count ?? 0) == 0) break; list.AddRange(results); } // Refresh objects that have been changed. AFChangeInfo.Refresh(myPISystem, list); // Find the objects that have been changed. foreach (AFChangeInfo info in list) { AFObject myObj = info.FindObject(myPISystem, false); Console.WriteLine("Found changed object: {0}", myObj); }
' This example demonstrates getting changes made by other users ' and refreshing the objects. ' Get the System and System Cookie Dim myPISystem As PISystem = New PISystems().DefaultPISystem Dim sysCookie As Object = myPISystem.GetFindChangedItemsCookie(searchSandbox:=False) ' Wait for changes to be made... '======================================================= ' Find changes made by other users. Dim list As New List(Of AFChangeInfo)() Dim resultsPerPage As Integer = 1000 While True Dim results As IList(Of AFChangeInfo) _ = myPISystem.FindChangedItems(False, True, resultsPerPage, sysCookie, sysCookie) If ((results Is Nothing) OrElse (results.Count = 0)) Then Exit While End If list.AddRange(results) End While ' Refresh objects that have been changed. AFChangeInfo.Refresh(myPISystem, list) ' Find the objects that have been changed. For Each info As AFChangeInfo In list Dim myObj As AFObject = info.FindObject(myPISystem, False) Console.WriteLine("Found changed object: {0}", myObj) Next
No code example is currently available or this language may not be supported.
No code example is currently available or this language may not be supported.
// This example demonstrates persisting and restoring the cookie // using the XmlSerializer. Other serializers could also be used. // Then the cookie is restored and used to get changes made while // the application was shut down. // Get the System and Database and their Cookie Values PISystem myPISystem = new PISystems().DefaultPISystem; AFDatabase myDB = myPISystem.Databases.DefaultDatabase; object sysCookie = myPISystem.GetFindChangedItemsCookie(searchSandbox: false); object dbCookie; myDB.FindChangedItems(false, int.MaxValue, null, out dbCookie); // Persist the cookie if you want to save to pick up changes // where you left off after restarting application. string tmpDir = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); string sysCookieFile = Path.Combine(tmpDir, "AFSysCookie.xml"); string dbCookieFile = Path.Combine(tmpDir, "AFDbCookie.xml"); XmlSerializer serializer = new XmlSerializer(typeof(object[])); using (var stream = File.Create(sysCookieFile)) { serializer.Serialize(stream, sysCookie); } using (var stream = File.Create(dbCookieFile)) { serializer.Serialize(stream, dbCookie); } // Shut down application, and wait for changes to be made... //======================================================= // After application restarts, reload persisted cookies. using (var stream = File.OpenRead(sysCookieFile)) { sysCookie = serializer.Deserialize(stream); } using (var stream = File.OpenRead(dbCookieFile)) { dbCookie = serializer.Deserialize(stream); } // Find changes made while application not running. List<AFChangeInfo> list = new List<AFChangeInfo>(); int resultsPerPage = 1000; while (true) { var results = myPISystem.FindChangedItems(false, resultsPerPage, sysCookie, out sysCookie); if ((results?.Count ?? 0) == 0) break; list.AddRange(results); } while (true) { var results = myDB.FindChangedItems(false, resultsPerPage, dbCookie, out dbCookie); if ((results?.Count ?? 0) == 0) break; list.AddRange(results); } // Find the objects that have been changed. foreach (AFChangeInfo info in list) { AFObject myObj = info.FindObject(myPISystem, false); Console.WriteLine("Found changed object: {0}", myObj); }
' This example demonstrates persisting and restoring the cookie ' using the XmlSerializer. Other serializers could also be used. ' Then the cookie is restored and used to get changes made while ' the application was shut down. ' Get the System and Database and their Cookie Values Dim myPISystem As PISystem = New PISystems().DefaultPISystem Dim myDB As AFDatabase = myPISystem.Databases.DefaultDatabase Dim sysCookie As Object = myPISystem.GetFindChangedItemsCookie(searchSandbox:=False) Dim dbCookie As Object = Nothing myDB.FindChangedItems(False, Integer.MaxValue, Nothing, dbCookie) ' Persist the cookie if you want to save to pick up changes ' where you left off after restarting application. Dim tmpDir As String = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) Dim sysCookieFile As String = Path.Combine(tmpDir, "AFSysCookie.xml") Dim dbCookieFile As String = Path.Combine(tmpDir, "AFDbCookie.xml") Dim serializer As XmlSerializer = New XmlSerializer(GetType(Object())) Using stream As FileStream = File.Create(sysCookieFile) serializer.Serialize(stream, sysCookie) End Using Using stream As FileStream = File.Create(dbCookieFile) serializer.Serialize(stream, dbCookie) End Using ' Shut down application, and wait for changes to be made... '======================================================= ' After application restarts, reload persisted cookies. Using stream As FileStream = File.OpenRead(sysCookieFile) sysCookie = serializer.Deserialize(stream) End Using Using stream As FileStream = File.OpenRead(dbCookieFile) dbCookie = serializer.Deserialize(stream) End Using ' Find changes made while application not running. Dim list As List(Of AFChangeInfo) = New List(Of AFChangeInfo) Dim resultsPerPage As Integer = 1000 While True Dim results As IList(Of AFChangeInfo) _ = myPISystem.FindChangedItems(False, resultsPerPage, sysCookie, sysCookie) If ((results Is Nothing) OrElse (results.Count = 0)) Then Exit While End If list.AddRange(results) End While While True Dim results As IList(Of AFChangeInfo) _ = myDB.FindChangedItems(False, resultsPerPage, dbCookie, dbCookie) If ((results Is Nothing) OrElse (results.Count = 0)) Then Exit While End If list.AddRange(results) End While list.AddRange(myPISystem.FindChangedItems(False, Integer.MaxValue, sysCookie, sysCookie)) list.AddRange(myDB.FindChangedItems(False, Integer.MaxValue, dbCookie, dbCookie)) ' Find the objects that have been changed. For Each info As AFChangeInfo In list Dim myObj As AFObject = info.FindObject(myPISystem, False) Console.WriteLine("Found changed object: {0}", myObj) Next
No code example is currently available or this language may not be supported.
No code example is currently available or this language may not be supported.