Gracias Federico,
Le voy a agarrar la mano a esto. Necesito hacer que el WorkWith hable….
Lo que terminé haciendo fue una clase TransactionFB, con un elemento Transaction y un método (el que necesitaba).
Fabio Bon
Av. Jorge Williams M.62 S.10
Tel. (+598) 26966918 096185889
e-Mail fabiobonpereira@gmail.com
De: Federico Azzato [mailto:fazzato@genexus.com]
Enviado el: jueves, 24 de febrero de 2011 04:50 p.m.
Para: genexusextensions@gxlists.com
CC: Fabio Bon Pereira
Asunto: Re: [genexusextensions] Como acceder a un objeto Transaction ?
Hola Fabio
Lamentablemente lo que estás haciendo no va a funcionar. No soportamos extensibilidad a nivel de clases en los objetos Genexus. Heredar de las clases que definen los objetos y partes del lenguaje no es una práctica recomendada. Inclusive estamos considerando impedir que se pueda hacerlo.
Se me ocurren 2 alternativas para lograr algo similar a lo que queres hacer.
1- Utilizar extension methods
public static class TransactionFB
{
public static bool MyExtensionMethod(this Transaction trn)
{
// your code
}
}
y luego puedes utilizar el método desde el objeto al que se lo "agregaste"
Transaction trn = wwInstance.GetElement<IGridObject>(instanceObject.Element).Transaction;
trn.MyExtensionMethod();
Te recomiendo mirar la documentación de extension methods para ver más y mejores ejemplos :)
2- Definir una conversión explícita/implícita a tu tipo de objeto
public class TransactionFB
{
private Transaction trn;
public TransactionFB (Transaction trn)
{
this.trn = trn;
}
public static bool MyExtensionMethod(this Transaction trn)
{
// your code
}
public static explicit operator TransactionFB (Transaction trn)
{
return new TransactionFB(trn);
}
}
Y luego podes castear cualquier objeto de tipo Transaction a TransactionFB
TransactionFB trn = (TransactionFB)wwInstance.GetElement<IGridObject>(instanceObject.Element).Transaction;
trn.MyExtensionMethod();
De nuevo, recomiendo mirar la documentación de las conversiones explícitas para más y mejores ejemplos.
saludos
____________________________________________________
Federico Azzato, GeneXus Development
+598 2 601 20 82 | ¿Ya probó la Evolution 1?
Síguenos en Facebook | LinkedIn | Orkut | Twitter
2011/2/24 Fabio Bon Pereira <fabiobonpereira@gmail.com>
De acuerdo, pero creo que estoy en ese caso.
Yo extendí a Transaction como TransactionFB agregándole un método que me dice si la trn tiene o no una instancia de un determinado tipo.
Partiendo de la base que la relación seria TransactionFB : Transaction, tú me dices que no es correcta la sentencia :
TransactionFB trnfb = (TransactionFB)KBObject.Get(instanceObject.Model, Artech.Udm.Framework.EntityKey.CreateKey<Transaction>(wwInstance.GetElement<IGridObject>(instanceObject.Element).Transaction.Id));
En cuanto a usar los métodos propios de Transaction, yo lo hubiera hecho si pudiera obtener de forma directa, dada una Trn si tiene o no instancia de un tipo, pero sinceramente no la hallé y por eso la tuve que programar.
De: Matias Hernandez [mailto:matiash@genexus.com]
Enviado el: jueves, 24 de febrero de 2011 02:06 p.m.
Para: genexusextensions@gxlists.com
Asunto: Re: [genexusextensions] Como acceder a un objeto Transaction ?
La herencia es una relación "es-un", pero va en un solo sentido. De esta forma, como Transaction hereda de KBObject, siempre podés tratar una instancia de Transaction como una instancia de KBObject.
Tu TransactionFB hereda de Transaction, por lo cual siempre podés tratar una instancia de TransactionFB como una Transaction, pero no lo contrario!
Te recomendaría que en lugar de hacer una clase derivada de Transaction, simplemente trabajes con métodos que la usen.
Saludos,
- Matías
2011/2/24 Fabio Bon Pereira <fabiobonpereira@gmail.com>
Gracias Matías, anduvo bien pero con un detalle que no me doy cuenta.
Programe una extensión de la clase Transaction para agregar un método que indica si tiene una instancia de un determinado tipo.
Acorde a lo que me dijiste: Transaction deriva de KBObject y como TransactionFB deriva de Transaction debería ser valido lo siguiente, no ?
TransactionFB trnfb = (TransactionFB)KBObject.Get(instanceObject.Model, Artech.Udm.Framework.EntityKey.CreateKey<Transaction>(wwInstance.GetElement<IGridObject>(instanceObject.Element).Transaction.Id));
A propósito: puse Artech.Udm.Framework.EntityKey.CreateKey<Transaction>(wwInstance.GetElement<IGridObject>(instanceObject.Element).Transaction.Id) porque no me doy cuenta como aplico lo que me dijiste : KbObject no parece tener un metodo Key.
Pero la duda es, con la sintaxis que copie, en ejecución que da un error de tipos y no me doy cuenta porqué.
De: Matias Hernandez [mailto:matiash@genexus.com]
Enviado el: jueves, 24 de febrero de 2011 01:13 p.m.
Para: genexusextensions@gxlists.com
Asunto: Re: [genexusextensions] Como acceder a un objeto Transaction ?
Hola Fabio,
No es necesario "referenciar la transacción como un KBObject", la clase Transaction hereda de KBObject y por lo tanto la podés tratar como tal.
De todas formas, te comento que la Key de un KBObject (o cualquier objeto derivado) la podés obtener con kbObject.Key. Y el (GUID del) tipo con kbObject.Type. En caso que necesites construir una EntityKey puedes hacerlo con EntityKey key = new EntityKey(type, id);
Ojo que el campo Guid del objeto es el GUID del objeto (valga la redundancia) y no el de su tipo.
Saludos,
- Matías
2011/2/24 Fabio Bon Pereira <fabiobonpereira@gmail.com>

Necesito acceder a un objeto Transaction de una KB. Los datos que tengo son:
A partir de wwInstance.GetElement<IGridObject>(instanceObject.Element).Transaction que representa la transacción asociada a un TabGrid, necesito referenciar la transacción como un KBObject.
Veo que la puedo referenciar mediante “KBObject objTrn = KBObject.Get( modelo, EntityKey );”
Mi problema es al intentar resolver la EntityKey, que según entiendo está formada por ( GUID de tipo de Objeto + Id. Objeto ).
El Id. Del objeto, ya me di cuenta de cómo obtenerlo (creo) : wwInstance.GetElement<IGridObject>(instanceObject.Element).Transaction.Id
Supongo además que el GUID del tipo es : wwInstance.GetElement<IGridObject>(instanceObject.Element).Transaction.GetType().GUID
No me doy cuenta como “armar” la EntityKey a partir de estos dos datos, o si tal vez se pueda referenciar el objeto Transaccion simplemente a travez de su GUID es decir a travez de: wwInstance.GetElement<IGridObject>(instanceObject.Element).Transaction.Guid
Fabio Bon
Av. Jorge Williams M.62 S.10
Tel. (+598) 26966918 096185889
e-Mail fabiobonpereira@gmail.com
0 Response to "RE: [genexusextensions] Como acceder a un objeto Transaction ?"
Publicar un comentario