Esta es una pequeña mejora, pero creo que es digna de mención ya que puede interesar a más de uno.
Para los puristas del modelo vista-controlador, el uso de los clásicos Data-controls de Xailer no es lo apropiado, ya que todo el proceso de edición se produce también en la vista, cuando debería realizarse en el controlador. La forma más conveniente de evitar este problema es utilizar objetos de tipo TMemDataset que devuelven un recordset de memoria que está completamente desvinculado de la tabla de la cual procede. Pero tiene el inconveniente de que las operaciones de inserción y edición son más complejas ya que requiere de la construcción de las cadenas SQL de insert y update de forma manual. Veamos como resuelve este problema Xailer 8.1 con un pequeño ejemplo:
CLASS TControlador
oDataSource
METHOD RSClientes( oRs )
METHOD ClientesUpdate( oRs, nId )
END CLASS
METHOD RsClientes( oRS as CLASS TMemdataset ) CLASS TControlador
WITH OBJECT ::oDatasource
IF oRs != NIL
:QueryMemDataset("SELECT * FROM CLIENTES", "", oRs )
ELSE
oRs := :QueryMemDataset("SELECT * FROM CLIENTES")
ENDIF
END WITH
RETURN oRs
METHOD ClientesUpdate( oRS, nId ) CLASS TControlador
WITH OBJECT ::oDatasource
TRY
:BeginTrans()
:Execute(oRs:SqlUpdate("idCliente", nId ))
// Aquí se pueden hacer más operaciones de forma clara
:CommitTrans()
CATCH
:RollbackTrans()
END
END WITH
RETURN NIL
La operación de update se realiza en el controlador con la ventaja adicional de que podemos incluir cualquier operación dentro de la misma transacción. Para ello se utiliza el nuevo método SqlUpdate( aWhereCols, aWhereValues) que crea la instrucción SQL con sólo las columnas que han cambiado su valor. Como se puede imaginar, también hay un nuevo método de nombre SqlInsert().
Otra de las particularidades que tiene este código en su método RsClientes() que creo es muy interesante, es que el objeto TMemDataset se pasa como parámetro, en vez de crearse en el propio método y devolverse como valor de retorno, que podría ser la primera aproximación que haría cualquier programador. Esta técnica tiene una gran ventaja, que consiste en poder incorporar en el propio formulario un TMemDataset vacío e incluso vincularlo con un browse en el cual hemos definido las columnas completamente y todo de forma visual. Si nuestro método fuera el responsable de crear el TMemdatset y lo retornase como valor de retorno para luego asignarlo al browse con oBrowse:oDataset := oControlador:RsClientes(…) observariamos como todas nuestras columnas del browse desaparecerían ya que se ha asignado un nuevo dataset y eso provoca un reset de todo el control. Por el contrario si pasamos el recordset como parámetro todo se mantiene perfectamente.
Y eso es todo por ahora. En breve, más novedades.
Un saludo