<?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>spainfull &#187; Software</title>
	<atom:link href="http://www.spainfull.com/blog/category/poquer/software-poquer/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.spainfull.com/blog</link>
	<description>Póquer yo lo valgo</description>
	<lastBuildDate>Tue, 31 Jan 2012 08:59:45 +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>Bots Attacks! Parte I.</title>
		<link>http://www.spainfull.com/blog/167/</link>
		<comments>http://www.spainfull.com/blog/167/#comments</comments>
		<pubDate>Thu, 17 Sep 2009 19:03:03 +0000</pubDate>
		<dc:creator>spainfull</dc:creator>
				<category><![CDATA[Póquer]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Póquer-Red]]></category>

		<guid isPermaLink="false">http://www.spainfull.com/blog/?p=167</guid>
		<description><![CDATA[Introducción al tema de los bots en el póquer online. Qué son, los requisitos que se necesitan para crearlos y las razones por las cuales algunos desarrolladores de software se embarcan en la aventura de programarlos.]]></description>
			<content:encoded><![CDATA[<p><span style="color: gray;"><em><a href="http://www.poker-red.com/articulos/bots-attacks-parte-i-spainfull">Artículo</a> publicado en Póquer-Red el 19 de Junio de 2008.</em></span></p>
<p>El tema que toca esta semana es otro de esos que desata encendidas discusiones en los foros de póquer y en las tertulias entre aficionados. En este caso, solo atañe a los jugadores de póquer online. Se trata, como se puede inferir con facilidad del título del artículo, de los <em>bots</em> de póquer.</p>
<p><strong>Si me he animado a escribir este artículo es por varias razones. En primer lugar, porque para el jugador medio, sin demasiados conocimientos de informática, es una cuestión misteriosa que le plantea enormes dudas. Además, es un tema que se suele tratar y argumentar desde el más absoluto desconocimiento; y, por definición, se teme a lo que no se conoce.</strong></p>
<p><span id="more-167"></span>Últimamente, hay un gran número de noticias y alertas de <em>bots</em> que juegan al póquer y que amenazan con hundir el juego por internet o cambiarlo para siempre. Sin ir más lejos, un programador estadounidense llamado James Devlin, que sostiene que ha desarrollado un <em>bot</em> que juega con éxito en varias salas, está desglosando los pormenores de su trabajo en este <a href="http://www.codingthewheel.com/">blog</a>.</p>
<p>Los artículos (en inglés) están muy bien elaborados y explicados. Hay mucha información interesante, tanto para los que tienen conocimientos de programación como para los que no. Se nota que sabe de lo que habla. <strong>En estas líneas, y en las que sigan en próximas entregas, voy a tratar de reflejar la realidad de la situación actual.</strong> Para ello, ayudándome de los conocimientos propios que tengo como programador, he investigado, resumido y anotado todo aquello que he podido encontrar por la red sobre el particular. Espero que lo que viene a continuación disipe la mayor parte de las dudas que se puedan tener y los lectores se queden más tranquilos (o no).</p>
<p>Antes de continuar, voy a explicar a qué me refiero cuando hablo de <em>bot</em> de póquer. De manera simple, <strong>un <em>bot</em> de póquer es un programa informático (o varios) que juegan en una sala de póquer online sin -en principio- necesidad de que una persona esté dirigiendo el proceso.</strong> Tan sencillo como arrancar una aplicación de nuestro escritorio y ganar mucho dinero sin mover un dedo. Pero, evidentemente, esto no es tan fácil; se necesitan muchos conocimientos y trabajo duro para conseguir algo que funcione de verdad. Aquí no voy a filosofar sobre otro tipo de trampas tales como colusión, troyanos que permiten ver las cartas de otro jugador, cuentas de <em>superusuario</em>, etc. Eso es otro cantar que considero completamente diferente al caso que nos ocupa.</p>
<p>Volviendo a los <em>bots</em> de póquer, podemos encontrar varios disponibles en la red a cambio de una cantidad económica (o incluso gratuitos). Seguro que os suenan nombres como WinHoldEm, ICMBot, etc. Se supone que son capaces de ganar en límites bajos (alguno es programable mediante ciertas reglas escritas por nosotros) y son indetectables. No los he probado, ni pienso hacerlo. No solo porque pudieran cerrarme la cuenta si soy descubierto, sino además, entre otras cosas, porque no me fiaría ni un pelo de instalar una aplicación que podría estar espiando todos mis datos como contraseñas de salas de póquer. Luego profundizaré más sobre estos <em>bots</em> comerciales.</p>
<p>Para tener todo controlado es mejor hacerlo uno mismo pero, tal y como dije anteriormente, eso no es una tarea sencilla. <strong>Los requisitos para desarrollar un <em>bot</em> son cuantiosos y muy especializados.</strong> Para empezar, es necesario haber estudiado programación, conocer y haber trabajado durante un tiempo sobre el lenguaje escogido para la aplicación, tener ciertas habilidades sobre técnicas de <em>hacking</em> y manejar las interioridades del sistema operativo. Además, seguro que el trabajo lleva implícitas muchas lecturas de libros y artículos, búsquedas por la red, cientos y cientos de horas de desarrollo, infinitas pruebas&#8230;</p>
<p><strong>La ventaja es que toda la información imprescindible para elaborar un <em>bot</em> se encuentra disponible para quien le interese.</strong> Incluso hay un proyecto de código abierto (que se puede descargar, modificar y usar), basado en WinHoldEm que es un buen punto de partida para quien quiera empezar a desarrollar su propio <em>bot</em>: <a href="http://code.google.com/p/openholdembot/">OpenHoldEmBot</a>. En realidad, no hace falta ser un hacha para codificar la mayoría de tareas que debe realizar el programa. Eso sí, son laboriosas y requieren de mucho tiempo y paciencia. La parte más complicada es la que tiene que decidir las acciones a realizar, es decir, la inteligencia artificial.</p>
<p>Por si esto fuera poco, también es preciso ser un buen jugador de póquer. No solo eso, sino además, tener un conocimiento matemático del juego para poder enseñar al <em>bot</em> a jugar o a “aprender a jugar”. Porque, al igual que ocurre con muchos profesores que, a pesar de ser unas eminencias en su campo, no logran transmitir con eficiencia los conceptos a sus alumnos, no es lo mismo saber de una cosa que tener facilidad para explicarla. Es imprescindible saber estadística, probabilidad, estrategia&#8230;</p>
<p>Si, como se puede comprobar a simple vista, es necesario tanto esfuerzo y conocimiento, ¿por qué alguien va a querer desarrollar un <em>bot</em> de póquer? La respuesta obvia e inmediata es la que hace girar el mundo: dinero. <strong>La industria del juego mueve unas sumas mareantes y están a solo unos clics de ratón de un programador inteligente que reúna las características necesarias.</strong></p>
<p>Un <em>bot</em> que ni gane ni pierda en las mesas de juego, simplemente con los programas de <em>rakeback</em> o similares ofrecidos por las salas, supone muchos miles de dólares al año. Multiplicado por varias cuentas y salas, resulta en más dinero del que la mayoría de personas pueden lograr en toda su vida. Estímulo más que suficiente como para dedicarle parte de nuestro tiempo. Pero ése no es para muchos el más importante. Porque, como parece ser el sentimiento generalizado de varios desarrolladores, <strong>la mayoría de <em>bots</em> caseros son perdedores.</strong></p>
<p>Perdonad que me ponga por un momento en la piel de un desarrollador de un <em>bot</em> de póquer; lo que pretendo conseguir es que se entienda su punto de vista (es más, la mayoría de ellos, jugar con un <em>bot</em> no lo ven como hacer trampas). La perspectiva de ganar mucho dinero es tentadora para todo el mundo, incluido el programador. <strong>Pero lo que hace a la idea realmente llamativa para él es ser capaz de lograr que su creación sea capaz de ganar al resto de jugadores, humanos o no.</strong> Lo encuentra algo fascinante, es su pasatiempo, su reto. Conseguir al mismo tiempo burlar la seguridad de las salas y la habilidad de los rivales. Al final, para muchos, que sea ganador es lo de menos. Con el desarrollo de la aplicación han conseguido unir y perfeccionar dos actividades que son muy lucrativas: póquer y programación. No es tiempo perdido ni mucho menos.</p>
<p>El principal problema de los <em>bots</em> comerciales se da el día que se logra detectar a uno de ellos; en cuanto quiera la sala de póquer podría congelar las cuentas de todos los que usan ese programa, y dejar a los usuarios sin su fuente de ingresos. Por eso, aunque costoso, es mucho mejor desarrollarlo de manera privada. <strong>La discreción es una de las claves de un <em>bot</em> exitoso. Porque, que no os quepa ninguna duda, los <em>bots</em> son reales y están jugando en las salas.</strong> Otra cosa es si deberíamos temerles y si a las casas les interesa detectarlos. Pero eso, para la próxima semana.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.spainfull.com/blog/167/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>AHK PT3 HUD</title>
		<link>http://www.spainfull.com/blog/ahk-pt3-hud/</link>
		<comments>http://www.spainfull.com/blog/ahk-pt3-hud/#comments</comments>
		<pubDate>Sat, 26 Jan 2008 15:47:00 +0000</pubDate>
		<dc:creator>spainfull</dc:creator>
				<category><![CDATA[Póquer]]></category>
		<category><![CDATA[Poker Tracker]]></category>
		<category><![CDATA[Poker Tracker 3]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Obsoleto]]></category>

		<guid isPermaLink="false">http://www.spainfull.com/blog/?p=16</guid>
		<description><![CDATA[Hace pocos días ha salido la beta del programa Poker Tracker 3. Es un software que permite recoger todas las manos que jugamos en nuestra sala de póquer para analizar a posteriori nuestro juego. En principio, los desarrolladores van a implementar las mismas funcionalidades que tenía la versión anterior y, una vez que las tengas, [...]]]></description>
			<content:encoded><![CDATA[<p>Hace pocos días ha salido la beta del programa <em>Poker Tracker 3.</em> Es un software que permite recoger todas las manos que jugamos en nuestra sala de póquer para analizar a posteriori nuestro juego. En principio, los desarrolladores van a implementar las mismas funcionalidades que tenía la versión anterior y, una vez que las tengas, incorporar nuevas características.</p>
<p>El problema de la beta actual es que no posee un HUD para visualizar los datos de los rivales mientras se juega; y parece que van a tardar aún un tiempo en sacarlo (quizás a mitad de Febrero de 2008). Mientras tanto, se puede usar un <em>script</em> de <em>Autohotkey</em> creado por _dave_. Para ello, es necesario registrarse en la página de PT3 y descargarlo del <a href="http://www.pokertracker3.com/forums/viewtopic.php?f=15&amp;t=180&amp;st=0&amp;sk=t&amp;sd=a">hilo</a> especialmente creado en los foros de PT3.</p>
<p><span id="more-16"></span>De momento, solo funciona en PS, pero va a incorporar FTP y Party en breve. Es necesario seguir una serie de pasos para poder usarlo:<br />
1. Tener instalado <a href="http://www.autohotkey.com/download/"><em>Autohotkey</em></a><em>.</em> Tener instalado PT3 y una base de datos de este programa.<br />
2. Descargar pt3_hud_v0.1.zip. Extraer los ficheros a un directorio.<br />
3. Copiar y pegar en el directorio anterior el archivo psql.exe y todos los .dll de &#8220;<em>C:\Archivos de programa\PostgreSQL\8.x\bin</em>&#8220;.<br />
4. Editar &#8220;stats.ahk&#8221; y cambiar la configuración.<br />
5. Ejecutar el archivo &#8220;<em>pt3_hud_v01.ahk</em>&#8220;. Sentarse en una mesa de PS y  recibir una mano. En cuanto se complete la primera mano, las estadísticas deberían aparecer.<br />
6. Colocar los paneles con el botón izquierdo del ratón. La posición se recordará para las próximas veces.</p>
<h2><span style="font-size:12pt">Configuración</span></h2>
<p>Para configurar el programa hay que modificar el archivo &#8220;<em>stats.ahk</em>&#8220;:</p>
<p><span style="font-family:Courier New">pt3_database_name := &#8220;PT3NL100&#8243;</span></p>
<p>Nombre de la base de datos de PT3 de donde queremos sacar las estadísticas.</p>
<p><span style="font-family:Courier New">pt3_database_host := &#8220;localhost&#8221;</span></p>
<p>Servidor donde se encuentra <em>PostgreSQL</em> (por defecto será localhost).</p>
<p><span style="font-family:Courier New">show_player_name := 0</span></p>
<p>Si queremos que muestre el nombre del jugador en los datos poner un 1.</p>
<p><span style="font-family:Courier New">ignore_hero := 1</span></p>
<p>Si queremos que no aparezcan nuestros datos poner un 1.</p>
<p>El resto de entradas anteriores sirven para configurar una serie de datos como tipo de letra, color de fondo del panel, tasa de refresco de los datos, etc.</p>
<p>A partir de: &#8220;; Define stats here as SQL &#8220;SELECT&#8221; statements&#8221; se definen las estadísticas que van a aparecer en el HUD. Son consultas SQL a la base de datos de PT3 (quien quiera más información sobre el esquema de la base de datos para poder hacer las consultas, la tiene en la parte de <a href="http://www.pokertracker3.com/products/PT3/docs/">documentación</a> de la web de PT3). Se pueden añadir  nuevas a las ya existentes (de hecho, en el hilo del <em>script</em> la gente ya ha mandado algunas).</p>
<p><span style="font-family:Courier New">statlist := &#8220;hands/*vpip,pfr*3bet/,fold3pf/call3pf/raise3pf&#8221;<br />
</span><br />
La última línea es la que define los datos a aparecer en el HUD  (si hay 3 de <em>statlist</em> es porque 2 son de ejemplo, las líneas que empiezan por &#8220;;&#8221; no se procesan, son comentarios). Es una lista de estadísticas separadas por comas (definidas en las sentencias SQL de más arriba); una coma indica una nueva estadística en el mismo panel, una barra (/) una nueva línea y un asterisco (*) en lugar de una coma, señala que se debe comenzar un nuevo panel.</p>
<p>En el ejemplo de arriba, tenemos un panel con el número de manos, otro con el <em>vpip</em> y el <em>pfr</em> en la misma línea, y un último con cuatro estadísticas, cada una en una línea.</p>
<p>Una imagen con el aspecto final de la aplicación:<br />
<a href="http://3.bp.blogspot.com/_5624shASmf0/R5tW2bvwlSI/AAAAAAAAAKY/g1BIkjFoHyU/s1600-h/AHK_PT3_HUD.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5159813291244033314" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_5624shASmf0/R5tW2bvwlSI/AAAAAAAAAKY/g1BIkjFoHyU/s400/AHK_PT3_HUD.PNG" border="0" alt="" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.spainfull.com/blog/ahk-pt3-hud/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Herramientas útiles para jugar NL multimesa</title>
		<link>http://www.spainfull.com/blog/herramientas-utiles-para-jugar-nl-multimesa/</link>
		<comments>http://www.spainfull.com/blog/herramientas-utiles-para-jugar-nl-multimesa/#comments</comments>
		<pubDate>Tue, 02 Oct 2007 09:55:00 +0000</pubDate>
		<dc:creator>spainfull</dc:creator>
				<category><![CDATA[Póquer]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[No Limit]]></category>

		<guid isPermaLink="false">http://www.spainfull.com/blog/?p=13</guid>
		<description><![CDATA[AutoHotKey En este artículo voy a describir el uso de una serie de herramientas que pueden ser de gran ayuda para todos aquellos que jueguen a póquer simultáneamente en varias mesas. En realidad, se trata de varios programitas (o scripts en inglés) que se ejecutan con una aplicación llamada AutoHokey. Lo primero, y si no [...]]]></description>
			<content:encoded><![CDATA[<h2>AutoHotKey</h2>
<p>En este artículo voy a describir el uso de una serie de herramientas que pueden ser de gran ayuda para todos aquellos que jueguen a póquer simultáneamente en varias mesas. En realidad, se trata de varios programitas (o <em>scripts</em> en inglés) que se ejecutan con una aplicación llamada <em>AutoHokey</em>.<span id="more-13"></span></p>
<p>Lo primero, y si no se tiene instalado ya, es ir a la página http://www.autohotkey.com/, ir a la sección de descargas, bajarse el archivo AutoHotkeyInstall.exe e instalarlo en el ordenador. A partir de aquí, se podrán usar todos los programas escritos para esta aplicación. Hay muchos y para muy diversos usos, principalmente para agilizar las tareas cotidianas creando atajos de teclado, pero eso es otra historia; el que quiera más información, tiene para aburrirse en la página anteriormente comentada. Yo me voy a limitar a hablar sobre los programas realizados sobre esta herramienta para jugar a póquer, que es que seguro por lo que estáis leyendo esto.</p>
<p>Los programas que se pueden correr sobre <em>AutoHokey </em>son ficheros de texto con la extensión .ahk. Para ejecutar uno de ellos, bastará con hacer doble clic sobre el mismo y tener instalado el <em>AutoHokey</em> en el ordenador. Los programas que nos interesan están en la página http://www.overcards.com/wiki/moin.cgi/AutoHotKey. En ella se puede ver un listado con todos los disponibles. Son totalmente gratuitos, aunque la mayoría solo sirven para unas salas muy concretas. Normalmente para <em>Poker Stars</em> (PS), <em>Party Poker</em> (PP) o <em>Full Tilt Poker</em> (FT).</p>
<p>En los siguientes apartados, explicaré los programas que utilizo normalmente para jugar. Éstos son <em>Stars Planner</em>, <em>Table Highlighter</em> y <em>Stars Notes</em>. Por si no os habíais percatado, juego en PS, pero algunos sirven también para otras salas o tienen su equivalente en la página antes citada. Otros programas interesantes son el <em>Bet Pot</em> (para manejar el tamaño de apuesta  en NL con atajos de teclado o la ruleta del ratón), <em>Stars Auto Reloader</em> (carga el <em>buy in</em> completo automáticamente), <em>Stars Buddy List</em> (para buscar a los pardillos), <em>Big Pot Grabber</em> (almacena los botes grandes que se suceden en nuestras mesas para poder revisarlos), etc. Yo no utilizo <em>Bet Pot</em> porque me resulta cómoda la manera de seleccionar la apuesta en PS y porque así me obligo a pensar más que si tuviera automatizada la acción, pero creo que es bastante útil si se juega 12 mesas. Echadle un ojo a la página porque seguro que encontráis alguno más que os pueda interesar.</p>
<p>A modo de resumen, voy  a enumerar los pasos necesarios para utilizar un programa para <em>AutoHotkey</em> (traducido de la página donde están listados):</p>
<p>1. Bajar e instalar <em>Autohotkey</em>.</p>
<p>2. Hacer clic con el botón derecho del ratón en el directorio donde se quiera guardar el programa y elegir <em>Nuevo-&gt;AutoHotkey Script.</em> Renombrar ese archivo &#8220;<em>New AutoHotkey Script.ahk</em>&#8221; a &#8220;<em>El nombre que quieras.ahk</em>&#8220;. ¡No olvidar el &#8220;<em>.ahk</em>&#8220;!</p>
<p>3. Hacer clic con el botón derecho del ratón sobre el archivo creado  y elegir <em>Edit Script</em>.</p>
<p>4.Pegar el programa seleccionado (el código del programa está en la página del mismo), guardar y cerrar.</p>
<p>5. Para hacerlo funcionar, hacer doble clic sobre el archivo.</p>
<p>Nota: normalmente para que funcionen correctamente es preciso cambiar algunos parámetros de configuración. Las instrucciones estarán detalladas en la página del programa.</p>
<h2><span style="font-size:13pt">Stars Planner</span></h2>
<p>Sin duda el programa más útil para PS. Con él se pueden controlar varios aspectos de la aplicación de PS. También se puede usar en PP, FT y <em>Absolute</em>. Cuando se ejecuta, aparece una ventana de configuración:</p>
<p><a href="http://img228.imageshack.us/img228/5590/starsplannerrn7.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px;" src="http://img228.imageshack.us/img228/5590/starsplannerrn7.png" border="0" alt="" /></a><br />
Si se marca <em>Enable Keep Lobby</em>, se mostrará siempre la pantalla principal de la aplicación de la sala de póquer (donde se eligen las mesas, el cajero, etc.), y no dejará minimizarla.</p>
<p>Si se marca <em>Enable Automatic Buy In when seated</em>, cada vez que nos sentemos en una nueva mesa nos cargará automáticamente el <em>buy in</em> completo.</p>
<p>Si se marca <em>Dismiss Open-fold &#8220;Are you sure&#8221;?,</em> no nos mostrará la pregunta de si estamos seguros de hacer <em>fold</em> y lo hará automáticamente (creo).</p>
<p>Si se marca <em>Sit Out on all tables (untick to return),</em> nos pondrá <em>sit out</em> en todas las mesas hasta que lo deseleccionemos.</p>
<p>Si se marca <em>Enable Re-Size and Arrange Tables,</em> nos colocará las mesas con el tamaño, orden y posición que hayamos configurado previamente. Para ello es necesario seguir una serie de pasos:</p>
<p>1. Abrir el número de mesas que queramos configurar y colocarlas como prefiramos.</p>
<p>2. Pulsar el botón <em>Capture</em> de <em>Stars Planner</em> y elegir un nombre para esta configuración (por ejemplo, 12 mesas 2 monitores).</p>
<p>3. Debería aparecer una ventanita con un mensaje similar a: &#8220;<em>Found 12 Pokestars tables</em>&#8221; (Encontradas 12 mesas de <em>PokerStars</em>).</p>
<p>4. Cerrar las mesas, no se necesita tenerlas abiertas.</p>
<p>5. Pulsar el botón <em>Configure</em> de <em>Stars Planner</em> y colocar las mesas en el orden en el que queramos que se vayan abriendo (lo harán siguiendo el orden numérico). Es un poco complicado colocarlas porque se mueven a otras posiciones y nos desbarajustan todo. Hay que tener un poco de paciencia y pillarle el tranquillo.</p>
<p>6. Una vez que estemos contentos con la configuración, pulsar el botón <em>Save</em> de <em>Stars Planner</em>.</p>
<p>7. Marcar <em>Enable Re-Size and Arrange Tables</em> para que las mesas se recoloquen con el tamaño adecuado.</p>
<p>Nota: para que en PS el programa vaya más rápido, es necesario añadir la línea:</p>
<p>f5redrawtable=1</p>
<p>en la sección [Options] del archivo &#8220;User.Ini&#8221; del directorio de PokerStars (normalmente &#8220;C:\Archivos de programa\PokerStars&#8221;).</p>
<h2><span style="font-size:13pt">Table Highlighter</span></h2>
<p>Otra aplicación muy útil cuando se juega en varias mesas. Básicamente, resalta la mesa en la que nos llegue el turno de actuar. Tiene varios parámetros que sirven para configurar diversos aspectos del programa, están en la parte de configuración del archivo:</p>
<p><span style="font-family:Courier New; font-size:9pt">;###### Configuration ######</span></p>
<p><span style="font-family:Courier New; font-size:9pt">AQ_Ex = 1 ; poner a 0 para ignorar los botones de acción anticipada.</span></p>
<p><span style="font-family:Courier New; font-size:9pt">timeBeep = 0 ; pita una vez si te quedan menos de x segundos para actuar. 0 no pita.</span></p>
<p><span style="font-family:Courier New; font-size:9pt">timeContBeep = 0 ; beep &#8211; beep &#8211; beep &#8211; beep &#8230;</span></p>
<p><span style="font-family:Courier New; font-size:9pt">timeFlash = 1 ; parpadea la ventana en lugar del pitido (se pueden tener ambos).</span></p>
<p><span style="font-family:Courier New; font-size:9pt">shiftColors = 0 ; poner a 1 para cambiar a un rango de colores según el tiempo que quede.</span></p>
<p><span style="font-family:Courier New; font-size:9pt">style = Bar ; donde se resalta. Opciones: &#8220;Barra&#8221;, &#8220;BarraDeAbajo&#8221;, o &#8220;Chat&#8221;.</span></p>
<p><span style="font-family:Courier New; font-size:9pt">barX = 3 ; solo se aplica al estilo &#8220;BarraDeAbajo&#8221;.</span></p>
<p><span style="font-family:Courier New; font-size:9pt">barY = 550 ; son dinámicos (como el dúo). Configurarlos en una mesa de tamaño </span></p>
<p><span style="font-family:Courier New; font-size:9pt">barW = 790 ; normal, y después usarlos con cualquier tamaño de mesa</span></p>
<p><span style="font-family:Courier New; font-size:9pt">barH = 25 ;</span></p>
<p><span style="font-family:Courier New; font-size:9pt">roundCorners = 0 ; poner a 1 si se quieren esquinas redondeadas en la Barra Superior.</span></p>
<p><span style="font-family:Courier New; font-size:9pt">skipUnderMouse = 0 ; poner a 1 si cuando se pase el ratón la ventana no debe resaltar. </span></p>
<p><span style="font-family:Courier New; font-size:9pt">skipUnderMouseTitle = 0 ; igual pero solo cuando pase el ratón por el título de la ventana.</span></p>
<p><span style="font-family:Courier New; font-size:9pt">buttonFlash = 0 ; poner a 1 para que parpadee la barra si los botones anticipados se muestran.</span></p>
<p><span style="font-family:Courier New; font-size:9pt">barTopH = 0 ; establecer la altura de la Barra Superior. 0 para usar la por defecto.</span></p>
<p><span style="font-family:Courier New; font-size:9pt">barTopY = 0 ; poner la coordenada Y donde la Barra Superior debe situarse.</span></p>
<p><span style="font-family:Courier New; font-size:9pt">activate_on_mouse_over = 0 ; poner 1 para activar la tabla si se pasa el ratón y está resaltada.</span></p>
<p><span style="font-family:Courier New; font-size:9pt">flash_speed = 2 ; velocidad del parpadeo (1=rápida, 2=media, 3=lenta, etc.)</span></p>
<p><span style="font-family:Courier New; font-size:9pt">active_windows_only = 0 ; poner a 1 para que solo funcione en la mesa activa.</span></p>
<p><span style="font-family:Courier New; font-size:9pt">activate_waiting_table = 0 ; poner a 1 para hacer que una mesa en espera pase a activa.</span></p>
<p><span style="font-family:Courier New; font-size:9pt">;###### Configuration &#8211; End ######</span></p>
<p>Nota:  este programa requiere de las funciones de <em>Roland</em> para funcionar. Para ello, ir a <a href="http://www.overcards.com/wiki/moin.cgi/RolandsFunctions" class="broken_link">http://www.overcards.com/wiki/moin.cgi/RolandsFunctions</a> , descargarse los dos archivos que aparecen y guardarlos en el mismo directorio que tengamos los programas.</p>
<h2><span style="font-size:13pt">Star Notes</span></h2>
<p>Este programa solo funciona en PS. Sirve para mostrar las notas que tenemos de los jugadores sin tener que abrir la sección de <em>Notes</em> de la ventana de juego. Cuando estemos jugando en una mesa y pasemos el ratón sobre un jugador del que tenemos notas, aparecerá un cuadro con las mismas.</p>
<p>Para que funcione, hay que configurarlo. Cuando se ejecuta, aparece la ventana:</p>
<p><a href="http://img228.imageshack.us/img228/7287/starnotesrv6.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px;" src="http://img228.imageshack.us/img228/7287/starnotesrv6.png" border="0" alt="" /></a><br />
En <em>Hand history directory</em> hay que poner el directorio donde guarda PS las manos (normalmente C:\Archivos de programa\PokerStars\HandHistory\Nuestro nick en la sala).</p>
<p>En <em>Notes file</em> el archivo donde guarda PS las notas que escribimos (normalmente C:\Archivos de programa\PokerStars\Notes.txt).</p>
<p>Y después, si usamos el sitio preferido configurarlo.</p>
<p>Una vez hecho esto, pulsar el botón <em>Submit</em>. El resto de ocasiones que iniciemos el programa, bastará con pulsar Cancel puesto que la configuración ya estará almacenada.</p>
<p>Nota: este programa requiere de las funciones de <em>Roland</em> para funcionar.</p>
<p>Esto es todo por ahora, espero que os sirva.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.spainfull.com/blog/herramientas-utiles-para-jugar-nl-multimesa/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Estadísticas básicas a mostrar en el PokerAce Hud para NL</title>
		<link>http://www.spainfull.com/blog/estadisticas-basicas-a-mostrar-en-el-pokerace-hud-para-nl/</link>
		<comments>http://www.spainfull.com/blog/estadisticas-basicas-a-mostrar-en-el-pokerace-hud-para-nl/#comments</comments>
		<pubDate>Thu, 14 Jun 2007 20:29:00 +0000</pubDate>
		<dc:creator>spainfull</dc:creator>
				<category><![CDATA[Estrategia]]></category>
		<category><![CDATA[Póquer]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Estadísticas]]></category>
		<category><![CDATA[No Limit]]></category>

		<guid isPermaLink="false">http://www.spainfull.com/blog/?p=8</guid>
		<description><![CDATA[Éste artículo es una traducción de un mensaje de Pokey en este hilo del 10-11-2006. En él se recogen las estadísticas que usa en el PokerAce Hud y los valores típicos de los jugadores de NL FR en microlímites; además de valiosas lecturas sobre su significado. He añadido las dos que utiliza el gran Sobraoboy [...]]]></description>
			<content:encoded><![CDATA[<p>Éste artículo es una traducción de un mensaje de Pokey en este <a href="http://forumserver.twoplustwo.com/showflat.php?Cat=0&amp;Number=8009454&amp;page=0&amp;fpart=all&amp;vc=1">hilo</a> del 10-11-2006. En él se recogen las estadísticas que usa en el PokerAce Hud y los valores típicos de los jugadores de NL FR en microlímites; además de valiosas lecturas sobre su significado. He añadido las dos que utiliza el gran Sobraoboy y seguramente la legión de seguidores 12-<em>tablers </em>(CB y RF) antes de que las pidáis.</p>
<p><strong>Voluntarily Put Money Into the Pot &#8211; VPIP</strong><strong>(Dinero puesto voluntariamente en el bote)</strong>: el indicador fundamental de lo selectivo que es un jugador antes del <em>flop</em>, y uno de los mejores indicios sobre el rango de manos de un jugador. En microlímites quieres que el VPIP de los rivales sea lo mayor posible. Cuantas más manos jueguen, peores serán y más dinero les ganarás. El rango normal para un TAG en microlímites se sitúa entre un 14% y un 20% (más sobre esto en siguientes artículos).</p>
<p><strong></strong></p>
<p><strong>Preflop Raise &#8211; PFR (Subida antes del <em>flop</em>)</strong>: el porcentaje de las veces que un rival sube antes del <em>flop</em>. Este número indica cómo ajustarse al rival antes del <em>flop</em>. En primer lugar, si es extremadamente bajo no hay que preocuparse de que el oponente suba con una mano especulativa. Si el jugador situado a tu izquierda tiene un PFR mínimo, puedes ver con manos muy especulativas y esperar llegar barato al <em>flop</em>, dándote maravillosas <em>odds</em> implícitas. Aprovéchate de ello. Sin embargo, si un jugador con un PFR del 2% sube antes del <em>flop</em>, puedes tirar la mayoría de manos especulativas sin preocuparte (NOTA: si te vas a quedar solo contra un rival con el <em>stack</em> completo cuyo PFR es menor del 4% y ha subido 4ó 5 BB, puedes ver tranquilamente con cualquier pareja solo por las <em>odds</em> implícitas, porque si ligas el trío, te llevarás el <em>stack</em> del contrario con mucha frecuencia. Su bajísimo PFR delata sus posibles manos, y la mayoría de estos jugadores comprometerán su <em>stack</em> entero en una mano que es lo suficientemente buena como para convencerles de subir antes del <em>flop</em>). El rango normal de un TAG en microlímites se sitúa entre un 7% y un 10% (más sobre esto en siguientes artículos).<span id="more-8"></span></p>
<p><strong>Total Aggression &#8211;  TA (Agresividad Total)</strong>: el mejor indicador de lo agresivo que es un rival después del <em>flop</em>. Antes y después del <em>flop</em> son dos situaciones diferentes, y no hay que esperar que un oponente se comporte igual (de pasivo o agresivo) en ambas. Hay jugadores que son muy agresivos antes del <em>flop</em> pero se convierten en <em>calling stations</em> después del <em>flop</em>, y al contrario, <em>limpers</em> recalcitrantes antes del <em>flop</em> que se transforman en psicópatas descontrolados después del <em>flop</em> si ligan una mano. Si ves un rival con una agresividad extremadamente grande, probablemente tengas que jugar pasivo ante él si tienes una mano aceptablemente buena, dejando que apueste por ti. <span style="text-decoration: underline;">OJO</span>: jugadores con una agresividad muy alta se dividen fundamentalmente en dos tipos: los megaselectivos débiles y los maniacos. Los primeros son jugadores cuya agresividad es alta porque se tiran cuando algún otro apuesta y él no tiene la mejor mano. Los segundos son aquellos que tienen una agresividad alta porque apuestan y suben con cualquier mano. Si sabes distinguirlos, harás mucho más dinero (Indicio: fíjate en los tipos de mano que muestran al final. Si llegan al showdown pocas veces y con una gran mano, seguramente sean megaselectivos débiles. Si pierden la mayoría de las manos en el <em>showdown</em>, con gran probabilidad serán maniacos). El rango normal para un TAG en microlímites se sitúa entre un 2 y un 3 (más sobre esto en siguientes artículos).</p>
<p>Después de la trinidad, las estadísticas que uso en mi HUD:</p>
<p><strong>Folds to Continuation Bet (Porcentaje que se tira ante una apuesta de continuación)</strong>: probablemente la siguiente estadística más útil tras las tres primeras y una en la que confío plenamente a la hora de tomar decisiones. Cuanto más se tira un jugador ante una apuesta de continuación, más  propenso soy a (a) subir antes del <em>flop</em> con ellos en la mano y (b) apostarles cuando no ligo en el <em>flop</em>. No veo ninguna razón para apostar cuando alguien no se va a tirar; en lugar de eso, esperaré a tener una mano legítima y machacar al contrario. Por otra parte, si un rival se tira tras una apuesta de continuación el 60% del tiempo o más, usaré mi posición sin piedad, subiéndole con mucha frecuencia y robando bote tras bote en el <em>flop</em> con una apuesta fuerte.</p>
<p><strong>Continuation Bet &#8211; CB</strong> (Porcentaje de apuesta de continuación): un dato que puede ayudar a tomar decisiones en la primera calle. Indica la frecuencia con la que el rival apuesta en el <em>flop</em> tras haber subido <em>preflop</em>. Si tiene menos del 65% solo apostará normalmente cuando haya ligado su mano o cuando la situación parezca favorable (p.e.: estar HU con posición y un <em>flop</em> sin peligro aparente ante un pasivo). Un rival fácil de leer normalmente, pero atención al <em>slowplay</em> con cañones que se puede confundir con debilidad y cuidado también con intentar farolearle si tiene un WTSD alto y es capaz de ver con cualquier cosa mejor que un farol; entre el 65% y el 85% apostará la mayoría de situaciones que pudieran parecer favorables y evitará los <em>flop</em> peligrosos (con muchos proyectos o ante varios rivales sin una mano lo suficientemente fuerte); a partir de 85% apostará prácticamente siempre aunque no haya ligado, se convierte en un blanco propicio para subirle de vez en cuando y tirarle de la mano.</p>
<p><strong>Raise Flop &#8211; RF (Subida en el <em>flop</em>)</strong>: un indicador de la fuerza de las subidas del rival en el <em>flop</em>, ayuda a decidir si abandonar la mano. Un valor menor de 10 suele pertenecer a un jugador que solo sube sus manos más fuertes; entre 10 y 12 subirá manos hechas (a partir de TP) y proyectos muy fuertes; un número mayor de 12 indica que al rival le gusta meter presión y subir con todo tipo de proyectos (cuanto mayor este valor, más posibilidades de subida de farol).</p>
<p><strong>Attempted to Steal the Blinds (Porcentaje de intento de robar las ciegas)</strong>: muy útil a la hora de ver si un rival tiene en cuenta la posición. Desde CO y B, trato este número como el PFR del jugador en esas posiciones, y ajusto mi juego en consonancia. Además, si el porcentaje de robo es significativamente más grande que su PFR, asumo que el rival tiene algo más que simples nociones sobre cómo jugar a esto y le tengo algo más de respeto cuando me enfrento a él. También pienso que tengo bastante más <em>folding equity</em> contra ellos en general, porque los jugadores decentes son poco propensos a comportarse como <em>calling stations</em> y mucho más capaces de tirar una mano decente pero superable.</p>
<p><strong>Folded Big/Small Blind to a Steal (Porcentaje de abandono en SB/BB ante un intento de robo)</strong>: otro indicador básico de la fuerza de una mano. Si el rival se tira constantemente ante intentos de robo, sé que cuando vea desde las ciegas, tendrá una mano decente. Si suele defender las ciegas, asumo que puede tener cualquier cosa incluso aunque vea una subida considerable. Combinado con el porcentaje de abandono ante una apuesta de continuación en el <em>flop</em>, tengo una idea bastante aproximada de si robar contra ese oponente va a ser rentable o no.</p>
<p><strong></strong></p>
<p><strong>Went to Showdown Percentage &#8211; WTSD &#8211; WSD% (Porcentaje de ida al <em>Showdown</em>)</strong>: cuanto mayor sea este número, más <em>calling stantion</em> será el rival. No hay un número mágico que indique si será rentable o no jugar contra determinado oponente; por contra, me indica cómo debería ajustar mi juego ante el villano. Frente a un jugador con un WSD% muy bajo, apuesto por valor mucho menos a menudo y faroleo con mayor frecuencia.</p>
<p><strong>Won Money At Showdown &#8211; W$SD (Dinero ganado en el <em>Showdown</em>)</strong>: otra estadística bastante útil. Es una medida aproximada de la habilidad después del <em>flop</em> de un jugador. Cuanto mayor sea este número, más probable es que el villano tenga la mejor mano en el <em>showdown</em>. Me ayuda a decidir con qué frecuencia puedo apostar por valor a un rival o ver sus apuestas. De igual forma, me ayuda a distinguir entre buenos y malos LAG (<em>Loose-Agresive</em>), <em>nits</em> (roca, jugador de manual) de TAG (<em>Tight-Aggresive</em>), y maniacos de jugadores agresivos pero listos. Si el W$SD de un oponente es extremadamente alto, lo considero débil y le faroleo con frecuencia. También ajusto el tamaño de mis apuestas, sabiendo que no me costará mucho sacar al villano de la mano. Si por el contrario, el W$SD del rival es extremadamente bajo, apostaré con valor con cualquier mano que haya ligado, esperando que me vea la apuesta frecuentemente. Además, aumento el tamaño de mis apuestas por valor, con la esperanza de ser visto aunque muestre bastante fuerza.</p>
<p><strong>Total Hands – TA (Manos totales)</strong>: un número increíblemente importante. Indica el grado de confianza que puedes tener en el resto de números que muestra el HUD. Sobre unas 50, el VPIP y el PFR empiezan a ser significativos. Sobre 10.000/VPIP, puedes empezar a hacer caso a la agresividad total (p.e.: 200 manos para un jugador con un VPIP de 50, pero 500 para otro con un VPIP de 20). El W$SD no se ajusta realmente hasta varios miles de manos, así que trátalo de modo orientativo si no tienes esa cantidad; sin embargo, el WSD% adquiere valores confiables mucho antes.</p>
<p>Además de las estadísticas de los rivales, tengo configurado el HUD para que muestre las mías también. El programa las almacena de forma independiente en cada mesa que juguemos; así, podemos de un vistazo comprobar cómo estamos jugando en una mesa determinada, lo que nos ayudará a identificar nuestra imagen en la mesa contra un conjunto específico de rivales. Cuando mi VPIP es grande, sé que parezco un mal jugador. Cuando mi PFR es grande, sé que mis subidas antes del <em>flop</em> no van a ser demasiado respetadas. Cuando mi TA es grande, sé que parezco un forero de 2+2. Cuando mis intentos de robos son frecuentes, sé que empiezo a perder <em>folding equity</em> y debo jugar con mayor prudencia. Si estoy tirándome demasiado ante una apuesta de continuación, sé que algunos jugadores pueden empezar a hacerme movimientos en el <em>flop</em>. Tener en cuenta todos estos números, permite ajustarme adecuadamente a las condiciones siempre cambiantes de la mesa. <em>Be water, my friend</em>.</p>
<p>El último detalle que siempre tengo configurado en mi HUD es la información del <em>showdown</em>. Mostrando las cartas de la mesa y de cada rival me ahorra tener que abrir el historial de manos constantemente para ver qué tenían. Me ayuda a juzgar cómo están jugando, información de vital importancia para cualquier jugador ganador.</p>
<p><span style="text-decoration: underline;">Una última cosa</span>: en las ventanas emergentes (<em>pop-up</em>) del HUD tengo cualquier dato que se pueda mostrar. Así, si un jugador hace un movimiento infrecuentemente fuerte, tengo acceso instantáneo a cualquier estadística que pudiera necesitar. ¿Con qué frecuencia pasa en falso en el <em>turn</em>? ¿Con qué frecuencia ve una subida antes del <em>flop</em>? ¿Con qué frecuencia sube las apuestas de continuación? ¿Con qué frecuencia gana cuando ve un <em>flop</em>? Nunca se sabe cuándo un detalle de éstos puede acabar salvando tu <em>stack</em>, y como no cuesta nada tener esa información incluida, deberías configurarlo y poder acceder a ella.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.spainfull.com/blog/estadisticas-basicas-a-mostrar-en-el-pokerace-hud-para-nl/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Cómo usar PostgreSQL en Poker Tracker</title>
		<link>http://www.spainfull.com/blog/como-usar-postgresql-en-poker-tracker/</link>
		<comments>http://www.spainfull.com/blog/como-usar-postgresql-en-poker-tracker/#comments</comments>
		<pubDate>Fri, 09 Mar 2007 21:01:00 +0000</pubDate>
		<dc:creator>spainfull</dc:creator>
				<category><![CDATA[Póquer]]></category>
		<category><![CDATA[Poker Tracker]]></category>
		<category><![CDATA[Poker Tracker 2]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Bases de datos]]></category>
		<category><![CDATA[Obsoleto]]></category>

		<guid isPermaLink="false">http://www.spainfull.com/blog/?p=25</guid>
		<description><![CDATA[En este artículo voy a explicar la solución para todos aquellos que juguéis una gran cantidad de manos y Poker Tracker + PokerAce Hud ralentice muchísimo vuestro ordenador. Lo mejor que podéis hacer es instalar la base de datos PostgreSQL para usarla con PT. Es realmente sencillo, no hay más que seguir unos pasos detallados [...]]]></description>
			<content:encoded><![CDATA[<p>En este artículo voy a explicar la solución para todos aquellos que juguéis una gran cantidad de manos y Poker Tracker + PokerAce Hud ralentice muchísimo vuestro ordenador. Lo mejor que podéis hacer es instalar la base de datos PostgreSQL para usarla con PT. Es realmente sencillo, no hay más que seguir unos pasos detallados a continuación.<span id="more-25"></span></p>
<p>Antes de empezar, dos advertencias:</p>
<ol>
<li>Esta guía es para sistemas operativos del maligno, es decir, Windows. Pero para que funcione PostgreSQL debe ser un sistema operativo NT, es decir<span style="font-weight: bold;">, a partir de Windows 2000</span>; no, Windows 98 no vale ni Windows ME tampoco; y sí, Windows XP vale.</li>
<li><span id="fullpost"><span style="font-weight: bold;">Nuestro sistema de archivos no deberá ser ni FAT ni FAT32</span>. Para ver qué sistema está instalado en la unidad en la que se va a instalar PostgreSQL basta con hacer doble clic sobre “<span style="font-style: italic;">Mi PC</span>” y pulsar con el ratón derecho y elegir “<span style="font-style: italic;">Propiedades</span>” sobre la unidad elegida (normalmente lo instalaremos en  la unidad “<span style="font-style: italic;">C:</span>”), tal y como se muestra en la imagen:<br />
<a href="http://bp1.blogger.com/_5624shASmf0/RfHM7yIP4UI/AAAAAAAAAIw/-RIl2l1f9Mo/s1600-h/MiPC.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5040034785445011778" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_5624shASmf0/RfHM7yIP4UI/AAAAAAAAAIw/-RIl2l1f9Mo/s400/MiPC.PNG" border="0" alt="" /></a><br />
</span></li>
<li>Se mostrará una ventana en la que si aparece “<span style="font-style: italic;">Sistema de archivos: NTFS</span>” se podrá instalar, pero si es “<span style="font-style: italic;">FAT</span>” o “<span style="font-style: italic;">FAT32</span>”, no funcionará (aunque se puede convertir si sigues los pasos indicados <a href="http://www.microsoft.com/technet/prodtechnol/winxppro/maintain/convertfat.mspx">aquí</a> -en guiri y no me responsabilizo de lo que pueda pasar-).</li>
</ol>
<p><span id="fullpost"><a href="http://bp3.blogger.com/_5624shASmf0/RfHNJSIP4VI/AAAAAAAAAI4/GMdMyVRh7jA/s1600-h/NTFS.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5040035017373245778" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_5624shASmf0/RfHNJSIP4VI/AAAAAAAAAI4/GMdMyVRh7jA/s400/NTFS.PNG" border="0" alt="" /></a><br />
<span style="font-weight: bold;">Instalación de PostgreSQL</span></span></p>
<p>El primer paso para usar PostgreSQL en Poker Tracker es instalarlo en nuestro ordenador; para ello hay que ir a su página <a href="http://www.postgresql.org/">web</a> y pulsar en el enlace de descarga “<a href="http://www.postgresql.org/ftp/"><span style="font-style: italic;">Download PostgreSQL 8.2.3</span></a>” que aparece en la página principal (la última versión para la que se escribe este artículo a día 09-03-2007 es la 8.2.3, las siguientes supongo que serán muy similares). Una vez pulsado, nos llevará a la sección &#8220;<span style="font-style: italic;">FTP Browse</span>r&#8221;, donde se ven una serie de carpetas; si vamos a instalarla en plataforma Windows, pulsamos en la carpeta que pone &#8220;<span style="font-style: italic;">Win32</span>&#8220;. Aparecerán una serie de archivos, pulsamos sobre el que tiene solo la extensión zip (&#8220;<a href="http://wwwmaster.postgresql.org/download/mirrors-ftp?file=binary%2Fv8.2.3%2Fwin32%2Fpostgresql-8.2.3-1.zip" class="broken_link"><span style="font-style: italic;">postgresql-8.2.3-1.zip</span></a>&#8221; es la última versión disponible) que contendrá el instalador para Windows. Seguidamente nos muestran una pantalla con muchas banderitas; no es para elegir la que más nos guste ni nuestra selección favorita (ni siquiera el lenguaje de la aplicación), sino para seleccionar desde qué servidor queremos descargar el archivo, lógicamente pulsaremos sobre el que más cerca nos pille. Una vez pulsado el país, nos mostrará una ventana de descarga de archivos y elegimos guardar (se iniciará la descarga y se guardará en el directorio que tengamos especificado por defecto para las descargas con el navegador que estemos usando).</p>
<p>Una vez tenemos el archivo zip en nuestro disco duro cuando ha acabado la descarga, lo abrimos haciendo doble clic sobre él. Cuando se abra Winzip, pulsamos sobre <span style="font-style: italic;">“Extract”</span>, mostrará una ventana para seleccionar donde guardar esos archivos. Seleccionamos “<span style="font-style: italic;">All files</span>” y el directorio donde queremos descomprimir el instalador (da igual donde lo hagamos, luego borraremos estos archivos de instalación). Una vez descomprimidos, ejecutamos el archivo “<span style="font-style: italic;">postgresql-8.2.msi</span>” que lanzará la instalación de PostgreSQL.</p>
<p>Aparecerá esta ventana:</p>
<p><a href="http://bp2.blogger.com/_5624shASmf0/RfHOyCIP4WI/AAAAAAAAAJA/IFP58EVnxRI/s1600-h/1Lan.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5040036816964542818" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_5624shASmf0/RfHOyCIP4WI/AAAAAAAAAJA/IFP58EVnxRI/s400/1Lan.PNG" border="0" alt="" /></a><br />
Seleccionamos el idioma en el que queramos tener la aplicación y pulsamos “<span style="font-style: italic;">Start &gt;</span>”. Después “<span style="font-style: italic;">Next &gt;</span>” hasta que nos muestre la siguiente pantalla:</p>
<p><a href="http://bp3.blogger.com/_5624shASmf0/RfHO9SIP4XI/AAAAAAAAAJI/OzdJBhGjIJw/s1600-h/2Opt.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5040037010238071154" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_5624shASmf0/RfHO9SIP4XI/AAAAAAAAAJI/OzdJBhGjIJw/s400/2Opt.PNG" border="0" alt="" /></a><br />
Dejamos todo como está por defecto y pulsamos “<span style="font-style: italic;">Next &gt;</span>”</p>
<p><a href="http://bp0.blogger.com/_5624shASmf0/RfHPRiIP4YI/AAAAAAAAAJQ/227biGhy3Nk/s1600-h/3Conf.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5040037358130422146" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_5624shASmf0/RfHPRiIP4YI/AAAAAAAAAJQ/227biGhy3Nk/s400/3Conf.PNG" border="0" alt="" /></a><br />
Nos muestra la pantalla de configuración de la cuenta que ejecutará el servidor de la base de datos de PostgreSQL. Lo único que debemos hacer es escribir una contraseña cualquiera (pero apúntatela para que no se te olvide o pon una facilita) en “<span style="font-style: italic;">Account password</span>” y escribirla de nuevo para comprobar que la hemos escrito bien en “<span style="font-style: italic;">Verify password</span>”. Una vez acabado esto, pulsamos “<span style="font-style: italic;">Next &gt;</span>”, nos pregunta si queremos crear la cuenta y respondemos que “<span style="font-style: italic;">Sí</span>”, después<span style="font-weight: bold;"> es probable que nos diga que nuestra contraseña es débil y nos pregunte si queremos que nos la cambie por una aleatoria generada por él, tenemos que decir que “<span style="font-style: italic;">No</span>”</span>. Entonces aparecerá esta pantalla:</p>
<p><a href="http://bp0.blogger.com/_5624shASmf0/RfHPZiIP4ZI/AAAAAAAAAJY/5Yqo4UweKko/s1600-h/4Clu.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5040037495569375634" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_5624shASmf0/RfHPZiIP4ZI/AAAAAAAAAJY/5Yqo4UweKko/s400/4Clu.PNG" border="0" alt="" /></a><br />
De nuevo escribimos una contraseña en “<span style="font-style: italic;">Password</span>” y otra vez la misma en “<span style="font-style: italic;">Password (again)</span>”. <span style="font-weight: bold;">Puede ser la misma que hemos utilizado anteriormente, en este caso será para el usuario dentro de la base de datos y el que tendremos que poner en el PT, así que no la pierdas</span>. Pulsamos “<span style="font-style: italic;">Next &gt;</span>”, y en la siguiente pantalla “<span style="font-style: italic;">Enable procedural languages</span>” dejamos todo por defecto y otra vez “<span style="font-style: italic;">Next &gt;</span>”. Nos muestra la pantalla “<span style="font-style: italic;">Enable contrib modules</span>” donde se pueden seleccionar módulos adicionales con funcionalidad añadida a la que viene por defecto. Dejamos todo como está (se podrán añadir después de la instalación si se necesitaran) y pulsamos “<span style="font-style: italic;">Next &gt;</span>”. Aparece la pantalla de “<span style="font-style: italic;">Ready to install</span>”, eso quiere decir que ya estamos casi, pulsamos “<span style="font-style: italic;">Next &gt;</span>” y comenzará la instalación. Cuando acabe nos muestra una pantalla en la que nos dice que se ha instalado con éxito y para concluir debemos pulsar “<span style="font-style: italic;">Finish</span>”. Ya tenemos instalado PostgreSQL en nuestro ordenador.</p>
<p><span style="font-weight: bold;">Uso de PostgreSQL en Poker Tracker</span></p>
<p>Ahora debemos configurar PT para usar esta base de datos; con este objetivo, seleccionamos del menú “<span style="font-style: italic;">Utilities-&gt;PostgreSQL Settings&#8230;</span>”, apareciendo esta ventana, donde debemos escribir el usuario que viene por defecto en la instalación <span style="font-style: italic;">“postgres” </span>(si no lo cambiamos en la instalación) y la contraseña que pusimos para el usuario, es decir, la segunda vez que nos pidieron en la instalación que escribiéramos una:</p>
<p><a href="http://bp0.blogger.com/_5624shASmf0/RfHSDiIP4aI/AAAAAAAAAJg/npC_gjDfzek/s1600-h/PosPT.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5040040416147136930" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_5624shASmf0/RfHSDiIP4aI/AAAAAAAAAJg/npC_gjDfzek/s400/PosPT.PNG" border="0" alt="" /></a><br />
Ahora solo falta convertir nuestra base de datos Access a PostgreSQL mediante la función del menú de PT</p>
<p><span id="fullpost">“<span style="font-style: italic;">Utilities-&gt;Convert Database&#8230;</span>” y elegir la que queramos convertir (puede tardar muuuuuucho tiempo dependiendo del tamaño de la base de datos, paciencia y no cerréis antes de acabar aunque parezca que se ha colgado).</span></p>
<p>Una vez convertida a PostgreSQL, vamos a establecer ésta como la base de datos por defecto cada vez que arranque PT. Para ello, seleccionamos “<span style="font-style: italic;">File-&gt;Maintain Database names&#8230;</span>” y marcamos la base de datos convertida en la columna “<span style="font-style: italic;">Dflt</span>”.</p>
<p><a href="http://bp0.blogger.com/_5624shASmf0/RfQD5yIP4cI/AAAAAAAAAJw/reTcMhQM5N0/s1600-h/DefaultBD.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5040658174178222530" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_5624shASmf0/RfQD5yIP4cI/AAAAAAAAAJw/reTcMhQM5N0/s400/DefaultBD.PNG" border="0" alt="" /></a><br />
Si se desea, también se puede borrar desde esta ventana la base de datos Access antigua, aunque siempre la podemos guardar como backup.</p>
<p><span style="font-weight: bold;">Configuración del PokerAce Hud</span></p>
<p>Ahora, es preciso cambiar la configuración del PokerAce Hud para seleccionar la base de datos de la que queremos que coja la información. Para ello, en &#8220;<span style="font-style: italic;">Options-&gt;Preferences-&gt;Database-&gt;Holdem</span>&#8221; o en &#8220;<span style="font-style: italic;">Options-&gt;Preferences-&gt;Database-&gt;Omaha</span>&#8221; simplemente se marca la base de datos escogida de entre las que aparezcan:</p>
<p><a href="http://bp2.blogger.com/_5624shASmf0/RfQEUSIP4dI/AAAAAAAAAJ4/sD1ddizAx-E/s1600-h/AceHud.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5040658629444755922" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_5624shASmf0/RfQEUSIP4dI/AAAAAAAAAJ4/sD1ddizAx-E/s400/AceHud.PNG" border="0" alt="" /></a><br />
Esto es todo, espero que os sirva.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.spainfull.com/blog/como-usar-postgresql-en-poker-tracker/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Cómo realizar consultas SQL en la BD de Poker Tracker. Parte III.</title>
		<link>http://www.spainfull.com/blog/como-realizar-consultas-sql-en-la-bd-de-poker-tracker-parte-iii/</link>
		<comments>http://www.spainfull.com/blog/como-realizar-consultas-sql-en-la-bd-de-poker-tracker-parte-iii/#comments</comments>
		<pubDate>Mon, 29 Jan 2007 13:13:00 +0000</pubDate>
		<dc:creator>spainfull</dc:creator>
				<category><![CDATA[Póquer]]></category>
		<category><![CDATA[Poker Tracker]]></category>
		<category><![CDATA[Poker Tracker 2]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Bases de datos]]></category>
		<category><![CDATA[Obsoleto]]></category>

		<guid isPermaLink="false">http://www.spainfull.com/blog/?p=24</guid>
		<description><![CDATA[En este artículo voy a profundizar en el uso de consultas a la base de datos de Poker Tracker, explicando detalladamente la consulta usada en la primera parte y creando nuevas para obtener más información no disponible en el programa que pueda resultar interesante. El objetivo es que cualquiera pueda crearse su propia consulta a [...]]]></description>
			<content:encoded><![CDATA[<p>En este artículo voy a profundizar en el uso de consultas a la base de datos de Poker Tracker, explicando detalladamente la consulta usada en la <a href="http://www.spainfull.com/blog/como-realizar-consultas-sql-en-la-bd-de-poker-tracker-parte-i/">primera</a> parte y creando nuevas para obtener más información no disponible en el programa que pueda resultar interesante. El objetivo es que cualquiera pueda crearse su propia consulta a partir de unas sencillas instrucciones.</p>
<p>En el <a href="http://www.spainfull.com/blog/como-realizar-consultas-sql-en-la-bd-de-poker-tracker-parte-i/">primero</a> de la serie, explicaba simplemente cómo hacer una consulta SQL en Access; y en el <a href="http://www.spainfull.com/blog/como-realizar-consultas-sql-en-la-bd-de-poker-tracker-parte-ii/">segundo</a>, la estructura de la base de datos de PT para saber la forma en la que almacena la información y cómo se divide ésta en las diferentes tablas y campos. En esta tercera y última parte, se comprenderán muchas cosas que en los anteriores podían resultar confusas. Lo intentaré hacer despacito, como le gusta a las mujeres.</p>
<p>Si no has estado despistado, sabrás que el lenguaje con el que se hacen las consultas se llama SQL. No es más que una serie de instrucciones que sabe interpretar el motor de la base de datos y que se emplea para manipular la información contenida en ella. En este breve tutorial voy a centrarme exclusivamente en las órdenes de consulta, es decir, en la recuperación de datos.<span id="more-24"></span></p>
<p>Hay una serie de palabras que conforman el lenguaje SQL y que equivalen a instrucciones sobre la base de datos. Para hacer una consulta, se utiliza la palabra <span style="font-style: italic;font-size:100%;"><span style="font-family:courier new;">SELECT </span></span>(del inglés, seleccionar). La estructura de una consulta SQL es la siguiente:</p>
<p><span style="font-size:85%;"><span style="font-family:courier new;">SELECT (lo que se quiera seleccionar de la BD)</span><br />
<span style="font-family:courier new;">FROM (la tabla o tablas donde se encuentran los datos que se quieren seleccionar)</span><br />
<span style="font-family:courier new;">WHERE (las condiciones que tienen que cumplir los datos que se quieren seleccionar)</span></span></p>
<p>La parte del <span style="font-style: italic;font-family:courier new;">SELECT </span>es la de selección. A continuación se debe indicar lo que se desea recuperar de la base de datos. Básicamente se ponen los campos de la tabla (cuyo nombre pondremos a continuación en la parte <span style="font-style: italic;font-family:courier new;">FROM</span>) que se quieren recuperar separados por comas (supongo que te acordarás que las tablas se dividen en campos que contienen la información del tipo con el que se haya creado ese campo); otra opción es poner &#8220;*&#8221; que significa que queremos recuperar todos los campos.</p>
<p>La parte del <span style="font-style: italic;font-family:courier new;">FROM </span>es la de origen. Se escribe el nombre de la tabla donde se encuentran esos campos que queremos recuperar. La parte del <span style="font-style: italic;font-family:courier new;">WHERE </span>es la de condición. Es opcional (no es necesario que aparezca) y funciona mediante expresiones aritméticas o booleanas que condicionan la selección.</p>
<p>Con un ejemplo sencillo se verá todo más claro. Poco a poco iré explicando detalles más complicados.</p>
<p>Voy a obtener todos los campos de la tabla <span style="font-style: italic;font-family:courier new;">game_level</span>:</p>
<p><span style="font-size:85%;"><span style="font-family:courier new;">SELECT *</span><br />
<span style="font-family:courier new;">FROM game_level</span></span></p>
<p><a href="http://bp3.blogger.com/_5624shASmf0/RddoWKQGn8I/AAAAAAAAAFQ/_ZHPwVgAsdA/s1600-h/SelGameLev.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5032605838528126914" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_5624shASmf0/RddoWKQGn8I/AAAAAAAAAFQ/_ZHPwVgAsdA/s400/SelGameLev.PNG" border="0" alt="" /></a><br />
Así de fácil. Esta consulta mostrará todos los campos de la tabla (la explicación del significado de las tablas y los campos que las componen están en el segundo <a href="http://www.spainfull.com/blog/como-realizar-consultas-sql-en-la-bd-de-poker-tracker-parte-ii/">artículo</a> de la serie). Si solo se quiere que muestre los campos de identificador de nivel y su descripción, bastaría con poner:<br />
<span style="font-size:85%;"><br />
<span style="font-family:courier new;">SELECT game_level_id, game_level_desc</span><br />
<span style="font-family:courier new;">FROM game_level</span></span></p>
<p><a href="http://bp2.blogger.com/_5624shASmf0/Rddov6QGn9I/AAAAAAAAAFY/Hf3AkIfXQRk/s1600-h/SelGameLevII.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5032606280909758418" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_5624shASmf0/Rddov6QGn9I/AAAAAAAAAFY/Hf3AkIfXQRk/s400/SelGameLevII.PNG" border="0" alt="" /></a><br />
Como se ve, solo aparecen los campos seleccionados en la parte de selección. Cabe destacar, que si no se usa la parte de condición, la selección se hace sobre todas las filas de la tabla. El número de columnas de la tabla resultado es el número de elementos que tenemos en la selección separados por comas; en este caso, dos. El título de la columna de la tabla resultado es el del nombre del campo.</p>
<p>En la parte de selección se pueden utilizar una serie de funciones que hacen operaciones sobre los campos, se escribe la palabra que representa a la función y entre paréntesis el campo al que se le aplica. Las funciones son:</p>
<ul>
<li><span style="font-family:Georgia;"><span style="font-style: italic;">Max</span>(campo): obtiene el valor máximo del campo.</span></li>
<li><span style="font-family:Georgia;"><span style="font-style: italic;">Min</span>(campo): obtiene el valor mínimo del campo.</span></li>
<li><span style="font-family:Georgia;"><span style="font-style: italic;">Sum</span>(campo): suma los registros del campo elegido.</span></li>
<li><span style="font-family:Georgia;"><span style="font-style: italic;">Avg</span>(campo): obtiene la media de las filas del campo elegido.</span></li>
<li><span style="font-family:Georgia;"><span style="font-style: italic;">Count</span>(*): muestra el total de filas seleccionadas.</span></li>
</ul>
<p class="MsoNormal"><span style="font-family:Georgia;">Si por ejemplo se quiere obtener el máximo bote ganado en las manos almacenadas de <span style="font-style: italic;">cash </span>habría que usar la consulta (el bote máximo sin importar quién lo ha ganado). Te recuerdo que el resumen de las manos se guardan en la tabla <span style="font-style: italic;font-size:100%;"><span style="font-family:courier new;">game</span></span>:</span></p>
<p><span style="font-size:85%;"><span style="font-family:courier new;">SELECT MAX(pot)</span><br />
<span style="font-family:courier new;">FROM game</span></span></p>
<p><a href="http://bp3.blogger.com/_5624shASmf0/Rddp2KQGn-I/AAAAAAAAAFo/DIQbE00lOwA/s1600-h/SelMAX.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5032607487795568610" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_5624shASmf0/Rddp2KQGn-I/AAAAAAAAAFo/DIQbE00lOwA/s400/SelMAX.PNG" border="0" alt="" /></a><br />
Si te fijas, el nombre de la columna no es descriptivo. Esto se debe a que como no es un campo, sino una operación sobre un campo, no tiene un nombre fijo asignado. Para que aparezca un título en la columna de la tabla resultado, y lo que es más importante, para que se pueda utilizar este cálculo temporal posteriormente dentro de la selección en consultas más elaboradas, es preciso usar un alias que identificará el resultado temporal. Para ello basta con escribir la palabra <span style="font-style: italic;font-family:courier new;">AS </span>y el nombre que se le quiere asignar (también se puede utilizar con los campos para que aparezca con otro nombre la columna resultado y para volver a usar esos campos):</p>
<p><span style="font-size:85%;"><span style="font-family:courier new;">SELECT MAX(pot) AS bote_máximo</span><br />
<span style="font-family:courier new;">FROM game</span><br />
</span><br />
<a href="http://bp2.blogger.com/_5624shASmf0/RddqE6QGn_I/AAAAAAAAAFw/ZYM2kTQnCyE/s1600-h/SelMAXII.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5032607741198639090" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_5624shASmf0/RddqE6QGn_I/AAAAAAAAAFw/ZYM2kTQnCyE/s400/SelMAXII.PNG" border="0" alt="" /></a><br />
Si ahora se quiere obtener el bote máximo ganado por cada jugador, se puede utilizar una nueva instrucción que agrupa las filas que tienen el mismo valor en un campo. Esa instrucción se representa en SQL mediante las palabras <span style="font-style: italic;font-family:courier new;">GROUP BY</span>. Para hacer esta consulta, habrá que agrupar las filas que tengan el mismo valor en el campo <span style="font-style: italic;font-family:courier new;">player_id</span> (que es el que identifica al jugador). Para que aparezca también el identificador del jugador, se añade ese campo en la selección:</p>
<p><span style="font-size:85%;"><span style="font-family:courier new;">SELECT player_id, MAX(pot) AS bote_máximo_por_jugador</span><br />
<span style="font-family:courier new;">FROM game</span><br />
<span style="font-family:courier new;">GROUP BY player_id</span></span></p>
<p><a href="http://bp0.blogger.com/_5624shASmf0/RddrJaQGoAI/AAAAAAAAAGA/VRM7QBXEq1k/s1600-h/SelMAXIII.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5032608918019678210" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_5624shASmf0/RddrJaQGoAI/AAAAAAAAAGA/VRM7QBXEq1k/s400/SelMAXIII.PNG" border="0" alt="" /></a><br />
Como se puede apreciar, aparece un identificador del jugador que es un número. Esto es debido a que es así cómo se guarda en el resto de tablas que no es la de jugadores (<span style="font-style: italic;font-family:courier new;">players</span>) para diferenciarlos. Si se quieren obtener más datos del jugador, hay que mirar también en la tabla players, pero eso lo dejo para más adelante.</p>
<p>Ahora voy a tratar la parte condicional de las consultas. Hasta aquí, las consultas estaban realizadas sobre todas las filas de la tabla. Si se quiere seleccionar sobre solo una fracción de ellas, es preciso usar la parte del <span style="font-size:100%;"><span style="font-style: italic;font-family:courier new;">WHERE</span></span>. A continuación es preciso establecer las condiciones que debe cumplir la búsqueda. Para ello se usan los campos o los alias (entre corchetes) de la parte de la selección y las relaciones entre ellos. Estas relaciones pueden ser de comparación: mayor que, menor que, mayor o igual que, menor o igual que, distinto, igual (&gt;, &lt;, &gt;=, &lt;=, &lt;&gt;, =); lógicas: y, o, no (<span style="font-style: italic;font-family:courier new;">And</span>, <span style="font-style: italic;font-family:courier new;">Or</span>, <span style="font-style: italic;font-family:courier new;">Not</span>) y otros operadores como intervalo (<span style="font-style: italic;font-family:courier new;">Between And</span>), filas diferentes (<span style="font-style: italic;font-family:courier new;">Distinct</span>), similares (<span style="font-style: italic;font-family:courier new;">Like</span>), conjunto (<span style="font-style: italic;font-family:courier new;">In</span>, <span style="font-style: italic;font-family:courier new;">Not In</span>), si el campo es vacío (<span style="font-style: italic;font-family:courier new;">Is Null</span>), etc.</p>
<p>Para entenderlo mejor, voy a hacer la consulta del máximo bote de <span style="font-style: italic;">cash </span>menor de 50:</p>
<p class="MsoNormal"><span style="font-family:Georgia;"><!--[if !supportEmptyParas]--> <!--[endif]--></span></p>
<p class="MsoNormal"><span style="font-family:Georgia;"><span style="font-size:85%;"><span style="font-family:courier new;">SELECT MAX(pot) AS bote_máximo</span><br />
<span style="font-family:courier new;">FROM game</span><br />
<span style="font-family:courier new;">WHERE pot &#8216;&lt;&#8217; 50  <a href="http://bp0.blogger.com/_5624shASmf0/RddrnaQGoBI/AAAAAAAAAGI/-svr6Zm4H3I/s1600-h/SelMAXVI.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5032609433415753746" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_5624shASmf0/RddrnaQGoBI/AAAAAAAAAGI/-svr6Zm4H3I/s400/SelMAXVI.PNG" border="0" alt="" /></a><br />
Si se quieren ver los datos de un jugador como todos los identificadores de jugador, los alias y las salas que se corresponden con un nombre de usuario (en mi caso suelo usar &#8220;<span style="font-style: italic;font-family:courier new;">spainfull</span>&#8220;), bastaría hacer la siguiente selección (estos datos se encuentran en la tabla <span style="font-style: italic;font-family:courier new;">players</span>, que almacena en cada fila los datos de un jugador en una sala; el identificador de sala es un valor que se corresponde con una sala que se puede ver en la tabla <span style="font-style: italic;font-family:courier new;">poker_sites</span>):</span></span></span></p>
<p class="MsoNormal"><span style="font-family:Georgia;"><!--[if !supportEmptyParas]--> <!--[endif]--></span></p>
<p class="MsoNormal"><span style="font-family:Georgia;" lang="EN-GB"><span style="font-size:85%;"><span style="font-family:courier new;">SELECT player_id AS jugador_id, main_site_id AS sala, alias_id AS alias</span><br />
<span style="font-family:courier new;">FROM players</span><br />
<span style="font-family:courier new;">WHERE screen_name = &#8220;spainfull&#8221;</span></span></span></p>
<p><a href="http://bp3.blogger.com/_5624shASmf0/Rdd7PKQGoCI/AAAAAAAAAGY/sGzV39lexKY/s1600-h/SelPla.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5032626608989970466" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_5624shASmf0/Rdd7PKQGoCI/AAAAAAAAAGY/sGzV39lexKY/s400/SelPla.PNG" border="0" alt="" /></a></p>
<p class="MsoNormal"><span style="font-family:Georgia;" lang="EN-GB"><!--[if !supportEmptyParas]--> <!--[endif]--></span></p>
<p class="MsoNormal"><span style="font-family:Georgia;">Si se quieren ver todos los identificadores de un jugador, la sala a la que corresponde ese identificador, el nombre de usuario en esa sala, conociendo el número empleado como <span style="font-style: italic;font-family:courier new;">alias_id</span> (en mi caso 1) se pueden obtener con la siguiente consulta:</span></p>
<p class="MsoNormal"><span style="font-family:Georgia;"><!--[if !supportEmptyParas]--> <!--[endif]--></span></p>
<p class="MsoNormal"><span style="font-family:Georgia;" lang="EN-GB"><span style="font-style: italic;font-family:courier new;font-size:85%;">SELECT player_id AS jugador_id, main_site_id AS sala, screen_name AS nombre</span><span style="font-size:85%;"><br />
</span><span style="font-style: italic;font-family:courier new;font-size:85%;">FROM players</span><span style="font-size:85%;"><br />
</span><span style="font-style: italic;font-family:courier new;font-size:85%;">WHERE alias_id = 1</span></span></p>
<p><a href="http://bp2.blogger.com/_5624shASmf0/Rdd7h6QGoDI/AAAAAAAAAGg/jIGKeLWbqyU/s1600-h/SelPlaII.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5032626931112517682" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_5624shASmf0/Rdd7h6QGoDI/AAAAAAAAAGg/jIGKeLWbqyU/s400/SelPlaII.PNG" border="0" alt="" /></a></p>
<p class="MsoNormal"><span style="font-family:Georgia;" lang="EN-GB"><!--[if !supportEmptyParas]--> <!--[endif]--></span></p>
<p class="MsoNormal"><span style="font-family:Georgia;">Como en la fila del identificador original que se emplea como <span style="font-style: italic;font-family:courier new;">alias_id</span>, el campo <span style="font-style: italic;font-family:courier new;">alias_id</span> está vacío, no aparece en los resultados. Para que así suceda, es preciso añadir una condición además de la que se ha puesto en el ejemplo anterior, que el alias sea 1 o que el identificador del jugador sea 1:</span></p>
<p class="MsoNormal"><span style="font-family:Georgia;"><!--[if !supportEmptyParas]--> <!--[endif]--></span></p>
<p class="MsoNormal"><span style="font-family:Georgia;" lang="EN-GB"><span style="font-size:85%;"><span style="font-family:courier new;">SELECT player_id AS jugador_id, main_site_id AS sala, screen_name AS nombre</span><br />
<span style="font-family:courier new;">FROM players</span><br />
<span style="font-family:courier new;">WHERE alias_id = 1 OR player_id = 1</span></span></span></p>
<p class="MsoNormal"><span style="font-family:Georgia;" lang="EN-GB"><!--[if !supportEmptyParas]--> <!--[endif]--></span></p>
<p><a href="http://bp3.blogger.com/_5624shASmf0/Rdd7yKQGoEI/AAAAAAAAAGo/qNvjsoGoki8/s1600-h/SelPlaIII.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5032627210285391938" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_5624shASmf0/Rdd7yKQGoEI/AAAAAAAAAGo/qNvjsoGoki8/s400/SelPlaIII.PNG" border="0" alt="" /></a></p>
<p class="MsoNormal"><span style="font-family:Georgia;">La siguiente consulta será el bote medio conseguido por mí en cualquier nivel de juego almacenado en la tabla:</span></p>
<p class="MsoNormal"><span style="font-family:Georgia;"><!--[if !supportEmptyParas]--> <!--[endif]--></span></p>
<p class="MsoNormal"><span style="font-family:Georgia;"><span style="font-size:85%;"><span style="font-family:courier new;">SELECT SUM(pot)/COUNT(game_id) AS bote_medio</span><br />
<span style="font-family:courier new;">FROM game</span><br />
<span style="font-family:courier new;">WHERE player_id = 1</span></span></span></p>
<p><a href="http://bp2.blogger.com/_5624shASmf0/Rdd8I6QGoFI/AAAAAAAAAG8/lASjOAEpUOY/s1600-h/SelBote.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5032627601127415890" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_5624shASmf0/Rdd8I6QGoFI/AAAAAAAAAG8/lASjOAEpUOY/s400/SelBote.PNG" border="0" alt="" /></a><br />
Se suman todos los botes y se divide por el número de filas en las que he ganado (en el campo <span style="font-style: italic;font-family:courier new;">player_id</span> de la tabla game se almacena el ganador de la mano). Si además se desea saber el bote medio obtenido en un nivel concreto (los niveles se guardan en la tabla <span style="font-style: italic;font-family:courier new;">game_level</span>), por ejemplo en $1/$2 que corresponde con identificador 5 (<span style="font-style: italic;font-family:courier new;">game_level_id</span> establece el nivel de la mano en la tabla game):<br />
<span style="font-size:85%;"><br />
<span style="font-family:courier new;">SELECT SUM(pot)/COUNT(game_id) AS bote_medio</span><br />
<span style="font-family:courier new;">FROM game</span><br />
<span style="font-family:courier new;">WHERE player_id = 1 AND game_level_id = 5</span></span></p>
<p><a href="http://bp0.blogger.com/_5624shASmf0/Rdd8eaQGoGI/AAAAAAAAAHE/-43pQcD8CYk/s1600-h/SelBoteII.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5032627970494603362" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_5624shASmf0/Rdd8eaQGoGI/AAAAAAAAAHE/-43pQcD8CYk/s400/SelBoteII.PNG" border="0" alt="" /></a><br />
Si además se quiere ver el total y el número de botes ganados para que quede más informativa y clara la consulta:</p>
<p><span style="font-size:85%;"><span style="font-family:courier new;">SELECT SUM(pot) AS bote_total, COUNT(game_id) AS botes_ganados, [bote_total]/[botes_ganados] AS bote_medio</span><br />
<span style="font-family:courier new;">FROM game</span><br />
<span style="font-family:courier new;">WHERE player_id = 1 AND game_level_id = 5</span></span></p>
<p><a href="http://bp3.blogger.com/_5624shASmf0/Rdd8sKQGoHI/AAAAAAAAAHU/prqUqgA0OMU/s1600-h/SelBoteIII.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5032628206717804658" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_5624shASmf0/Rdd8sKQGoHI/AAAAAAAAAHU/prqUqgA0OMU/s400/SelBoteIII.PNG" border="0" alt="" /></a><br />
Como se puede comprobar, sabiendo qué campos elegir y cómo hacer condiciones, con todo lo visto hasta ahora se pueden hacer consultas sencillas.</p>
<p>Para obtener datos que se encuentran en más de una tabla que están unidos por un identificador (como por ejemplo <span style="font-style: italic;font-family:courier new;">player_id</span> en varias tablas) hay que utilizar lo que se conoce como unión. Por ejemplo, si en la consulta realizada anteriormente del bote máximo de cada jugador se quieren obtener más datos por jugador, hay que mirar en la tabla <span style="font-style: italic;font-family:courier new;">players</span>. Si por ejemplo se quiere mostrar además el nombre del jugador al que pertenece ese identificador, habrá que obtenerlo de esa tabla. Para conseguirlo, en la parte de selección se señala de qué tabla proviene cada campo anteponiendo al nombre del campo el nombre de la tabla a la que pertenece y un punto. En la parte de origen, se ponen los nombres de las tablas separados por la instrucción <span style="font-style: italic;font-family:courier new;">INNER JOIN</span> y se especifica qué campos son los que unen las tablas (los que significan lo mismo, son del mismo tipo aunque puedan tener distinto nombre) tras la palabra <span style="font-style: italic;font-family:courier new;">ON</span>:</p>
<p><span style="font-size:85%;"><span style="font-family:courier new;">SELECT game.player_id, players.screen_name, Max(game.pot) AS bote_máximo_por_jugador</span><br />
<span style="font-family:courier new;">FROM game INNER JOIN players ON game.player_id = players.player_id</span><br />
<span style="font-family:courier new;">GROUP BY game.player_id, players.screen_name</span></span></p>
<p><a href="http://bp3.blogger.com/_5624shASmf0/Rdd9FKQGoII/AAAAAAAAAHc/-0larQsps3E/s1600-h/SelBoteVI.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5032628636214534274" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_5624shASmf0/Rdd9FKQGoII/AAAAAAAAAHc/-0larQsps3E/s400/SelBoteVI.PNG" border="0" alt="" /></a></p>
<p class="MsoNormal"><span style="font-family:Georgia;">Esta consulta se podría poner de otra manera en la que se ve claro lo que hace el <span style="font-style: italic;font-family:courier new;">INNER JOIN</span>:</span></p>
<p class="MsoNormal" style="font-family:courier new;"><span style="font-size:85%;">SELECT game.player_id, players.screen_name, Max(game.pot) AS bote_máximo_por_jugador<br />
FROM game, players<br />
WHERE game.player_id = players.player_id<br />
GROUP BY game.player_id, players.screen_name</span></p>
<p class="MsoNormal">Por último, voy a diseccionar la consulta que mostré como ejemplo en el primer artículo, que calculaba las veces que mejoraba nuestra pareja a trío en el <span style="font-style: italic;">flop</span>:</p>
<p><span style=";font-family:courier new;font-size:85%;">SELECT gp.hole_cards AS Par, count(*) AS Veces, SUM(<br />
IIF(left(g.flop_1,1)=left(gp.hole_card_1,1),1,<br />
IIF(left(g.flop_2,1)=left(gp.hole_card_1,1),1,<br />
IIF(left(g.flop_3,1)=left(gp.hole_card_1,1),1,<br />
0)))) AS [Trío en flop]<br />
FROM game_players AS gp INNER JOIN game AS g ON gp.game_id = g.game_id<br />
WHERE gp.player_id = (select pref_value from prefs where pref_key = &#8216;RP&#8217;)<br />
AND gp.pair_hand = 1<br />
AND gp.saw_flop_n = 1<br />
GROUP BY gp.hole_cards, gp.card_order1<br />
ORDER BY gp.card_order1 DESC</span></p>
<p><a href="http://bp3.blogger.com/_5624shASmf0/Rdd9WKQGoJI/AAAAAAAAAHk/ZLF37_InTf0/s1600-h/SelTrio.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5032628928272310418" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_5624shASmf0/Rdd9WKQGoJI/AAAAAAAAAHk/ZLF37_InTf0/s400/SelTrio.PNG" border="0" alt="" /></a><br />
Antes de empezar a hacer una consulta se debe tener claro qué es lo que se quiere conseguir y dónde están esos datos. Lo que se pretende es ver cuándo nuestra pareja de mano ha mejorado a trío. Las cartas comunes de cada mano se guardan en la tabla <span style="font-style: italic;font-family:courier new;">game</span>, pero las cartas de cada jugador en cada mano se almacenan en la tabla <span style="font-style: italic;font-family:courier new;">game_players</span>. Por lo tanto, está claro que habrá que usar estas dos tablas. El campo que  une estas dos tablas es el <span style="font-style: italic;font-family:courier new;">game_id</span>, que identifica unívocamente cada mano. Así, tenemos la parte de origen que queda de la siguiente manera:<br />
<span style="font-size:85%;"><br />
<span style="font-family:courier new;">FROM game_players AS gp INNER JOIN game AS g ON gp.game_id = g.game_id</span></span></p>
<p>Se emplea un alias para cada tabla para no tener que volver a escribir el nombre de las tablas antes de cada campo y que quede demasiado largo.</p>
<p>En la parte de selección se detallan las columnas que se quieren visualizar como resultado. En este caso, la pareja de mano que se tiene (en la tabla <span style="font-style: italic;font-family:courier new;">game_players</span> el campo <span style="font-style: italic;font-family:courier new;">hole_cards</span> indica la mano que tiene el jugador), el número de veces que se ha dado cada pareja cuando se ha visto el <span style="font-style: italic;">flop</span>, y el número de veces que ha mejorado a trío. Si se hiciera la consulta sin la parte condicional, la selección se haría sobre todas las manos de la tabla game, pero lo que se quiere es que se trate de una mano nuestra, que sea una pareja de mano y que se haya visto el <span style="font-style: italic;">flop</span>. Pero volviendo a la parte de selección, tenemos:</p>
<p><span style="font-size:85%;"><span style="font-family:courier new;">SELECT gp.hole_cards AS Par, count(*) AS Veces, SUM(</span><br />
<span style="font-family:courier new;">IIF(left(g.flop_1,1)=left(gp.hole_card_1,1),1,</span><br />
<span style="font-family:courier new;">IIF(left(g.flop_2,1)=left(gp.hole_card_1,1),1,</span><br />
<span style="font-family:courier new;">IIF(left(g.flop_3,1)=left(gp.hole_card_1,1),1,</span><br />
<span style="font-family:courier new;">0)))) AS [Trío en flop]</span></span></p>
<p>Los dos primeros elementos están claros, la mano inicial (que serán parejas por las condiciones que se pondrán después) y el número de veces que nos han repartido esas parejas cuando hemos visto el <span style="font-style: italic;">flop </span>(también significará esto por las condiciones de la parte <span style="font-style: italic;font-family:courier new;">WHERE </span>que se añadirán). La tercera columna es más sencilla de lo que parece; para que nuestra pareja se convierta en trío, precisa que una de las cartas del <span style="font-style: italic;">flop </span>sea igual a cualquiera de las que tenemos en mano; eso es lo que indica la expresión que está dentro del <span style="font-style: italic;font-family:courier new;">SUM</span>.</p>
<p>Las cartas que nos han repartido están en la tabla <span style="font-style: italic;font-family:courier new;">game_players</span> en los campos <span style="font-style: italic;font-family:courier new;">hole_card_1</span> y <span style="font-style: italic;font-family:courier new;">hole_card_2</span> y las del <span style="font-style: italic;">flop </span>en la tabla <span style="font-style: italic;font-family:courier new;">game </span>en los campos<span style="font-style: italic;font-family:courier new;"> flop_1</span>, <span style="font-style: italic;font-family:courier new;">flop_2</span> y <span style="font-style: italic;font-family:courier new;">flop_3</span>.  Estos campos son alfanuméricos (letras y números) y cada carta se representa por su valor (un número del 2 al 9 o una letra mayúscula si es un A, T, J, Q o K seguido de una letra minúscula que indica el palo); por tanto se debe obtener el valor de la carta sin importar el palo, es decir, el primer carácter de los campos a seleccionar. Para ello se cuenta con la instrucción de SQL <span style="font-style: italic;font-family:courier new;">left</span>(campo, x) que obtiene x caracteres empezando por la izquierda en un campo alfanumérico. En este caso nos interesa mirar si el valor de una de nuestras cartas de mano (como es una pareja no importa con cuál comparemos) es igual a cualquiera de las tres del <span style="font-style: italic;">flop</span>. Con este objetivo se utiliza <span style="font-style: italic;font-family:courier new;">left</span>(<span style="font-style: italic;font-family:courier new;">gp.hole_card_1</span>, 1) para nuestra mano y se compara con  <span style="font-style: italic;font-family:courier new;">left</span>(<span style="font-style: italic;font-family:courier new;">g.flop_x</span>,1). <span style="font-style: italic;font-family:courier new;">IIF </span>evalúa una condición y si se cumple se da el primer valor, y si no el segundo: <span style="font-style: italic;font-family:courier new;">IIF</span>(condición, valor_1, valor_2); en este caso, si coincide la comparación que se hace entre nuestra carta de mano y la primera del <span style="font-style: italic;">flop</span>, el valor es uno y se suma y se sale de la expresión (como vez que conseguimos trío, se suma porque se emplea <span style="font-style: italic;font-family:courier new;">SUM </span>encerrando a la expresión completa), si no coincide se mira la segunda del <span style="font-style: italic;">flop</span>, si coincide se suma y se sale de la expresión, si no se mira la tercera y si coincide se suma y se sale de la expresión, y por fin, si no es que no se consiguió trío y el valor que se obtiene y se suma es 0. Puede parecer complicado, pero con un poco de paciencia se entiende sin problemas.</p>
<p>Ahora la parte de la condición:</p>
<p><span style="font-size:85%;"><span style="font-family:courier new;">WHERE gp.player_id = (select pref_value from prefs where pref_key = &#8216;RP&#8217;)</span><br />
<span style="font-family:courier new;">AND gp.pair_hand = 1</span><br />
<span style="font-family:courier new;">AND gp.saw_flop_n = 1</span><br />
<span style="font-family:courier new;">GROUP BY gp.hole_cards, gp.card_order1</span><br />
<span style="font-family:courier new;">ORDER BY gp.card_order1 DESC</span></span></p>
<p>La primera condición es que sea nuestro jugador. Se podría poner el número que se ha obtenido en una de las consultas anteriores, pero en este caso se ha anidado otra consulta (se debe escribir entre paréntesis) que coge de la tabla de preferencias <span style="font-style: italic;font-family:courier new;">prefs </span>nuestro identificador de jugador, almacenado en el campo <span style="font-style: italic;font-family:courier new;">pref_value</span> y que se asocia al valor &#8220;<span style="font-style: italic;font-family:courier new;">RP</span>&#8221; del campo <span style="font-style: italic;font-family:courier new;">pref_key</span>. La siguiente condición es que sea una pareja de mano, aspecto almacenado en la tabla <span style="font-style: italic;font-family:courier new;">game_players</span> en el campo <span style="font-style: italic;font-family:courier new;">pair </span>(1 si es pareja de mano, 0 si no). La siguiente, que yo haya visto el <span style="font-style: italic;">flop</span>, guardado en el campo <span style="font-style: italic;font-family:courier new;">saw_flop</span> de la misma tabla (1 si se ve el <span style="font-style: italic;">flop</span>, 0 si no). Por último, se agrupan las cartas de mano que sean iguales y también por el valor de la mano. Para mostrarlas ordenadas por el valor de la mano se emplea la instrucción <span style="font-style: italic;font-family:courier new;">ORDER BY </span>(y para seleccionar que en orden inverso de valor la instrucción <span style="font-style: italic;font-family:courier new;">DESC</span> -el valor de las cartas en el campo <span style="font-style: italic;font-family:courier new;">card_orderx</span> va del 2 para el 2 al 14 para el As-).</p>
<p>Con esto se acaba el tutorial de cómo realizar consultas SQL en la BD de PT. Espero que te haya servido de algo. Hay mucha información disponible sobre SQL en la red que cubre aspectos y funcionalidades que no he tratado y que pueden resultar interesantes. De todas maneras, si tienes alguna duda, ¡pregunta coño!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.spainfull.com/blog/como-realizar-consultas-sql-en-la-bd-de-poker-tracker-parte-iii/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Cómo realizar consultas SQL en la BD de Poker Tracker. Parte II.</title>
		<link>http://www.spainfull.com/blog/como-realizar-consultas-sql-en-la-bd-de-poker-tracker-parte-ii/</link>
		<comments>http://www.spainfull.com/blog/como-realizar-consultas-sql-en-la-bd-de-poker-tracker-parte-ii/#comments</comments>
		<pubDate>Mon, 29 Jan 2007 09:25:00 +0000</pubDate>
		<dc:creator>spainfull</dc:creator>
				<category><![CDATA[Póquer]]></category>
		<category><![CDATA[Poker Tracker]]></category>
		<category><![CDATA[Poker Tracker 2]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Bases de datos]]></category>
		<category><![CDATA[Obsoleto]]></category>

		<guid isPermaLink="false">http://www.spainfull.com/blog/?p=23</guid>
		<description><![CDATA[Para comprender mejor cómo funciona Poker Tracker y las instrucciones a escribir en la consultas SQL, en el siguiente apartado detallaré la organización de la base de datos de PT. Estructura de la base de datos de Poker Tracker Para los menos iniciados en la informática, es preciso recordar que una base de datos no [...]]]></description>
			<content:encoded><![CDATA[<p>Para comprender mejor cómo funciona Poker Tracker y las instrucciones a escribir en la consultas SQL, en el siguiente apartado detallaré la organización de la base de datos de PT.</p>
<p><strong>Estructura de la  base de datos de Poker Tracker</strong></p>
<p>Para los menos iniciados en la informática, es preciso recordar que una base de datos no es más que una manera de almacenar información. Cada tipo de base de datos tiene una forma propia de guardar esos datos y acceder a ellos. Se hace así con el objetivo de recuperar lo almacenado con mayor rapidez, mantener una gran cantidad de datos eficientemente y para facilitar la inserción de nuevos elementos; todo esto es posible  porque hay implementados una serie de interfaces (protocolos, medios de comunicación entre programas) que permiten  realizar estas operaciones de manera mucho más eficaz que si se guardaran los datos, por ejemplo, en un simple archivo de texto.</p>
<p>Hay muchos tipos de bases de datos. Seguro que te suenan palabras como Access, Oracle, SQLServer, MySQL, PostgreSQL&#8230; Todas identifican bases de datos muy diferentes entre sí, cuya construcción interna no se parece en absoluto, aunque tienen cosas en común. Básicamente, todas ellas almacenan la información en tablas, cada una de las cuales tiene una serie de campos que definen atributos de lo representado por la tabla. La forma de acceder a estos datos es distinta en cada caso ya que suelen poseer su propio lenguaje, pero las consultas SQL que voy a crear se pueden utilizar en todas ellas con pocas modificaciones (SQL es el lenguaje base usado por la mayoría de bases de datos de la actualidad).<span id="more-23"></span></p>
<p>Access no es diferente y también guarda los datos en tablas. Una tabla se identifica por un nombre que debería ser descriptivo de la información que contiene. En cada tabla los datos se agrupan en campos que contienen los detalles de lo que se quiere almacenar. Por ejemplo, si se es un poco maníaco-obsesivo-exitoso y se desea tener una base de datos de ligues, habría una tabla de nombre &#8220;<span style="font-style: italic;">Pibitas</span>&#8221; (si es muy obsesivo probablemente el nombre sería &#8220;<span style="font-style: italic;">Chochos</span>&#8220;) que contendría seguramente los campos &#8220;<span style="font-style: italic;">Nombre</span>&#8220;, &#8220;<span style="font-style: italic;">Teléfono</span>&#8220;, &#8220;<span style="font-style: italic;">Altura</span>&#8220;, &#8220;<span style="font-style: italic;">Edad</span>&#8220;, &#8220;<span style="font-style: italic;">Peso</span>&#8220;, &#8220;<span style="font-style: italic;">Cara</span>&#8221; (nota asignada de 1 a 10), &#8220;<span style="font-style: italic;">Tetas</span>&#8221; <span id="fullpost">(nota asignada de 1 a 10)</span><span id="fullpost">, &#8220;<span style="font-style: italic;">Culo</span>&#8221; </span><span id="fullpost">(nota asignada de 1 a 10)</span><span id="fullpost">, &#8220;<span style="font-style: italic;">Sexo</span>&#8221; (vamos, que si folla) , &#8220;<span style="font-style: italic;">Casada</span>&#8221; y &#8220;<span style="font-style: italic;">FechaPrimeraCita</span>&#8220;. Los campos son las columnas de la tabla y, cada nueva conquista, sería una nueva fila en la tabla que tendría unos valores en los campos que la definirían. Advertir que la elección de los campos ha sido totalmente arbitraria; se podrían haber definido otros atributos o características (y no, no tengo una tabla como ésta hecha).</span></p>
<p>Los campos pueden ser de distinto tipo dependiendo de la información que vayan a guardar. Los tipos básicos disponibles son: numéricos (con decimales o sin decimales), alfanuméricos (letras y números, es decir, texto), moneda, fechas y booleano (datos que son verdadero o falso, por ejemplo &#8220;<span style="font-style: italic;">Sexo</span>&#8221; y &#8220;<span style="font-style: italic;">Casada</span>&#8220;). Como se puede comprobar, hasta aquí no es nada complicado. Ahora que conoces las bases, voy a desmenuzar las tablas de PT y el porqué de cada una.</p>
<p>En una base de datos suele haber más de una tabla para lograr definir los objetos que participan en el problema a solucionar; además, los datos que contienen están interrelacionados entre ellas. Las consultas se pueden hacer sobre varias tablas a la vez ya que si no, se limitaría mucho la búsqueda. La creación de bases de datos en sistemas complejos es una tarea ardua y complicada puesto que hay que tener en cuenta muchas variables y factores. Pero tranquilo, eso es otra historia y, como me dijo un profesor de la universidad la primera vez que hablaba con él: &#8220;eso a ti te la suda&#8221;.</p>
<p>Ahora &#8220;solo&#8221; vas a aprender la estructura de la base de datos de PT, así que presta atención. Si se abre la base de datos de PT tal y como comenté <a href="http://spainfull.blogspot.com/2007/01/cmo-realizar-consultas-sql-en-la-bd-de.html">ayer</a>, y se selecciona &#8220;<span style="font-style: italic;font-family:courier new;">Tablas</span>&#8221; en los &#8220;<span style="font-style: italic;font-family:courier new;">Objetos</span>&#8220;, aparece una imagen <span id="fullpost"> como la siguiente</span><span id="fullpost"> con todas las tablas de PT:</span></p>
<p><a href="http://bp0.blogger.com/_5624shASmf0/Rb3YkZUIoqI/AAAAAAAAACc/AAYZK30mA18/s1600-h/tablas.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5025410878997570210" style="cursor: pointer;" src="http://bp0.blogger.com/_5624shASmf0/Rb3YkZUIoqI/AAAAAAAAACc/AAYZK30mA18/s400/tablas.PNG" border="0" alt="" /></a></p>
<p>La mayor parte de las tablas son bastante auto explicativas, y sus campos logran definir cada aspecto que el programador de PT ha querido reflejar. Hay algunas tablas que son de definición: de niveles, salas, ciegas, etc.; otras que detallan cada mano del juego con todos los datos posibles; otras que son resumen de valores para que la recuperación y visualización en PT sea más rápida (como por ejemplo la tabla de las sesiones jugadas); y, por último, otras que sirven para la configuración del programa.</p>
<p>Para ver los campos de cada tabla, basta con seleccionar la tabla de la que se quiere ver su estructura y pulsar el icono de &#8220;<span style="font-style: italic;font-family:courier new;">Diseño</span>&#8221; o hacer clic con el botón derecho del ratón sobre la tabla elegida y pulsar sobre &#8220;<span style="font-style: italic;font-family:courier new;">Vista Diseño</span>&#8220;:</p>
<p><a href="http://bp2.blogger.com/_5624shASmf0/Rb4rPpUIorI/AAAAAAAAACo/RDnWKRFuzok/s1600-h/campos.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5025501781980390066" style="cursor: pointer;" src="http://bp2.blogger.com/_5624shASmf0/Rb4rPpUIorI/AAAAAAAAACo/RDnWKRFuzok/s400/campos.PNG" border="0" alt="" /></a></p>
<p>Si se hace lo dicho, aparece una ventana que lista los campos que contiene la tabla y el tipo de cada uno de los campos. También puede contener observaciones acerca del contenido de cada uno de los campos que se utilizan para hacer aclaraciones sobre el mismo (solo tiene valor informativo). Un apunte, en la creación de la mayor parte de las tablas se define un campo identificador que distingue unívocamente a una fila de la tabla del resto de filas; la mayoría de las tablas de PT tienen un campo de este tipo, que suele ser un entero positivo (se declara en la base de datos  para que cada vez que se añade una fila se incremente automáticamente, aunque éste es un detalle que no nos importa demasiado). Estos identificadores son muy útiles para enlazar valores entre tablas (esto se verá más claro en el siguiente capítulo en el que haré las consultas):</p>
<p><a href="http://bp3.blogger.com/_5624shASmf0/Rb4r75UIosI/AAAAAAAAAC0/raiRUVLqAw4/s1600-h/dise%C3%B1o.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5025502542189601474" style="cursor: pointer;" src="http://bp3.blogger.com/_5624shASmf0/Rb4r75UIosI/AAAAAAAAAC0/raiRUVLqAw4/s400/dise%C3%B1o.PNG" border="0" alt="" /></a></p>
<p>Voy a agrupar las tablas de PT según la función para la que han sido creadas. Ésta es una clasificación que he establecido para que se vea más claramente la utilidad de cada una de ellas, pero no significa que sean de distinto tipo sino simplemente que las he ordenado para no mostrar todas seguidas; solo hay un tipo único de tablas aunque se usen para almacenar diferentes tipos de datos. Los datos de cash y torneos se guardan en tablas separadas.</p>
<p>La mejor manera para seguir la explicación de las tablas es abrir en Access la base de datos e ir abriéndolas conforme se detallan (basta con hacer doble click sobre la tabla que se quiera visualizar).</p>
<p>♣ <span style="font-weight: bold;">Tablas de definición de datos:</span><br />
Son todas aquellas que definen entidades que se utilizarán en otras tablas.</p>
<p>♠ <span style="font-weight: bold;">Tabla <span style="font-style: italic;font-family:courier new;">blind_structure</span>.</span><br />
Define los distintos niveles en un torneo. Contiene los campos siguientes:</p>
<ul>
<li><span style="font-style: italic;font-family:courier new;">blind_structure_id</span>: identificador del nivel de ciegas.</li>
<li><span style="font-style: italic;font-family:courier new;">blind_structure_desc</span>: estructura de ciega pequeña y ciega grande.</li>
<li><span style="font-style: italic;font-family:courier new;">big_bet</span>: tamaño de la ciega grande en relación a la unidad (una ficha es la unidad más pequeña).</li>
</ul>
<p><a href="http://bp0.blogger.com/_5624shASmf0/Rb4tPJUIotI/AAAAAAAAADA/kbRikepz5zE/s1600-h/blinds.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5025503972413711058" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_5624shASmf0/Rb4tPJUIotI/AAAAAAAAADA/kbRikepz5zE/s400/blinds.PNG" border="0" alt="" /></a><br />
Puede que te preguntes por qué los valores están desordenados. Esto es debido a que en cuanto PT lee un nivel nuevo de ciegas, añade una línea a esta tabla y le asigna un identificador que comienza en 1 y se va incrementando automáticamente como expliqué anteriormente. Seguramente inicié el PT con un torneo comenzado o la importación automática de torneos la hizo de manera desordenada; esto no tiene ninguna importancia ya que se sabe qué nivel es por el identificador; por ejemplo, el identificador 6 corresponde al nivel de ciegas 150/300, y no importa el orden en el que esté insertada la fila en la tabla.</p>
<p>♠ <span style="font-weight: bold;">Tabla <span style="font-style: italic;font-family:courier new;">game_level</span>.</span><br />
Define las ciegas en las mesas de cash. Contiene los campos siguientes:</p>
<ul>
<li><span style="font-style: italic;font-family:courier new;">game_level_id</span>: identificador de la cantidad de las ciegas.</li>
<li><span style="font-style: italic;font-family:courier new;">game_level_desc</span>: descripción de la ciega pequeña y la ciega grande.</li>
<li><span style="font-style: italic;font-family:courier new;">game_level_big_bet</span>: tamaño de la ciega grande en relación a la unidad (la unidad más pequeña es una unidad de moneda ($, € o GBP).</li>
<li><span style="font-style: italic;font-family:courier new;">pl_nl</span>: 0 si es <span style="font-style: italic;">limit</span>, 1 si se trata de NL o PL.</li>
</ul>
<p><a href="http://bp3.blogger.com/_5624shASmf0/Rb4175UIouI/AAAAAAAAADM/Q0ZxqkOI6uc/s1600-h/game_level.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5025513537305879266" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_5624shASmf0/Rb4175UIouI/AAAAAAAAADM/Q0ZxqkOI6uc/s400/game_level.PNG" border="0" alt="" /></a></p>
<p>♠ <span style="font-weight: bold;">Tabla <span style="font-style: italic;font-family:courier new;">hand_rank</span>.</span><br />
Define las posibles manos en el <span style="font-style: italic;">showdown </span>en <span style="font-style: italic;">Holdem</span>. Contiene los campos siguientes:</p>
<ul>
<li><span style="font-style: italic;font-family:courier new;">hand_rank_id</span>: identificador de la jugada.</li>
<li><span style="font-style: italic;font-family:courier new;">hand_rank_desc</span>: descripción en texto de la calidad de la jugada.</li>
</ul>
<p><a href="http://bp1.blogger.com/_5624shASmf0/Rb4_zZUIovI/AAAAAAAAADY/SXQkz8vOBuY/s1600-h/hand_rank.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5025524386393268978" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_5624shASmf0/Rb4_zZUIovI/AAAAAAAAADY/SXQkz8vOBuY/s400/hand_rank.PNG" border="0" alt="" /></a><br />
Como se puede apreciar, esta tabla sí está ordenada de peor a mejor jugada, esto es debido a que es una tabla con los datos completos antes de capturar ningún dato el programa, o rellenada automáticamente al crear una nueva base de datos (en <span style="font-style: italic;">Holdem </span>el ranking de jugadas es fijo e inmutable).</p>
<p>♠ <span style="font-weight: bold;">Tabla <span style="font-style: italic;">players</span>.</span><br />
Define a los jugadores en cada sala de póquer. Cada fila identifica a un jugador en una sala. Se utilizará en todas las tablas que contengan datos de juego. Contiene los campos siguientes:</p>
<ul>
<li><span style="font-style: italic;font-family:courier new;">player_id</span>: identificador del jugador en la base de datos de PT.</li>
<li><span style="font-style: italic;font-family:courier new;">screen_name</span>: nombre en la sala que se ve en pantalla del jugador.</li>
<li><span style="font-style: italic;font-family:courier new;">location</span>: lugar de origen que el jugador se ha puesto en la sala.</li>
<li><span style="font-style: italic;font-family:courier new;">general_description</span>: notas sobre el jugador.</li>
<li><span style="font-style: italic;font-family:courier new;">treeview_icon</span>: identificador del icono del jugador que aparece en el árbol de jugadores del PT (se refiere a los dibujicos que representan cada tipo de jugador).</li>
<li><span style="font-style: italic;font-family:courier new;">site_id</span>: utilizado en los jugadores con alias para indicar el identificador de la sala al que correponde el alias asignado.</li>
<li><span style="font-style: italic;font-family:courier new;">alias_id</span>: identificador del jugador al que corresponde éste alias.</li>
<li><span style="font-style: italic;font-family:courier new;">main_site_id</span>: sala para la que está definido el jugador.</li>
<li><span style="font-style: italic;font-family:courier new;">hide_ind</span>: si no se muestra al jugador de cash en las ventanas del PT.</li>
<li><span style="font-style: italic;font-family:courier new;">ring_player</span>: si es jugador de cash en la sala (significa si se tiene alguna mano de él jugando cash).</li>
<li><span style="font-style: italic;font-family:courier new;">tourney_player</span>: si es jugador de torneos.</li>
<li><span style="font-style: italic;font-family:courier new;">tourney_hide_ind</span>: <span id="fullpost">si no se muestra al jugador de torneos en las ventanas del PT.</span></li>
<li><span style="font-style: italic;font-family:courier new;">last_icon</span>: último icono del jugador.</li>
<li><span style="font-style: italic;font-family:courier new;">last_auto_rated</span>: fecha en la que se hizo la última clasificación de jugadores automática.</li>
<li><span style="font-style: italic;font-family:courier new;">last_batch_rated</span>: fecha en la que se hizo la última clasificación de jugadores.</li>
<li><span style="font-style: italic;font-family:courier new;">icon_before_batch_rate</span>: icono anterior a la última clasificación de jugadores.</li>
<li><span style="font-style: italic;font-family:courier new;">no_auto_rate</span>: si a éste jugador no hay que clasificarlo.</li>
<li><span style="font-style: italic;font-family:courier new;">icon_file</span>: fichero donde se almacena el icono del jugador (para personalizaciones).</li>
</ul>
<p><a href="http://bp3.blogger.com/_5624shASmf0/Rb5IN5UIowI/AAAAAAAAADk/HNPPE6WiGqc/s1600-h/players.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5025533637752824578" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_5624shASmf0/Rb5IN5UIowI/AAAAAAAAADk/HNPPE6WiGqc/s400/players.PNG" border="0" alt="" /></a><br />
Destacar que, como seguramente conoces, para agrupar las estadísticas de un jugador que tiene datos de diferentes salas hay que utilizar los alias de PT. Ahora puedes ver cómo funcionan. Cada jugador tiene una fila por sala en la que juega. Si se usan los alias, a través de los campos &#8220;<span style="font-style: italic;font-family:courier new;">site_id</span>&#8221; y &#8220;<span style="font-style: italic;font-family:courier new;">alias_id</span>&#8221; el programa sabe que son el mismo jugador y combinará sus estadísticas.</p>
<p>♠ <span style="font-weight: bold;">Tabla <span style="font-style: italic;font-family:courier new;">poker_sites</span>.</span><br />
Define las salas de póquer para las que funciona PT. Contiene los campos siguientes:</p>
<ul>
<li><span style="font-style: italic;font-family:courier new;">site_id</span>: identificador de la sala.</li>
<li><span style="font-style: italic;font-family:courier new;">site_abbrev</span>: nombre abreviado de la sala de póquer.</li>
<li><span style="font-style: italic;font-family:courier new;">site_name</span>: nombre completo de la sala de póquer.</li>
</ul>
<p><a href="http://bp2.blogger.com/_5624shASmf0/Rb5KBpUIoxI/AAAAAAAAADw/Ypj6rHspouU/s1600-h/poker_sites.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5025535626322682642" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_5624shASmf0/Rb5KBpUIoxI/AAAAAAAAADw/Ypj6rHspouU/s400/poker_sites.PNG" border="0" alt="" /></a></p>
<p>♣ <span style="font-weight: bold;">Tablas de datos:</span><br />
Almacenan los datos del juego en sí.</p>
<p>♠ <span style="font-weight: bold;">Tabla <span style="font-style: italic;">game</span>.</span><br />
Define los detalles generales de cada mano de cash. Cada fila identifica una mano jugada e importada en el PT. Contiene los campos siguientes:</p>
<ul>
<li><span style="font-style: italic;font-family:courier new;">game_id</span>: identificador de la mano.</li>
<li><span style="font-style: italic;font-family:courier new;">game_number</span>: otro identificador de la mano (usado para salas como Prima).</li>
<li><span style="font-style: italic;font-family:courier new;">site_id</span>: sala donde se juega la mano.</li>
<li><span style="font-style: italic;font-family:courier new;">date_played</span>: fecha en la que se juega la mano.</li>
<li><span style="font-style: italic;font-family:courier new;">game_level_id</span>: nivel en la que se juega la mano.</li>
<li><span style="font-style: italic;font-family:courier new;">flop_1</span>: carta primera del <span style="font-style: italic;">flop</span>.</li>
<li><span style="font-style: italic;font-family:courier new;">flop_2</span>: <span id="fullpost">carta segunda del <span style="font-style: italic;">flop</span></span><span style="font-style: italic;">.</span></li>
<li><span style="font-style: italic;font-family:courier new;">flop_3</span>: <span id="fullpost">carta tercera del <span style="font-style: italic;">flop</span></span><span style="font-style: italic;">.</span></li>
<li><span style="font-style: italic;font-family:courier new;">turn</span>: carta del <span style="font-style: italic;">turn</span>.</li>
<li><span style="font-style: italic;font-family:courier new;">river</span>: carta del <span style="font-style: italic;">river</span>.</li>
<li><span style="font-style: italic;font-family:courier new;">pot</span>: bote que se lleva el ganador de la mano (antes de descontar la comisión).</li>
<li><span style="font-style: italic;font-family:courier new;">rake</span>: <span id="fullpost">comisión que se lleva la casa en la mano.</span></li>
<li><span style="font-style: italic;font-family:courier new;">player_id</span>: identificador del jugador que gana la mano.</li>
<li><span style="font-style: italic;font-family:courier new;">import_date</span>: fecha en la que se hizo la importación de la mano.</li>
<li><span style="font-style: italic;font-family:courier new;">game_notes</span>: notas de la mano.</li>
<li><span style="font-style: italic;font-family:courier new;">table_name</span>: nombre de la mesa en la que se jugó la mano.</li>
<li><span style="font-style: italic;font-family:courier new;">winning_hand</span>: calidad de la jugada de la mano ganadora.</li>
<li><span style="font-style: italic;font-family:courier new;">real_player_id</span>: identificador real del jugador (si se utilizan alias, éste será el identificador del jugador en la sala, no su alias).</li>
<li><span style="font-style: italic;font-family:courier new;">players_saw_flop</span>: jugadores que han visto el <span style="font-style: italic;">flop</span>.</li>
<li><span style="font-style: italic;font-family:courier new;">number_of_players</span>: número total de jugadores de la mano.</li>
<li><span style="font-style: italic;font-family:courier new;">ub_game_number</span>: <span id="fullpost">identificador de mano en UB.</span></li>
<li><span style="font-style: italic;font-family:courier new;">ub_kill_game</span>: si es una mesa <span style="font-style: italic;">kill </span>de UB.</li>
</ul>
<p><a href="http://bp2.blogger.com/_5624shASmf0/Rb5SbpUIoyI/AAAAAAAAAD8/PbVZ1C0gcGg/s1600-h/game.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5025544869092303650" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_5624shASmf0/Rb5SbpUIoyI/AAAAAAAAAD8/PbVZ1C0gcGg/s400/game.PNG" border="0" alt="" /></a><br />
Es un resumen de cada mano jugada. Los detalles por jugador están contenidos en la tabla &#8220;<span style="font-style: italic;font-family:courier new;">game_players</span>&#8220;.</p>
<p>♠ <span style="font-weight: bold;">Tabla <span style="font-style: italic;">tourney_game</span>.</span><br />
Define los detalles generales de cada mano de torneo. Cada fila es una mano  de torneo jugada e importada por PT. Contiene los campos siguientes:</p>
<ul>
<li><span style="font-style: italic;font-family:courier new;">tourney_id</span>: identificador de la mano.</li>
<li><span style="font-style: italic;font-family:courier new;">game_number</span>: otro identificador de la mano (usado para salas como Prima).</li>
<li><span style="font-style: italic;font-family:courier new;">date_played</span>: fecha en la que se juega la mano.</li>
<li><span style="font-style: italic;font-family:courier new;">blind_structure_id</span>: nivel de ciegas en la que se juega la mano.</li>
<li><span style="font-style: italic;font-family:courier new;">game_level</span>: nombre del nivel en el de ciegas en el que se juega la mano.</li>
<li><span style="font-style: italic;font-family:courier new;">pp_game_number</span>: identificador de la mano (creo que para PP).</li>
<li><span style="font-style: italic;font-family:courier new;">flop_1</span>: carta primera del <span style="font-style: italic;">flop</span>.</li>
<li><span style="font-style: italic;font-family:courier new;">flop_2</span>: <span id="fullpost">carta segunda del <span style="font-style: italic;">flop</span></span><span style="font-style: italic;">.</span></li>
<li><span style="font-style: italic;font-family:courier new;">flop_3</span>: <span id="fullpost">carta tercera del <span style="font-style: italic;">flop</span></span><span style="font-style: italic;">.</span></li>
<li><span style="font-style: italic;font-family:courier new;">turn</span>: carta del <span style="font-style: italic;">turn</span>.</li>
<li><span style="font-style: italic;font-family:courier new;">river</span>: carta del <span style="font-style: italic;">river</span>.</li>
<li><span style="font-style: italic;font-family:courier new;">pot</span>: número de fichas que se lleva el ganador de la mano.</li>
<li><span style="font-style: italic;font-family:courier new;">player_id</span>: identificador del jugador que gana la mano.</li>
<li><span style="font-style: italic;font-family:courier new;">import_date</span>: fecha en la que se hizo la importación de la mano.</li>
<li><span style="font-style: italic;font-family:courier new;">game_notes</span>: notas de la mano.</li>
<li><span style="font-style: italic;font-family:courier new;">table_name</span>: nombre de la mesa en la que se jugó la mano.</li>
<li><span style="font-style: italic;font-family:courier new;">winning_hand</span>: calidad de la jugada de la mano ganadora.</li>
<li><span style="font-style: italic;font-family:courier new;">real_player_id</span>: identificador real del jugador (si se utilizan alias, éste será el identificador del jugador en la sala, no su alias).</li>
<li><span style="font-style: italic;font-family:courier new;">players_saw_flop</span>: jugadores que han visto el <span style="font-style: italic;">flop</span>.</li>
<li><span style="font-style: italic;font-family:courier new;">number_of_players</span>: número total de jugadores de la mano.</li>
<li><span style="font-style: italic;font-family:courier new;">heads_up</span>: si se trata de un torneo <span style="font-style: italic;">Heads Up</span>.</li>
<li><span style="font-style: italic;font-family:courier new;">ub_game_number</span>: <span id="fullpost">identificador de mano en UB.</span></li>
</ul>
<p><a href="http://bp0.blogger.com/_5624shASmf0/Rb5yiJUIozI/AAAAAAAAAEI/AMbJR6HS-Gc/s1600-h/tourney_game.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5025580165133542194" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_5624shASmf0/Rb5yiJUIozI/AAAAAAAAAEI/AMbJR6HS-Gc/s400/tourney_game.PNG" border="0" alt="" /></a><br />
Como se puede comprobar, esta tabla es similar a la anterior pero usada para torneos.</p>
<p>♠ <span style="font-weight: bold;">Tabla <span style="font-style: italic;">game_players</span>.</span><br />
Define los detalles de cada mano desde el punto de vista de cada jugador que participa en la misma. Contiene los campos siguientes:</p>
<ul>
<li><span style="font-style: italic;font-family:courier new;">game_id</span>: identificador de la mano.</li>
<li><span style="font-style: italic;font-family:courier new;">player_id</span>: identificador del jugador.</li>
<li><span style="font-style: italic;font-family:courier new;">seat_number</span>: posición en la que está sentado el jugador.</li>
<li><span style="font-style: italic;font-family:courier new;">button</span>: posición que ocupa la posición de <span style="font-style: italic;">button</span>.</li>
<li><span style="font-style: italic;font-family:courier new;">hole_card_1</span>: primera carta de las dos del jugador.</li>
<li><span style="font-style: italic;font-family:courier new;">hole_card_2</span>: segunda carta <span id="fullpost">de las dos del jugador</span>.</li>
<li><span style="font-style: italic;font-family:courier new;">suited</span>: <span id="fullpost">s si es <span style="font-style: italic;">suited</span>, o si no</span><span style="font-style: italic;">.</span></li>
<li><span style="font-style: italic;font-family:courier new;">pre_flop_bet</span>: cantidad apostada antes del <span id="fullpost"><span style="font-style: italic;">flop</span><span style="font-style: italic;">.</span></span></li>
<li><span style="font-style: italic;font-family:courier new;">flop_bet</span>: cantidad apostada en el <span id="fullpost"><span style="font-style: italic;">flop</span><span style="font-style: italic;">.</span></span></li>
<li><span style="font-style: italic;font-family:courier new;">turn_bet</span>: <span id="fullpost">cantidad apostada en el<span style="font-style: italic;"> turn</span></span>.</li>
<li><span style="font-style: italic;font-family:courier new;">river_bet</span>: <span id="fullpost"><span id="fullpost">cantidad apostada en el<span style="font-style: italic;"> river.</span></span></span></li>
<li><span style="font-style: italic;font-family:courier new;">total_bet</span>: <span id="fullpost">cantidad apostada en el conjunto de la mano.</span></li>
<li><span style="font-style: italic;font-family:courier new;">total_won</span>: cantidad total ganada en la mano.</li>
<li><span style="font-style: italic;font-family:courier new;">when_folded</span>: cuando tiró las cartas en la mano.</li>
<li><span style="font-style: italic;font-family:courier new;">player_notes</span>: notas del jugador en la mano.</li>
<li><span style="font-style: italic;font-family:courier new;">final_hand</span>: calidad final de la mano del jugador.</li>
<li><span style="font-style: italic;font-family:courier new;">hand_rank_id</span>: identificador de la calidad de la jugada de la mano ganadora.</li>
<li><span style="font-style: italic;font-family:courier new;">all_in</span>: si el jugador ha ido <span style="font-style: italic;">all in</span> en la mano.</li>
<li><span style="font-style: italic;font-family:courier new;">hole_cards</span>: cartas del jugador en formato texto.</li>
<li><span style="font-style: italic;font-family:courier new;">card_order1</span>: ranking de la primera carta de mano en relación a su fuerza individual (2-&gt;2,&#8230;, As-&gt;14).</li>
<li><span style="font-style: italic;font-family:courier new;">card_order2</span>: <span id="fullpost">ranking de la segunda carta de mano en relación a su fuerza individual (2-&gt;2,&#8230;, As-&gt;14).</span></li>
<li><span style="font-style: italic;font-family:courier new;">card_order3</span>: 1 si son<span style="font-style: italic;"> suited</span>, 0 si no.</li>
<li><span style="font-style: italic;font-family:courier new;">connector_hand</span>: 1 si están conectadas, 0 si no.</li>
<li><span style="font-style: italic;font-family:courier new;">pair_hand</span>: 1 si es una pareja de mano, 0 si no.</li>
<li><span style="font-style: italic;font-family:courier new;">won_hand</span>: 1 si el jugador ganó la mano, 0 si no.</li>
<li><span style="font-style: italic;font-family:courier new;">session_id</span>: identificador de la sesión en la que se circunscribe la mano.</li>
<li><span style="font-style: italic;font-family:courier new;">off_the_button</span>: número de posiciones de diferencia con el <span style="font-style: italic;">button</span>.</li>
<li><span style="font-style: italic;font-family:courier new;">number_of_players</span>: número de jugadores en la mano.</li>
<li><span style="font-style: italic;font-family:courier new;">big_blind_n</span>: 1 si es <span style="font-style: italic;">big blind</span>, 0 si no.</li>
<li><span style="font-style: italic;font-family:courier new;">small_blind_n</span>: <span id="fullpost">1 si es <span style="font-style: italic;">small blind</span>, 0 si no.</span></li>
<li><span style="font-style: italic;font-family:courier new;">went_to_showdown_n</span>: <span id="fullpost">1 si llegó con la mano hasta el final, 0 si no.</span></li>
<li><span style="font-style: italic;font-family:courier new;">saw_flop_n</span>: <span id="fullpost">1 si vió el <span style="font-style: italic;">flop</span>, 0 si no.</span></li>
<li><span style="font-style: italic;font-family:courier new;">attempted_stea</span>l: <span id="fullpost">1 si intentó un robo, 0 si no.</span></li>
<li><span style="font-style: italic;font-family:courier new;">raised_first_pf</span>: <span id="fullpost">1 si subió el primero antes del <span style="font-style: italic;">flop</span>, 0 si no.</span></li>
<li><span style="font-style: italic;font-family:courier new;">real_player_id</span>: identificador real del jugador (no su alias).</li>
<li><span style="font-style: italic;font-family:courier new;">chip_count</span>: dinero con el que el jugador comenzó la mano.</li>
<li><span style="font-style: italic;font-family:courier new;">ub_kill_blind</span>: 1 si es la ciega <span style="font-style: italic;">kill </span>en una mesa <span style="font-style: italic;">kill </span>de UB, 0 si no.</li>
</ul>
<p><a href="http://bp1.blogger.com/_5624shASmf0/Rb55RZUIo0I/AAAAAAAAAEU/SUjwLD6hTQA/s1600-h/game_players.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5025587573952127810" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_5624shASmf0/Rb55RZUIo0I/AAAAAAAAAEU/SUjwLD6hTQA/s400/game_players.PNG" border="0" alt="" /></a><br />
Hay muchos otros campos <span style="font-style: italic;">booleanos </span>(valores cierto o falso, 0 ó 1) que definen cada una de las posibles acciones que el jugador ha podido realizar en cada una de las calles (<span style="font-style: italic;">call</span>, <span style="font-style: italic;">check-raise</span>, <span style="font-style: italic;">bet-raise</span>, etc.) y que servirán para mostrar las estadísticas en las ventanas del PT.</p>
<p>♠ <span style="font-weight: bold;">Tabla <span style="font-style: italic;">tourney_game_players</span>.</span><br />
Define los detalles de cada mano de torneo desde el punto de vista de cada jugador que participa en la misma. Contiene los campos siguientes:</p>
<ul>
<li><span style="font-style: italic;font-family:courier new;">tourney_id</span>: identificador del torneo.</li>
<li><span style="font-style: italic;font-family:courier new;">game_id</span>: identificador de la mano dentro del torneo.</li>
<li><span style="font-style: italic;font-family:courier new;">player_id</span>: identificador del jugador.</li>
<li><span style="font-style: italic;font-family:courier new;">seat_number</span>: posición en la que está sentado el jugador.</li>
<li><span style="font-style: italic;font-family:courier new;">button</span>: posición que ocupa la posición de <span style="font-style: italic;">button</span>.</li>
<li><span style="font-style: italic;font-family:courier new;">hole_card_1</span>: primera carta de las dos del jugador.</li>
<li><span style="font-style: italic;font-family:courier new;">hole_card_2</span>: segunda carta <span id="fullpost">de las dos del jugador</span>.</li>
<li><span style="font-style: italic;font-family:courier new;">suited</span>: <span id="fullpost">s si es <span style="font-style: italic;">suited</span>, o si no</span><span style="font-style: italic;">.</span></li>
<li><span style="font-style: italic;font-family:courier new;">pre_flop_bet</span>: cantidad apostada antes del <span id="fullpost"><span style="font-style: italic;">flop</span><span style="font-style: italic;">.</span></span></li>
<li><span style="font-style: italic;font-family:courier new;">flop_bet</span>: cantidad apostada en el <span id="fullpost"><span style="font-style: italic;">flop</span><span style="font-style: italic;">.</span></span></li>
<li><span style="font-style: italic;font-family:courier new;">turn_bet</span>: <span id="fullpost">cantidad apostada en el<span style="font-style: italic;"> turn</span></span>.</li>
<li><span style="font-style: italic;font-family:courier new;">river_bet</span>: <span id="fullpost"><span id="fullpost">cantidad apostada en el<span style="font-style: italic;"> river.</span></span></span></li>
<li><span style="font-style: italic;font-family:courier new;">total_bet</span>: <span id="fullpost">cantidad apostada en el conjunto de la mano.</span></li>
<li><span style="font-style: italic;font-family:courier new;">total_won</span>: cantidad total ganada en la mano.</li>
<li><span style="font-style: italic;font-family:courier new;">when_folded</span>: cuando tiró las cartas en la mano.</li>
<li><span style="font-style: italic;font-family:courier new;">player_notes</span>: notas del jugador en la mano.</li>
<li><span style="font-style: italic;font-family:courier new;">final_hand</span>: calidad final de la mano del jugador.</li>
<li><span style="font-style: italic;font-family:courier new;">hand_rank_id</span>: identificador de la calidad de la jugada de la mano ganadora.</li>
<li><span style="font-style: italic;font-family:courier new;">all_in</span>: si el jugador ha ido <span style="font-style: italic;">all in</span> en la mano.</li>
<li><span style="font-style: italic;font-family:courier new;">hole_cards</span>: cartas del jugador en formato texto.</li>
<li><span style="font-style: italic;font-family:courier new;">card_order1</span>: ranking de la primera carta de mano en relación a su fuerza individual (2-&gt;2, &#8230;, As-&gt;14).</li>
<li><span style="font-style: italic;font-family:courier new;">card_order2</span>: <span id="fullpost">ranking de la segunda carta de mano en relación a su fuerza individual (2-&gt;2, &#8230;, As-&gt;14).</span></li>
<li><span style="font-style: italic;font-family:courier new;">card_order3</span>: 1 si son<span style="font-style: italic;"> suited</span>, 0 si no.</li>
<li><span style="font-style: italic;font-family:courier new;">connector_hand</span>: 1 si están conectadas, 0 si no.</li>
<li><span style="font-style: italic;font-family:courier new;">pair_hand</span>: 1 si es una pareja de mano, 0 si no.</li>
<li><span style="font-style: italic;font-family:courier new;">won_hand</span>: 1 si el jugador ganó la mano, 0 si no.</li>
<li><span style="font-style: italic;font-family:courier new;">session_id</span>: identificador de la sesión en la que se circunscribe la mano.</li>
<li><span style="font-style: italic;font-family:courier new;">off_the_button</span>: número de posiciones de diferencia con el <span style="font-style: italic;">button</span>.</li>
<li><span style="font-style: italic;font-family:courier new;">number_of_players</span>: número de jugadores en la mano.</li>
<li><span style="font-style: italic;font-family:courier new;">big_blind_n</span>: 1 si es <span style="font-style: italic;">big blind</span>, 0 si no.</li>
<li><span style="font-style: italic;font-family:courier new;">small_blind_n</span>: <span id="fullpost">1 si es <span style="font-style: italic;">small blind</span>, 0 si no.</span></li>
<li><span style="font-style: italic;font-family:courier new;">went_to_showdown_n</span>: <span id="fullpost">1 si llegó con la mano hasta el final, 0 si no.</span></li>
<li><span style="font-style: italic;font-family:courier new;">saw_flop_n</span>: <span id="fullpost">1 si vió el <span style="font-style: italic;">flop</span>, 0 si no.</span></li>
<li><span style="font-style: italic;font-family:courier new;">attempted_stea</span>l: <span id="fullpost">1 si intentó un robo, 0 si no.</span></li>
<li><span style="font-style: italic;font-family:courier new;">raised_first_pf</span>: <span id="fullpost">1 si subió el primero antes del <span style="font-style: italic;">flop</span>, 0 si no.</span></li>
<li><span style="font-style: italic;font-family:courier new;">real_player_id</span>: identificador real del jugador (no su alias).</li>
<li><span style="font-style: italic;font-family:courier new;">chip_count</span>: <span style="font-style: italic;">stack </span>con el que el jugador comenzó la mano.</li>
<li><span style="font-style: italic;font-family:courier new;">blind</span><span style="font-family:courier new;">_</span><span style="font-style: italic;font-family:courier new;">amt</span>: cantidad de fichas pagadas en la mano en concepto de ciegas (0 si el jugador está fuera de las posiciones que pagan ciegas).</li>
<li>ante_amt: cantidad de fichas pagadas en concepto de <span style="font-style: italic;">ante</span>.</li>
</ul>
<p><a href="http://bp0.blogger.com/_5624shASmf0/Rb-Ks5UIo1I/AAAAAAAAAEg/jgGZzBGcQZ8/s1600-h/t_game_player.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5025888213072913234" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_5624shASmf0/Rb-Ks5UIo1I/AAAAAAAAAEg/jgGZzBGcQZ8/s400/t_game_player.PNG" border="0" alt="" /></a><br />
Hay muchos otros campos <span style="font-style: italic;">booleanos </span>(valores cierto o falso, 0 ó 1) que definen cada una de las posibles acciones que el jugador ha podido realizar en cada una de las calles (<span style="font-style: italic;">call</span>, <span style="font-style: italic;">check-raise</span>, <span style="font-style: italic;">bet-raise</span>, etc.) y que servirán para mostrar las estadísticas en las ventanas del PT. Esta tabla es similar a la anterior pero orientada a torneos (por eso algunas columnas diferentes como la de los <span style="font-style: italic;">antes</span>).</p>
<p>♠ <span style="font-weight: bold;">Tabla <span style="font-style: italic;">tourney</span>.</span><br />
Define los datos generales de los torneos. Cada fila identifica un solo torneo importado en PT. Contiene los campos siguientes:</p>
<ul>
<li><span style="font-style: italic;font-family:courier new;">tourney_id</span>: identificador del torneo en la base de datos de PT.</li>
<li><span style="font-style: italic;font-family:courier new;">site_id</span>: identificador de la sala en la que se juega el torneo.</li>
<li><span style="font-style: italic;font-family:courier new;">tourney_number</span>: número de identificación del torneo en la sala.</li>
<li><span style="font-style: italic;font-family:courier new;">tourney_start</span>: fecha y hora de inicio del torneo.</li>
<li><span style="font-style: italic;font-family:courier new;">tourney_end</span>: <span id="fullpost">fecha y hora de fin del torneo</span>.</li>
<li><span style="font-style: italic;font-family:courier new;">buy_in</span>: dinero que costó la entrada al torneo.</li>
<li><span style="font-style: italic;font-family:courier new;">fee</span>: dinero pagado como comisión a la sala de póquer.</li>
<li><span style="font-style: italic;font-family:courier new;">tourney_type</span>: tipo de torneo (si no concreto más es porque no tengo apenas torneos guardados en la base de datos y no tengo ni puta idea de cuáles son los valores).</li>
<li><span style="font-style: italic;font-family:courier new;">table_type</span>: tipo de mesa (ídem. a la anterior).</li>
<li><span style="font-style: italic;font-family:courier new;">summary_text</span>: resumen en formato texto del identificador del torneo.</li>
<li><span style="font-style: italic;font-family:courier new;">target_tourney_number</span>: si es un satélite, indica el identificador del torneo en la sala al que se opta si se consigue una plaza.</li>
<li><span style="font-style: italic;font-family:courier new;">number_of_players</span>: <span id="fullpost">número de jugadores del torneo.</span></li>
<li><span style="font-style: italic;font-family:courier new;">tourney_notes</span>: notas del torneo.</li>
<li><span style="font-style: italic;font-family:courier new;">summary_loaded</span>: si se ha importado en el PT el resumen del torneo.</li>
</ul>
<p><a href="http://bp3.blogger.com/_5624shASmf0/Rb-P8pUIo2I/AAAAAAAAAEs/6tY3OadgJBs/s1600-h/tourney.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5025893981213991778" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_5624shASmf0/Rb-P8pUIo2I/AAAAAAAAAEs/6tY3OadgJBs/s400/tourney.PNG" border="0" alt="" /></a></p>
<p>♣ <span style="font-weight: bold;">Tablas de resumen de datos</span>:<br />
Guardan los resultados de ganancias y otras estadísticas agrupados.</p>
<p>♠ <span style="font-weight: bold;">Tabla <span style="font-style: italic;">session</span>.</span><br />
Define los datos de una sesión de juego (desde que te sientas a una mesa hasta que te levantas). Contiene los campos siguientes:</p>
<ul>
<li><span style="font-style: italic;font-family:courier new;">session_id</span>: identificador de la sesión en la base de datos de PT.</li>
<li><span style="font-style: italic;font-family:courier new;">player_id</span>: identificador del jugador.</li>
<li><span style="font-style: italic;font-family:courier new;">session_start</span>: <span id="fullpost">fecha y hora de inicio de la sesión</span>.</li>
<li><span style="font-style: italic;font-family:courier new;">session_end</span>: fecha y hora de fin de la sesión.</li>
<li><span style="font-style: italic;font-family:courier new;">table_name</span>: nombre de la mesa.</li>
<li><span style="font-style: italic;font-family:courier new;">seat_number</span>: posición dentro de la mesa.</li>
<li><span style="font-style: italic;font-family:courier new;">session_notes</span>: notas escritas de la sesión.</li>
<li><span style="font-style: italic;font-family:courier new;">game_level_id</span>: identificador del nivel en el que se juega.</li>
<li><span style="font-style: italic;font-family:courier new;">amount_won</span>: cantidad ganada total (o perdida, excepto para Caminante que solo tiene valores positivos en este campo).</li>
<li><span style="font-style: italic;font-family:courier new;">total_hands</span>: número total de manos jugadas.</li>
<li><span style="font-style: italic;font-family:courier new;">site_id</span>: identificador de la sala.</li>
<li><span style="font-style: italic;font-family:courier new;">vol_saw_flop</span>: <span id="fullpost">este valor en el conjunto de la sesión.</span></li>
<li><span style="font-style: italic;font-family:courier new;">pre_flop_raise</span>: <span id="fullpost"><span id="fullpost">este valor en el conjunto de la sesión</span></span>.</li>
<li><span style="font-style: italic;font-family:courier new;">att_steal</span>: <span id="fullpost"><span id="fullpost">este valor en el conjunto de la sesión</span></span>.</li>
<li><span style="font-style: italic;font-family:courier new;">chance_to_steal</span>: oportunidades de robo<span id="fullpost"><span id="fullpost"> en el conjunto de la sesión</span></span> (ya sabes, triste es pedir&#8230;).</li>
<li><span style="font-style: italic;font-family:courier new;">won_hand</span>: número de manos ganadas en la sesión.</li>
<li><span style="font-style: italic;font-family:courier new;">went_to_sd</span>: <span id="fullpost"><span id="fullpost"><span id="fullpost">este valor en el conjunto de la sesión</span></span>.</span></li>
<li><span style="font-style: italic;font-family:courier new;">won_at_sd</span>: <span id="fullpost"><span id="fullpost"><span id="fullpost">este valor en el conjunto de la sesión</span></span>.</span></li>
<li><span style="font-style: italic;font-family:courier new;">real_player_id</span>: identificador del jugador (distinto del anterior si usa alias y no es la sala primera en la que PT definió al jugador).</li>
<li><span style="font-style: italic;font-family:courier new;">tot_players</span>: número total de jugadores en el conjunto de la sesión (suma los totales en cada mano, sin importar que sea el mismo jugador; es decir, si juegas una sesión maratoniana de 2 manos contra los mismos 9 tíos, este campo valdrá 20).</li>
<li><span style="font-style: italic;font-family:courier new;">tot_saw_flop</span>: número total de jugadores que han visto el <span style="font-style: italic;">flop </span>en la sesión (mismo comentario que en el campo anterior).</li>
<li><span style="font-style: italic;font-family:courier new;">tot_pot</span>: <span id="fullpost">cantidad total de dinero en todos los botes de la sesión (la suma de todos los botes generados sin importar quién los ganara).</span></li>
</ul>
<p><a href="http://bp2.blogger.com/_5624shASmf0/Rb-W0ZUIo3I/AAAAAAAAAE4/g-pYUX7-ES4/s1600-h/session.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5025901536061465458" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_5624shASmf0/Rb-W0ZUIo3I/AAAAAAAAAE4/g-pYUX7-ES4/s400/session.PNG" border="0" alt="" /></a><br />
♠ <span style="font-weight: bold;">Tabla <span style="font-style: italic;">tourney_summary</span>.</span><br />
Define datos de los torneos desde el punto de vista de un jugador. Un torneo tendrá en esta tabla tantas filas como jugadores hayan participado (siempre que se hayan importado los datos a PT). Contiene los campos siguientes:</p>
<ul>
<li><span style="font-style: italic;font-family:courier new;">tourney_id</span>: identificador del torneo en la base de datos de PT.</li>
<li><span style="font-style: italic;font-family:courier new;">place_of_finish</span>: lugar en el que acabó el torneo el jugador.</li>
<li><span style="font-style: italic;font-family:courier new;">player_id</span>: identificador del jugador.</li>
<li><span style="font-style: italic;font-family:courier new;">amt_won</span>: cantidad ganada por el jugador.</li>
<li><span style="font-style: italic;font-family:courier new;">real_player_id</span>: <span id="fullpost">identificador del jugador (por si se utilizan alias)</span>.</li>
<li><span style="font-style: italic;font-family:courier new;">sat_seat_won</span>: el equivalente a dinero que cuesta la entrada al satélite que ha ganado este jugador.</li>
<li><span style="font-style: italic;font-family:courier new;">actual_buy_in</span>: dinero pagado total como entrada por este jugador.</li>
<li><span style="font-style: italic;font-family:courier new;">actual_fee</span>: <span id="fullpost">dinero pagado total como comisión a la sala de póquer</span>.</li>
<li><span style="font-style: italic;font-family:courier new;">total_rebuys</span>: número total de recompras realizadas en el torneo.</li>
<li><span style="font-style: italic;font-family:courier new;">rebuy_amt</span>: <span id="fullpost">cantidad que costaba cada recompra</span>.</li>
<li><span style="font-style: italic;font-family:courier new;">total_addons</span>: número total de <span style="font-style: italic;">addons </span>realizados en el torneo.</li>
<li><span style="font-style: italic;font-family:courier new;">addon_amt</span>: cantidad que costaba cada <span style="font-style: italic;">addon</span><span id="fullpost" style="font-style: italic;">.</span></li>
</ul>
<p>♠ <span style="font-weight: bold;">Tabla <span style="font-style: italic;">player_winnings</span>.</span><br />
Define los datos de ganancias entre los jugadores de <span style="font-style: italic;">cash</span>. Cada fila identifica el dinero que le ha ganado un jugador a otro durante una sesión. Contiene los campos siguientes:</p>
<ul>
<li><span style="font-style: italic;font-family:courier new;">date_played</span>: día en el que se contabilizan los datos de la fila.</li>
<li><span style="font-style: italic;font-family:courier new;">game_level_id</span>: identificador de la cantidad de las ciegas.</li>
<li><span style="font-style: italic;font-family:courier new;">site_id</span>: identificador de la sala.</li>
<li><span style="font-style: italic;font-family:courier new;">player_id</span>: identificador del jugador que ha ganado dinero en la sesión a <span style="font-style: italic;">opponent_id</span>.</li>
<li><span style="font-style: italic;font-family:courier new;">session_id</span>: identificador de la sesión.</li>
<li><span style="font-style: italic;font-family:courier new;">opponent_id</span>: <span id="fullpost">identificador del jugador que ha palmado pasta en la sesión a manos del jugador <span style="font-style: italic;">player_id</span></span>.</li>
<li><span style="font-style: italic;font-family:courier new;">won_from</span>: cantidad ganada por el jugador <span style="font-style: italic;">player_id</span> a <span style="font-style: italic;">opponent_id</span>.</li>
<li><span style="font-style: italic;font-family:courier new;">times_beat</span>: veces que <span id="fullpost"> <span style="font-style: italic;">player_id</span> ha ganado a </span><span id="fullpost"><span style="font-style: italic;">opponent_id</span></span><span id="fullpost"> en la sesión</span>.</li>
<li><span style="font-style: italic;font-family:courier new;">real_player_id</span>: identificador del jugador ganador (por si usa alias).</li>
<li><span style="font-style: italic;font-family:courier new;">real_opp_id</span>: identificador del jugador perdedor (por si usa alias).</li>
</ul>
<p><a href="http://bp2.blogger.com/_5624shASmf0/Rb-c5ZUIo4I/AAAAAAAAAFE/IRzCnS0ECqk/s1600-h/player_w.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5025908219030578050" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_5624shASmf0/Rb-c5ZUIo4I/AAAAAAAAAFE/IRzCnS0ECqk/s400/player_w.PNG" border="0" alt="" /></a><br />
Esta tabla sirve como base para mostrar la información de ganancias y pérdidas entre jugadores que tantas veces hemos tenido que volver a mirar varias veces por parecer increíble que ese jugador, con lo malo que es, nos haya ganado tanto dinero.</p>
<p>♣ <span style="font-weight: bold;">Tablas de configuración:</span><br />
Almacenan los datos de configuración del PT. En este apartado se encuentran las siguientes tablas (no merece la pena extenderse en ellas):</p>
<ul>
<li><span style="font-style: italic;font-family:courier new;">dst</span>: rangos de fechas que utilizará para cálculos internos del programa.</li>
<li><span style="font-style: italic;font-family:courier new;">datawindow_prefs</span>: preferencias del programa.</li>
<li><span style="font-style: italic;font-family:courier new;">exrates</span>: tipo de cambio entre dólares, euros y libras que va a utilizar en los cálculos.</li>
<li><span style="font-style: italic;font-family:courier new;">error_msgs</span>: mensajes de error del programa.</li>
<li>version_info:<span style="font-style: italic;"> </span>número de versión del programa.</li>
</ul>
<p>Con esto concluyo la revisión pormenorizada de las tablas de PT. Espero que aclare algunas dudas y facilite la creación de consultas que abordaré en la siguiente entrada.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.spainfull.com/blog/como-realizar-consultas-sql-en-la-bd-de-poker-tracker-parte-ii/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Cómo realizar consultas SQL en la BD de Poker Tracker. Parte I.</title>
		<link>http://www.spainfull.com/blog/como-realizar-consultas-sql-en-la-bd-de-poker-tracker-parte-i/</link>
		<comments>http://www.spainfull.com/blog/como-realizar-consultas-sql-en-la-bd-de-poker-tracker-parte-i/#comments</comments>
		<pubDate>Sat, 27 Jan 2007 09:43:00 +0000</pubDate>
		<dc:creator>spainfull</dc:creator>
				<category><![CDATA[Póquer]]></category>
		<category><![CDATA[Poker Tracker]]></category>
		<category><![CDATA[Poker Tracker 2]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Bases de datos]]></category>
		<category><![CDATA[Obsoleto]]></category>

		<guid isPermaLink="false">http://www.spainfull.com/blog/?p=22</guid>
		<description><![CDATA[Este artículo tiene dos objetivos principales: explicar la manera de obtener más información de nuestra base de datos Access de Poker Tracker (en adelante, PT) a través de consultas SQL y detallar la estructura de las tablas de esta base de datos para saber dónde hacer las consultas. Está orientado hacia los usuarios del PT [...]]]></description>
			<content:encoded><![CDATA[<p>Este artículo tiene dos objetivos principales: explicar la manera de obtener más información de nuestra base de datos Access de Poker Tracker (en adelante, PT) a través de consultas <a href="http://es.wikipedia.org/wiki/SQL">SQL</a> y detallar la estructura de las tablas de esta base de datos para saber dónde hacer las consultas. Está orientado hacia los usuarios del PT que tienen un nivel básico de manejo de la informática (o sea, ni puta idea) y quieren obtener datos que actualmente no muestra el programa. Bueno, si no quieres más información, quizás tengas la curiosidad de saber cómo funciona por dentro PT y le pierdas el miedo a esto de los ordenadores. En los <a href="http://www.pokertracker.com/forum/">foros</a> de PT hay un <a href="http://www.pokertracker.com/forum/viewtopic.php?t=4189">hilo</a> en inglés que me ha servido de base para este artículo y en estos foros, además,  puedes encontrar consultas SQL hechas por usuarios de PT.<span id="more-22"></span></p>
<p>Por defecto, el programa PT almacena los datos que captura de las diferentes salas de póquer en un archivo de base de datos Access. Éste archivo  tiene la extensión &#8220;<span style="font-style: italic;">.mdb</span>&#8221; y no es más que una manera de guardar la información. Esta información la obtiene PT de los historiales de las manos que se almacenan en nuestro disco duro en los directorios de las aplicaciones de las salas de póquer creados a tal efecto (la ruta que tenemos que poner en las ventanas de <span>auto-import</span> del PT para que pueda leer las manos). Lo que hace PT es leer esos ficheros de texto que contienen las manos jugadas, interpretar la información que de ellos se puede sacar (jugadores, <span style="font-style: italic;">stacks</span>, nuestras cartas de mano, cartas comunitarias, apuestas, ganador de la mano, etc.) y escribirla en la base de datos de manera apropiada para que después pueda ser procesada.</p>
<p>PT da la opción de guardar la información en otro tipo de base de datos llamada <a href="http://www.postgresql.org/">PostgreSQL</a>. Es totalmente gratuita y su código está disponible para todo el mundo. Tiene algunas ventajas sobre Access como son no tener limitación de espacio, ser algo más rápida, más estable y más robusta. El inconveniente es que hay que instalarla y configurar algunos parámetros en el PT para que funcione, pero tampoco nada demasiado complicado. Ahora bien, si no jugamos un número excesivo de manos, se puede usar Access tranquilamente. El problema de las bases de datos de Access es que tienen una limitación de tamaño de 2GB y hay que compactarlas de vez en cuando para que no se haga muy lento el acceso a los datos que contienen. Una solución es crear varias bases de datos de Access en PT, aunque es un poco latoso tener que estar cambiando de una a otra según donde quieras guardar los datos de juego.</p>
<p>El método que voy a explicar a continuación solo es válido para aquellos que guardan los datos del PT en una base de datos Access. Para realizar consultas SQL sobre ella, se necesita algún programa que tenga esta función incluida. En principio, se pueden utilizar tanto Microsoft Access como Microsoft Excel, aunque si no se dispone de estos programas, es posible bajarse algún programa gratuito que nos permita hacer consultas Access como por ejemplo <a href="http://www.freewarefiles.com/program_10_109_20139.html">SQueAl</a>.   En primer lugar mostraré simplemente cómo hacer la consulta sin entrar a analizar en detalle otros aspectos un poco más complejos que dejo para más adelante.</p>
<p><span><strong>Ejecutar una consulta con Microsoft Access</strong></span></p>
<p>Antes de comenzar una advertencia: Microsoft Access es la aplicación nativa para las bases de datos Access de PT, con lo que cualquier cambio que se haga sobre la tablas o borrado de elementos por error pueden provocar daños irreparables que implicarían la inutilización de la base de datos; así que cuida donde metes las zarpas y no pulses aceptar sin leer el mensaje. En principio, si sigues los pasos indicados no hay ningún problema, pero por si acaso, ten siempre una copia de seguridad de tu base de datos (basta con hacer una copia del archivo <span id="fullpost">&#8220;<span style="font-style: italic;">.mdb</span>&#8220;</span><span id="fullpost"> donde tengas la base de datos).</span></p>
<p>La consulta que se va a hacer es la de parejas que han mejorado a trío en el <span style="font-style: italic;">flop</span>. El código SQL para esta consulta es el siguiente (ten en cuenta que esto no es un tutorial ni de SQL ni de Access aunque posteriormente explicaré algunos conceptos, pero si quieres más información la red está llena de tutoriales sencillos):<br />
<span><br />
</span><span style="font-size:85%;"><span style="font-family:courier new;"><span><span><span id="fullpost"><span><span>SELECT gp.hole_cards AS Par, count(*) AS Veces, SUM(<br />
IIF(left(g.flop_1,1)=left(gp.hole_card_1,1),1,<br />
IIF(left(g.flop_2,1)=left(gp.hole_card_1,1),1,<br />
IIF(left(g.flop_3,1)=left(gp.hole_card_1,1),1,<br />
0)))) AS [Trío en flop]<br />
FROM game_players AS gp INNER JOIN game AS g ON gp.game_id = g.game_id<br />
WHERE gp.player_id = (select pref_value from prefs where pref_key = &#8216;RP&#8217;)<br />
AND gp.pair_hand = 1<br />
AND gp.saw_flop_n = 1<br />
GROUP BY gp.hole_cards, gp.card_order1<br />
ORDER BY gp.card_order1 DESC;</span></span></span></span></span></span></span></p>
<p>Para empezar, arranca la aplicación Microsoft Access. En el menú &#8220;<span><span id="fullpost"><span><span><em>Archivo</em></span></span></span></span><span id="fullpost">&#8220;<span> </span>escoge la opción </span><span id="fullpost">&#8220;</span><span id="fullpost"><span><span><em>Abrir&#8230;</em></span></span></span><span id="fullpost">&#8220;</span><span id="fullpost"> y en la ventana que se presenta, navega hasta seleccionar la base de datos sobre la que quieras hacer la consulta. Por defecto, la base de datos de PT es </span><span id="fullpost">&#8220;</span><span id="fullpost"><span><span><em>ptrack.mdb</em></span></span></span><span id="fullpost">&#8220;</span><span id="fullpost"> (puede que no aparezca la extensión </span><span id="fullpost">&#8220;<span style="font-style: italic;">.mdb</span>&#8220;</span><span id="fullpost">) y se encuentra en la ruta: &#8220;</span><span><span id="fullpost"><span><em>C:\Archivos de programa\Poker Tracker V2</em></span></span></span><span id="fullpost">&#8221; (también se puede abrir pulsando dos veces sobre el archivo &#8220;<span><span><em>ptrack.mdb</em></span></span>&#8221; en el explorador de Windows.</span></p>
<p>Aparecerá la siguiente pantalla. Debes pulsar en &#8220;<span id="fullpost"><span><span><em>Consultas</em></span></span></span><span id="fullpost">&#8221; (&#8220;<span><span><em>Queries</em></span></span>&#8221; si tienes el programa en inglés) y a continuación en el menú de la ventana mostrada seleccionar &#8220;</span><span><span id="fullpost"><span><em>Nuevo</em></span></span></span><span id="fullpost">&#8221; y en la nueva ventana &#8220;</span><span id="fullpost"><span><span><em>Vista Diseño</em></span></span></span><span id="fullpost"><span>&#8220;</span> (o directamente &#8220;</span><span><span id="fullpost"><span><em>Crear una consulta en vista Diseño</em></span></span></span><span id="fullpost">&#8220;).</span></p>
<p><a href="http://bp1.blogger.com/_5624shASmf0/RbyWW5UIolI/AAAAAAAAABg/AG7aUQ_8z2g/s1600-h/Consulta.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5025056604325192274" src="http://bp1.blogger.com/_5624shASmf0/RbyWW5UIolI/AAAAAAAAABg/AG7aUQ_8z2g/s400/Consulta.PNG" border="0" alt="" /></a></p>
<p>Aparecerá una ventana de &#8220;<span id="fullpost"><span><span><em>Consulta de selección</em></span></span></span><span id="fullpost">&#8221; y sobre ella una ventana de &#8220;<span><span><em>Mostrar Tabla</em></span></span>&#8220;.</span></p>
<p><a href="http://bp3.blogger.com/_5624shASmf0/RbyV3ZUIokI/AAAAAAAAABU/gVIgWZ40ooI/s1600-h/Mostrar+tabla.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5025056063159312962" src="http://bp3.blogger.com/_5624shASmf0/RbyV3ZUIokI/AAAAAAAAABU/gVIgWZ40ooI/s400/Mostrar+tabla.PNG" border="0" alt="" /></a></p>
<p>Cierra esta última ventana y nos quedamos con la ventana de consulta. Ahora debes pulsar el icono &#8220;<span><span><em>SQL</em></span></span>&#8221; que se encuentra debajo de &#8220;<span><span><em>Archivo</em></span></span>&#8221; o seleccionar &#8220;<span><span id="fullpost"><span><em>Ver-&gt;Vista SQL</em></span></span></span><span id="fullpost">&#8220;.</span></p>
<p><a href="http://bp0.blogger.com/_5624shASmf0/RbyW6pUIomI/AAAAAAAAABs/Fg_sBXFbgrI/s1600-h/SQL.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5025057218505515618" src="http://bp0.blogger.com/_5624shASmf0/RbyW6pUIomI/AAAAAAAAABs/Fg_sBXFbgrI/s400/SQL.PNG" border="0" alt="" /></a></p>
<p>Ahora ya solo nos queda copiar (o escribir) la consulta a realizar en la ventana y pulsar el icono &#8220;<span><em>!</em></span>&#8221; o seleccionar &#8220;<span><span><em>Consulta-&gt;Ejecutar</em></span></span>&#8221; para que obtengamos los resultados.</p>
<p><a href="http://bp3.blogger.com/_5624shASmf0/RbyciZUIooI/AAAAAAAAACE/d8_1PQ9bir8/s1600-h/Ejecutar.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5025063398963454594" src="http://bp3.blogger.com/_5624shASmf0/RbyciZUIooI/AAAAAAAAACE/d8_1PQ9bir8/s400/Ejecutar.PNG" border="0" alt="" /></a></p>
<p><a href="http://bp3.blogger.com/_5624shASmf0/Rbyc9ZUIopI/AAAAAAAAACQ/gG1_hnyPsSs/s1600-h/Resultados.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5025063862819922578" src="http://bp3.blogger.com/_5624shASmf0/Rbyc9ZUIopI/AAAAAAAAACQ/gG1_hnyPsSs/s400/Resultados.PNG" border="0" alt="" /></a></p>
<p>Se puede guardar la consulta para no tener que copiarla cada vez que queremos obtener la información; para ello basta pulsar el icono del disquete o seleccionar &#8220;<span><span><em>Archivo-&gt;Guardar</em></span></span>&#8221; y darle un nombre a la consulta, almacenándose junto con el resto de consultas previas en el apartado de &#8220;<span><span><em>Consultas</em></span></span>&#8221; de la base de datos visto en la primera imagen. Lo que se guarda es el texto de la consulta, no el resultado; si se quiere guardar el resultado habrá que copiarlo y pegarlo en otra aplicación (Excel, Word, Block de notas, etc.).</p>
<p>Una última consideración, de las instrucciones SQL que se pueden ejecutar, solo &#8220;<span><span id="fullpost"><span><em>SELECT</em></span></span></span><span id="fullpost">&#8221; no tiene como resultado modificar las tablas de las bases de datos (simplemente muestra información), así que no copiéis y ejecutéis consultas que incluyan palabras como &#8220;</span><span id="fullpost"><span><em>DROP</em></span></span><span id="fullpost">&#8220;, </span><span id="fullpost">&#8220;</span><span id="fullpost"><span><em>INSERT</em></span></span><span id="fullpost">&#8220;</span><span id="fullpost">, </span><span id="fullpost">&#8220;</span><span><span id="fullpost"><em>UPDATE</em></span></span><span id="fullpost">&#8220;</span><span id="fullpost"><span> </span>o </span><span id="fullpost">&#8220;</span><span id="fullpost"><span><em>DELETE</em></span></span><span id="fullpost">&#8220;</span><span id="fullpost"><span> </span>y, en general, consultas sospechosas no verificadas por otros usuarios más duchos en la materia. En el siguiente apartado explicaré en detalle las tablas de la base de datos y un poco de SQL (no demasiado, necesitarás un tutorial más completo) para que puedas hacer tus propias consultas.<br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.spainfull.com/blog/como-realizar-consultas-sql-en-la-bd-de-poker-tracker-parte-i/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

