Gerardo Taque | Desarrollador GeneXus · Software y Desarrollo · 26/11/2025

Podría describir la sensación frente a cada etapa de mi experiencia con Business Component.

👉 Una primera, de verlo aplicado como si de una inteligencia superior o alienígena se tratara, con una complejidad no apta para un mortal.

👉 Una segunda, donde me ví obligado a utlizarlo (para generar apps offline), aunque confieso, hice algunas investigaciones previas por si a caso tenía un camino alternativo.

👉 Una tercera, donde comencé a aplicarlo atravesando esa curva de aprendizaje, que no resultó ser aquella inalcanzable.

👉 Y una cuarta y actual, donde pienso… ¿por qué no lo utilicé desde antes? 😂

El BC (Business Component), tiene muchas ventajas, pero por lo pronto, y de uso más práctico y beneficioso, permítanme describir al que dedico generalmente.

Para definir un BC, nada mas hace falta activarlo en las propiedades de una TRN.

⚠️ Ojo: al establecer la TRN como BC, las referencias particulares de WEB, van a producir error, como por ejemplo: attributoTal.visible=true.

Para esto hay 2 soluciones, si la TRN contiene mucha acción en WEB, yo hago un Save As… de la TRN… con nombre: miTRN_BC y en esta última quito todo lo que sea acción web.

La otra solución es integrar todo lo que es web dentro de sección WEB{}… (no importa ahora…)

Bien, ¿en qué aplico SIEMPRE BC? En ABMs ✔️

Yendo al caso más simple, mas común: Lo que antes era New… For Each tanto para modificar como para eliminar…

BC.

¿Por qué? ¡Por practicidad y por sobre todo, por tener un mayor control y conocimiento sobre lo que sucede!

Cuántas horas perdidas, buscando dentro de código, propiedades en objetos, rompiendo algunos que estaban bien 😂 porque al intentar, por ejemplo, insertar con New, no se guardaba el registro 😭

Sin dudas, fué mayor el tiempo de esa investigación que la curva de aprendizaje BC

Business Component es así:

Ej.

Trn: Cliente (marco en sus propoiedades BC=true)

* ClienteID (autonumerado)

* ClienteNom

proc: insCliente (procedure inserta cliente)

Rules

parm( in: &ClienteNom, out: &messages)

//la variable &messages es del tipo: Messages, GeneXus.Common

Source

&Cliente = new() (variable del tipo BC Cliente, si no inicializamos reservando espacio en memoria, los datos no van a existir, no van a estar disponibles al intentar guardar)

&Cliente.ClienteNom = &clienteNom

//clienteId es autonumerado…

&Cliente.Save()

//y a continuación, lo mejor…

If &Cliente.Succes()

commit

else

rollBack

&messages = &Cliente.GetMessages()

endif

Ahora cuando llamamos al proc insCliente, vamos a saber si el proceso se realizó correctamente o en caso contrario sabremos la causa.

ej:

&messages = insCliente(«Estevan»)

if &messages.Count() = 0

//ok

else

for &unMensaje in &messages

msg(&unMensaje)

//Aqui aparecerán mensajes como: «No se pudo insertar por tal motivo…»

endfor

endif

Luego tenemos el update, delete; donde utilizaremos la misma lógica para conocer que sucedió:

UPD:

&Cliente.Load(&clienteID) //al igual que en un for each, buscamos por su clave y ya queda cargado el BC como si fuera una TRN en pantalla

&Cliente.clienteNom = &NuevoNombre

&Cliente.Save()

If &Cliente.Succes()……

DLT:

&Cliente.Load(&clienteID)

&Cliente.Delete()

If &Cliente.Succes()……

Luego se entiende que la misma lógica simple y básica se repite ✔️

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *