<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-23931139</id><updated>2012-01-25T11:38:44.818+01:00</updated><category term='DSL Tools Beta2'/><title type='text'>DSL Tools practico</title><subtitle type='html'>Utilizando las DSLTools, estamos realizando un entorno de Bases de Datos Multidimensionales para ayudar al diseñador en su tarea de definicion de sus modelos de datos.Ponemos ejemplos sencillos a cada paso que damos, situaciones que nos encontramos al intentar definir nuestro modelo, algunas de forma general, y otras enfocadas al caso concreto de nuestro proyecto.Queremos dar a conocer esta herramienta que aunque esté todavía en fase beta, ya tiene muchas posibilidades y es de gran utilidad.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dsltools.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://dsltools.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Enrique Catalá Bañuls</name><uri>https://profiles.google.com/106443016603413260641</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-JAennFczz-o/AAAAAAAAAAI/AAAAAAAAAAA/WHCyQfQWJOQ/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>22</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-23931139.post-3199225055700365501</id><published>2008-04-08T13:45:00.002+02:00</published><updated>2008-04-08T13:46:55.157+02:00</updated><title type='text'>Cambio de residencia</title><content type='html'>Hola amigos, me cambio de residencia aqui al lado, donde voy a comenzar a postear tambien sobre DSL Tools en Visual Studio 2008.&lt;br /&gt;&lt;br /&gt;Mi nueva residencia: &lt;a href="http://ecatalab.blogspot.com/"&gt;http://ecatalab.blogspot.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Nos vemos en el otro lado!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23931139-3199225055700365501?l=dsltools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsltools.blogspot.com/feeds/3199225055700365501/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23931139&amp;postID=3199225055700365501&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/3199225055700365501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/3199225055700365501'/><link rel='alternate' type='text/html' href='http://dsltools.blogspot.com/2008/04/cambio-de-residencia.html' title='Cambio de residencia'/><author><name>Enrique Catalá Bañuls</name><uri>https://profiles.google.com/106443016603413260641</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-JAennFczz-o/AAAAAAAAAAI/AAAAAAAAAAA/WHCyQfQWJOQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23931139.post-114634821955590097</id><published>2006-04-29T23:51:00.001+02:00</published><updated>2008-03-31T17:00:08.978+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DSL Tools Beta2'/><title type='text'>Acceder al modelo desde el CommandSet</title><content type='html'>Es posible que se quieran añadir nuevas funcionalidades al proyecto, como por ejemplo una nueva opción de menu contextual cuando clickeamos con el boton derecho en el modelo o en alguno de sus elementos. No voy a explicar como se hace esto, porque está bien descrito en los ejemplos del manual de Noviembre de 2005, pero sí explicaré como acceder a los elementos del modelo.&lt;br /&gt;&lt;br /&gt;Es muy sencillo, pero hay que saberlo. En el ejemplo de añadir un nuevo elemento del menu, hay que modificar el archivo CommandSet.dslddt y, por lo tanto, el generado CommandSet.cs. En este archivo podemos encontrar un objeto interno llamado &lt;em&gt;CurrentData&lt;/em&gt;. Pues bien, este es el que nos va a permitir acceder a nuestro modelo. Y para ello hay que acceder a través de la propiedad &lt;em&gt;Store&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Por ejemplo, si tenemos una clase en nuestro modelo que se llama &lt;em&gt;Clase1&lt;/em&gt;, y queremos obtener todas las instancias de esa clase que hay en el fichero actual, tendremos que escribir lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;IList listaClases=this.CurrentData.Store.ElementDirectory.GetElements(Clase1.MetaClassGuid);&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Y listo! Te las devolverá en forma de IList.&lt;br /&gt;&lt;br /&gt;Hay que recordar que no estamos en el proyecto del DomainModel, por lo que habrá que especificar toda la ruta o bien hacer un &lt;em&gt;using&lt;/em&gt; del proyecto del DomainModel para que reconozca la clase &lt;em&gt;Clase1&lt;/em&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23931139-114634821955590097?l=dsltools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsltools.blogspot.com/feeds/114634821955590097/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23931139&amp;postID=114634821955590097&amp;isPopup=true' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114634821955590097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114634821955590097'/><link rel='alternate' type='text/html' href='http://dsltools.blogspot.com/2006/04/acceder-al-modelo-desde-el-commandset.html' title='Acceder al modelo desde el CommandSet'/><author><name>Vicente Soriano</name><uri>http://www.blogger.com/profile/08890774860429356321</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23931139.post-114556957673194649</id><published>2006-04-20T23:36:00.001+02:00</published><updated>2008-03-31T17:00:29.815+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DSL Tools Beta2'/><title type='text'>Estado actual del proyecto</title><content type='html'>&lt;div style="TEXT-ALIGN: justify"&gt;Este post es simplemente para que sepais que el proyecto sigue adelante y que no esta muerto el blog. Llevamos muchos dias sin poner ninguna entrada pero no estamos parados ni mucho menos. Estamos con la fase de generacion de código y hemos preferido esperarnos a poner posts relativos a este proceso porque mientras estabamos con ello nos han ido surgiendo multitud de dudas relativas a claridad de código, reusabilidad, buenas prácticas y demás, que hacen que prefiramos esperar a tenerlo todo 100% claro para dar consejos.&lt;br /&gt;&lt;br /&gt;El caso es que ya lo tenemos todo claro y tenemos ya 1 generacion completa y otra " a punto de caramelo", por lo que podremos hablar en propiedad y sobre todo desde un prisma muy diferente al que pudieramos haber hablado hace unas semanas cuando empezamos con esta fase y aún no teniamos mas que la ayuda de las dsl tools y ninguna práctica.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Prepararos &lt;/span&gt;pues, &lt;span style="FONT-WEIGHT: bold"&gt;para recibir&lt;/span&gt; en breve &lt;span style="FONT-WEIGHT: bold"&gt;una oleada de posts &lt;/span&gt;relativos a la &lt;span style="FONT-WEIGHT: bold"&gt;generacion de código de forma automática&lt;/span&gt; desde nuestro modelo y lo que es mejor, a como abordar de la mejor forma esta tarea. No os asusteis, os llevareis una grata sorpresa al ver la potencia que tiene la herramienta, creedme ;). &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23931139-114556957673194649?l=dsltools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsltools.blogspot.com/feeds/114556957673194649/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23931139&amp;postID=114556957673194649&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114556957673194649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114556957673194649'/><link rel='alternate' type='text/html' href='http://dsltools.blogspot.com/2006/04/estado-actual-del-proyecto.html' title='Estado actual del proyecto'/><author><name>Enrique Catalá Bañuls</name><uri>https://profiles.google.com/106443016603413260641</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-JAennFczz-o/AAAAAAAAAAI/AAAAAAAAAAA/WHCyQfQWJOQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23931139.post-114466822941002287</id><published>2006-04-10T13:12:00.001+02:00</published><updated>2008-03-31T17:01:11.996+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DSL Tools Beta2'/><title type='text'>Sobre los iconos transparentes</title><content type='html'>&lt;div align="justify"&gt;Puede que si hemos intentado insertar un icono personalizado en el toolbox o en una shape, nos hayamos encontrado con que el icono ha aparecido transparente. El tema de los iconos está todavía en fase de pruebas, y hay bastantes bugs en relación a ellos (ver página de microsoft de &lt;a href="http://lab.msdn.microsoft.com/productfeedback/SearchResults.aspx?text=&amp;amp;category=119&amp;amp;product=14"&gt;bugs de las dsltools&lt;/a&gt;).&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;Por el momento, si nos sucede esto podemos hacer un 'pequeño apaño'... Por lo que he podido comprobar, aparece transparente unicamente cuando pintamos de negro un icono, si en lugar de negro usamos el gris esto no sucede. Por lo tanto basta con &lt;em&gt;repasar&lt;/em&gt; el icono con un gris muy ennegrecido, lo suficiente como para que no se note que es gris. Yo lo he intentado dandole valores RGB (10,10,10) y funciona. Basta con salvar los cambios en el archivo de Resources y ¡ahí tendremos nuestro icono!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23931139-114466822941002287?l=dsltools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsltools.blogspot.com/feeds/114466822941002287/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23931139&amp;postID=114466822941002287&amp;isPopup=true' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114466822941002287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114466822941002287'/><link rel='alternate' type='text/html' href='http://dsltools.blogspot.com/2006/04/sobre-los-iconos-transparentes.html' title='Sobre los iconos transparentes'/><author><name>Vicente Soriano</name><uri>http://www.blogger.com/profile/08890774860429356321</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23931139.post-114466729166184390</id><published>2006-04-10T12:17:00.002+02:00</published><updated>2008-03-31T17:01:35.775+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DSL Tools Beta2'/><title type='text'>Iconos en las compartment shapes</title><content type='html'>Como ya es sabido, hay tres tipos de Shapes que podemos darle a una clase &lt;ol&gt;&lt;li&gt;&lt;div align="justify"&gt;Geometric Shape: forma geométrica predefinida (rectángulo, rectágulo redondeado, elipse, círculo o diamante)&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;Image Shape: imagen de un archivo&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;Compartment Shape: forma geométrica (rectángulo o rectángulo redondeado) con otras clases embebidas como atributos&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p align="justify"&gt;La cuestión es que no podemos tener Compartment Shapes representadas como imágenes de un archivo. Sin embargo podemos incluir una pequeña imagen en alguna zona del rectángulo. Podemos intentar hacerlo con la herramienta de &lt;a href="http://www.modelisoft.com/"&gt;Modelisoft&lt;/a&gt;, pero es muy probable que nos salga alguna excepción. Tal y como explican en su página, los iconos en las Shapes aun no están implementados (ver en el Walkthrough, la parte de &lt;em&gt;More Information&lt;/em&gt;), pero sin embargo podemos hacer que aparezca con unos pequeños cambios.&lt;/p&gt;&lt;p align="justify"&gt;Partiendo del ejemplo de lenguaje mínimo, vamos a poner un pequeño icono en la esquina superior izquierda a la shape que representa la clase &lt;em&gt;ExampleClass&lt;/em&gt;. Primero de nada ejecutamos el dsldm2dd, y editamos la ExampleShape.&lt;/p&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/4190/2482/320/icons1.jpg" border="0" /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p align="justify"&gt;Vamos siguiendo los pasos del asistente, hasta que llegamos a la parte de los Icon decorators, le damos al boton señalado con un + en la zona donde queremos poner nuestro icono, y lo seleccionamos del menu contextual que sigue.&lt;/p&gt;&lt;p align="justify"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/4190/2482/320/icons2.1.jpg" border="0" /&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;p align="justify"&gt;Con la parte &lt;em&gt;Always Visible&lt;/em&gt; marcada, le damos a aceptar y continuamos hasta que finalizamos el asistente. Salvamos el Designer.dsldd y volvemos al visual.&lt;/p&gt;&lt;p align="justify"&gt;Cuando recargamos el fichero y generamos templates parece que todo ha salido bien, pero si intentamos depurar el modelo, nos saldrá algo parecido al siguiente mensaje de error:&lt;/p&gt;&lt;p align="justify"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/4190/2482/320/icons3.jpg" border="0" /&gt;&lt;/p&gt;&lt;p align="justify"&gt;Bien, pues tal y como nos dicen, lo único que nos falta es agregar el icono en el fichero de Resources, en Designer\Diagram\Designer.Resource.resx. Detenemos la depuración y nos vamos a este fichero, y una vez allí seleccionamos la pestaña de &lt;em&gt;images&lt;/em&gt;. Allí están los dos iconos de la toolbox, tenemos que añadir nuestra imagen dándole a "Add Resource"-&gt;"Add Existing File". Es importante que el nombre de la imagen sea el mismo que el que nos decian en el diálogo de error.&lt;/p&gt;&lt;p align="justify"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/4190/2482/320/icons4.jpg" border="0" /&gt;&lt;/p&gt;&lt;p align="justify"&gt;Una vez ya está añadido, ya podemos volver a depurar y ver como aparece el icono para cada nueva Shape que añadamos.&lt;/p&gt;&lt;p align="justify"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/4190/2482/320/icons5.jpg" border="0" /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23931139-114466729166184390?l=dsltools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsltools.blogspot.com/feeds/114466729166184390/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23931139&amp;postID=114466729166184390&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114466729166184390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114466729166184390'/><link rel='alternate' type='text/html' href='http://dsltools.blogspot.com/2006/04/iconos-en-las-compartment-shapes.html' title='Iconos en las compartment shapes'/><author><name>Vicente Soriano</name><uri>http://www.blogger.com/profile/08890774860429356321</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23931139.post-114427576988759469</id><published>2006-04-06T00:13:00.001+02:00</published><updated>2008-03-31T17:01:48.409+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DSL Tools Beta2'/><title type='text'>Sintaxis de color en plantillas de generacion de código</title><content type='html'>&lt;div style="TEXT-ALIGN: justify"&gt;Bueno, voy a poner un breve post de como utilizar la .dll de Modelisoft que nos provee de sintaxis de color en nuestras plantillas de generacion de código.&lt;br /&gt;No se si habeis comenzado con la etapa de generacion de código, pero algo que se hace realmente pesado es programar sin la sintaxis de color, sobre todo porque el código esta lleno de tags y debido a que los caracteres de retorno de carro se vuelcan sobre el fichero de salida, hemos de tener especial cuidado y tenerlo todo al mogollon. Por eso nos viene bien conocer la extension que nos propone Modelisoft.&lt;br /&gt;&lt;br /&gt;Los pasos son bien sencillos:&lt;br /&gt;&lt;/div&gt;&lt;ul style="TEXT-ALIGN: justify"&gt;&lt;li&gt;1) &lt;a href="http://modelisoft.dyndns.org/Nouveau/en/T4LangPackage.zip"&gt;Descargarnos el .zip con la .dll&lt;/a&gt;&lt;/li&gt;&lt;li&gt;2) Modificar si es necesario el archivo install.bat que viene con el, para que apunte a la ruta correcta (en nuestro caso por ser español, lo tendremos en Archivos de programa...&lt;/li&gt;&lt;li&gt;3) Todas aquellas plantillas de generacion de código que queramos tener coloreadas, han de tener la extension .t4 o .ReportTemplate&lt;/li&gt;&lt;/ul&gt;&lt;div style="TEXT-ALIGN: justify"&gt;Tan simple como esto, ahora ya podemos programar de una forma mas "vistosa" y amigable.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3254/2478/1600/templateColoreado.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: pointer; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/3254/2478/320/templateColoreado.jpg" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23931139-114427576988759469?l=dsltools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsltools.blogspot.com/feeds/114427576988759469/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23931139&amp;postID=114427576988759469&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114427576988759469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114427576988759469'/><link rel='alternate' type='text/html' href='http://dsltools.blogspot.com/2006/04/sintaxis-de-color-en-plantillas-de.html' title='Sintaxis de color en plantillas de generacion de código'/><author><name>Enrique Catalá Bañuls</name><uri>https://profiles.google.com/106443016603413260641</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-JAennFczz-o/AAAAAAAAAAI/AAAAAAAAAAA/WHCyQfQWJOQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23931139.post-114417904477734566</id><published>2006-04-04T21:27:00.002+02:00</published><updated>2008-03-31T17:01:59.256+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DSL Tools Beta2'/><title type='text'>Como depurar en la plantilla de generacion de codigo</title><content type='html'>Uno de los problemas mas comunes a la hora de ponernos con la generacion de código es la Navegabilidad dentro de la propia plantilla de generacion de código. Es decir, como hacer los bucles foreach, como nos movemos entre clases, qué propiedades tenemos accesibles,...&lt;br /&gt;Todo esto en principio nos puede parecer trivial, puesto que hemos estado mucho tiempo modelando el diseñador, pero cuando tenemos algo puntual y sobre todo cuando nuestro modelo ya se va haciendo grande y dificil de acordarse de esos pequeños detalles, nos viene bien poder hacer breakpoints en la propia generacion de código.&lt;br /&gt;&lt;br /&gt;Es muy sencillo, lo único que tenemos que tener presente es que lo que vamos a depurar no es la plantilla en sí, sino el código que mediante Sofware Factories se ha generado en C# a partir de nuestro fichero de template, y que generará nuestro archivo de salida. Parece lioso de entender pero si relees la frase anterior lo entenderas.&lt;br /&gt;&lt;br /&gt;La idea general es la siguiente:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;nuestroTextTemplate.Template -&gt; codigoIntermedioC#.cs -&gt; nuestroFicheroOutput.sql&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Como veis, se hace en 3 pasos y lo que atañe a la depuracion lo tendremos en codigoIntermedioC#.cs que es el que depuraremos.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Lo que tenemos que hacer es bien sencillo:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Activar el flag debug="true" en la directiva "&lt;em&gt;template"&lt;/em&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;#@ template inherits="...ModelingTextTransformation" &lt;strong&gt;&lt;span style="COLOR: rgb(204,0,0)"&gt;debug="true"&lt;/span&gt;&lt;/strong&gt; #&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Importar el espacio de nombres System.Diagnostics&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="COLOR: rgb(204,0,0)"&gt;&lt;#@ import namespace="System.Diagnostics" #&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Utilizar un bloque de expresion donde llamemos a la clase Debugger y hagamos un Breakpoint&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="COLOR: rgb(204,0,0)"&gt;&lt;# Debugger.Break(); #&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Ahora, cuando pongamos el bloque "Expression", al guardar o darle al boton "GenerateAllTemplates", podremos pararnos en aquel punto marcado por nosotros. Pero recordad que lo que vereis sera el código C# intermedio generado mediante Sofware Factories.&lt;/p&gt;&lt;p&gt;Voy a poner un ejemplo de una prueba de plantilla de generacion de código simple con un breakpoint y luego parte de lo que veriamos en el Visual Studio con el debugger:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;# Debugger.Break(); #&gt;&lt;br /&gt;&lt;# foreach(Clase clase in this.Esquema.classRole) { #&gt;&lt;br /&gt;&lt;#=clase.Name#&gt;&lt;br /&gt;&lt;# } #&gt;&lt;/p&gt;&lt;p&gt;Aqui podemos ver una captura en plena depuracion:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3254/2478/1600/CapturaDebugging-Text-Templates.1.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: pointer; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/3254/2478/320/CapturaDebugging-Text-Templates.1.jpg" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23931139-114417904477734566?l=dsltools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsltools.blogspot.com/feeds/114417904477734566/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23931139&amp;postID=114417904477734566&amp;isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114417904477734566'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114417904477734566'/><link rel='alternate' type='text/html' href='http://dsltools.blogspot.com/2006/04/como-depurar-en-la-plantilla-de.html' title='Como depurar en la plantilla de generacion de codigo'/><author><name>Enrique Catalá Bañuls</name><uri>https://profiles.google.com/106443016603413260641</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-JAennFczz-o/AAAAAAAAAAI/AAAAAAAAAAA/WHCyQfQWJOQ/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23931139.post-114406256652400139</id><published>2006-04-03T12:52:00.002+02:00</published><updated>2008-03-31T17:02:18.678+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DSL Tools Beta2'/><title type='text'>Soft Constraints. Añadir cardinalidades a las relaciones</title><content type='html'>&lt;div align="justify"&gt;En nuestro proyecto necesitabamos algunas relaciones que indicaran restricciones de cardinalidad (uno a uno, muchos a muchos...). Para hacerlo, hemos seguido estos pasos:&lt;br /&gt;&lt;br /&gt;1. Seleccionar la relacion, darle al botón derecho y escoger la opción 'Show As Class'&lt;br /&gt;2. En la clase que representa la relacion añadirle dos nuevos atributos de tipo String, SourceMultiplicity y TargetMultiplicity.&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/4190/2482/320/cardinalidades_1.2.jpg" border="0" /&gt;&lt;br /&gt;3. (opcional) En la ventana de propiedades de estos atributos, ponerle un valor por defecto en el campo &lt;em&gt;Default&lt;/em&gt;.&lt;br /&gt;4. Ejecutar el DslDm2Dd, y en la ventana de Text Decorators seleccionar la posición donde queremos que aparezcan nuestras cardinalidades (recordar que las posiciones centrales aun no están implementadas).&lt;br /&gt;&lt;br /&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/4190/2482/320/cardinalidades_2.2.jpg" border="0" /&gt;&lt;br /&gt;5. Para la validacion de estas restricciones, hay que escribir algo de código. Al ser una soft-constraints, vamos a crear una carpeta en el proyecto DomainModel llamada &lt;em&gt;Validation&lt;/em&gt;, y dentro de ella un archivo &lt;em&gt;AggregationCardinality.cs, &lt;/em&gt;en el que escribiremos lo siguiente:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="COLOR: rgb(51,51,255)"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="COLOR: rgb(51,51,255)"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="COLOR: rgb(51,51,255)"&gt;using&lt;/span&gt; System.Text;&lt;br /&gt;&lt;span style="COLOR: rgb(51,51,255)"&gt;using&lt;/span&gt; Microsoft.VisualStudio.Modeling.Validation;&lt;br /&gt;&lt;span style="COLOR: rgb(51,51,255)"&gt;using&lt;/span&gt; Microsoft.VisualStudio.Modeling;&lt;br /&gt;&lt;br /&gt;&lt;span style="COLOR: rgb(51,51,255)"&gt;namespace&lt;/span&gt; Proyecto.Fincarrera.ObjectOrientedMultidimensionalModel.DomainModel&lt;br /&gt;{&lt;br /&gt;&lt;span style="COLOR: rgb(51,204,0)"&gt;/// &lt;summary&gt;&lt;br /&gt;/// Partial class for staging the validation methods for ModelCardinality&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;&lt;/span&gt;[&lt;span style="COLOR: rgb(0,204,204)"&gt;ValidationState&lt;/span&gt;(&lt;span style="COLOR: rgb(0,204,204)"&gt;ValidationState&lt;/span&gt;.Enabled)]&lt;br /&gt;&lt;span style="COLOR: rgb(51,51,255)"&gt;public partial class&lt;/span&gt; Fact&lt;br /&gt;{&lt;span style="COLOR: rgb(51,204,0)"&gt;&lt;summary&gt;&lt;br /&gt;// Ensure the cardinality is correct. Only values 0, 0..1, 0..*, 1, 1..&lt;br /&gt;&lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;[&lt;span style="COLOR: rgb(0,204,204)"&gt;ValidationMethod&lt;/span&gt;(&lt;span style="COLOR: rgb(0,204,204)"&gt;ValidationCategory&lt;/span&gt;.Open&lt;br /&gt;&lt;span style="COLOR: rgb(0,204,204)"&gt;ValidationCategory&lt;/span&gt;.Save&lt;br /&gt;&lt;span style="COLOR: rgb(0,204,204)"&gt;ValidationCategory&lt;/span&gt;.Menu)]&lt;br /&gt;&lt;span style="COLOR: rgb(51,51,255)"&gt;private void&lt;/span&gt; ValidateCardinality(&lt;span style="COLOR: rgb(0,204,204)"&gt;ValidationContext&lt;/span&gt; context)&lt;br /&gt;{&lt;br /&gt;&lt;span style="COLOR: rgb(51,51,255)"&gt;foreach&lt;/span&gt; (&lt;span style="COLOR: rgb(0,204,204)"&gt;ElementLink&lt;/span&gt; link &lt;span style="COLOR: rgb(51,51,255)"&gt;in this&lt;/span&gt;.GetElementLinks(&lt;span style="COLOR: rgb(0,204,204)"&gt;Aggregation&lt;/span&gt;.FactMetaRoleGuid))&lt;br /&gt;{&lt;br /&gt;&lt;span style="COLOR: rgb(0,204,204)"&gt;Aggregation&lt;/span&gt; aggregation = link &lt;span style="COLOR: rgb(51,51,255)"&gt;as&lt;/span&gt; &lt;span style="COLOR: rgb(0,204,204)"&gt;Aggregation&lt;/span&gt;;&lt;br /&gt;&lt;span style="COLOR: rgb(51,204,0)"&gt;//Validar la multiplicidad en el origen&lt;/span&gt;&lt;br /&gt;&lt;span style="COLOR: rgb(51,51,255)"&gt;if&lt;/span&gt; (aggregation.SourceMultiplicity != &lt;span style="COLOR: rgb(204,0,0)"&gt;"0"&lt;/span&gt; &amp;amp;&amp;amp; aggregation.SourceMultiplicity != &lt;span style="COLOR: rgb(204,0,0)"&gt;"0..1"&lt;/span&gt; &amp;amp;&amp;amp;&lt;br /&gt;aggregation.SourceMultiplicity != &lt;span style="COLOR: rgb(204,0,0)"&gt;"0..*"&lt;/span&gt; &amp;amp;&amp;amp; aggregation.SourceMultiplicity != &lt;span style="COLOR: rgb(204,0,0)"&gt;"1"&lt;/span&gt; &amp;amp;&amp;amp;&lt;br /&gt;aggregation.SourceMultiplicity != &lt;span style="COLOR: rgb(204,0,0)"&gt;"1..*"&lt;/span&gt;)&lt;br /&gt;{&lt;br /&gt;&lt;span style="COLOR: rgb(51,51,255)"&gt;string&lt;/span&gt; warning = &lt;span style="COLOR: rgb(51,51,255)"&gt;string&lt;/span&gt;.Format(&lt;span style="COLOR: rgb(0,204,204)"&gt;DomainModel_Resource&lt;/span&gt;.IncorrectAggregationCardinality, &lt;span style="COLOR: rgb(51,51,255)"&gt;this&lt;/span&gt;.Name);&lt;br /&gt;context.LogError(warning, &lt;span style="COLOR: rgb(204,0,0)"&gt;"Error 01"&lt;/span&gt;, &lt;span style="COLOR: rgb(51,51,255)"&gt;this&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;span style="COLOR: rgb(51,204,0)"&gt;//Validar la multiplicidad en el destino&lt;/span&gt;&lt;br /&gt;&lt;span style="COLOR: rgb(51,51,255)"&gt;if&lt;/span&gt; (aggregation.TargetMultiplicity != &lt;span style="COLOR: rgb(204,0,0)"&gt;"0"&lt;/span&gt; &amp;amp;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp; aggregation.TargetMultiplicity != &lt;span style="COLOR: rgb(204,0,0)"&gt;"0..1"&lt;/span&gt; &amp;amp;&amp;amp;&lt;br /&gt;aggregation.TargetMultiplicity != &lt;span style="COLOR: rgb(204,0,0)"&gt;"0..*"&lt;/span&gt; &amp;amp;&amp;amp; aggregation.TargetMultiplicity != &lt;span style="COLOR: rgb(204,0,0)"&gt;"1"&lt;/span&gt; &amp;amp;&amp;amp;&lt;br /&gt;aggregation.TargetMultiplicity != &lt;span style="COLOR: rgb(204,0,0)"&gt;"1..*"&lt;/span&gt;)&lt;br /&gt;{&lt;br /&gt;&lt;span style="COLOR: rgb(51,51,255)"&gt;string&lt;/span&gt; warning = &lt;span style="COLOR: rgb(51,51,255)"&gt;string&lt;/span&gt;.Format(&lt;span style="COLOR: rgb(0,204,204)"&gt;DomainModel_Resource&lt;/span&gt;.IncorrectAggregationCardinality, &lt;span style="COLOR: rgb(51,51,255)"&gt;this&lt;/span&gt;.Name);&lt;br /&gt;context.LogError(warning, &lt;span style="COLOR: rgb(204,0,0)"&gt;"Error 01"&lt;/span&gt;, &lt;span style="COLOR: rgb(51,51,255)"&gt;this&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;br /&gt;Como se puede ver, es un código sencillo. Las restricciones siempre son sobre una clase, y para sobreescribirla debemos poner el &lt;em&gt;public partial class&lt;/em&gt;. Justo encima de ella, la etiqueta&lt;br /&gt;&lt;em&gt;[ValidationState(ValidationState.Enabled)]&lt;/em&gt;, para indicar que va a ser una validación, y antes del método, la parte de &lt;em&gt;ValidationMethod &lt;/em&gt;indica los casos en los que se va a disparar la validación, en este caso al abrir, al salvar y cuando lo seleccionemos del menu contextual&lt;br /&gt;&lt;br /&gt;Sobre el código incluido en el método, lo que hace es extraer primero todas las relaciones de agregación con &lt;em&gt;this.GetElementLinks(Aggregation.FactMetaRoleGuid)&lt;/em&gt;, donde Aggregation es el nombre de la relación. Casteamos cada link como una agregación, y entonces ya podremos acceder a sus elementos asociados, como SourceMultiplicity y TargetMultiplicity. Para mostrar el error, obtenemos el string del archivo de Resources de DomainModel (el archivo &lt;em&gt;DomainModel.Resource.resx&lt;/em&gt;), y con &lt;em&gt;context.LogError&lt;/em&gt; podremos mostrarlo en la ventanita de errores cuando se produzca.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23931139-114406256652400139?l=dsltools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsltools.blogspot.com/feeds/114406256652400139/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23931139&amp;postID=114406256652400139&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114406256652400139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114406256652400139'/><link rel='alternate' type='text/html' href='http://dsltools.blogspot.com/2006/04/soft-constraints-aadir-cardinalidades.html' title='Soft Constraints. Añadir cardinalidades a las relaciones'/><author><name>Vicente Soriano</name><uri>http://www.blogger.com/profile/08890774860429356321</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23931139.post-114380118664674556</id><published>2006-03-31T11:04:00.001+02:00</published><updated>2008-03-31T17:02:32.488+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DSL Tools Beta2'/><title type='text'>Hard-Constraints. Ejemplo: evitar conexiones a uno mismo</title><content type='html'>&lt;p align="justify"&gt;Para añadir hard-constraints, primero de nada hemos creado una carpeta llamada &lt;em&gt;Custom&lt;/em&gt; en el proyecto del Designer, donde guardaremos todas las clases con código referente a restricciones en tiempo de ejecución. &lt;/p&gt;&lt;br /&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/4190/2482/400/hard_constraints1_1.jpg" border="0" /&gt; &lt;p align="justify"&gt;En el archivo &lt;em&gt;CustomConnectorRestrictions.cs&lt;/em&gt; es donde se escribirán restricciones relacionadas con los conectores entre Shapes. Este quizá en un nombre muy general, dependiendo del número de restricciones podemos tener un fichero por cada conector, o tener un fichero en el que se definan restricciones parecidas para distintos tipos de conectores, como en nuestro caso.&lt;br /&gt;&lt;br /&gt;Vamos a ver el ejemplo en el que queremos evitar que un conector que une a Shapes del mismo tipo pueda conectar a una Shape consigo misma. En nuestro caso, esta Shape está definida en el DomainModel con el concepto de "Base", y tiene una asociación consigo misma llamada "BaseAssociatesBase".&lt;br /&gt;&lt;br /&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/4190/2482/320/hard_constraints1_2.jpg" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/4190/2482/1600/hard_constraints1_3.jpg"&gt;&lt;img style="FLOAT: right; MARGIN: 0px 0px 10px 10px; CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger/4190/2482/320/hard_constraints1_3.jpg" border="0" /&gt;&lt;/a&gt;Si no hacemos nada, cuando ejecutamos el modelo nos aparece un conector de tipo &lt;em&gt;BasesAssociation &lt;/em&gt;en el Toolbox (o el que hayamos definido en el Designer.dsldd), que nos permite conectar una base consigo misma, como se muestra en la figura de la derecha. Para evitar esto, debemos escribir algo de código en el fichero &lt;em&gt;CustomConnectorRestrictions.cs &lt;/em&gt;creado antes. El código se muestra más abajo. He señalado en rojo las partes que he considerado más importantes. En primer lugar, el namespace debe ser el de la ruta al que pertenezca nuestro Designer, no el de la carpeta donde tiene que estar contenido el fichero (que en este caso sería la de &lt;em&gt;Custom&lt;/em&gt;) . Esto hay que tenerlo en cuenta porque cuando creamos un fichero nuevo dentro de la carpeta pone el namespace de la carpeta por defecto (&lt;br /&gt;Proyecto.Fincarrera.ObjectOrientedMultidimensionalModel.Designer.Custom).&lt;br /&gt;La clase debe ser una &lt;em&gt;public partial class&lt;/em&gt;, y el nombre de la clase debe ser el de nuestro conector (&lt;em&gt;BaseAssociatesBaseConnector&lt;/em&gt;), que podemos consultar en el fichero Designer.dslss, más la cadena &lt;em&gt;ConnectionType&lt;/em&gt;. Si no se pone así no nos la reconocerá. El método para evitar conexiones con uno mismo es el segundo, el llamado &lt;em&gt;CanSelfConnect&lt;/em&gt;. Sólo hay que devolver el valor de 'false' en el get para que no permita esto. &lt;/p&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#3333ff;"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color:#6600cc;"&gt;using&lt;/span&gt; Microsoft.VisualStudio.Modeling;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;using&lt;/span&gt; System.Diagnostics;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;using&lt;/span&gt; Microsoft.VisualStudio.Modeling.Utilities;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;using&lt;/span&gt; System.Drawing;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;using&lt;/span&gt; Microsoft.VisualStudio.Modeling.Diagrams;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;using&lt;/span&gt; Microsoft.VisualStudio.Modeling.Diagrams.GraphObject;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#33cc00;"&gt;/// Validaciones especificas&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#cc0000;"&gt;&lt;strong&gt;namespace Proyecto.Fincarrera.ObjectOrientedMultidimensionalModel.Designer&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#33cc00;"&gt;/// &lt;summary&gt;&lt;br /&gt;/// Extra constraints on BaseAssociatesBaseConnectorConnectionType.&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;public partial class&lt;/span&gt; &lt;span style="color:#cc0000;"&gt;&lt;strong&gt;BaseAssociatesBaseConnector&lt;/strong&gt;&lt;/span&gt;&lt;span style="color:#00cccc;"&gt;ConnectionType&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#33cc00;"&gt;/// &lt;summary&gt;&lt;br /&gt;/// Decide whether two shapes can be created with this type of connector.&lt;br /&gt;/// Called frequently as user moves mouse over candidate targets.&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;/// &lt;param name="sourceShapeElement"&gt;&lt;/param&gt;&lt;br /&gt;/// &lt;param name="targetShapeElement"&gt;&lt;/param&gt;&lt;br /&gt;/// &lt;param name="connectionWarning"&gt;Toolip - why these can't be connected.&lt;/param&gt;&lt;br /&gt;/// &lt;returns&gt;&lt;/returns&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#3333ff;"&gt;public override bool&lt;/span&gt; &lt;span style="color:#cc0000;"&gt;&lt;strong&gt;CanCreateConnection&lt;/strong&gt;&lt;/span&gt;(&lt;span style="color:#00cccc;"&gt;ShapeElement&lt;/span&gt; sourceShapeElement, &lt;span style="color:#00cccc;"&gt;ShapeElement&lt;/span&gt; targetShapeElement, &lt;span style="color:#3333ff;"&gt;ref string&lt;/span&gt; connectionWarning)&lt;br /&gt;{&lt;br /&gt;&lt;span style="color:#00cccc;"&gt;ShapeElement&lt;/span&gt; realSource = &lt;span style="color:#00cccc;"&gt;ConnectorConnectAction&lt;/span&gt;.TopLevelShape(sourceShapeElement);&lt;br /&gt;&lt;span style="color:#00cccc;"&gt;ShapeElement&lt;/span&gt; realTarget = &lt;span style="color:#00cccc;"&gt;ConnectorConnectAction&lt;/span&gt;.TopLevelShape(targetShapeElement);&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;if&lt;/span&gt; (realSource &lt;span style="color:#3333ff;"&gt;is&lt;/span&gt; &lt;span style="color:#00cccc;"&gt;BaseShape&lt;/span&gt; &amp;amp;&amp;amp; realTarget &lt;span style="color:#3333ff;"&gt;is&lt;/span&gt; &lt;span style="color:#00cccc;"&gt;BaseShape&lt;/span&gt; &amp;amp;&amp;amp; sourceShapeElement==targetShapeElement)&lt;br /&gt;{&lt;br /&gt;&lt;span style="color:#cc0000;"&gt;&lt;strong&gt;connectionWarning&lt;/strong&gt;&lt;/span&gt; = &lt;span style="color:#00cccc;"&gt;String&lt;/span&gt;.Format(System.Globalization.&lt;span style="color:#00cccc;"&gt;CultureInfo&lt;/span&gt;.CurrentCulture, Diagram.&lt;span style="color:#00cccc;"&gt;Designer_Resource&lt;/span&gt;.BaseToItself, "BaseShape");&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;return false&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#3333ff;"&gt;else&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#3333ff;"&gt;return&lt;/span&gt; &lt;span style="color:#3333ff;"&gt;base&lt;/span&gt;.CanCreateConnection(sourceShapeElement, targetShapeElement, &lt;span style="color:#3333ff;"&gt;ref&lt;/span&gt; connectionWarning);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#33cc00;"&gt;/// &lt;summary&gt;&lt;br /&gt;/// Prevent links of this type connecting back to same object.&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#3333ff;"&gt;protected override bool&lt;/span&gt; &lt;span style="color:#cc0000;"&gt;&lt;strong&gt;CanSelfConnect&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;get&lt;/span&gt;{ &lt;span style="color:#3333ff;"&gt;return false&lt;/span&gt;; }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;} &lt;/span&gt;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;p align="justify"&gt;Llegados a aquí ya habríamos acabado. Pero si además queremos que muestre un mensajito en forma de Tooltip cuando intentemos crear una conexion de uno a uno mismo, tenemos que añadir otro método, el &lt;em&gt;CanCreateConnection&lt;/em&gt;. Recibe tres parámetros, la Shape origen, la Shape destino y un string llamado &lt;em&gt;connectionWarning. &lt;/em&gt;Es este string el que nos permite mostrar el mensaje de error. Tan solo tenemos que decirle el caso en el que queremos que nos lo muestre. En el ejemplo, se mostrará cuando ambos extremos sean una BaseShape y además sean el mismo.&lt;br /&gt;Utilizando el método &lt;em&gt;String.Format&lt;/em&gt; podemos (y deberíamos) definir el mensaje de error en un fichero de recursos. En el ejemplo lo hemos hecho llamándole al mensaje de error "BaseToItself", y lo podemos encontrar en el fichero &lt;em&gt;Designer.Resource.resx&lt;/em&gt; de la carpeta &lt;em&gt;Diagram&lt;/em&gt; del proyecto &lt;em&gt;Designer.&lt;/em&gt; &lt;/p&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/4190/2482/400/hard_constraints1_5.jpg" border="0" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23931139-114380118664674556?l=dsltools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsltools.blogspot.com/feeds/114380118664674556/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23931139&amp;postID=114380118664674556&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114380118664674556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114380118664674556'/><link rel='alternate' type='text/html' href='http://dsltools.blogspot.com/2006/03/hard-constraints-ejemplo-evitar.html' title='Hard-Constraints. Ejemplo: evitar conexiones a uno mismo'/><author><name>Vicente Soriano</name><uri>http://www.blogger.com/profile/08890774860429356321</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23931139.post-114379502096557488</id><published>2006-03-31T10:22:00.001+02:00</published><updated>2008-03-31T17:02:44.563+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DSL Tools Beta2'/><title type='text'>Sobre las validaciones y restricciones</title><content type='html'>&lt;div align="justify"&gt;Para añadir restricciones a un modelo, hay dos formas distintas de hacerlo:&lt;br /&gt;&lt;br /&gt;- Usando el &lt;strong&gt;sistema de validaciones&lt;/strong&gt; (&lt;em&gt;soft-constraints&lt;/em&gt;). El código se añade en el proyecto del DomainModel (e.g. en una carpeta &lt;em&gt;Validation&lt;/em&gt;). Las validaciones se realizarán cuando se disparan determinados eventos, que seleccionamos para cada una de estas validaciones (al salvar -Save-, al abrirse un documento -Open-, al seleccionarlo en el menu emergente cuando hacemos doble-click en el diagrama -Menu-, o al hacerlo manualmente desde código -Custom-). Un mensaje en la pestaña de errores aparecerá cuando se dé una restricción, pero el usuario podrá seguir trabajando con el modelo aunque no estén todas las restricciones solucionadas&lt;br /&gt;&lt;br /&gt;- Usando el &lt;strong&gt;sistema gráfico&lt;/strong&gt; en tiempo de ejecución (&lt;em&gt;hard-constraints&lt;/em&gt;). El código se añade en el proyecto del Designer (e.g. en una carpeta &lt;em&gt;Custom&lt;/em&gt;). Las validaciones se realizan constantemente, en tiempo de ejecución (por ejemplo, cuando se intenta conectar dos Shapes mediante un Connector). Cuando se da una restricción aparece un icono de prohibición, indicando que esa situación no puede llegar a darse.&lt;br /&gt;&lt;br /&gt;El elegir una forma de restringir nuestro lenguaje u otra depende de lo que estemos buscando. Las soft-constraints, por lo general, permiten trabajar de una forma más rápida, y al final del todo se puede pasar a solucionar las restricciones, ya que con este sistema de validación podemos seguir trabajando aunque hayan partes de nuestro modelo que estén incorrectas.&lt;br /&gt;Las hard-constraints no permiten modelos incorrectos, y las restricciones se solucionan conforme vamos dibujando el diagrama. Estas restricciones deberían ser más sencillas, para que se puedan computar de una forma rápida y no ralentice la ejecución del programa. Un excesivo número de hard-constraints también puede llegar a resultar frustante para el diseñador, por tener que estar parando a cada paso para solucionar los problemas.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23931139-114379502096557488?l=dsltools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsltools.blogspot.com/feeds/114379502096557488/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23931139&amp;postID=114379502096557488&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114379502096557488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114379502096557488'/><link rel='alternate' type='text/html' href='http://dsltools.blogspot.com/2006/03/sobre-las-validaciones-y-restricciones.html' title='Sobre las validaciones y restricciones'/><author><name>Vicente Soriano</name><uri>http://www.blogger.com/profile/08890774860429356321</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23931139.post-114354020205032033</id><published>2006-03-28T11:13:00.001+02:00</published><updated>2008-03-31T17:02:56.392+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DSL Tools Beta2'/><title type='text'>Conectores bidireccionales en referencias</title><content type='html'>&lt;div align="justify"&gt;Pongamos que tenemos una referencia entre una clase A a otra clase B de tipos distintos. Si queremos definir un conector para esa referencia en el Designer.dsldd tenemos que definir el sentido en el que el conector será dibujado, esto es, desde un rol hasta otro. El problema es que sólo se puede definir un sentido, no ambos.&lt;br /&gt;&lt;br /&gt;Esto constituye un problema cuando queremos que nuestro conector pueda dibujarse en ambos sentidos. Al definir un unico sentido entre roles, no nos he posible definir ambas Shapes en la etiqueta &amp;lt;permittedShapes&amp;gt; del Designer.dsldd&lt;br /&gt;&lt;br /&gt;Si queremos que se pueda navegar desde la Shape A a la Shape B y viceversa, un posible solución es heredar ambas clases en el domain model desde una superclase ficticia (o no, si es que ya derivaban de una misma clase), llamémosla clase C, y crear un conector desde la clase C a sí misma. Gráficamente,&lt;br /&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/4190/2482/400/bidirectional.jpg" border="0" /&gt;&lt;br /&gt;De esta manera ya nos es posible crear un conector que vaya de la Shape A asociada a la clase A a la Shape B asociada a la clase B, y viceversa. Solo hay que poner las Shapes permitidas en la etiqueta &amp;lt;permittedshapes&amp;gt; de Designer.dsldd&lt;br /&gt;&lt;br /&gt;En nuestro modelo, se ha hecho este mismo cambio entre las clases Dimension y Fact:&lt;br /&gt;&lt;center&gt;&lt;a href="http://photos1.blogger.com/blogger/4190/2482/1600/dim2base_antes.1.jpg"&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger/4190/2482/400/dim2base_antes.1.jpg" border="0" /&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;&lt;center&gt;&lt;a href="http://photos1.blogger.com/blogger/4190/2482/1600/dim2base_despues.0.jpg"&gt;&lt;img style="MARGIN: 0px 0px 10px 10px; CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger/4190/2482/400/dim2base_despues.0.jpg" align="center" border="0" /&gt;&lt;/a&gt; &lt;/center&gt;&lt;br /&gt;Hemos de dar gracias a Brian, del foro de las DSL tools de Microsoft, por su ayuda en la solución de este problema. &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=315013&amp;amp;SiteID=1"&gt;Ver aqui&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23931139-114354020205032033?l=dsltools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsltools.blogspot.com/feeds/114354020205032033/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23931139&amp;postID=114354020205032033&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114354020205032033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114354020205032033'/><link rel='alternate' type='text/html' href='http://dsltools.blogspot.com/2006/03/conectores-bidireccionales-en.html' title='Conectores bidireccionales en referencias'/><author><name>Vicente Soriano</name><uri>http://www.blogger.com/profile/08890774860429356321</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23931139.post-114319452086267426</id><published>2006-03-24T10:59:00.001+01:00</published><updated>2008-03-31T17:03:07.958+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DSL Tools Beta2'/><title type='text'>Cambiar un icono de la toolbox</title><content type='html'>&lt;div align="justify"&gt;Algo tan sencillo como cambiar un icono ya definido para una clase en el toolbox puede acarrear muchos problemas.. al menos eso es lo que me ha pasado a mi.&lt;br /&gt;&lt;br /&gt;De alguna manera, si intentas modificar el icono con la aplicacion DslDm2Dd te lo hace, te cambia el icono, te actualiza el fichero Designer.dsldd, y cuando generas plantillas y depuras.. ¡el icono antiguo sigue ahi! Si a continuación vuelves a ejecutar el DslDm2Dd te das cuenta de que no ha cambiado..&lt;br /&gt;&lt;br /&gt;Solo he conseguido cambiar el icono de una manera, puede que haya alguna más sencilla pero esta es la que me ha funcionado a mi. Para ello, hay que seguir los siguientes pasos:&lt;br /&gt;&lt;br /&gt;1. Ejecutar el DslDm2Dd, y borrar la clase en la parte del Designer Definition que corresponde a la clase a la que quieres cambiar el icono. Guardar el Designer.dsldd.&lt;br /&gt;2. Volver al Visual, actualizar el fichero si te lo pide, generar templates y depurar. El icono habrá desaparecido de la Toolbox.&lt;br /&gt;3. Volver a ejecutar el DslDm2Dd, y arrastrar de la parte del Domain Model el concepto del que hay que cambiar el icono a la raiz del Designer Definition para crearlo de nuevo.&lt;br /&gt;4. Cambiarle el nombre de la clase a otro distinto del antiguo. En nuestro ejemplo, vamos a cambiarle el icono a un conector llamado BaseAssociatesBaseConnector, asi que le ponemos como nuevo nombre BaseAssociatesBaseConnector2 (ver figura).&lt;br /&gt;&lt;br /&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/4190/2482/400/changeIcon.1.jpg" border="0" /&gt;&lt;br /&gt;5. Seguir los pasos del asistente hasta que te pida el icono, y seleccionar el nuevo del fichero que sea.&lt;br /&gt;6. Salvar, generar plantillas y depurar. El nuevo icono aparecera en la toolbox.&lt;br /&gt;&lt;br /&gt;Siguiendo estos pasos, hemos cambiado el nombre al objeto del Designer Definition a otro distinto del que teniamos antes. Si queremos volver al nombre antiguo, tan solo hay que hacer un &lt;em&gt;Replace All&lt;/em&gt; del nombre que tenemos ahora al nuevo que queremos (que era el que teniamos en un principio)&lt;br /&gt;&lt;br /&gt;Creando un elemento en el Designer con un nuevo nombre hace que cree un nuevo objeto y, por lo tanto, inicialice todos sus valores a los indicados por primera vez. Si intentamos actualizar debe alguno que siempre se mantiene, y no podemos cambiarle el icono. Esperemos que en las versiones posteriores se solucione este problema. Hasta entonces, y si no encontramos ninguna solución mejor, tendremos que seguir usando este metodo...&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23931139-114319452086267426?l=dsltools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsltools.blogspot.com/feeds/114319452086267426/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23931139&amp;postID=114319452086267426&amp;isPopup=true' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114319452086267426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114319452086267426'/><link rel='alternate' type='text/html' href='http://dsltools.blogspot.com/2006/03/cambiar-un-icono-de-la-toolbox.html' title='Cambiar un icono de la toolbox'/><author><name>Vicente Soriano</name><uri>http://www.blogger.com/profile/08890774860429356321</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23931139.post-114294090181789556</id><published>2006-03-21T10:06:00.001+01:00</published><updated>2008-03-31T17:03:20.675+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DSL Tools Beta2'/><title type='text'>Sobre las compartment shapes y las embedding relationships</title><content type='html'>&lt;div align="justify"&gt;Este articulo debería haber llegado antes que el de Quique de los &lt;em&gt;Problemas derivados de usar palabras reservadas&lt;/em&gt;, ya que me hizo posible solucionar otros problemas que se dieron antes, problemas relacionados con el DomainModel y su semántica.&lt;br /&gt;&lt;br /&gt;Antes de nada quiero destacar que es muy difícil averiguar cada una de las cosas permitidas o no en el DomainModel, no hay ninguna documentación clara al respecto, y lograr averiguar el por qué de los errores a veces se convierte en una tarea más que difícil.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Primero de nada, sobre los compartmentShapes. &lt;a href="http://photos1.blogger.com/blogger/4190/2482/1600/compShapes1.1.jpg"&gt;&lt;img style="FLOAT: right; MARGIN: 0px 0px 10px 10px; CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger/4190/2482/320/compShapes1.1.jpg" border="0" /&gt;&lt;/a&gt; Para que en el Designer una clase pueda ser tratada como compartmentShape de otra, y esto gráficamente es que los elementos de una clase se representen como los atributos de otra (ver figura de la derecha-abajo), &lt;a href="http://photos1.blogger.com/blogger/4190/2482/1600/compShapes2.0.jpg"&gt;&lt;img style="FLOAT: right; MARGIN: 0px 0px 10px 10px; CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger/4190/2482/320/compShapes2.0.jpg" border="0" /&gt;&lt;/a&gt;la primera debe estar embebida en la segunda (cosa bastante lógica). Por lo tanto tiene que haber una relación embebida entre ellas en el DomainModel. Además, esta relación debe cumplir otra condición, y es que la propiedad &lt;em&gt;Accepts &lt;/em&gt;del rol de la izquierda (el triángulo) debe ser 'All', mientras que la otra (la del rectángulo) debe estar a 'None'. El sentido de esto no lo tengo nada claro todavía y no he logrado encontrar nada en la documentación, así que agradecería cualquier ayuda al respecto. Pero la cuestion es que debe ser así, de otra manera no funciona. &lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/4190/2482/1600/embeding.0.jpg"&gt;&lt;img style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger/4190/2482/320/embeding.0.jpg" border="0" /&gt;&lt;/a&gt;Después, con respecto a las relaciones embebidas. Encontré una frase en uno de los walktroughs que es de gran ayuda: &lt;em&gt;it is impossible for A to embed B, when a class C already embeds B&lt;/em&gt;. Gráficamente es lo representado en la figura de la izquierda. En nuestro caso particular esto pasaba con el DegenerateDimension y el FactAttribute, ya que ambos estaban embebidos tanto por el Fact como por el DegenerateFact. Asi que simplemente cambié las relaciones en el DegenerateFact por referencias. Esto es solo una solución provisional, hasta que encontremos otro modelo equivalente y válido en el que podamos obtener los resultados que queremos.&lt;br /&gt;&lt;br /&gt;Y por último, algo también importante, en una relación embebida sólo hay cuatro posibles combinaciones en las cardinalidades de los roles: (*,0), (*,1), (+,0), (+,1). Cualquier otra combinación entre ellas dará error cuando intentemos generar los templates.&lt;/div&gt;&lt;div align="justify"&gt;El rol del rectángulo no te da opción a ningún otro valor que no sea 0 o 1, pero sin embargo en el triángulo si que te permite cualquier valor. En este último rol, por lo tanto, el valor de &lt;em&gt;max &lt;/em&gt;siempre deberá ser de '0'. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23931139-114294090181789556?l=dsltools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsltools.blogspot.com/feeds/114294090181789556/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23931139&amp;postID=114294090181789556&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114294090181789556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114294090181789556'/><link rel='alternate' type='text/html' href='http://dsltools.blogspot.com/2006/03/sobre-las-compartment-shapes-y-las.html' title='Sobre las compartment shapes y las embedding relationships'/><author><name>Vicente Soriano</name><uri>http://www.blogger.com/profile/08890774860429356321</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23931139.post-114290066278492426</id><published>2006-03-21T01:20:00.001+01:00</published><updated>2008-03-31T17:03:31.802+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DSL Tools Beta2'/><title type='text'>Primera compilacion de nuestro proyecto!</title><content type='html'>&lt;div style="TEXT-ALIGN: justify"&gt;Ya compila (gracias vicen por la currada de ver y corregir las petadas de las plantillas)!!! Si sigues el post anterior, veras que es lo que he hecho para compilar a partir de la version que modificaste.&lt;br /&gt;&lt;br /&gt;Dicho esto, voy a poner un pantallazo de la primera version compilada del ObjectOrientedMultidimensionalModel (vaya nombrecito, eh? ;).&lt;br /&gt;&lt;br /&gt;De momento no podemos hacer conexiones entre Facts, dimensions y base clases, pero poco a poco.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3254/2478/1600/OOMM-0.1.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: pointer; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/3254/2478/320/OOMM-0.1.jpg" border="0" /&gt;&lt;/a&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23931139-114290066278492426?l=dsltools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsltools.blogspot.com/feeds/114290066278492426/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23931139&amp;postID=114290066278492426&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114290066278492426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114290066278492426'/><link rel='alternate' type='text/html' href='http://dsltools.blogspot.com/2006/03/primera-compilacion-de-nuestro.html' title='Primera compilacion de nuestro proyecto!'/><author><name>Enrique Catalá Bañuls</name><uri>https://profiles.google.com/106443016603413260641</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-JAennFczz-o/AAAAAAAAAAI/AAAAAAAAAAA/WHCyQfQWJOQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23931139.post-114289585599891159</id><published>2006-03-20T23:31:00.001+01:00</published><updated>2008-03-31T17:03:43.163+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DSL Tools Beta2'/><title type='text'>Problemas derivados de usar palabras reservadas</title><content type='html'>Una vez tenemos el DomainModel.dsldm completo y hemos sincronizado el Designer.dsldd (utilizando la herramienta de Modelisoft por ejemplo), llega la hora de pulsar el botoncito de "&lt;span style="FONT-STYLE: italic"&gt;Transform all templates&lt;/span&gt;" , que nos generara el código C# que compilaremos para que se nos cree la libreria de nuestro Lenguaje de Dominio con la que podremos ya empezar a generar nuestro código y nuestras cosas.&lt;br /&gt;&lt;div style="TEXT-ALIGN: justify"&gt;&lt;br /&gt;Voy a exponer algunos problemas derivados de nuestro modelo de dominio en concreto.&lt;br /&gt;&lt;br /&gt;Nuestro proyecto consiste en un Modelo Multidimensional Orientado a Objetos. Se trata de un lenguaje de modelado multidimensional para almacenes de datos. El problema que hemos tenido ha sido por la nomenclatura de nuestras clases. Aqui podeis ver la estructura de nuestro DomainModel.dsldm en la que podemos destacar cosas como la clase "Class" o "Base", cuyas relaciones llamadas "class" y "base" nos van a dar alguna que otra sorpresita desagradable.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3254/2478/1600/Fase2.2.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: pointer; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/3254/2478/320/Fase2.2.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Las palabras reservadas, no se pueden usar y eso es algo que todavia al estar en fase beta, las DSL Tools no impiden. Puesto que no se nos ha impedido, hemos podido utilizar nombres de clase como "class", "base", utilizar tipos de datos no definidos,...&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul style="TEXT-ALIGN: justify"&gt;&lt;li&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Problemas de las palabras reservadas "class" y "base":&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="TEXT-ALIGN: justify"&gt;El primer problema que hemos tenido que solventar ha sido el de compilacion producido por utilizar la palabra reservada "class" en nuestro DomainModel. Esta palabra reservada la hemos utilizado en la relacion entre "Esquema" y "Class". La solucion es tan sencilla como cambiarle el nombre a por ejemplo "classRole".&lt;br /&gt;&lt;br /&gt;Identico problema hemos tenido entre las clases "Dimension" y "Base", cuyo rol se llamaba "base" y ha sido reemplazado por baseRole.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3254/2478/1600/Fase3.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: pointer; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/3254/2478/320/Fase3.jpg" border="0" /&gt;&lt;/a&gt;Una vez hecho esto , tendremos que sincronizar los cambios del DomainModel, con el Designer y aplicar mas tarde el botoncito de "&lt;span style="FONT-STYLE: italic"&gt;Transform all templates&lt;/span&gt;" para que nos vuelva a generar las plantillas de código y veremos otros errores distintos al compilar la solucion.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul style="TEXT-ALIGN: justify"&gt;&lt;li&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Error de tipo de datos mal definido:&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="TEXT-ALIGN: justify"&gt;Ahora veremos que los errores de antes han desaparecido y nos aparecen otros errores. Nos centraremos primero en uno un tanto extraño en el cual podemos ver que la generacion de código ha producido una línea c# no válida. Simplemente hace falta saber dónde ha sido declarada esa propiedad en el DomainModel, para darse cuenta que el error viene dado por no haber declarado correctamente sus tipos.&lt;br /&gt;&lt;br /&gt;La propiedad en cuestion que da error al compilar es la siguiente:&lt;br /&gt;&lt;br /&gt;&lt;span style="COLOR: rgb(0,153,0); FONT-STYLE: italic"&gt;private Proyecto.Fincarrera.ObjectOrientedMultidimensionalModel.DomainModel.AssociationType typePropertyStorage = Proyecto.Fincarrera.ObjectOrientedMultidimensionalModel.DomainModel.AssociationType&lt;span style="FONT-WEIGHT: bold; COLOR: rgb(204,0,0)"&gt;.0&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En ella podemos ver claramente como le intenta poner a la propiedad , como nombre el número &lt;span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,0)"&gt;"0"&lt;/span&gt;, lo cual es sintacticamente incorrecto y nos avisa el compilador con un estupendo error. Para arreglarlo, nos vamos a la declaracion en el DomainModel y nos damos cuenta que el error es porque tiene como tipo de datos "AssociationType" y valor por defecto 0. Si sabemos que va a ser un desplegable, pues le ponemos como tipo de datos entero y valor por defecto 0 y arreglado.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3254/2478/1600/Error-AssociationType.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: pointer; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/3254/2478/320/Error-AssociationType.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Una vez corregido esto, volvemos a transformar todos los templates y a recompilar.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul style="TEXT-ALIGN: justify"&gt;&lt;li&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Problema del caracter no válido dentro de una enumeracion:&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="TEXT-ALIGN: justify"&gt;&lt;br /&gt;Debido a nuestro Modelo de dominio en concreto, donde uno de los conectores tiene por nombre Rolls-upTo, al generarse los ficheros de código a partir de nuestras plantillas, ha vuelto a surgirnos un error de sintaxis.&lt;br /&gt;&lt;br /&gt;&lt;span style="COLOR: rgb(0,153,0); FONT-STYLE: italic"&gt;public enum AssociationType&lt;/span&gt;&lt;br /&gt;&lt;span style="COLOR: rgb(0,153,0); FONT-STYLE: italic"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="COLOR: rgb(0,153,0); FONT-STYLE: italic"&gt;Rolls&lt;span style="FONT-WEIGHT: bold; COLOR: rgb(204,0,0)"&gt;-&lt;/span&gt;upTo=0,&lt;/span&gt;&lt;br /&gt;&lt;span style="COLOR: rgb(0,153,0); FONT-STYLE: italic"&gt;Completeness=1,&lt;/span&gt;&lt;br /&gt;&lt;span style="COLOR: rgb(0,153,0); FONT-STYLE: italic"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Como vemos, ese signo "&lt;span style="COLOR: rgb(153,0,0)"&gt;-&lt;/span&gt;" es sintacticamente incorrecto y va a hacer que el compilador nos diga que esperaba un ";". Pues bien ahora hay que ir a detectar donde se ha declarado y cambiarlo. Veremos pues que en este caso se ha generado a partir de uno de los miembros de la enumeracion "AssociationType" de la que antes hablábamos porque tenia otro error y que su solucion vuelve a ser tan simple como eliminar ese signo "-".&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3254/2478/1600/Error-rolls-upto.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: pointer; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/3254/2478/320/Error-rolls-upto.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Una vez conseguido esto, ya compila nuestro DSL y podemos hechar un primer vistazo al modelo. Claro esta, tendremos que retocarlo mas adelante pero ya tenemos un primer paso conseguido. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23931139-114289585599891159?l=dsltools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsltools.blogspot.com/feeds/114289585599891159/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23931139&amp;postID=114289585599891159&amp;isPopup=true' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114289585599891159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114289585599891159'/><link rel='alternate' type='text/html' href='http://dsltools.blogspot.com/2006/03/problemas-derivados-de-usar-palabras.html' title='Problemas derivados de usar palabras reservadas'/><author><name>Enrique Catalá Bañuls</name><uri>https://profiles.google.com/106443016603413260641</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-JAennFczz-o/AAAAAAAAAAI/AAAAAAAAAAA/WHCyQfQWJOQ/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23931139.post-114246089172830277</id><published>2006-03-15T22:47:00.001+01:00</published><updated>2008-03-31T17:03:54.847+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DSL Tools Beta2'/><title type='text'>Sincronizar DomainModel.dsldm y Designer.dsldd</title><content type='html'>Cuando escribo estas lineas, estoy utilizando el Visual Studio 2005 SDK CTP Febrero 2006, que trae las DSLTools integradas dentro de el. En esta revision de las DSL Tools existe un gran problema para el desarrollador de lenguajes de dominio, la sincronizacion del Modelo de dominio y del Diseñador grafico.&lt;br /&gt;&lt;div style="TEXT-ALIGN: justify"&gt;&lt;br /&gt;El modelo de dominio lo definimos graficamente ayudados por la interfaz gráfica que nos proporciona Visual Studio 2005. En el, desarrollamos restricciones de cardinalidad, herencias entre clases, agregaciones, conectores,...para definir nuestro Modelo de Dominio. Esta definicion gráfica, se nos genera un fichero denominado DomainModel.dsldm dentro del proyecto DomainModel. Hasta aqui todo correcto, el problema viene luego a la hora de sincronizarnos con el diseñador gráfico, que es el que van a usar los "modeladores" o personas que usaran el Lenguaje de Dominio específico que hemos creado para ellos. En esta version de Febrero de las DSL Tools no se incluye ningun tipo de diseñador gráfico para el fichero Designer.dsldd por lo que te toca editar cientos de lineas XML formateado para especificar las dependencias, formas de figuras,...es decir un lio tremendo.&lt;br /&gt;&lt;br /&gt;Para esta tarea, de forma no oficial, la empresa &lt;a href="http://www.modelisoft.com/"&gt;ModeliSoft &lt;/a&gt;ha creado un &lt;a href="http://modelisoft.dyndns.org/Nouveau/Dmd2Dd.aspx"&gt;programa externo&lt;/a&gt; que se encarga de procesar el fichero DomainModel.dsldm y permitirnos en funcion de el, que sincronicemos nuestro diseñador gráfico. Es de muy agradecer esta herramienta porque como veremos, aunque no es facil utilizar las DSL Tools en esta etapa temprana, con esta herramienta, una de las mayores pegas con las que nos podemos encontrar ahora se disipan, la sincronizacion dsldm y dsldd.&lt;br /&gt;&lt;br /&gt;Mi intencion en este post no es hacer un tutorial de uso de la herramienta , puesto que se encuentra en la misma web antes mencionada, sino exponer los problemas con los que nos estamos encontrando al utilizarla.&lt;br /&gt;&lt;br /&gt;El primer problema que nos encontramos es que si hacemos el DomainModel.dsldm directamente y una vez hecho abrimos la aplicacion Dsldm2Dd.exe y cargamos el archivo Designer.dsldd de nuestro proyecto, vamos a ver un terrorifico error que nos va a hacer creer que no podemos utilizar la herramienta teniendo que programar a mano el XML. Nada mas lejos de la realidad puesto que veremos como con unos sencillos cambios arreglaremos esta situacion.&lt;br /&gt;&lt;br /&gt;Si al abrir la herramienta Dsldm2Dd.exe y cargar la configuracion de nuestro Designer.dsldd nos da un error del JIT de .NET o que no es posible realizar la carga porque parece que el archivo que intenta cargar no es un archivo dsldd válido, es porque la clase raiz, es decir, la que le dice la superficie en la que pintar (el esquema propiamente dicho donde vamos a dibujar nuestro modelo) ha cambiado y no hay relacion ninguna entre el DomainModel.dsldm y el Designer.dsldd. Para saltarnos este error y poder comenzar a trabajar con la herramienta, lo que debemos hacer es abrir el fichero Designer.dsldd y reemplazar la cadena "ExampleModel" por la cadena que identifique la clase raiz de nuestro modelo; en nuestro caso "Esquema". Una vez hecho eso y guardado veremos como ahora si que nos funcionará la herramienta y ya podremos continuar usándola.&lt;br /&gt;&lt;br /&gt;Por ejemplo, una ocurrencia que tendriamos que cambiar seria esta:&lt;br /&gt;&lt;&gt;&lt;br /&gt;&lt;&gt;&lt;br /&gt;&lt;&gt;&lt;br /&gt;&lt;&gt;&lt;br /&gt;....DomainModel.ObjectOrientedMultidimensionalModel/&lt;span style="FONT-WEIGHT: bold; COLOR: rgb(204,0,0)"&gt;ExampleModel&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: rgb(204,0,0)"&gt;&lt;/span&gt;&lt; /class&gt;&lt;br /&gt;&lt; /childCollections&gt;&lt;br /&gt;...&lt;br /&gt;Cambiaríamos "ExampleModel" por "Esquema".&lt;br /&gt;&lt;br /&gt;&lt;div style="TEXT-ALIGN: justify"&gt;Esto es debido a que cuando comenzamos la creacion de nuestro modelo de dominio, lo que hacemos es comenzar desde un "lenguaje mínimo", y este lenguaje mínimo si que viene ya sincronizado en las plantillas dsldm y dsldd pero cuando editamos el dsldm, el dsldd no se modifica y por eso tenemos que darle una ayudita a la herramienta de Modelisoft, para que empiece sabiendo por lo menos el punto de partida o nombre del esquema.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="TEXT-ALIGN: justify"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3254/2478/1600/ScreenExploradorSolucionProyecto-Fase2.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: pointer; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/3254/2478/320/ScreenExploradorSolucionProyecto-Fase2.jpg" border="0" /&gt;&lt;/a&gt;Aqui podemos ver los dos archivos mencionados: DomainModel.dsldm y Designer.dsldd &lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23931139-114246089172830277?l=dsltools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsltools.blogspot.com/feeds/114246089172830277/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23931139&amp;postID=114246089172830277&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114246089172830277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114246089172830277'/><link rel='alternate' type='text/html' href='http://dsltools.blogspot.com/2006/03/sincronizar-domainmodeldsldm-y.html' title='Sincronizar DomainModel.dsldm y Designer.dsldd'/><author><name>Enrique Catalá Bañuls</name><uri>https://profiles.google.com/106443016603413260641</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-JAennFczz-o/AAAAAAAAAAI/AAAAAAAAAAA/WHCyQfQWJOQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23931139.post-114238211318670798</id><published>2006-03-15T01:01:00.001+01:00</published><updated>2008-03-31T17:04:11.677+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DSL Tools Beta2'/><title type='text'>Crear funciones para el parser</title><content type='html'>&lt;div style="TEXT-ALIGN: justify"&gt;Tambien llamados "ClassFeatures", con su sintaxis &lt;span style="COLOR: rgb(204,0,0); FONT-STYLE: italic"&gt;&lt;#+ ClassFeature #&gt;&lt;/span&gt;, nos permiten definirnos funciones para que se ejecuten en el parser antes de generar el código y podamos hacer cambios en el mismo.&lt;br /&gt;&lt;br /&gt;Un tipico ejemplo es el de el nombre de una tabla de sql. Obviando características especiales de SQL Server como poner los nombres entre corchetes; si hacemos "create table Tabla 3", nos dara un error porque no sabe que el nombre de la tabla tiene un espacio. Pues bien, podemos hacer para que o bien nos genere los corchetes ( quedando "create table [Tabla 3]") o que nos quite el/los espacio/s en blanco (quedando "create Table Tabla3").&lt;br /&gt;&lt;br /&gt;Optando por la segunda forma porque de paso veremos como utilizar la directiva import y el uso de clases externas, lo que habria que hacer es lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul style="TEXT-ALIGN: justify"&gt;&lt;li&gt;1) Importar el namespace System.Text.RegularExpressions&lt;/li&gt;&lt;/ul&gt;&lt;div style="TEXT-ALIGN: justify"&gt;&lt;div style="TEXT-ALIGN: left"&gt;Esto se hace añadiendo al principio del template la siguiente directiva:&lt;br /&gt;&lt;/div&gt;&lt;div style="TEXT-ALIGN: left"&gt;&lt;span style="COLOR: rgb(204,0,0); FONT-STYLE: italic"&gt;&lt;#@ import namespace = "System.Text.RegularExpressions" #&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;ul style="TEXT-ALIGN: justify"&gt;&lt;li&gt;2) Definirnos en cualquier parte la ClassFeature siguiente:&lt;/li&gt;&lt;/ul&gt;&lt;div style="TEXT-ALIGN: justify"&gt;&lt;span style="FONT-STYLE: italic"&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;/span&gt;&lt;span style="FONT-STYLE: italic"&gt;&lt;/span&gt;&lt;span style="FONT-STYLE: italic"&gt;&lt;/span&gt;&lt;span style="FONT-STYLE: italic"&gt;&lt;/span&gt;&lt;span style="FONT-STYLE: italic"&gt;&lt;#+&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic"&gt;&lt;/span&gt;&lt;span style="FONT-STYLE: italic"&gt;&lt;/span&gt;&lt;span style="FONT-STYLE: italic"&gt;&lt;/span&gt;&lt;span style="FONT-STYLE: italic"&gt;private string FixWhiteSpaces(string typeName)&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic"&gt;&lt;/span&gt;&lt;span style="FONT-STYLE: italic"&gt;&lt;/span&gt;&lt;span style="FONT-STYLE: italic"&gt;&lt;/span&gt;&lt;span style="FONT-STYLE: italic"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic"&gt;&lt;/span&gt;&lt;span style="FONT-STYLE: italic"&gt;&lt;/span&gt;&lt;span style="FONT-STYLE: italic"&gt;&lt;/span&gt;&lt;span style="FONT-STYLE: italic"&gt;&lt;span style="COLOR: rgb(0,153,0)"&gt;//Usa el namespace System.Text.RegularExpressions importado antes&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic"&gt;&lt;/span&gt;&lt;span style="FONT-STYLE: italic"&gt;&lt;/span&gt;&lt;span style="FONT-STYLE: italic"&gt;&lt;/span&gt;&lt;span style="FONT-STYLE: italic"&gt;string checkName = Regex.Replace(typeName," ","");&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic"&gt;&lt;/span&gt;&lt;span style="FONT-STYLE: italic"&gt;&lt;/span&gt;&lt;span style="FONT-STYLE: italic"&gt;&lt;/span&gt;&lt;span style="FONT-STYLE: italic"&gt;return(checkName.ToString());&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic"&gt;&lt;/span&gt;&lt;span style="FONT-STYLE: italic"&gt;&lt;/span&gt;&lt;span style="FONT-STYLE: italic"&gt;&lt;/span&gt;&lt;span style="FONT-STYLE: italic"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic"&gt;&lt;/span&gt;&lt;span style="FONT-STYLE: italic"&gt;&lt;/span&gt;&lt;span style="FONT-STYLE: italic"&gt;&lt;/span&gt;&lt;span style="FONT-STYLE: italic"&gt;#&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;ul style="TEXT-ALIGN: justify"&gt;&lt;li&gt;3) Ahora solo falta usarlo, y se usa como cualquier funcion, pero desde dentro de un bloque de sentencias &lt;#...#&gt;. Por ejemplo, este código es válido.&lt;/li&gt;&lt;/ul&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;div style="TEXT-ALIGN: justify"&gt;&lt;# foreach(Table table in this.Schema.tables) { &lt;span style="COLOR: rgb(0,153,0)"&gt;//Como vemos, cojemos el nombre de la tabla del diagrama&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;s&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold"&gt;&lt;span style="FONT-WEIGHT: bold"&gt;tring nombreTabla = table.Name;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR: rgb(0,153,0)"&gt;// Si el nombre de la columna contiene espacios en blanco, se los quito &lt;/span&gt;&lt;br /&gt;&lt;span style="COLOR: rgb(204,0,0)"&gt;nombreTabla = FixWhiteSpaces(nombreTabla); &lt;/span&gt;&lt;br /&gt;#&gt;&lt;br /&gt;&lt;br /&gt;Create Table &lt;span style="COLOR: rgb(204,0,0)"&gt;&lt;#=nombreTabla#&gt;&lt;/span&gt;&lt;br /&gt;(&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;&lt;div style="TEXT-ALIGN: left"&gt;&lt;# //Cierro el bucle foreach } #&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Esto creara ficheros como el siguiente:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Create Table Tabla1&lt;br /&gt;(&lt;br /&gt;)&lt;br /&gt;Create Table NiNombreTabla&lt;br /&gt;(&lt;br /&gt;)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Para ello, los nombres de las tablas podian haberse puesto en el diagrama como " Ni NombreTa b l a", puesto que con la funcion de antes , se eliminan los espacios en blanco.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23931139-114238211318670798?l=dsltools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsltools.blogspot.com/feeds/114238211318670798/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23931139&amp;postID=114238211318670798&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114238211318670798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114238211318670798'/><link rel='alternate' type='text/html' href='http://dsltools.blogspot.com/2006/03/crear-funciones-para-el-parser.html' title='Crear funciones para el parser'/><author><name>Enrique Catalá Bañuls</name><uri>https://profiles.google.com/106443016603413260641</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-JAennFczz-o/AAAAAAAAAAI/AAAAAAAAAAA/WHCyQfQWJOQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23931139.post-114237998070387298</id><published>2006-03-15T00:33:00.001+01:00</published><updated>2008-03-31T17:04:23.818+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DSL Tools Beta2'/><title type='text'>Comentarios en los Templates</title><content type='html'>Para poner comentarios dentro de las plantillas de generacion de código, es tan simple como recordar que las Sentencias &lt;#...#&gt; son para delimitar código compilado en .net y por tanto si creamos una directiva en la cual lo unico que tenemos es un comentario, esta no se vera representada en el fichero generado.&lt;br /&gt;&lt;br /&gt;Aqui tenemos un ejemplo de comentario.&lt;br /&gt;&lt;br /&gt;&lt;# &lt;span style="COLOR: rgb(51,204,0)"&gt;// Soy un comentario y no voy a verme reflejado en el fichero de salida&lt;/span&gt;&lt;br /&gt;#&gt;&lt;br /&gt;&lt;br /&gt;El problema viene porque al estar en un estado temprano, el parser de DSLTools tiene problemas con los comentarios y cree que hay Sentencias donde no las hay.&lt;br /&gt;&lt;br /&gt;Por ejemplo:&lt;br /&gt;&lt;# &lt;span style="COLOR: rgb(51,204,0)"&gt;/* Esto lo he comentado porque no consigo depurarlo&lt;/span&gt;&lt;br /&gt;&lt;span style="COLOR: rgb(51,204,0)"&gt;&lt;#@ template debug="true" #&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="COLOR: rgb(51,204,0)"&gt;&lt;#@ import namespace="System.Diagnostics" #&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="COLOR: rgb(51,204,0)"&gt;*/&lt;/span&gt;&lt;br /&gt;#&gt;&lt;br /&gt;Aunque es sintacticamente correcto, nos da error el compilador porque el parser del template se lia con los #&gt; y cree que hemos cerrado la Sentencia cuando realmente tendria que pasar de largo porque esta dentro de un comentario. Esto hace que lo que le de al compilador de .net sea un código no valido y por eso nos saca warnings y errores.&lt;br /&gt;&lt;br /&gt;La solucion es obvia, para salir del paso le podemos decir que son caracteres especiales; al estar dentro de un comentario no hara nada.&lt;br /&gt;&lt;br /&gt;&lt;# &lt;span style="COLOR: rgb(51,204,0)"&gt;/* Esto lo he comentado porque no consigo depurarlo&lt;/span&gt;&lt;br /&gt;&lt;span style="COLOR: rgb(51,204,0)"&gt;&lt;&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: rgb(204,0,0)"&gt;\&lt;/span&gt;&lt;span style="COLOR: rgb(51,204,0)"&gt;#@ template debug="true"&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: rgb(51,204,0)"&gt; &lt;span style="COLOR: rgb(204,0,0)"&gt;\&lt;/span&gt;&lt;/span&gt;&lt;span style="COLOR: rgb(51,204,0)"&gt;#&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="COLOR: rgb(51,204,0)"&gt;&lt;&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: rgb(204,0,0)"&gt;\&lt;/span&gt;&lt;span style="COLOR: rgb(51,204,0)"&gt;#@ import namespace="System.Diagnostics" &lt;span style="FONT-WEIGHT: bold; COLOR: rgb(204,0,0)"&gt;\&lt;/span&gt;#&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="COLOR: rgb(51,204,0)"&gt;*/&lt;/span&gt;&lt;br /&gt;#&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23931139-114237998070387298?l=dsltools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsltools.blogspot.com/feeds/114237998070387298/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23931139&amp;postID=114237998070387298&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114237998070387298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114237998070387298'/><link rel='alternate' type='text/html' href='http://dsltools.blogspot.com/2006/03/comentarios-en-los-templates.html' title='Comentarios en los Templates'/><author><name>Enrique Catalá Bañuls</name><uri>https://profiles.google.com/106443016603413260641</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-JAennFczz-o/AAAAAAAAAAI/AAAAAAAAAAA/WHCyQfQWJOQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23931139.post-114237775472815200</id><published>2006-03-15T00:04:00.001+01:00</published><updated>2008-03-31T17:04:55.413+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DSL Tools Beta2'/><title type='text'>Caracteres especiales en generacion de codigo</title><content type='html'>Bueno a partir de ahora voy a hablar de Templates de generacion de código y para abreviar mas aun, de Templates. De esta forma vamos a ver que para que en nuestros templates de generacion de código se nos generen caracteres especiales como las comillas " o el signo menor que "&lt;" (por ejemplo), hemos de hacer tal y como haciamos al programar en C/C++. Es decir con el caracter especial "\". De esta forma, podremos hacer lo siguiente: &lt;span style="COLOR: rgb(204,0,0)"&gt;&lt;# string texto = "\"Texto entre comillas"\" #&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="COLOR: rgb(204,0,0)"&gt;&lt;#= texto #&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Con lo que se nos generara: &lt;span style="FONT-WEIGHT: bold"&gt;"Texto entre comillas"&lt;/span&gt; (con comillas incluidas)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23931139-114237775472815200?l=dsltools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsltools.blogspot.com/feeds/114237775472815200/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23931139&amp;postID=114237775472815200&amp;isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114237775472815200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114237775472815200'/><link rel='alternate' type='text/html' href='http://dsltools.blogspot.com/2006/03/caracteres-especiales-en-generacion-de.html' title='Caracteres especiales en generacion de codigo'/><author><name>Enrique Catalá Bañuls</name><uri>https://profiles.google.com/106443016603413260641</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-JAennFczz-o/AAAAAAAAAAI/AAAAAAAAAAA/WHCyQfQWJOQ/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23931139.post-114236663996692195</id><published>2006-03-14T20:42:00.001+01:00</published><updated>2008-03-31T17:05:09.987+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DSL Tools Beta2'/><title type='text'>Problemas al depurar nuestro modelo</title><content type='html'>&lt;div style="TEXT-ALIGN: justify"&gt;En la version DSL Tools CTP Febrero 2006 , hay veces que al intentar depurar nuestro modelo, nos da un error bastante feo y no podemos seguir trabajando, porque en ocasiones nisiquiera nos sale el toolbox de nuestro modelo en el VS activo.&lt;br /&gt;&lt;br /&gt;El error es como el siguiente:&lt;br /&gt;&lt;/div&gt;&lt;ul style="COLOR: rgb(204,0,0); TEXT-ALIGN: left"&gt;&lt;li&gt;&lt;span id="_ctl0_MainContent_PostFlatView"&gt;&lt;span style="font-size:+0;"&gt;"Package Enrique.Catala.Designer.DSLmodel, Catala.DSLModel.Designer, Version=1.0.0.0, Culture=neutral, PublickeyToken=&lt;/span&gt;&lt;/span&gt;&lt;span id="_ctl0_MainContent_PostFlatView"&gt;&lt;span style="font-size:+0;"&gt;'b03f5f7f11d50a3a' &lt;span style="FONT-WEIGHT: bold"&gt;has failed to load properly&lt;/span&gt; ( GUID ={8F583BC9-4E70-4888-A667-4C461AC6D3A5}).&lt;/span&gt;&lt;/span&gt;&lt;span id="_ctl0_MainContent_PostFlatView"&gt;&lt;span style="font-size:+0;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="TEXT-ALIGN: justify"&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;La forma de repararlo en un 90% es haciendo uso del enlace "&lt;span style="FONT-STYLE: italic"&gt;Reset the Visual Studio 2005 Experimental hive&lt;/span&gt;" que nos aparece en "&lt;span style="FONT-STYLE: italic"&gt;inicio-&gt;todos los programas-&gt;Visual Studio 2005 SDK-&gt;2006.2&lt;/span&gt;".&lt;br /&gt;Por si no os sale, el comando es el siguiente:&lt;br /&gt;&lt;ul style="COLOR: rgb(0,153,0); TEXT-ALIGN: left"&gt;&lt;li&gt;"C:\Archivos de programa\Visual Studio 2005 SDK\2006.02\VisualStudioIntegration\Tools\Bin\VsRegEx.exe" GetOrig 8.0 Exp&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Esto tarda un poquito y aunque no he mirado detenidamente lo que hace en realidad, elimina de la cache de ensamblados , las .dll de nuestro modelo, nos resetea el toolbox y borra nuestras preferencias y configuraciones (recordemos que del Visual Studio Experimental, no el normal que usamos para nuestros proyectos C# por ejemplo) y asi la proxima vez que entramos, ya tenemos la posibilidad de volver a compilar el modelo y trabajar normalmente.&lt;br /&gt;&lt;br /&gt;Estre problema aunque no he encontrado informacion exacta de porqué se produce, si que me he dado cuenta que pasa por ejemplo cuando compilamos el modelo en una máquina y luego queremos hacer lo mismo en otra máquina distinta. Esto es lo que nos esta pasando a Vicente y a mi puesto que tenemos nuestro proyecto en un servidor SubVersioN y alguno de los ficheros que tenemos sincronizado no deberia estarlo porque se ve que guarda como un GID único que identifica a la máquina y hay que resetearlo.&lt;br /&gt;&lt;br /&gt;Espero que te sirva. Por si acaso aqui tienes algunos links con problemas y soluciones de gente a la que le pasaba lo mismo:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=100744&amp;amp;SiteID=1"&gt;http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=100744&amp;amp;SiteID=1&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=260596&amp;amp;SiteID=1"&gt;http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=260596&amp;amp;SiteID=1&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23931139-114236663996692195?l=dsltools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsltools.blogspot.com/feeds/114236663996692195/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23931139&amp;postID=114236663996692195&amp;isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114236663996692195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114236663996692195'/><link rel='alternate' type='text/html' href='http://dsltools.blogspot.com/2006/03/problemas-al-depurar-nuestro-modelo.html' title='Problemas al depurar nuestro modelo'/><author><name>Enrique Catalá Bañuls</name><uri>https://profiles.google.com/106443016603413260641</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-JAennFczz-o/AAAAAAAAAAI/AAAAAAAAAAA/WHCyQfQWJOQ/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23931139.post-114229271316766384</id><published>2006-03-14T00:19:00.001+01:00</published><updated>2008-03-31T17:05:22.896+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DSL Tools Beta2'/><title type='text'>Primeros pasos con la generacion de código</title><content type='html'>&lt;span style="font-family:arial;"&gt;Voy a poner una breve introduccion de lo que mas nos puede servir para meternos de lleno con la generacion de código utilizando DSL Tools.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Primeramente, lo que tenemos que hacer es añadir un nuevo item en el proyecto: &lt;/span&gt;&lt;span style="COLOR: rgb(255,102,0); FONT-STYLE: italicfont-family:arial;" &gt;Proyect-&gt; Add new Item -&gt; Template -&gt; Text File&lt;/span&gt;&lt;span style="font-family:arial;"&gt;. Una vez tengamos la plantilla, lo renombramos como queramos, por ejemplo "&lt;/span&gt;&lt;span style="COLOR: rgb(255,102,0); FONT-STYLE: italicfont-family:arial;" &gt;sqlPlantilla.sql&lt;/span&gt;&lt;span style="font-family:arial;"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;En la ventana de propiedades, hemos de poner en la celda de &lt;/span&gt;&lt;span style="FONT-STYLE: italic;font-family:arial;" &gt;"Custom tool"&lt;/span&gt;&lt;span style="font-family:arial;"&gt; la palabra: &lt;/span&gt;&lt;span style="COLOR: rgb(255,102,0); FONT-STYLE: italicfont-family:arial;" &gt;"TextTemplatingFileGenerator"&lt;/span&gt;&lt;span style="font-family:arial;"&gt;, para que el generador de plantillas, utilice esta plantilla para generar código. Podemos tener tantas plantillas como queramos.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;font-family:arial;" &gt;TAGS PARA LAS PLANTILLAS&lt;/span&gt;&lt;br /&gt;&lt;ul style="FONT-WEIGHT: bold"&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Directivas interesantes:&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;code style="FONT-FAMILY: arial"&gt;&lt;/code&gt;&lt;ul style="TEXT-ALIGN: justify;font-family:arial;" &gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;&lt;code&gt;&lt;span style="COLOR: rgb(255,0,0); FONT-STYLE: italic"&gt;&lt;#@ output extension=".sql" #&gt;&lt;/span&gt;&lt;/code&gt;&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div style="TEXT-ALIGN: justify"&gt;&lt;code style="FONT-FAMILY: arial"&gt;&lt;/code&gt;Con esto nos aseguramos que la plantilla, va a generar un archivo nombrePlantilla.sql con el código generado.&lt;br /&gt;Cabeceras e inclusion de copyright y demas:&lt;br /&gt;Mediante la directiva include, podemos incluir en la generacion de código, una serie de informacion externa como copyright, encabezados, pies de pagina...&lt;br /&gt;&lt;/div&gt;&lt;code style="COLOR: rgb(0,0,0); FONT-FAMILY: arial"&gt;&lt;/code&gt;&lt;ul style="COLOR: rgb(0,0,0); TEXT-ALIGN: justify" face="arial"&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="COLOR: rgb(255,0,0); FONT-STYLE: italic"&gt;&lt;#@ include file="c:\test.txt" #&gt;&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul style="TEXT-ALIGN: justify;font-family:arial;" &gt;&lt;ul&gt;&lt;li&gt;&lt;span style="COLOR: rgb(255,0,0); FONT-STYLE: italic"&gt;&lt;#@ template debug="true" #&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="COLOR: rgb(255,0,0); FONT-STYLE: italic"&gt;&lt;#@ import namespace="System.Diagnostics" #&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div style="TEXT-ALIGN: justify"&gt;&lt;div style="TEXT-ALIGN: justify"&gt;&lt;span style="font-family:arial;"&gt;Con estas dos directivas, se supone que podemos hacer depuracion en la generacion del código, justo mientras se encuentra el TextTemplatingFileGenerator en ejecucion, pero por desgracia no he podido probarlo porque me ha dado un error. Tengo que mirarlo mas en profundidad porque me interesa muchisimo.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Para poner breakpoints, basta con poner esto donde queramos pararnos:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="COLOR: rgb(255,0,0); FONT-STYLE: italicfont-family:arial;" &gt;&lt;# Debugger.Break(); #&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul style="FONT-WEIGHT: bold; TEXT-ALIGN: justify"&gt;&lt;li&gt;&lt;span style="COLOR: rgb(0,0,0);font-family:arial;" &gt;Sentencias de Código:&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="TEXT-ALIGN: justify"&gt;&lt;span style="COLOR: rgb(0,0,0);font-family:arial;" &gt;Las sentencias de código tienen la siguiente sintaxis: &lt;span style="COLOR: rgb(0,153,0); FONT-STYLE: italic"&gt;&lt;# SentenciaCodigo #&gt;&lt;/span&gt;. Estas sentencias se tienen que escribir en el lenguaje que hayamos decidido utilizar para programarlas (por defecto C#) y han d&lt;span style="font-size:100%;"&gt;e compilarse correctamente, por lo que no podemos cometer errores de sintaxis, como es de suponer.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul style="TEXT-ALIGN: justify"&gt;&lt;li&gt;&lt;span style="COLOR: rgb(0,0,0);font-family:arial;" &gt;&lt;span style="font-size:100%;"&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Bloques Expression&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="TEXT-ALIGN: justify"&gt;&lt;br /&gt;&lt;span style="COLOR: rgb(0,0,0);font-family:arial;" &gt;&lt;span style="font-size:100%;"&gt;Los bloques Expression tienen la sintaxis &lt;#= Expression #&gt; y siren para añadir Strings al código generado en funcion de variables y/o propiedades calculadas.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="COLOR: rgb(0,0,0);font-family:arial;" &gt;&lt;span style="font-size:100%;"&gt;Por ejemplo, esto seria un trozo de código con una sentencia de código que no se verá y un bloque Expression que si que se verá reflejado en el fichero de código que generemos.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="COLOR: rgb(0,0,0);font-family:arial;" &gt;&lt;span style="font-size:100%;"&gt;&lt;span style="COLOR: rgb(255,0,0)"&gt;&lt;#&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="COLOR: rgb(0,0,0);font-family:arial;" &gt;&lt;span style="font-size:100%;"&gt;&lt;span style="COLOR: rgb(255,0,0)"&gt;int result = 2*9&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="COLOR: rgb(0,0,0);font-family:arial;" &gt;&lt;span style="font-size:100%;"&gt;&lt;span style="COLOR: rgb(255,0,0)"&gt;#&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="COLOR: rgb(0,0,0);font-family:arial;" &gt;&lt;span style="font-size:100%;"&gt;&lt;span style="COLOR: rgb(255,0,0)"&gt;&lt;#= result #&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="COLOR: rgb(0,0,0);font-family:arial;" &gt;&lt;span style="font-size:100%;"&gt;&lt;span style="COLOR: rgb(255,0,0)"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="COLOR: rgb(0,0,0);font-family:arial;" &gt;&lt;span style="font-size:100%;"&gt;&lt;span style="COLOR: rgb(255,0,0)"&gt;&lt;br /&gt;&lt;span style="COLOR: rgb(0,0,0)"&gt;Lo que hara esto sera ejecutar el 2*9 mientras se encuentra el parser analizando, compilando y ejecutando nuestro template y escribir el valor de result al fichero de generacion de código. Es decir que en el fichero generado obtendriamos "18" solamente.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23931139-114229271316766384?l=dsltools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsltools.blogspot.com/feeds/114229271316766384/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23931139&amp;postID=114229271316766384&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114229271316766384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114229271316766384'/><link rel='alternate' type='text/html' href='http://dsltools.blogspot.com/2006/03/primeros-pasos-con-la-generacion-de.html' title='Primeros pasos con la generacion de código'/><author><name>Enrique Catalá Bañuls</name><uri>https://profiles.google.com/106443016603413260641</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-JAennFczz-o/AAAAAAAAAAI/AAAAAAAAAAA/WHCyQfQWJOQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23931139.post-114225769055205723</id><published>2006-03-13T14:30:00.001+01:00</published><updated>2008-03-31T17:05:34.665+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DSL Tools Beta2'/><title type='text'>Sobre las cardinalidades</title><content type='html'>&lt;div style="TEXT-ALIGN: justify"&gt;Pienso que esto es importante a nivel conceptual:&lt;br /&gt;&lt;br /&gt;Las cardinalidades se leen, para el caso del triangulo, según la dirección que indica (normalmente de izquierda a derecha), y en el caso del cuadrado en sentido contrario. Este es un ejemplo sacado del Walkthrough: Domain Model Designer.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/4190/2482/1600/cardinal.jpg"&gt;&lt;img style="FLOAT: left; MARGIN: 0px 10px 10px 0px" alt="" src="http://photos1.blogger.com/blogger/4190/2482/320/cardinal.jpg" border="0" /&gt;&lt;/a&gt;Poniendo como ejemplo las distintas cardinalidades que le podriamos asignar al role 'Pages', representado como el triangulo en la imagen, vamos a explicar el significado de cada cardinalidad, y como obtenerla (valores de &lt;em&gt;max &lt;/em&gt;y &lt;em&gt;min&lt;/em&gt; en la ventana de propiedades)&lt;br /&gt;&lt;br /&gt;1 (&lt;em&gt;max=&lt;/em&gt;1, &lt;em&gt;min=&lt;/em&gt;1) -&gt; Una PageFlow debe tener exactamente una única Page&lt;br /&gt;0 (&lt;em&gt;max=&lt;/em&gt;1, &lt;em&gt;min=&lt;/em&gt;0) -&gt; Una PageFlow puede tener como mucho una Page (esto es, o 0 o 1)&lt;br /&gt;+ (&lt;em&gt;max=&lt;/em&gt;0, &lt;em&gt;min=&lt;/em&gt;1) -&gt; Una PageFlow debe tener 1 o más Pages&lt;br /&gt;* (&lt;em&gt;max=&lt;/em&gt;0, &lt;em&gt;min=&lt;/em&gt;0) -&gt; Una PageFlow puede tener 0, 1 o más Pages&lt;br /&gt;&lt;br /&gt;Este significado se puede intuir con las relaciones máximo-mínimo. Para el caso de 0 y 1 es tal y como se supone, &lt;em&gt;máx&lt;/em&gt; y&lt;em&gt; min&lt;/em&gt; expresan sus correspondientes valores máximos y mínimos. Para el caso de + y * es igual si pensamos que &lt;em&gt;max=&lt;/em&gt;0 tiene el sentido de &lt;em&gt;muchos&lt;/em&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23931139-114225769055205723?l=dsltools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsltools.blogspot.com/feeds/114225769055205723/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23931139&amp;postID=114225769055205723&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114225769055205723'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23931139/posts/default/114225769055205723'/><link rel='alternate' type='text/html' href='http://dsltools.blogspot.com/2006/03/sobre-las-cardinalidades.html' title='Sobre las cardinalidades'/><author><name>Vicente Soriano</name><uri>http://www.blogger.com/profile/08890774860429356321</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
