Para quien no conoce nada acerca de Cooperator Framework le recomiendo leer mi post anterior Introducción a Cooperator Framework.
Comencemos por descargar la herramienta, aquí encontramos el último release de Cooperator Modeler, al finalizar la descarga, descomprimimos el archivo y podremos ver el ejecutable de nombre CooperatorModeler.exe, con un doble click veremos lo su interfaz gráfica:

La prueba la vamos a realizar sobre SQL Server 2005, entonces vamos a abrir SQL Server Management Studio y creamos una base de datos de nombre Prueba, donde crearemos dos tablas, Cliente y Sucursal con una relación 1 a n.
La tabla Cliente tiene un campo ID (PK, INT y autonumérico) y RazonSocial (VARCHAR(50)).
La tabla Sucursal tiene un campo ID (PK, INT y autonumérico), IDCliente (FK, INT y autonumérico) y Denominacion (VARCHAR(50)).


Establecemos la relación entre la PK de Cliente y la FK de Sucursal.

Volvamos ahora al Modeler y hagamos un click sobre el botón New Model, cuando se abra el formulario hacemos click sobre el botón Get Databases, seleccionamos la nuestra y Ok:
![]()

Ahora veremos el Modelo:
![]()

Desplegamos las Entidades:
![]()

Vemos que Cliente tiene una colección de Sucursales, pero si la queremos incluir en el modelo es necesario chequearla.
![]()

Seleccionemos ahora Sucursal:
Podemos ver la propiedad GenerateAsChildOf con el valor Cliente, si esto no fuera así, antes no hubieramos podido seleccionar, en Cliente, la colección de Sucursales. También vemos que en Sucursal existe una ClienteEntity, si se chequea esto la entidad Sucursal incuirá la entidad Cliente (padre) con todas sus propiedades, incluirla o no es una desición de diseño.
El elemento ClienteString va a mostrar el campo de la tabla Cliente que nosotros determinemos, seleccionemos el elemento RazonSocial de la tabla Cliente, la propiedad GenerateAsDescriptionField vale True, esto define que RazonSocial es el campo que se mostrará cuando se invoque Sucursal.ClienteString.
Un punto muy importante que resuelve Cooperator es la aplicación del patrón LazyLoad y lo hace sin ningún esfuerzo extra de nuestra parte. Seleccionemos el elemento SucursalCollection de la entidad Cliente, vemos que la propiedad GenerateAsLazyLoad está en True, no hace falta nada más.
Supongamos que nuestro Modelo, por ahora termina acá, lo salvamos y hacemos un click sobre Code Generation
![]()

Hacemos un click sobre Generate SP, al finalizar otro click sobre Generate source code y cuando finalice seleccionamos una carpeta en la que querramos generar nuestra solución y luego un click sobre Generate Solution (para esta primera vez).
Modeler casi inmediatamente nos va a avisar que la solución se generó exitosamente y nos preguntará si queremos abrirla, le contestamos que si y vamos al Visual Studio que se está abriendo.
![]()

Abramos el formulario en modo diseño y agreguemos un ComboBox de nombre cboCliente y un DataGridView de nombre dtgSucursal.
Para hacer la prueba vamos a cargar a mano algunos registros en las tablas.
Ahora vamos a agregar código al formulario Form1, comenzando por los Imports:
Imports PruebaRules.Entities
Imports PruebaRules.Objects
Imports PruebaRules.Mappers
Imports PruebaRules.Views
En el evento Load del formulario disparamos CargarComboCliente
Private Sub CargarComboCliente()
Dim mClienteList As ClienteList = ClienteMapper.Instance.GetAll()
Dim mClienteListView As ClienteListView = New ClienteListView(mClienteList)
cboCliente.DisplayMember = “RazonSocial”
cboCliente.ValueMember = “ID”
Dim mCliente As New Cliente
mCliente.RazonSocial = “(Ninguno)”
mClienteListView.Add(mCliente)
mClienteListView.Sort(“RazonSocial”, True)
cboCliente.DataSource = mClienteListView
cboCliente.SelectedIndex = 0
End Sub
Los Clientes se recuperan en un objeto ClienteList a través de su correspondiente Mapper, en la segunda linea asigno este ClienteList a otro objeto ClienteListView que me permite más versatilidad. La tercer y cuarta linea de código me permiten definir que valores se van a ver en el ComboBox y cuales voy a recuperar al seleccionar un Cliente por medio de las propiedades DisplayMember y ValueMember respectivamente. En las siguientes tres lineas creo un objeto Cliente, le asigno el valor (Ninguno) y lo agrego en el ComboBox. Luego ordeno el objeto de tipo ClienteListView por medio de un Sort, le asigno dicho ListView a la propiedad DataSource del ComboBox y finalmente me posiciono en el valor (Ninguno) del ComboBox.
En el SelectedIndexChanged del ComboBox de Clientes disparo CargarGrillaSucursal:
Private Sub CargarGrillaSucursal()
Dim mSucursalList As SucursalObjectList = SucursalMapper.Instance.GetByCliente(CType(cboCliente.SelectedValue, Integer))
Dim mSucursalListView As SucursalObjectListView = New SucursalObjectListView(mSucursalList)
dtgSucursal.DataSource = mSucursalListView
End Sub
Acá usamos un objeto de tipo SucursalObjectList para obtener, por medio de su Mapper, la lista de Sucursales correspondiente al Cliente seleccionado en el ComboBox. Vemos que se usa un objeto de tipo SucursalObjectList y no uno de tipo SucursalList. Si vamos al Modeler y vemos el elemento SucursalCollection, tiene una propiedad de nombre GenerateAsType con valor ObjectList, si en esta propiedad seleccionamos el valor EntityList, podríamos haber usado un objeto de tipo SucursalList a cambio de SucursalObjectList.
A esta altura es necesario aclarar que un Object mapea uno a uno contra una tabla de la base de datos, mientras que en un objeto de tipo Entity no necesariamente es así.
Ahora F5 y a ver como anda.
No intenten hacer esto solos en sus casas.
Voy a subir el código de este post ya que va a ser la base de otros posteriores.
Prueba.coop es el archivo con que el Modeler persiste la información.
Script.sql, para crear la base de datos.
Prueba.zip la solución Visual Studio 2005
Espero les sirva y espero sus comentarios.

