
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 ✔️