﻿<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>StrataFrame Forum » StrataFrame Application Framework - V1 » Business Objects and Data Access (How do I?)  » How to know what fields has changed on the BO when the saved</title><generator>InstantForum 2017-1 Final</generator><description>StrataFrame Forum</description><link>http://forum.strataframe.net/</link><webMaster>StrataFrame Forum</webMaster><lastBuildDate>Sat, 30 May 2026 13:17:51 GMT</lastBuildDate><ttl>20</ttl><item><title>How to know what fields has changed on the BO when the saved</title><link>http://forum.strataframe.net/FindPost29511.aspx</link><description>Hi SF,&lt;br/&gt;&lt;br/&gt;My client has asked me to send an email alert when a value has changed in a field for a record.&amp;nbsp; Is there an event the BO fires that I can handle which tells me what fields has changed and the before and after values of those fields?&lt;br/&gt;&lt;br/&gt;Or does anyone have any suggestions on how I can do this?&lt;br/&gt;&lt;br/&gt;Thanks,&lt;br/&gt;&lt;br/&gt;Jeff&lt;br/&gt;&lt;br/&gt;Using C#/Visual Studio 2008</description><pubDate>Fri, 04 Mar 2011 10:37:23 GMT</pubDate><dc:creator>Jeff Pagley</dc:creator></item><item><title>RE: How to know what fields has changed on the BO when the saved</title><link>http://forum.strataframe.net/FindPost29642.aspx</link><description>Thanks Keith and Jeff,&lt;br/&gt;&lt;br/&gt;I think I finally figured out that in C#, the CurrentRow does not have a property named Item.&amp;nbsp; So the C# code I am using is:&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;if (! BO.CurrentRow[colCount, Data.DataRowVersion.Original] == BO.CurrentRow[colCount, Data.DataRowVersion.Current])&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;which I think is logically equivalent to Keith's VB code as follows:&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;&lt;font face=Consolas&gt;If NOT BO.CurrentRow.Item(colCount, Data.DataRowVersion.Original) = BO.CurrentRow.Item(colCount, Data.DataRowVersion.Current)&lt;/font&gt;&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;Notice the C# code does not use an Item property.&amp;nbsp; If I am off base, please let me&amp;nbsp; know.&lt;br/&gt;&lt;br/&gt;Sam Tenney</description><pubDate>Fri, 04 Mar 2011 10:37:23 GMT</pubDate><dc:creator>Sam Tenney</dc:creator></item><item><title>RE: How to know what fields has changed on the BO when the saved</title><link>http://forum.strataframe.net/FindPost29641.aspx</link><description>I have been testing this code in the BO_BeforeSave event and it seems to work:&lt;br/&gt;&lt;br/&gt;[codesnippet]&lt;br/&gt;&lt;br/&gt;&lt;font size=2&gt;&lt;/font&gt;&lt;font color=#008000 size=2&gt;&lt;font color=#008000 size=2&gt;// Established a local for the BO's current row&lt;br/&gt;&lt;br/&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt;&lt;/font&gt;&lt;font color=#2b91af size=2&gt;&lt;font color=#2b91af size=2&gt;DataRow&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt; dataRow = &lt;/font&gt;&lt;font color=#0000ff size=2&gt;&lt;font color=#0000ff size=2&gt;this&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt;.CurrentRow;&lt;br/&gt;&lt;br/&gt;&lt;/font&gt;&lt;font color=#008000 size=2&gt;&lt;font color=#008000 size=2&gt;// Iterate through the columns of the data table&lt;br/&gt;&lt;br/&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt;&lt;/font&gt;&lt;font color=#0000ff size=2&gt;&lt;font color=#0000ff size=2&gt;foreach&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt; (&lt;/font&gt;&lt;font color=#2b91af size=2&gt;&lt;font color=#2b91af size=2&gt;DataColumn&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt; item &lt;/font&gt;&lt;font color=#0000ff size=2&gt;&lt;font color=#0000ff size=2&gt;in&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt; &lt;/font&gt;&lt;font color=#0000ff size=2&gt;&lt;font color=#0000ff size=2&gt;this&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt;.CurrentDataTable.Columns)&lt;br/&gt;&lt;br/&gt;{&lt;br/&gt;&lt;br/&gt;&lt;/font&gt;&lt;font color=#008000 size=2&gt;&lt;font color=#008000 size=2&gt;// Determine what data row column to retrieve it's value&lt;br/&gt;&lt;br/&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt;&lt;/font&gt;&lt;font color=#0000ff size=2&gt;&lt;font color=#0000ff size=2&gt;if&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt; (item.ColumnName.Equals(&lt;/font&gt;&lt;font color=#a31515 size=2&gt;&lt;font color=#a31515 size=2&gt;"cc_Description"&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt;) || item.ColumnName.Equals(&lt;/font&gt;&lt;font color=#a31515 size=2&gt;&lt;font color=#a31515 size=2&gt;"coco_Description"&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt;))&lt;br/&gt;&lt;br/&gt;{&lt;br/&gt;&lt;br/&gt;&lt;/font&gt;&lt;font color=#008000 size=2&gt;&lt;font color=#008000 size=2&gt;// Compare the original version with the current to determine if it changed&lt;br/&gt;&lt;br/&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt;&lt;/font&gt;&lt;font color=#0000ff size=2&gt;&lt;font color=#0000ff size=2&gt;if&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt; (dataRow[item.ColumnName, &lt;/font&gt;&lt;font color=#2b91af size=2&gt;&lt;font color=#2b91af size=2&gt;DataRowVersion&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt;.Original] != dataRow[item.ColumnName, &lt;/font&gt;&lt;font color=#2b91af size=2&gt;&lt;font color=#2b91af size=2&gt;DataRowVersion&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt;.Current])&lt;br/&gt;&lt;br/&gt;{&lt;br/&gt;&lt;br/&gt;&lt;/font&gt;&lt;font color=#2b91af size=2&gt;&lt;font color=#2b91af size=2&gt;Console&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt;.WriteLine(&lt;/font&gt;&lt;font color=#2b91af size=2&gt;&lt;font color=#2b91af size=2&gt;String&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt;.Format(&lt;/font&gt;&lt;font color=#a31515 size=2&gt;&lt;font color=#a31515 size=2&gt;"Table: {0}"&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt;, &lt;/font&gt;&lt;font color=#0000ff size=2&gt;&lt;font color=#0000ff size=2&gt;this&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt;.TableName));&lt;br/&gt;&lt;br/&gt;&lt;/font&gt;&lt;font color=#2b91af size=2&gt;&lt;font color=#2b91af size=2&gt;Console&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt;.WriteLine(&lt;/font&gt;&lt;font color=#2b91af size=2&gt;&lt;font color=#2b91af size=2&gt;String&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt;.Format(&lt;/font&gt;&lt;font color=#a31515 size=2&gt;&lt;font color=#a31515 size=2&gt;"Col ({0}) Original = {1} Current = {2}"&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt;, item.ColumnName, dataRow[item.ColumnName, &lt;/font&gt;&lt;font color=#2b91af size=2&gt;&lt;font color=#2b91af size=2&gt;DataRowVersion&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt;.Original].ToString(), dataRow[item.ColumnName, &lt;/font&gt;&lt;font color=#2b91af size=2&gt;&lt;font color=#2b91af size=2&gt;DataRowVersion&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt;.Current].ToString()));&lt;br/&gt;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;/font&gt;[/codesnippet]&lt;br/&gt;&lt;br/&gt;I hope this is helpful.&lt;br/&gt;&lt;br/&gt;Jeff</description><pubDate>Thu, 03 Mar 2011 18:29:07 GMT</pubDate><dc:creator>Jeff Pagley</dc:creator></item><item><title>RE: How to know what fields has changed on the BO when the saved</title><link>http://forum.strataframe.net/FindPost29640.aspx</link><description>if&amp;nbsp;BO is a business object, its currentrow has an item property, in the code snippet above BO is just a placeholder for an actual business object&lt;br/&gt;&lt;br/&gt;Quick and dirty code you can use on any SF form with a Primary BO is below. Not efficient if the BO has many rows, but you can always skinny it down if you need to.&lt;br/&gt;&lt;br/&gt;&lt;font size=2 face=Consolas&gt;&lt;font size=2 face=Consolas&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font size=2 face=Consolas&gt;&lt;font size=2 face=Consolas&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;For&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=2 face=Consolas&gt;&lt;font size=2 face=Consolas&gt; colCount = 0 &lt;/font&gt;&lt;/font&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;To&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=2 face=Consolas&gt;&lt;font size=2 face=Consolas&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;Me&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=2 face=Consolas&gt;&lt;font size=2 face=Consolas&gt;.PrimaryBusinessObject.CurrentDataTable.Columns.Count - 1&lt;br/&gt;&lt;br/&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;If&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=2 face=Consolas&gt;&lt;font size=2 face=Consolas&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;Not&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=2 face=Consolas&gt;&lt;font size=2 face=Consolas&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;Me&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=2 face=Consolas&gt;&lt;font size=2 face=Consolas&gt;.PrimaryBusinessObject.CurrentRow.Item(colCount, Data.&lt;/font&gt;&lt;/font&gt;&lt;font color=#2b91af size=2 face=Consolas&gt;&lt;font color=#2b91af size=2 face=Consolas&gt;&lt;font color=#2b91af size=2 face=Consolas&gt;DataRowVersion&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=2 face=Consolas&gt;&lt;font size=2 face=Consolas&gt;.Original) = &lt;/font&gt;&lt;/font&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;Me&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=2 face=Consolas&gt;&lt;font size=2 face=Consolas&gt;.PrimaryBusinessObject.CurrentRow.Item(colCount, Data.&lt;/font&gt;&lt;/font&gt;&lt;font color=#2b91af size=2 face=Consolas&gt;&lt;font color=#2b91af size=2 face=Consolas&gt;&lt;font color=#2b91af size=2 face=Consolas&gt;DataRowVersion&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=2 face=Consolas&gt;&lt;font size=2 face=Consolas&gt;.Current) &lt;/font&gt;&lt;/font&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;Then&lt;br/&gt;&lt;br/&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=2 face=Consolas&gt;&lt;font size=2 face=Consolas&gt;MsgBox(&lt;/font&gt;&lt;/font&gt;&lt;font color=#a31515 size=2 face=Consolas&gt;&lt;font color=#a31515 size=2 face=Consolas&gt;&lt;font color=#a31515 size=2 face=Consolas&gt;"Changed row old value: "&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=2 face=Consolas&gt;&lt;font size=2 face=Consolas&gt; &amp;amp; &lt;/font&gt;&lt;/font&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;Me&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=2 face=Consolas&gt;&lt;font size=2 face=Consolas&gt;.PrimaryBusinessObject.CurrentRow.Item(colCount, Data.&lt;/font&gt;&lt;/font&gt;&lt;font color=#2b91af size=2 face=Consolas&gt;&lt;font color=#2b91af size=2 face=Consolas&gt;&lt;font color=#2b91af size=2 face=Consolas&gt;DataRowVersion&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=2 face=Consolas&gt;&lt;font size=2 face=Consolas&gt;.Original) &amp;amp; vbCrLf &amp;amp; &lt;/font&gt;&lt;/font&gt;&lt;font color=#a31515 size=2 face=Consolas&gt;&lt;font color=#a31515 size=2 face=Consolas&gt;&lt;font color=#a31515 size=2 face=Consolas&gt;"Changed row new value: "&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=2 face=Consolas&gt;&lt;font size=2 face=Consolas&gt; &amp;amp; &lt;/font&gt;&lt;/font&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;Me&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=2 face=Consolas&gt;&lt;font size=2 face=Consolas&gt;.PrimaryBusinessObject.CurrentRow.Item(colCount, Data.&lt;/font&gt;&lt;/font&gt;&lt;font color=#2b91af size=2 face=Consolas&gt;&lt;font color=#2b91af size=2 face=Consolas&gt;&lt;font color=#2b91af size=2 face=Consolas&gt;DataRowVersion&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=2 face=Consolas&gt;&lt;font size=2 face=Consolas&gt;.Current))&lt;br/&gt;&lt;br/&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;End&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=2 face=Consolas&gt;&lt;font size=2 face=Consolas&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;If&lt;br/&gt;&lt;br/&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=2 face=Consolas&gt;&lt;font size=2 face=Consolas&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;Next&lt;br/&gt;&lt;br/&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;</description><pubDate>Thu, 03 Mar 2011 17:09:10 GMT</pubDate><dc:creator>Keith Chisarik</dc:creator></item><item><title>RE: How to know what fields has changed on the BO when the saved</title><link>http://forum.strataframe.net/FindPost29639.aspx</link><description>I am a beginner and I must be missing something simple.&lt;br/&gt;&lt;br/&gt;In the BeforeSave method of my BO, I want to compare the current value of a field to the original value.&amp;nbsp; I am using C# and Visual Studio 2008 and when I try to enter:&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;&lt;font face=Consolas&gt;If&amp;nbsp;(!BO.CurrentRow.Item(colCount, Data.&lt;span class=shl&gt;&lt;font style="background-color: #f8ff40"&gt;DataRowVersion&lt;/font&gt;&lt;/span&gt;.Original) == BO.CurrentRow.Item(colCount, Data.&lt;span class=shl&gt;&lt;font style="background-color: #f8ff40"&gt;DataRowVersion&lt;/font&gt;&lt;/span&gt;.Current))&lt;/font&gt;&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;it appears that BO.CurrentRow does not have a method named Item.&amp;nbsp; What am I doing wrong?&lt;br/&gt;&lt;br/&gt;Sam Tenney</description><pubDate>Thu, 03 Mar 2011 15:47:24 GMT</pubDate><dc:creator>Sam Tenney</dc:creator></item><item><title>RE: How to know what fields has changed on the BO when the saved</title><link>http://forum.strataframe.net/FindPost29517.aspx</link><description>I will start from there as you suggested.&lt;br/&gt;&lt;br/&gt;Thank you for your help.&lt;br/&gt;&lt;br/&gt;Jeff</description><pubDate>Mon, 07 Feb 2011 15:30:32 GMT</pubDate><dc:creator>Jeff Pagley</dc:creator></item><item><title>RE: How to know what fields has changed on the BO when the saved</title><link>http://forum.strataframe.net/FindPost29516.aspx</link><description>I put a line of code on my reply that should get you pointed in the right direction:&lt;br/&gt;&lt;br/&gt;Call the below in a loop for each column in each row you want to check.&lt;br/&gt;&lt;br/&gt;&lt;font color=#000000 face=Consolas&gt;&lt;strong&gt;If NOT BO.CurrentRow.Item(colCount, Data.DataRowVersion.Original) = BO.CurrentRow.Item(colCount, Data.DataRowVersion.Current) Then&lt;/strong&gt;&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;Additional Info:&lt;br/&gt;&lt;br/&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.data.datarowversion.aspx"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.data.datarowversion.aspx"&gt;http://msdn.microsoft.com/en-us/library/system.data.datarowversion.aspx&lt;/a&gt;&lt;/a&gt;</description><pubDate>Mon, 07 Feb 2011 14:05:07 GMT</pubDate><dc:creator>Keith Chisarik</dc:creator></item><item><title>RE: How to know what fields has changed on the BO when the saved</title><link>http://forum.strataframe.net/FindPost29515.aspx</link><description>Hi Keith,&lt;br/&gt;&lt;br/&gt;How can I tell what field has changed on the BO?&amp;nbsp; Is there a way to know what are&amp;nbsp;the before and after values of the field of the BO? And what BO event would I handle to access this info?&amp;nbsp; Any code examples would be appreciated.&lt;br/&gt;&lt;br/&gt;I don't what to audit the information, but I&amp;nbsp;want to send an email when certain fields' values&amp;nbsp;changed in a record.&amp;nbsp; Therefore, I don't need to setup SQL triggers.&lt;br/&gt;&lt;br/&gt;Thanks,&lt;br/&gt;&lt;br/&gt;Jeff&lt;br/&gt;&lt;br/&gt;Using C#/VS 2008</description><pubDate>Mon, 07 Feb 2011 13:54:13 GMT</pubDate><dc:creator>Jeff Pagley</dc:creator></item><item><title>RE: How to know what fields has changed on the BO when the saved</title><link>http://forum.strataframe.net/FindPost29512.aspx</link><description>If you want to do it via&amp;nbsp;BO you can use the DataRowVersion on the underlying datarows&lt;br/&gt;&lt;br/&gt;&lt;font color=#008000 size=2 face=Consolas&gt;&lt;font color=#008000 size=2 face=Consolas&gt;&lt;font color=#008000 size=2 face=Consolas&gt;If NOT BO.CurrentRow.Item(colCount, Data.DataRowVersion.Original) = BO.CurrentRow.Item(colCount, Data.DataRowVersion.Current) Then&lt;br/&gt;&lt;br/&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;or if you want it all on the SQL Server you could do a trigger that looks at the values in the internal INSERTED AND DELETED tables </description><pubDate>Mon, 07 Feb 2011 12:10:05 GMT</pubDate><dc:creator>Keith Chisarik</dc:creator></item></channel></rss>