11 comments
Comments feed for this article
Martes 12 dUTC Febrero dUTC 2008 a 7:02:36
ipadila
Carlos, estos ejemplos son muy útiles para los que empezamos a aprender Cooperator Modeler.
Gracias
ipadilla
Miércoles 28 dUTC Mayo dUTC 2008 a 17:05:52
macmaster
Se pueden utilizar BindingSource con CooperatorFramework ??
SAludos
Martes 03 dUTC Junio dUTC 2008 a 21:06:27
Carlos Marcelo Santos
Si, MacMaster, se pueden usar, también los BindingNavigators.
Todavía no los usé, sino te pasaba un ejemplo.
Gracias por tu atención.
Jueves 26 dUTC Junio dUTC 2008 a 21:06:32
ABM básico en Cooperator « Carlos Marcelo Santos
[...] Cooperator, un ejemplo sencillo para comenzar y [...]
Viernes 05 dUTC Septiembre dUTC 2008 a 16:09:35
Felipe
Disculpame pero no he podido comprender como es que puedo utilizar los procedimientos para insertar registros, modificarlos y eliminarlos, me podrias orientar un poco, Gracias de antemano por tu atencion
Sábado 06 dUTC Septiembre dUTC 2008 a 10:09:33
Carlos Marcelo Santos
Hola Felipe:
Gracias por escribir.
Tengo un post donde doy un ejemplo de lo que me pedís, http://carlossantos.wordpress.com/2008/06/26/abm-basico-en-cooperator/, si pudieras dedicarle el tiempo para leerlo creo que te sería útil.
Ante cualquier duda escribime por favor.
Espero tu comentario.
Sábado 27 dUTC Septiembre dUTC 2008 a 3:09:02
Felipe
Gracias por su respuesta, me fue de gran ayuda.
Viernes 17 dUTC Octubre dUTC 2008 a 3:10:46
espinete
Sigan con más ejemplos, por favor.
Gracias.
Viernes 17 dUTC Octubre dUTC 2008 a 15:10:58
Carlos Marcelo Santos
Hola Espinete:
Tenés un par de posts más,
http://carlossantos.wordpress.com/2008/02/05/cooperator-modificando-el-modelo/ y http://carlossantos.wordpress.com/2008/06/26/abm-basico-en-cooperator/
Si hay algún punto en particular que te interese, contame cuál es y en la medida de lo posible publicaré algo.
Gracias por tu interés.
Lunes 26 dUTC Octubre dUTC 2009 a 16:10:09
stanley
Tengo una duda,…como hacer esto para un proyecto web??
Martes 27 dUTC Octubre dUTC 2009 a 11:10:30
Carlos Marcelo Santos
Hola Stanley:
Yo no usé hasta ahora Cooperator en un proyecto web. Sé que es bastante directo, es decir, necesitás referenciar las dlls de Cooperator desde tu proyecto web.
De todos modos te recomiendo que hagas la consulta en la lista de Cooperator, http://www.egrupos.net/grupo/cooperatorframework, vas a encontrar varias personas que lo están usando así.
Saludos.
Carlos.