This method is quite useful when updating an existing object with attribute /
values of a source object.
Why / when would you use this?
If you are, say, editing an OBJECT (or entity). You copied the object to an
$editObj; then afterwards want to conditionally update it and know what was
changed
[This also has the feature of revealing exactly what was changed in the OBJECT
so that you can use that information if useful…]
// OB_UPDATE ( dstObj; srcObj ) --> ResultObj. Conditionally updates the
dstObj with attributes from srcObj [if any difference]. ResultObj gives
feedback on what was updated
C_OBJECT($1;$2) // dstObj; srcObj
C_OBJECT($0;$resultObj) // resultObj. Will give the "result" and feedback on
what was changed
$resultObj:=New object("result";False;"new";New collection;"update";New
collection)
// we set up the RESULT object to have a:
// .result — TRUE if there were any changes made
// .new [ ] — a collection with all the NEW attributes added to dstObj [from
srcObj]
// .update [ ] — a collection with all the attribute values UPDATED in dstObj
[from srcObj]
For each ($attr;$2) // go through all the attributes for the Source Object
Case of
: (Undefined($1[$attr])) // if the attribute does not already
exist in destination, we will need to add it, and 'write this down' in the
result object
$resultObj.new.push(New object($attr;$2[$attr])) //
remember we added this attribute
$resultObj.result:=True // updates made
$1[$attr]:=$2[$attr]
: ($1[$attr]#$2[$attr]) // change in the attribute
$resultObj.update.push(New
object($attr;$2[$attr];"old";$1[$attr])) // remember we added this attribute
$resultObj.result:=True // updates made
$1[$attr]:=$2[$attr]
End case
End for each
$0:=$resultObj // the result!
—————————————
the result Object will be in this format:
.result — TRUE if changes made; FALSE if nothing changed
.new – COLLECTION of new attributes added to dstObj from srcObj.
.update — COLLECTION of attributes that received updated values. It gives both
the current value and the old one.
So, for example, if you try it with this tester code:
// zzTEST_OB_UPDATE -- test OB_UPDATE( ) function
C_OBJECT($srcObj;$dstObj;$result)
$srcObj:=New object("name";"Chris";"address";"5619 Vanlerberg
Road";"city";"Fernie";"age";55)
$dstObj:=New object("name";"Tracine";"address";"109 Ridgemont
Crescent";"city";"Fernie")
$resultObj:=OB_UPDATE ($dstObj;$srcObj)
— $dstObj will be made to be identical to $srcObj; {because $dstObj does not
possess any attributes not found in $srcObj}
— $resultObj will tell you what was changed and how
in this case:
$resultObj.result = TRUE
$result.new [ ] has [{age:55}]
$result.update has [{name:Chris,old:Tracine},{address:5619 Vanlerberg
Road,old:109 Ridgemont Crescent}]
— So not only have you updated $dstObj with all the values of $srcObj
(including adding any missing attributes), you know what the changes are
—————————————
In the scenario when you have $dstObj having attributes lacking in $srcObj
{i.e. $srcObj has only a SUBSET if the attributes} ...
// zzTEST_OB_UPDATE -- test OB_UPDATE( ) function
C_OBJECT($srcObj;$dstObj;$result)
// now when you update $dstObj from $srcObj, and $dstObj has attributes that
are NOT in $srcObj, those attributes are not touched.
// so you can update $dstObj with just a subset of attributes using $srcObj
$dstObj:=New object("name";"Chris";"address";"5619 Vanlerberg
Road";"city";"Fernie";"age";55)
$srcObj:=New object("name";"Tracine";"address";"109 Ridgemont
Crescent";"city";"Fernie")
$resultObj:=OB_UPDATE ($dstObj;$srcObj)
$dstObj continues to have the “age”:55 attributes {which the $srcObj did not
have}, but it also gets all the updates from $srcObj. So it is made identical
to $srcObj EXCEPT FOR attributes of $dstObj that were not in $srcObj
— $dstObj becomes: {name:Tracine,address:109 Ridgemont
Crescent,city:Fernie,age:55}
while $srcObj was only: {name:Tracine,address:109 Ridgemont
Crescent,city:Fernie}
So $dstObj is not made EQUAL to $srcObj
in this case,
$resultObj is
{result:true,new:[],update:[{name:Tracine,old:Chris},{address:109 Ridgemont
Crescent,old:5619 Vanlerberg Road}]}
—————————————
My full test method, which you should copy/paste and then TRACE as you execute
it, is:
// zzTEST_OB_UPDATE -- test OB_UPDATE( ) function
C_OBJECT($srcObj;$dstObj;$result)
$srcObj:=New object("name";"Chris";"address";"5619 Vanlerberg
Road";"city";"Fernie";"age";55)
$dstObj:=New object("name";"Tracine";"address";"109 Ridgemont
Crescent";"city";"Fernie")
$result:=OB_UPDATE ($dstObj;$srcObj)
// now when you update dstObj from srcObj, and dstObj has attributes that are
NOT in srcObj, those attributes are not touched.
// so you can update $dstObj with just a subset of attributes using $srcObj
$dstObj:=New object("name";"Chris";"address";"5619 Vanlerberg
Road";"city";"Fernie";"age";55)
$srcObj:=New object("name";"Tracine";"address";"109 Ridgemont
Crescent";"city";"Fernie")
$result:=OB_UPDATE ($dstObj;$srcObj)
— Chris Belanger
**********************************************************************
4D Internet Users Group (4D iNUG)
Archive: http://lists.4d.com/archives.html
Options: https://lists.4d.com/mailman/options/4d_tech
Unsub: mailto:[email protected]
**********************************************************************