<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>(code segment) &#187; caml</title>
	<atom:link href="http://oldblog.ideseg.com/category/sharepoint/caml/feed" rel="self" type="application/rss+xml" />
	<link>http://oldblog.ideseg.com</link>
	<description>se acabarón las espinacas</description>
	<lastBuildDate>Thu, 26 Jan 2012 17:27:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>YACAMLQT (Yet another CAML query tool) Redux (3) in CodePlex</title>
		<link>http://oldblog.ideseg.com/2009/yacamlqt-yet-another-caml-query-tool-redux-3-in-codeplex</link>
		<comments>http://oldblog.ideseg.com/2009/yacamlqt-yet-another-caml-query-tool-redux-3-in-codeplex#comments</comments>
		<pubDate>Tue, 26 May 2009 23:47:39 +0000</pubDate>
		<dc:creator>cseg</dc:creator>
				<category><![CDATA[caml]]></category>
		<category><![CDATA[net]]></category>
		<category><![CDATA[sharepoint]]></category>

		<guid isPermaLink="false">/post/YACAMLQT-(Yet-another-CAML-query-tool)-Redux-(3)-in-CodePlex.aspx</guid>
		<description><![CDATA[Bueno, esta es la última entrega a partir de hoy el proyecto se encuentra en CodePlex (yacamlqt.codeplex.com).En esta última parte solo unas pequeñas notas para el usuario final.Bien, para usar YACAMLQT, dentro de tus proyectos, solo hay que referenciar la dll (IdeSeg.SharePoint.Caml.QueryParser.dll)&#160; y el uso sería el siguiente: 1: try 2: { 3: var parser [...]]]></description>
			<content:encoded><![CDATA[<p>Bueno, esta es la última entrega a partir de hoy el proyecto se encuentra en CodePlex (<FONT color=#ff0000><B><A href="http://yacamlqt.codeplex.com/">yacamlqt.codeplex.com</A></B></FONT>).<BR><BR>En esta última parte solo unas pequeñas notas para el usuario final.<BR><BR>Bien, para usar YACAMLQT, dentro de tus proyectos, solo hay que referenciar la dll (<B>IdeSeg.SharePoint.Caml.QueryParser.dll</B>)&nbsp; y el uso sería el siguiente:<BR><BR><BR><br />
<P></P><!-- code formatted by http://manoli.net/csharpformat/ --><br />
<DIV class=csharpcode><PRE class=alt><SPAN class=lnum>   1:  </SPAN>            <SPAN class=kwrd>try</SPAN></PRE><PRE><SPAN class=lnum>   2:  </SPAN>            {</PRE><PRE class=alt><SPAN class=lnum>   3:  </SPAN>                var parser = <SPAN class=kwrd>new</SPAN> NParser(textTSql, <SPAN class=kwrd>new</SPAN> ASTNodeCAMLFactory());</PRE><PRE><SPAN class=lnum>   4:  </SPAN>                var generator = <SPAN class=kwrd>new</SPAN> CodeGenerator(parser.Parse());</PRE><PRE class=alt><SPAN class=lnum>   5:  </SPAN>                generator.Generate();</PRE><PRE><SPAN class=lnum>   6:  </SPAN>                <SPAN class=kwrd>return</SPAN> _formatTools.FormatXml(generator.Code);</PRE><PRE class=alt><SPAN class=lnum>   7:  </SPAN>            }</PRE><PRE><SPAN class=lnum>   8:  </SPAN>            <SPAN class=kwrd>catch</SPAN> (ParserException ex)</PRE><PRE class=alt><SPAN class=lnum>   9:  </SPAN>            {</PRE><PRE><SPAN class=lnum>  10:  </SPAN>                _view.Status = ex.Message;</PRE><PRE class=alt><SPAN class=lnum>  11:  </SPAN>            }</PRE><PRE><SPAN class=lnum>  12:  </SPAN>            <SPAN class=kwrd>catch</SPAN> (ScannerException ex)</PRE><PRE class=alt><SPAN class=lnum>  13:  </SPAN>            {</PRE><PRE><SPAN class=lnum>  14:  </SPAN>                _view.Status = ex.Message;</PRE><PRE class=alt><SPAN class=lnum>  15:  </SPAN>            }</PRE></DIV><br />
<P>Instanciamos el Parser (<B>NParser</B>), le pasamos la consulta en TSQL (<B>textSql</B>) y la factoría correspondiente a lo que queremos generar, por el momento solo está disponible la de <B>CAML</B>, en breve completaré la de <B>CAML.Net</B>; Por último inyectamos el Parser en el Generador de código, llamamos al método <B>Generate</B> y recogemos la consulta en CAML en <B>generator.Code</B>.</P><br />
<P><BR>Las posibles excepciones tanto del Parser como del generador de código se pueden atrapar con <B>ParserException</B> y <B>ScannerException</B>.</P><br />
<P><BR>En el proyecto se incluye un pequeño subproyecto con una interfaz WinForms (no es que se me de especialmente bien)<BR><BR></P><br />
<DIV align=center><IMG src="http://oldblog.ideseg.com/content//YACAMLQT_Sample_Gui.PNG" border=0><BR><BR><B><A href="http://www.ideseg.com/YACAMLQTYetAnotherCAMLQueryToolRedux2.aspx">Parte 2 http://www.ideseg.com/YACAMLQTYetAnotherCAMLQueryToolRedux2.aspx</A></B><BR><B><A href="http://www.ideseg.com/YACAMLQTYetAnotherCAMLQueryToolRedux1.aspx">Parte 1 http://www.ideseg.com/YACAMLQTYetAnotherCAMLQueryToolRedux1.aspx</A></B><BR></DIV></p>
]]></content:encoded>
			<wfw:commentRss>http://oldblog.ideseg.com/2009/yacamlqt-yet-another-caml-query-tool-redux-3-in-codeplex/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>YACAMLQT (Yet another CAML query tool) Redux (2)</title>
		<link>http://oldblog.ideseg.com/2009/yacamlqt-yet-another-caml-query-tool-redux-2</link>
		<comments>http://oldblog.ideseg.com/2009/yacamlqt-yet-another-caml-query-tool-redux-2#comments</comments>
		<pubDate>Fri, 22 May 2009 09:50:52 +0000</pubDate>
		<dc:creator>cseg</dc:creator>
				<category><![CDATA[caml]]></category>
		<category><![CDATA[net]]></category>
		<category><![CDATA[sharepoint]]></category>

		<guid isPermaLink="false">/post/YACAMLQT-(Yet-another-CAML-query-tool)-Redux-(2).aspx</guid>
		<description><![CDATA[Continuando con la explicación del código de YACAMLQT. Habíamos visto la parte relacionada con el Lexer el analizador morfológico. Como es obvio detrás debe haber un analizador sintáctico y semántico el Parser. El analizador sintáctico y semántico (NParser) se ha implementado siguiendo el patrón interpeter, (seguramente sea uno de los que menos se ven), el [...]]]></description>
			<content:encoded><![CDATA[<p>Continuando con la <a href="http://www.ideseg.com/YACAMLQTYetAnotherCAMLQueryToolRedux1.aspx">explicación del código de YACAMLQT</a>.</p>
<p>Habíamos visto la parte relacionada con el Lexer el analizador morfológico. Como es obvio detrás debe haber un analizador sintáctico y semántico el <a href="http://en.wikipedia.org/wiki/Parsing">Parser</a>.</p>
<p>El analizador sintáctico y semántico (<b>NParser</b>) se ha implementado siguiendo el patrón interpeter, (<i>seguramente sea uno de los que menos se ven</i>), el objetivo es obtener los distintos Tokens desde el Scanner y montar un árbol sintáctico (<a href="http://en.wikipedia.org/wiki/Abstract_syntax_tree">AST</a>) este árbol contiene Nodos (<b>ASTNodeBase</b>) y estos nodos representan de manera abstracta y simplificada la estructura sintáctica de la consulta en SQL.</p>
<p>(diagrama NParser)
<div align="center"><img src="http://oldblog.ideseg.com/content//yacamlqt_nparser.gif" border="0" width="467" height="445"></div>
<p>A la clase <b>NParser </b>se le puede inyectar una factoria (<b>ASTNodeFactoryBase</b>) en función del código que queramos generar, por el momento solo esta implementado el CAML, pero se puede extender sencillamente para generar <a href="http://www.codeplex.com/camldotnet">CAML.Net</a>.</p>
<p>Partiendo de un nodo abstracto (<b>ASTNodeBase</b>) podemos definir las distintas unidades sintácticas, por medio de la herencia. Estos nodos abstractos (heredados de <b>ASTNodeBase </b>) conforman las distintas expresiones que se usan en el analizador sintáctico y semántico (<b>NParser</b>), para ello se ha definido una clase para cada uno de los Tokens a modo de plantilla (template),&nbsp; y estas clases son a su vez son las distintas expresiones abstractas, que se usan en&nbsp; el patrón interpreter implementado en el parser. (<b>NParser</b>).</p>
<p>Todos estos nodos que forman las expresiones abstractas al fin al cabo son plantillas (templates), y podrían a su vez ser clases abstractas, yo opte por una implementarlas como clases normales. Ya que algunos de los nodos son terminales y otros intermedios y no tienen por qué ser heredados, de este modo la factoria base (<b>ASTNodeFactoryBase</b>) usa miembros virtuales parar crear dichos nodos.</p>
<p>(diagrama parcial de ASTNodeBase)
<div align="center"><img src="http://oldblog.ideseg.com/content//yacamlqt_ast.gif" border="0"></div>
<p>Para crear todos estas expresiones abstractas existe una factoría abstracta (<b>ASTNodeFactoryBase </b>) a través de la cual creamos los distintos nodos. Como puede verse, para añadir una variante como <a href="http://www.codeplex.com/camldotnet">CAML.Net</a>, solamente hay que añadir las expresiones abstractas heredando de las ya existentes e implementando <b>PreCode()</b> y <b>PostCode()</b>. </p>
<p>Todos estos nodos que forman las expresiones abstractas al fin al cabo son plantillas (templates), y podrían a su vez ser clases abstractas, yo opte por una implementarlas como clases normales, debido a que algunos de los nodos son terminales y otros intermedios y no tienen por qué ser heredados, de este modo la factoria base (<b>ASTNodeFactoryBase</b>) usa miembros virtuales parar crear dichos nodos terminales e intermedios.</p>
<p>Después para poder inyectar en el parser dichas expresiones debemos crear una nueva factoría heredada de la factoría base (ASTNodeFactoryBase).</p>
<p>(diagrama ASTNodeFactoryBase)
<div align="center"><img src="http://oldblog.ideseg.com/content//yacamlqt_nodefactory.gif" border="0"></div>
<p>Para generar CAML lo que he hecho es heredar de cada plantilla ó expresión abstracta definida, una nueva clase que redefine los métodos virtuales <b>PreCode()</b> y <b>PostCode()</b> que son los encargados de sustituir cada nodo del árbol sintáctico en CAML.</p>
<p>Y crear una factoría (<b>ASTNodeCAMLFactory</b>) que se encarga de crear las expresiones.</p>
]]></content:encoded>
			<wfw:commentRss>http://oldblog.ideseg.com/2009/yacamlqt-yet-another-caml-query-tool-redux-2/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>YACAMLQT (Yet another CAML query tool) Redux (1)</title>
		<link>http://oldblog.ideseg.com/2009/yacamlqt-yet-another-caml-query-tool-redux-1</link>
		<comments>http://oldblog.ideseg.com/2009/yacamlqt-yet-another-caml-query-tool-redux-1#comments</comments>
		<pubDate>Mon, 27 Apr 2009 13:26:05 +0000</pubDate>
		<dc:creator>cseg</dc:creator>
				<category><![CDATA[caml]]></category>
		<category><![CDATA[net]]></category>
		<category><![CDATA[sharepoint]]></category>

		<guid isPermaLink="false">/post/YACAMLQT-(Yet-another-CAML-query-tool)-Redux-(1).aspx</guid>
		<description><![CDATA[Hace un mes, John Holliday, me pidió a ver si podíamos integrar su CAML.net con mi YACAMLQT, a la vez que ampliar mi herramienta para soportar otro tipo de consultas como adds y updates. YACAMLQT, es una utilidad que convierte una sentencia SQL en CAML, el lenguaje de consulta de Sharepoint. (Véase YACAMLQT, YACAMLQT2 y [...]]]></description>
			<content:encoded><![CDATA[<p>Hace un mes, <a href="http://www.johnholliday.net/">John Holliday</a>, me pidió a ver si podíamos integrar su <a href="http://www.codeplex.com/camldotnet">CAML.net</a> con mi <b><a href="http://www.ideseg.com/SharePointYetAnotherCAMLQueryTool2.aspx">YACAMLQT</a></b>, a la vez que ampliar mi herramienta para soportar otro tipo de consultas como adds y updates.</p>
<p>YACAMLQT, es una utilidad que convierte una sentencia SQL en CAML, el lenguaje de consulta de Sharepoint. (Véase <a href="http://www.ideseg.com/SharePointYetAnotherCAMLQueryToolAlaSQL.aspx">YACAMLQT</a>, <a href="http://www.ideseg.com/SharePointYetAnotherCAMLQueryTool2.aspx">YACAMLQT</a>2 y <a href="http://www.ideseg.com/SharePointCAMLNetGenial.aspx">YACAMLQT-CAML.Net</a>)</p>
<p>Estos días entre rato bueno y rato malo, he reescrito totalmente el código de YACAMLQT, para hacerlo más sencillo (por supuesto usando TDD), en principio el objetivo ha sido emular el antiguo YACAMLQT, pero dotándolo de un diseño más sencillo y ampliable.</p>
<p>YACAMLQT, es un programa que convierte una sintaxis tipo SQL en CAML (el lenguaje de consulta de SharePoint).</p>
<p>Es decir esto: 
<p class="style1"><font face="Courier New"><font size="2"><font color="#000080"><strong><span class="style2">WHERE</span> </strong>((Column1 = &#8220;Value1&#8243;) <span class="style2"><strong>AND</strong></span> (Column2 = &#8220;Value2&#8243;)) <span class="style2"><strong>OR</strong></span> ((Column3 = 10) <br /></font></font></font><font face="Courier New"><font size="2"><font color="#000080"><span class="style2"><strong>AND</strong></span> (Column3 &lt;&gt; NULL)) <span class="style2"><strong>GROUPBY</strong></span> Column1 <span class="style2"><strong>ORDERBY</strong></span> Column1, Column2 <span class="style2"><strong>ASC</strong></span>, Column3 <span class="style2"><strong>DESC</strong></span></font></font></font></p>
<p>En esto:</p>
<div class="csharpcode">
<pre class="alt"><span class="kwrd">&lt;</span><span class="html">Query</span><span class="kwrd">&gt;</span></pre>
<pre>  <span class="kwrd">&lt;</span><span class="html">Where</span><span class="kwrd">&gt;</span></pre>
<pre class="alt">    <span class="kwrd">&lt;</span><span class="html">Or</span><span class="kwrd">&gt;</span></pre>
<pre>      <span class="kwrd">&lt;</span><span class="html">And</span><span class="kwrd">&gt;</span></pre>
<pre class="alt">        <span class="kwrd">&lt;</span><span class="html">Eq</span><span class="kwrd">&gt;</span></pre>
<pre>          <span class="kwrd">&lt;</span><span class="html">FieldRef</span> <span class="attr">Name</span><span class="kwrd">="Column1"</span> <span class="kwrd">/&gt;</span></pre>
<pre class="alt">          <span class="kwrd">&lt;</span><span class="html">Value</span> <span class="attr">Type</span><span class="kwrd">="Text"</span><span class="kwrd">&gt;</span>Value1<span class="kwrd">&lt;/</span><span class="html">Value</span><span class="kwrd">&gt;</span></pre>
<pre>        <span class="kwrd">&lt;/</span><span class="html">Eq</span><span class="kwrd">&gt;</span></pre>
<pre class="alt">        <span class="kwrd">&lt;</span><span class="html">Eq</span><span class="kwrd">&gt;</span></pre>
<pre>          <span class="kwrd">&lt;</span><span class="html">FieldRef</span> <span class="attr">Name</span><span class="kwrd">="Column2"</span> <span class="kwrd">/&gt;</span></pre>
<pre class="alt">          <span class="kwrd">&lt;</span><span class="html">Value</span> <span class="attr">Type</span><span class="kwrd">="Text"</span><span class="kwrd">&gt;</span>Value2<span class="kwrd">&lt;/</span><span class="html">Value</span><span class="kwrd">&gt;</span></pre>
<pre>        <span class="kwrd">&lt;/</span><span class="html">Eq</span><span class="kwrd">&gt;</span></pre>
<pre class="alt">      <span class="kwrd">&lt;/</span><span class="html">And</span><span class="kwrd">&gt;</span></pre>
<pre>      <span class="kwrd">&lt;</span><span class="html">And</span><span class="kwrd">&gt;</span></pre>
<pre class="alt">        <span class="kwrd">&lt;</span><span class="html">Eq</span><span class="kwrd">&gt;</span></pre>
<pre>          <span class="kwrd">&lt;</span><span class="html">FieldRef</span> <span class="attr">Name</span><span class="kwrd">="Column3"</span> <span class="kwrd">/&gt;</span></pre>
<pre class="alt">          <span class="kwrd">&lt;</span><span class="html">Value</span> <span class="attr">Type</span><span class="kwrd">="Integer"</span><span class="kwrd">&gt;</span>10<span class="kwrd">&lt;/</span><span class="html">Value</span><span class="kwrd">&gt;</span></pre>
<pre>        <span class="kwrd">&lt;/</span><span class="html">Eq</span><span class="kwrd">&gt;</span></pre>
<pre class="alt">        <span class="kwrd">&lt;</span><span class="html">IsNotNull</span><span class="kwrd">&gt;</span></pre>
<pre>          <span class="kwrd">&lt;</span><span class="html">FieldRef</span> <span class="attr">Name</span><span class="kwrd">="Column3"</span> <span class="kwrd">/&gt;</span></pre>
<pre class="alt">        <span class="kwrd">&lt;/</span><span class="html">IsNotNull</span><span class="kwrd">&gt;</span></pre>
<pre>      <span class="kwrd">&lt;/</span><span class="html">And</span><span class="kwrd">&gt;</span></pre>
<pre class="alt">    <span class="kwrd">&lt;/</span><span class="html">Or</span><span class="kwrd">&gt;</span></pre>
<pre>  <span class="kwrd">&lt;/</span><span class="html">Where</span><span class="kwrd">&gt;</span></pre>
<pre class="alt">  <span class="kwrd">&lt;</span><span class="html">GroupBy</span><span class="kwrd">&gt;</span></pre>
<pre>    <span class="kwrd">&lt;</span><span class="html">FieldRef</span> <span class="attr">Name</span><span class="kwrd">="Column1"</span> <span class="kwrd">/&gt;</span></pre>
<pre class="alt">  <span class="kwrd">&lt;/</span><span class="html">GroupBy</span><span class="kwrd">&gt;</span></pre>
<pre>  <span class="kwrd">&lt;</span><span class="html">OrderBy</span><span class="kwrd">&gt;</span></pre>
<pre class="alt">    <span class="kwrd">&lt;</span><span class="html">FieldRef</span> <span class="attr">Name</span><span class="kwrd">="Column1"</span> <span class="kwrd">/&gt;</span></pre>
<pre>    <span class="kwrd">&lt;</span><span class="html">FieldRef</span> <span class="attr">Name</span><span class="kwrd">="Column2"</span> <span class="attr">Ascending</span><span class="kwrd">="True"</span> <span class="kwrd">/&gt;</span></pre>
<pre class="alt">    <span class="kwrd">&lt;</span><span class="html">FieldRef</span> <span class="attr">Name</span><span class="kwrd">="Column3"</span> <span class="attr">Ascending</span><span class="kwrd">="False"</span> <span class="kwrd">/&gt;</span></pre>
<pre>  <span class="kwrd">&lt;/</span><span class="html">OrderBy</span><span class="kwrd">&gt;</span></pre>
<pre class="alt"><span class="kwrd">&lt;/</span><span class="html">Query</span><span class="kwrd">&gt;</span></pre>
</div>
<p>El proyecto completo lo subiré a <b>CodePlex</b> en unos días, con su código fuente que poco a poco y con ayuda espero ir ampliando.</p>
<p>Por si alguien quiere echar una mano en el proyecto, voy a contar alguno de los entresijos del diseño de la aplicación.</p>
<p>Lo primero que he diseñado es el analizador morfológico (<i>lexer</i>) que se encarga de identificar dentro de un string, las distintas unidades sintácticas (<i>tokens</i>) con las que construiremos un analizador sintáctico y semántico (<i>parser</i>) con el cual construiremos un árbol sintáctico (<i>AST</i>) que por último recorreremos para transformar el SQL en CAML u otra variante como CAML.Net.</p>
<p>El lexer, está compuesto por una clase base, <b>ScannerBase </b>que contiene las partes más básicas del lexer, he extraído esta clase base una vez que tenía el analizador morfológico completo ya que de esta manera podemos realizar otro tipo de analizadores. </p>
<p><img src="http://oldblog.ideseg.com/content//yacamlqt_lexer.gif" border="0"></p>
<p>Las funciones básicas como comerse los espacios (<b>EatSpaces</b>()), detectar si es el final de línea (<b>EndOfLine</b>()) , saltar caracteres (<b>SkipChar</b>()) son parte de ScannerBase. Lo más importante de esta clase es la propiedad <b>CurrentChar </b>que devuelve el último carácter leído y el método <b>GetCharMoveNext</b>(), que obtiene un carácter y se mueve a la siguiente posición.</p>
<p>Para los que habéis usado el unix <a href="http://es.wikipedia.org/wiki/Herramienta_de_programaci%C3%B3n_lex">flex</a>, <b>GetCharMoveNext</b>() es similar a <b>input</b>().</p>
<p>Esta clase <b>ScannerBase </b>utiliza internamente una clase <b>ScannerState </b>que mantiene el estado para poder releer un token ó unidad sintáctica. </p>
<p>Los tokens en el caso de YACAMLQT, consisten en las palabras reservadas propias de SQL, así como los distintos operadores, los campos y los valores (<i>cadena, fecha, lógico y numérico</i>). </p>
<p>A diferencia del unix <a href="http://es.wikipedia.org/wiki/Herramienta_de_programaci%C3%B3n_lex">flex</a>, esto no se trata de un <b>unput</b>(), ya que mediante este volveríamos al carácter anterior. En este caso, como lo importante del analizador es obtener una unidad sintáctica, o token, lo que he hecho es implementar un método llamado <b>BackToken</b>() que lo que hace es posicionar el lexer justo al comienzo del último token obtenido, de modo que <b>GetToken</b>() volverá a devolvernos el mismo token.</p>
<p>La clase <b>Scanner</b>, hereda como es de suponer de <b>ScannerBase</b>, e implementa <b>GetToken</b>(), el responsable de de devolver un token, y <b>CheckCorrectBracketsAndQuotes</b>() que es el responsable de comprobar que los paréntesis y las comillas están correctamente.</p>
<p>Dentro de la clase <b>Scanner</b>, el método <b>GetToken</b>() es el responsable de identificar cada uno de los tokens, para lo cual he realizado un método para identificar cada uno de los distintos tokens. <b>GetToken</b>() usa los métodos <b>ScanDate</b>(), <b>ScanString</b>(), <b>ScanOperator</b>(), <b>ScanNumber</b>() y <b>ScanReservedWordOrSymbol</b>().</p>
<p><b>ScanOperator</b>() y <b>ScanReservedWordOrSymbol</b>() usan un diccionario para identificar los distintos operadores y palabras reservadas. En el caso de <b>ScanReservedWordOrSymbol</b>(), si el token leído no se encuentra en el diccionario de palabras reservadas estaremos identificando un símbolo ó identificador.</p>
<p>Para terminar con esta primera parte, y siguiendo el principio de responsabilidad única, se ha implementado la clase <b>Token </b>como un contenedor y <b>TokenFactory </b>como una factória encargada de crear los distintos tipos de tokens ó unidades sintácticas. La clase<b> Scanner</b> es la que usa la factória para crear los distintos Tokens.</p>
<p><img src="http://oldblog.ideseg.com/content//yacamlqt_token.gif" border="0"></p>
<p>La clase <b>Token</b>, puede contener los distintos tipos de tokens, en principio todos aunque pueden ser de diferentes tipos, mantendrán su valor como un string. El resto de propiedades para identificar el tipo de token (<b>TType</b>) ó el tipo de valor (<b>ValueType</b>) son una enumeración.</p>
]]></content:encoded>
			<wfw:commentRss>http://oldblog.ideseg.com/2009/yacamlqt-yet-another-caml-query-tool-redux-1/feed</wfw:commentRss>
		<slash:comments>355</slash:comments>
		</item>
		<item>
		<title>Online YACAMLQT, the SQL to CAML converter</title>
		<link>http://oldblog.ideseg.com/2008/online-yacamlqt-the-sql-to-caml-converter</link>
		<comments>http://oldblog.ideseg.com/2008/online-yacamlqt-the-sql-to-caml-converter#comments</comments>
		<pubDate>Fri, 27 Jun 2008 16:53:53 +0000</pubDate>
		<dc:creator>cseg</dc:creator>
				<category><![CDATA[caml]]></category>
		<category><![CDATA[sharepoint]]></category>

		<guid isPermaLink="false">/post/Online-YACAMLQT-the-SQL-to-CAML-converter.aspx</guid>
		<description><![CDATA[Thanks to the guys from SPSProfessional, my small toy YACAMLQT, is&#160;ONLINE you can play with this in www.spsprofessional.com/sqlcaml.aspx Enjoy&#8230; &#160;]]></description>
			<content:encoded><![CDATA[<p><P>Thanks to the guys from <STRONG>SPSProfessional</STRONG>, my small toy <A href="http://www.ideseg.com/SharePointYetAnotherCAMLQueryTool2.aspx">YACAMLQT</A>, is&nbsp;ONLINE you can play with this in <A href="http://www.spsprofessional.com/sqlcaml.aspx">www.spsprofessional.com/sqlcaml.aspx</A></P><br />
<P>Enjoy&#8230;</P><br />
<P>&nbsp;</P></p>
]]></content:encoded>
			<wfw:commentRss>http://oldblog.ideseg.com/2008/online-yacamlqt-the-sql-to-caml-converter/feed</wfw:commentRss>
		<slash:comments>379</slash:comments>
		</item>
		<item>
		<title>SharePoint &#8211; CAMLEditor v1.0 is here to stay</title>
		<link>http://oldblog.ideseg.com/2005/sharepoint-camleditor-v1-0-is-here-to-stay</link>
		<comments>http://oldblog.ideseg.com/2005/sharepoint-camleditor-v1-0-is-here-to-stay#comments</comments>
		<pubDate>Sun, 18 Dec 2005 08:10:09 +0000</pubDate>
		<dc:creator>cseg</dc:creator>
				<category><![CDATA[caml]]></category>

		<guid isPermaLink="false">/post/SharePoint-CAMLEditor-v10-is-here-to-stay.aspx</guid>
		<description><![CDATA[Days ago I show my last&#160;toy project called CAML Editor, this first sketch was only a test application. Now I have the pleasure to announce that the first version is here to stay . •&#160;New tabbed interface•&#160;Code completion and folding support in text editor•&#160;CAML code generator completely rewritten•&#160;Many Bugs fixed•&#160;New Validation error interface inside of [...]]]></description>
			<content:encoded><![CDATA[<p><P>Days ago I show my last&nbsp;toy project called CAML Editor, this first sketch was only a test application. Now I have the pleasure to announce that the first version is here to stay <img src='http://oldblog.ideseg.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> .</P><br />
<P>•&nbsp;New <STRONG>tabbed interface<BR></STRONG>•&nbsp;<STRONG>Code completion</STRONG> and <STRONG>folding support</STRONG> in text editor<BR>•&nbsp;CAML <STRONG>code generator</STRONG> completely rewritten<BR>•&nbsp;Many Bugs fixed<BR>•&nbsp;New <STRONG>Validation error</STRONG> interface inside of the editor<BR></P><br />
<P align=center><IMG src="http://oldblog.ideseg.com/content//CAMLEditor%20v1-Generator.gif" border=0></P><br />
<P align=center><IMG src="http://oldblog.ideseg.com/content//CAMLEditor v1-Editor.gif" border=0><BR></P><br />
<P align=center><IMG src="http://oldblog.ideseg.com/content//CAMLEditor v1-Preview.gif" border=0></P><br />
<P align=center><IMG src="http://oldblog.ideseg.com/content//save_16.gif" border=0>&nbsp;You can download it here&#8230; <A href="http://oldblog.ideseg.com/content//CAMLEditor_v1.0.zip">CAMLEditor v1.0.zip (246,46 KB)</A></P></p>
]]></content:encoded>
			<wfw:commentRss>http://oldblog.ideseg.com/2005/sharepoint-camleditor-v1-0-is-here-to-stay/feed</wfw:commentRss>
		<slash:comments>2515</slash:comments>
		</item>
		<item>
		<title>SharePoint &#8211; CAML Editor v0.00</title>
		<link>http://oldblog.ideseg.com/2005/sharepoint-caml-editor-v0-00</link>
		<comments>http://oldblog.ideseg.com/2005/sharepoint-caml-editor-v0-00#comments</comments>
		<pubDate>Tue, 06 Dec 2005 08:38:10 +0000</pubDate>
		<dc:creator>cseg</dc:creator>
				<category><![CDATA[caml]]></category>
		<category><![CDATA[sharepoint]]></category>

		<guid isPermaLink="false">/post/SharePoint-CAML-Editor-v000-.aspx</guid>
		<description><![CDATA[Updated v1.0 is here My last project has changed of name, I believe that CAML XML EDITOR will be called. Join to workspaces.gotdotnet.com/CAMLEditor At the moment he is a simple XML editor that allows simultaneously to publish the code by fragments (use the context menu in editor) that can are validated themselves. Also has a [...]]]></description>
			<content:encoded><![CDATA[<p><P><STRONG><FONT color=#ff0000><A href="http://www.ideseg.com/SharePointCAMLEditorV10IsHereToStay.aspx">Updated v1.0 is here</A></FONT></STRONG></P><br />
<P>My last project has changed of name, I believe that <STRONG>CAML XML EDITOR</STRONG> will be called.</P><br />
<P align=center><IMG src="http://oldblog.ideseg.com/content//CAML-Editor-v0-1.gif" border=0></P><br />
<P>Join to <A href="http://workspaces.gotdotnet.com/CAMLEditor"><STRONG>workspaces.gotdotnet.com/CAMLEditor</STRONG></A></P><br />
<P>At the moment he is a simple XML editor that allows simultaneously to publish the code by fragments (use the context menu in editor) that can are validated themselves. Also has a HTML preview to show the HTML code generated.</P><br />
<P align=center><IMG src="http://oldblog.ideseg.com/content//CAML-Editor-v0-2.gif" border=0></P><br />
<P align=center><IMG src="http://oldblog.ideseg.com/content//CAML-Editor-v0-3.gif" border=0></P><br />
<P>And a little CAML generator, you can select any CAML then you has the correct XML, if you select a reference in the XML you can expand it using the context menu.</P><br />
<P align=center><IMG src="http://oldblog.ideseg.com/content//CAML-Editor-v0-4.gif" border=0></P><br />
<P><IMG src="http://oldblog.ideseg.com/content//save_16.gif" border=0>&nbsp;You can download it here&#8230;<STRIKE> </STRIKE><A href="http://oldblog.ideseg.com/content//CAMLEditor.zip"><STRIKE>CAMLEditor.zip (203,29 KB)</STRIKE></A>&nbsp;<A href="http://www.ideseg.com/SharePointCAMLEditorV10IsHereToStay.aspx"><STRONG>Version 1.0</STRONG></A></P></p>
]]></content:encoded>
			<wfw:commentRss>http://oldblog.ideseg.com/2005/sharepoint-caml-editor-v0-00/feed</wfw:commentRss>
		<slash:comments>1830</slash:comments>
		</item>
		<item>
		<title>SharePoint &#8211; CAML Editor, locuras de una noche de invierno</title>
		<link>http://oldblog.ideseg.com/2005/sharepoint-caml-editor-locuras-de-una-noche-de-invierno</link>
		<comments>http://oldblog.ideseg.com/2005/sharepoint-caml-editor-locuras-de-una-noche-de-invierno#comments</comments>
		<pubDate>Thu, 01 Dec 2005 19:31:36 +0000</pubDate>
		<dc:creator>cseg</dc:creator>
				<category><![CDATA[caml]]></category>
		<category><![CDATA[sharepoint]]></category>

		<guid isPermaLink="false">/post/SharePoint-CAML-Editor-locuras-de-una-noche-de-invierno-.aspx</guid>
		<description><![CDATA[Para la mayoría de los que trabajamos con SharePoint, el personalizar listas, sitios o áreas usando CAML, seré suave, es un INFIERNO, pero para bien o para mal vamos a tener que convivir con el. No quiero entrar en detalles acerca de lo bueno o malo, de lo dificultoso o no que pueda llegar a [...]]]></description>
			<content:encoded><![CDATA[<p><P>Para la mayoría de los que trabajamos con SharePoint, el personalizar listas, sitios o áreas usando CAML, seré suave, es un INFIERNO, pero para bien o para mal vamos a tener que convivir con el. <BR><BR>No quiero entrar en detalles acerca de lo bueno o malo, de lo dificultoso o no que pueda llegar a ser, por que como ya he dicho antes hay que convivir con el. Así que he pensado en ser más tolerante y tratar de solucionar los problemas en la medida de lo posible.<BR><BR>Por lo general uso un pequeño truco desde hace tiempo (<A href="http://mindsharpblogs.com/todd/archive/2005/11/11/853.aspx">Todd Bleeker </A>lo comento la semana pasada yo pensaba que era algo de dominio publico)&nbsp; para pulir las listas antes de integrarlas en SharePoint. Básicamente yo edito la lista en SharePoint, personalizo los campos y las vistas (cosas que son incomodas léase INFERNALES en CAML), después guardo la lista como una plantilla, la paso a mi ordenador, renombro la plantilla como .CAB, descomprimo el archivo con lo que obtengo (manifest.xml, x0000000.000) y edito el archivo manifest.xml<BR><BR>El archivo manifest.xml contiene la definición de la lista en nuestro querido CAML, con un editor de XML y con paciencia edito la barra de botones u otras cosas que necesite cambiar. <BR><BR>Una vez realizados los cambios comprimo de nuevo todos los archivos y los subo al portal, para finalmente crear una lista usando la plantilla modificada.<BR><BR>Ayer por la tarde pensé en como podría automatizar un poco el proceso, pensé en escribir un pequeño notepad que automáticamente realizara el proceso de extracción, edición del manifest.xml y compresión.<BR><BR>Durante la primera media hora me dedique a buscar una biblioteca ó componente que me permitiese trabajar con archivos “.cab” desde Windows Forms. No hubo éxito. (Si alguien conoce alguna que por favor me lo indique). <BR><BR>Visto que no podía subsanar el problema pensé en ejecutar el proceso “cabarc.exe”&nbsp;&nbsp;y listo. <BR><BR>Bien, en unos minutos abría el archivo “.stp”, extraía los archivos y estaba editando el manifest.xml. Y <STRONG>LLEGO LA IDEA</STRONG>.<BR><BR>Editar un archivo .xml sencillo no es un problema, pero cuando se trata de un CAML, es un autentico caos. ¿Cómo podría editar el archivo de manera más amigable?<BR><BR>Dos horas después tenía un pequeño editor de XML, conectado a un TextBox, y ahora se veía un poquito mejor.<BR><BR>Después cambie el editor por un fabuloso ICSharp.Code.TextEditor hummm resalta la sintaxis, después un control para previsualizar nodos del XML en HTML en un navegador y ver el código que se va a generar… y entonces eran las 3 de la mañana. <BR><BR>Una horita más y otra vez gracias al <A href="http://www.gotdotnet.com/workspaces/workspace.aspx?id=b63fe8c3-e2da-47a8-86d5-a854c6a1f869">CAML Schema</A> de Carsten Keutmann, podía validar cada sección que iba editando … buff es hora de irse a la cama.<BR><BR>La cosa es que como nadie se decide por el momento a hacer nada, he pensado en crear un workspace en gotdotnet.com (workspaces.gotdotnet.com/SharePointListTemplateEditor)<BR><BR>El código, sucio, sucio, sucio, como generalmente comienzan este tipo de herramientas, pero <STRONG>ya es hora de ir pensando en hacer algo ¿NO?</STRONG>&nbsp;<BR><BR>Ale unas pantallitas para animar al personal a que se una al proyecto.<BR></P><br />
<CENTER><br />
<P><IMG src="http://oldblog.ideseg.com/content//CAML-ListTemplateEditor-3.gif" border=0></P><br />
<P><IMG src="http://oldblog.ideseg.com/content//CAML-ListTemplateEditor-4.gif" border=0></P><br />
<P><IMG src="http://oldblog.ideseg.com/content//CAML-ListTemplateEditor-5.gif" border=0>&nbsp;<BR><BR>[<A href="http://oldblog.ideseg.com/content//CAML-ListTemplateEditor-3b.gif">Imagen</A>] [<A href="http://oldblog.ideseg.com/content//CAML-ListTemplateEditor-4b.gif">Imagen</A>] [<A href="http://oldblog.ideseg.com/content//CAML-ListTemplateEditor-5b.gif">Imagen</A>]</P></CENTER></p>
]]></content:encoded>
			<wfw:commentRss>http://oldblog.ideseg.com/2005/sharepoint-caml-editor-locuras-de-una-noche-de-invierno/feed</wfw:commentRss>
		<slash:comments>2775</slash:comments>
		</item>
	</channel>
</rss>

