A veces, necesitamos copiar parte de las propiedades de un objeto en otro diferente. La forma mas facil sería hacer lo siguiente:
Set obj1.FirstName = obj2.FirstName

Set obj1.SecondName = obj2.SecondName

¿Que sucede si el objeto contiene un gran número de propiedades? ¿Y si solo necesitamos extraer un importante grupo de datos, y complementar la información en otro objeto? Tenemos las siguientes clases: <span style="font-family:courier new,courier,monospace;">Class Kurro.PersonalInfo Extends %Library.SerialObject {  /// Code of personal  Property Code As %String;    /// First name of personal  Property FirstName As %String;    /// Second name of personal  Property SecondName As %String;    /// Date of birthday of personal  Property DateOfBirthday As %DateTime;    /// Passport ID number  Property PassportId As %String;    } Class Kurro.NameInfo Extends %Library.SerialObject {  /// First name of personal  Property FirstName As %String;    /// Second name of personal  Property SecondName As %String;    /// Date of birthday of personal  Property DateOfBirthday As %DateTime;  /// Relationship  Property Relationship As %String;   } </span> Relleno el objeto PersonalInfo
ENSDEMO>zw personal
personal=


  [1@Kurro.PersonalInfo]
  +----------------- general information ---------------
  |      oref value: 1
  |      class name: Kurro.PersonalInfo
  | reference count: 2
  +----------------- attribute values ------------------
  |               Code = "FLH01"
  |     DateOfBirthday = 47878
  |          FirstName = "Francisco"
  |         PassportId = "ESP-123456"
  |         SecondName = "Lopez"
  +-----------------------------------------------------</span></pre>
  
  
  

Creo la siguiente clase de utilidades

&lt;span style="font-family:courier new,courier,monospace;">Class Kurro.Utils.Functions
{

/// Copy properties 
Method CopyProps(Output obj) As %Status [ CodeMode = objectgenerator ]
{
    set properties = %compiledclass.Properties
    for i=1:1:properties.Count() 
    {
        #dim prop As %Dictionary.CompiledProperty = properties.GetAt(i)
        if prop.Name'="",prop.Name'["%" 
        {
            set propName = prop.Name
            if prop.Name["_" 
            {
                set propName = """"_prop.Name_""""
            }
            do %code.WriteLine(" If (obj.ExistsProperty("""_propName_""")) { set obj."_propName _"=.."_propName_" } ")
        }
    }
    quit $$$OK
}

/// Check if a property exists
ClassMethod ExistsProperty(pPropName As %String = "") As %Boolean
{
    Set tExists = 0
    If (pPropName '= "") 
    {
        Set tExists = ##class(%Dictionary.CompiledProperty).IDKEYExists($classname($this),pPropName)
    }
    Quit tExists
}

}&lt;/span>

Ahora, necesitamos extender también nuestras clases a la clase de utilidades.

Class Kurro.PersonalInfo Extends (%Library.SerialObject, Kurro.Utils.Functions)
Class Kurro.NameInfo Extends (%Library.SerialObject, Kurro.Utils.Functions)

Probar como funciona usando el siguiente código:

set personal = ##class(Kurro.PersonalInfo).%New()
set personal.Code="FLH01"
set personal.FirstName="Francisco"
set personal.SecondName="Lopez"
set personal.DateOfBirthday=$ZDATEH("1972-02-01",3)
set personal.PassportId ="ESP-123456"
set name = ##class(Kurro.NameInfo).%New()
do personal.CopyProps(.name)

zw name
    

Este es el resultado:

ENSDEMO>zw name 
name=


  [3@Kurro.NameInfo]
  +----------------- general information ---------------
  |      oref value: 3
  |      class name: Kurro.NameInfo
  | reference count: 2
  +----------------- attribute values ------------------
  |     DateOfBirthday = 47878
  |          FirstName = "Francisco"
  |       Relationship = ""
  |         SecondName = "Lopez"
  +-----------------------------------------------------</pre>
  
  
  

Importante: Solo se podrá copiar el contenido de una clase que extienda de esta funcion, porque necesita el método ExistsProperty.

Espero que este truco te sea tan util como me ha sido a mi.

Un Saludo

</body></html>