<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2124217069974135740</id><updated>2011-12-15T10:51:17.953-04:30</updated><category term='Bienvenida'/><category term='xdrtas'/><title type='text'>Zero Or One</title><subtitle type='html'>Blog de tecnología informática.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://xdrtas.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2124217069974135740/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://xdrtas.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>xdrtas</name><uri>http://www.blogger.com/profile/06633503378192749976</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-GTZO4GO-ad0/TW-HR7ov2BI/AAAAAAAAADI/2tiQbfNTfbI/s220/IMG00092-20101128-1206.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>8</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2124217069974135740.post-3231344550389845602</id><published>2011-02-09T18:37:00.011-04:30</published><updated>2011-02-17T04:39:04.148-04:30</updated><title type='text'>0007 – Instalar pldebugger en postgreSQL bajo Windows</title><content type='html'>&lt;span xmlns=""&gt;&lt;p&gt;Pldebugger es un plugin para depurar scripts plpgsql en PostgreSQL. Usando el "one-click-installer" de postgreSQL no hace falta bajarse el plugin y compilarlo para que funcione. El paquete de instalación "one-click-installer" ya se encarga de hacerlo por nosotros.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;En este artículo voy a explicar cómo se debe configurar el pldebugger bajo Windows una vez instalado PostgreSQL.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Descripción técnica:&lt;br /&gt;&lt;/p&gt;&lt;div&gt;&lt;table border="0" style="border-collapse:collapse"&gt;&lt;colgroup&gt;&lt;col style="width:299px"&gt;&lt;col style="width:299px"&gt;&lt;/colgroup&gt;&lt;tbody valign="top"&gt;&lt;tr&gt;&lt;td style="padding-left: 7px; padding-right: 7px; border-top:  solid #4f81bd 1.0pt; border-left:  none; border-bottom:  solid #4f81bd 1.0pt; border-right:  none"&gt;&lt;p&gt;&lt;span style="color:#365f91"&gt;&lt;strong&gt;S.O.&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="padding-left: 7px; padding-right: 7px; border-top:  solid #4f81bd 1.0pt; border-left:  none; border-bottom:  solid #4f81bd 1.0pt; border-right:  none"&gt;&lt;p&gt;&lt;span style="color:#365f91"&gt;&lt;strong&gt;Windows XP SP3&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="background: #d3dfee"&gt;&lt;td style="padding-left: 7px; padding-right: 7px; border-left:  none; border-bottom:  solid #4f81bd 1.0pt; border-right:  none"&gt;&lt;p&gt;&lt;span style="color:#365f91"&gt;&lt;strong&gt;Versión de postgreSQL&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="padding-left: 7px; padding-right: 7px; border-left:  none; border-bottom:  solid #4f81bd 1.0pt; border-right:  none"&gt;&lt;p&gt;&lt;span style="color:#365f91"&gt;9.0&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Abrir explorador de Windows e ir a la ruta de instalación de postgreSQL: &lt;strong&gt;..\PostgreSQL\9.0\data&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;div id="001" style="overflow: hidden; width: 100%;" onmouseover="javascript:Ver('001', 1, '100%', 'auto', 'hidden');" onmouseout="javascript:Ver('001',0,'100%','auto','hidden');"&gt;&lt;br /&gt;&lt;img src="http://img833.imageshack.us/img833/1926/001jv.png" alt="Image Hosted by ImageShack.us" /&gt;By &lt;a target="_new" href="http://profile.imageshack.us/user/xdrtas_001"&gt;xdrtas_001&lt;/a&gt; at 2011-02-09&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;En la carpeta "&lt;strong&gt;data&lt;/strong&gt;", abrir el archivo de configuración: "&lt;strong&gt;postgresql.conf&lt;/strong&gt;" con el editor de preferencia, para este caso uso el block de notas clásico.&lt;br /&gt;&lt;div id="002" style="overflow: hidden; width: 100%;" onmouseover="javascript:Ver('002', 1, '100%', 'auto', 'hidden');" onmouseout="javascript:Ver('002',0,'100%','auto','hidden');"&gt;&lt;br /&gt;&lt;img src="http://img195.imageshack.us/img195/4356/002xp.png" alt="Image Hosted by ImageShack.us" /&gt;By &lt;a target="_new" href="http://profile.imageshack.us/user/xdrtas_001"&gt;xdrtas_001&lt;/a&gt; at 2011-02-09&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Buscar la opción "&lt;span style="font-family:Courier New; font-size:10pt"&gt;shared_preload_libraries&lt;/span&gt;".&lt;br /&gt;&lt;div id="003" style="overflow: hidden; width: 100%;" onmouseover="javascript:Ver('003', 1, '100%', 'auto', 'hidden');" onmouseout="javascript:Ver('003',0,'100%','auto','hidden');"&gt;&lt;br /&gt;&lt;img src="http://img217.imageshack.us/img217/2371/003hw.png" alt="Image Hosted by ImageShack.us" /&gt;By &lt;a target="_new" href="http://profile.imageshack.us/user/xdrtas_001"&gt;xdrtas_001&lt;/a&gt; at 2011-02-09&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Colocar la siguiente ruta como se muestra a continuación: &lt;strong&gt;shared_preload_libraries = '$libdir/plugins/plugin_debugger.dll'&lt;/strong&gt; #Guardar los cambios.&lt;br /&gt;&lt;div id="004" style="overflow: hidden; width: 100%;" onmouseover="javascript:Ver('004', 1, '100%', 'auto', 'hidden');" onmouseout="javascript:Ver('004',0,'100%','auto','hidden');"&gt;&lt;br /&gt;&lt;img src="http://img638.imageshack.us/img638/4492/004dsc.png" alt="Image Hosted by ImageShack.us" /&gt;By &lt;a target="_new" href="http://profile.imageshack.us/user/xdrtas_001"&gt;xdrtas_001&lt;/a&gt; at 2011-02-09&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Detener PostgreSQL y volverlo a iniciar.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Iniciar pgAdminIII y buscar la Base de datos donde se requiera el uso del debugger.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Como se puede observar en la siguiente imagen, la opción "Debugging" está inhabilitado pese a que se tiene seleccionado la función a la cual se le va aplicar el debugger, que en este caso, la función es "modfechserial(bigint, date, date), el siguiente paso es habilitar la opción "Debugging".&lt;br /&gt;&lt;br /&gt;&lt;div id="007" style="overflow: hidden; width: 100%;" onmouseover="javascript:Ver('007', 1, '100%', 'auto', 'hidden');" onmouseout="javascript:Ver('007',0,'100%','auto','hidden');"&gt;&lt;br /&gt;&lt;img src="http://img843.imageshack.us/img843/694/007mi.png" alt="Image Hosted by ImageShack.us" /&gt;&lt;br /&gt;By &lt;a target="_new" href="http://profile.imageshack.us/user/xdrtas_001"&gt;xdrtas_001&lt;/a&gt; at 2011-02-09&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Abrir una ventana de Query y hacer click en "Abrir" o "Open" según el idioma en que esté configurado el pgAdminIII.&lt;br /&gt;&lt;br /&gt;&lt;div id="008" style="overflow: hidden; width: 100%;" onmouseover="javascript:Ver('008', 1, '100%', 'auto', 'hidden');" onmouseout="javascript:Ver('008',0,'100%','auto','hidden');"&gt;&lt;br /&gt;&lt;img src="http://img707.imageshack.us/img707/6920/008ntx.png" alt="Image Hosted by ImageShack.us" /&gt;&lt;br /&gt;By &lt;a target="_new" href="http://profile.imageshack.us/user/xdrtas_001"&gt;xdrtas_001&lt;/a&gt; at 2011-02-09&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Ir a la siguiente ruta:&lt;strong&gt; ..\PostgreSQL\9.0\share\contrib &lt;/strong&gt;y buscar el archivo &lt;strong&gt;pldbgapi.sql.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;div id="009" style="overflow: hidden; width: 100%;" onmouseover="javascript:Ver('009', 1, '100%', 'auto', 'hidden');" onmouseout="javascript:Ver('009',0,'100%','auto','hidden');"&gt;&lt;br /&gt;&lt;img src="http://img844.imageshack.us/img844/7186/009uj.png" alt="Image Hosted by ImageShack.us" /&gt;&lt;br /&gt;By &lt;a target="_new" href="http://profile.imageshack.us/user/xdrtas_001"&gt;xdrtas_001&lt;/a&gt; at 2011-02-09&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Ejecutar el script cargado.&lt;br /&gt;&lt;div id="010" style="overflow: hidden; width: 100%;" onmouseover="javascript:Ver('010', 1, '100%', 'auto', 'hidden');" onmouseout="javascript:Ver('010',0,'100%','auto','hidden');"&gt;&lt;br /&gt;&lt;img src="http://img8.imageshack.us/img8/4986/010ov.png" alt="Image Hosted by ImageShack.us" /&gt;&lt;br /&gt;By &lt;a target="_new" href="http://profile.imageshack.us/user/xdrtas_001"&gt;xdrtas_001&lt;/a&gt; at 2011-02-09&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Como se puede observar en la siguiente imagen, la opción de "Debugging" ya está habilitado para las funciones de esa base de datos.&lt;br /&gt;&lt;div id="011" style="overflow: hidden; width: 100%;" onmouseover="javascript:Ver('011', 1, '100%', 'auto', 'hidden');" onmouseout="javascript:Ver('011',0,'100%','auto','hidden');"&gt;&lt;br /&gt;&lt;img src="http://img200.imageshack.us/img200/1290/011ek.png" alt="Image Hosted by ImageShack.us" /&gt;&lt;br /&gt;By &lt;a target="_new" href="http://profile.imageshack.us/user/xdrtas_001"&gt;xdrtas_001&lt;/a&gt; at 2011-02-09&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Puntos a considerar:&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Al abrir el archivo de "postgresql.conf" es importante recordar quitar el símbolo de numeral "#"al comienzo de la línea shared_preload_libraries.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Una vez hecha esa modificación hay que reiniciar el servidor de base de datos.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Si al ejecutar el script "pldbgapi.sql" no aparece habilitado la opción "Debugging" entonces reiniciar de nuevo el servidor.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;La opción de "Debugging" sólo se habilitará cuando se seleccione una de las funciones.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;No hace falta bajar ningún archivo extra, todo lo necesario para habilitar el "Debugging" se encuentra en el instalador "one-click-installer".&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Hecho por David Lastra – XDRTAS&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Un cordial saludo.&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2124217069974135740-3231344550389845602?l=xdrtas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xdrtas.blogspot.com/feeds/3231344550389845602/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2124217069974135740&amp;postID=3231344550389845602&amp;isPopup=true' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2124217069974135740/posts/default/3231344550389845602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2124217069974135740/posts/default/3231344550389845602'/><link rel='alternate' type='text/html' href='http://xdrtas.blogspot.com/2011/02/0007-instalar-pldebugger-en-postgresql.html' title='0007 – Instalar pldebugger en postgreSQL bajo Windows'/><author><name>xdrtas</name><uri>http://www.blogger.com/profile/06633503378192749976</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-GTZO4GO-ad0/TW-HR7ov2BI/AAAAAAAAADI/2tiQbfNTfbI/s220/IMG00092-20101128-1206.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2124217069974135740.post-9186221900836301220</id><published>2010-08-16T11:51:00.024-04:30</published><updated>2011-12-15T10:42:22.770-04:30</updated><title type='text'>0006 Ajax – PHP – PostgreSQL II</title><content type='html'>&lt;div id="diagramaAJAXPHP" onmouseout="javascript:Ver('diagramaAJAXPHP',0,'100%','auto','hidden');" onmouseover="javascript:Ver('diagramaAJAXPHP', 1, '100%', 'auto', 'hidden');" style="overflow: hidden; width: 100%;"&gt;&lt;br /&gt;&lt;a href="http://img571.imageshack.us/i/phpajaxpostgresqlii.png/" target="_blank" title="ImageShack - Image And Video Hosting"&gt;&lt;img border="0" src="http://a.imageshack.us/img571/5796/phpajaxpostgresqlii.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;En este segundo tutorial sobre AJAX – PHP – PostgreSQL se van a tratar los siguientes puntos:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Mostrar el contenido de la página "index.html" dependiendo de un parámetro seleccionado por el usuario.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Enviar un parámetro a través de AJAX al script de PHP por medio de POST.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Guardar el resultado de la consulta SQL en formato XML y leer el contenido del resultado mediante AJAX.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Leer etiquetas HTML contenidos en el XML resultante.&lt;/li&gt;&lt;li&gt;Leer caracteres especiales HTML, (á, é, í, ó, ú), contenidos en el archivo XML dentro de los etiquetas HTML.&lt;/li&gt;&lt;/ol&gt;Código de la tabla ajax:&lt;br /&gt;&lt;div id="consultaSQL" onmouseout="javascript:Ver('consultaSQL',0,'100%','auto','hidden');" onmouseover="javascript:Ver('consultaSQL', 1, '150%', 'auto', 'hidden');" style="color: white; overflow: hidden; width: 100%;"&gt;&lt;br /&gt;&lt;table border="0" style="background: white repeat scroll 0% 0% rgb(0, 32, 96); border-collapse: collapse;"&gt;&lt;colgroup&gt;&lt;/colgroup&gt;&lt;colgroup&gt;&lt;col style="width: 604px;"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody style="color: black;" valign="top"&gt;&lt;tr style="height: 563px;"&gt;&lt;td style="border: 0.5pt solid black; font-family: Courier New; font-size: 8pt; padding-left: 7px; padding-right: 7px;"&gt;&lt;br /&gt;&lt;pre&gt;CREATE TABLE ajax&lt;br /&gt;&lt;br /&gt;(&lt;br /&gt;&lt;br /&gt;id serial NOT NULL,&lt;br /&gt;&lt;br /&gt;nombre character varying(50),&lt;br /&gt;&lt;br /&gt;apellido character varying,&lt;br /&gt;&lt;br /&gt;cedula character varying(8),&lt;br /&gt;&lt;br /&gt;sexo boolean,&lt;br /&gt;&lt;br /&gt;CONSTRAINT pid PRIMARY KEY (id)&lt;br /&gt;&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;WITH (&lt;br /&gt;&lt;br /&gt;OIDS=FALSE&lt;br /&gt;&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;ALTER TABLE ajax OWNER TO postgres;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;INSERT INTO ajax (id, nombre, apellido, cedula, sexo) VALUES (1, 'David', 'Lastra', '14852152', true);&lt;br /&gt;&lt;br /&gt;INSERT INTO ajax (id, nombre, apellido, cedula, sexo) VALUES (2, 'David', 'Lastra', '14852152', true);&lt;br /&gt;&lt;br /&gt;INSERT INTO ajax (id, nombre, apellido, cedula, sexo) VALUES (3, 'David', 'Lastra', '14852152', true);&lt;br /&gt;&lt;br /&gt;INSERT INTO ajax (id, nombre, apellido, cedula, sexo) VALUES (4, 'David', 'Lastra', '14852152', true);&lt;br /&gt;&lt;br /&gt;INSERT INTO ajax (id, nombre, apellido, cedula, sexo) VALUES (5, 'David', 'Lastra', '14852152', true);&lt;br /&gt;&lt;br /&gt;INSERT INTO ajax (id, nombre, apellido, cedula, sexo) VALUES (6, 'Miss', 'Universo', '11111111', false);&lt;br /&gt;&lt;br /&gt;INSERT INTO ajax (id, nombre, apellido, cedula, sexo) VALUES (7, 'Miss', 'Universo', '11111111', false);&lt;br /&gt;&lt;br /&gt;INSERT INTO ajax (id, nombre, apellido, cedula, sexo) VALUES (8, 'Miss', 'Universo', '11111111', false);&lt;br /&gt;&lt;br /&gt;INSERT INTO ajax (id, nombre, apellido, cedula, sexo) VALUES (9, 'Miss', 'Universo', '11111111', false);&lt;br /&gt;&lt;br /&gt;INSERT INTO ajax (id, nombre, apellido, cedula, sexo) VALUES (10, 'Miss', 'Universo', '11111111', false);&lt;br /&gt;&lt;br /&gt;INSERT INTO ajax (id, nombre, apellido, cedula, sexo) VALUES (11, 'Miss', 'Universo', '11111111', false);&lt;br /&gt;&lt;br /&gt;INSERT INTO ajax (id, nombre, apellido, cedula, sexo) VALUES (12, 'David', 'Lastra', '14852152', true);&lt;br /&gt;&lt;br /&gt;INSERT INTO ajax (id, nombre, apellido, cedula, sexo) VALUES (13, 'David', 'Lastra', '14852152', true);&lt;br /&gt;&lt;br /&gt;INSERT INTO ajax (id, nombre, apellido, cedula, sexo) VALUES (14, 'David', 'Lastra', '14852152', true);&lt;br /&gt;&lt;br /&gt;INSERT INTO ajax (id, nombre, apellido, cedula, sexo) VALUES (15, 'David', 'Lastra', '14852152', true);&lt;br /&gt;&lt;br /&gt;INSERT INTO ajax (id, nombre, apellido, cedula, sexo) VALUES (16, 'Miss', 'Universo', '11111111', false);&lt;br /&gt;&lt;br /&gt;INSERT INTO ajax (id, nombre, apellido, cedula, sexo) VALUES (17, 'Miss', 'Universo', '11111111', false);&lt;br /&gt;&lt;br /&gt;INSERT INTO ajax (id, nombre, apellido, cedula, sexo) VALUES (18, 'Miss', 'Universo', '11111111', false);&lt;br /&gt;&lt;br /&gt;INSERT INTO ajax (id, nombre, apellido, cedula, sexo) VALUES (19, 'Miss', 'Universo', '11111111', false);&lt;br /&gt;&lt;br /&gt;INSERT INTO ajax (id, nombre, apellido, cedula, sexo) VALUES (20, 'Miss', 'Universo', '11111111', false);&lt;br /&gt;&lt;br /&gt;INSERT INTO ajax (id, nombre, apellido, cedula, sexo) VALUES (21, 'Miss', 'Universo', '11111111', false);&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;La primera parte consta de la creación de la tabla con el nombre de "ajax" en minúsculas. La segunda parte es la inserción de datos para trabajar con los mismos desde los scripts.&lt;br /&gt;&lt;br /&gt;Código index.html:&lt;br /&gt;&lt;br /&gt;&lt;div id="codigoHTML" onmouseout="javascript:Ver('codigoHTML',0,'100%','auto','hidden');" onmouseover="javascript:Ver('codigoHTML', 1, '150%', 'auto', 'hidden');" style="overflow: hidden; width: 100%;"&gt;&lt;br /&gt;&lt;table border="0" style="background: white repeat scroll 0% 0% rgb(0, 32, 96); border-collapse: collapse;"&gt;&lt;colgroup&gt;&lt;col style="width: 604px;"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody valign="top"&gt;&lt;tr style="height: 555px;"&gt;&lt;td style="border: 0.5pt solid black; font-family: Courier New; font-size: 8pt; padding-left: 7px; padding-right: 7px;"&gt;&lt;pre&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;title&amp;gt;Prueba de [ AJAX - PHP - POSTGRESQL II]&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ffc000;"&gt; &amp;lt;script language="javascript" src="js/ajax.js" type="application/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;body style="background-color:#366;"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;table border="0" style="color:white; background-color:#000;" align="center"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;td colspan="2" align="center"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;strong&amp;gt;Prueba de:&amp;lt;/strong&amp;gt;&amp;lt;span style="color:#F00; font-weight:bolder;"&amp;gt;[ AJAX - PHP - POSTGRESQL II]&amp;lt;/span&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;td colspan="2"&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ffc000;"&gt;         &amp;lt;div id="contenido" style="color:#1FE4EF; font-family:'Times New Roman', Times, serif;"&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;td align="center"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;form action="#" name="frmSexo"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;select name="sexo"&amp;gt;&amp;lt;option value="true" &amp;gt;Hombre&amp;lt;/option&amp;gt;&amp;lt;option value="false"&amp;gt;Mujer&amp;lt;/option&amp;gt;&amp;lt;/select&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;hr /&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #fabf8f;"&gt;         &amp;lt;a href="#" onclick="javascript:fDatos('contenido',&lt;/span&gt;&lt;span style="color: #00b050;"&gt;frmSexo.sexo.options[frmSexo.sexo.selectedIndex].value&lt;/span&gt;&lt;span style="color: #fabf8f;"&gt; ,'ajax.php');" style="color:#0F0; text-decoration:none;"&amp;gt;[ Mostrar datos ]&amp;lt;/a&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;td align="center"&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ffc000;"&gt;         &amp;lt;a href="#" onclick="javascript:fBorrar('contenido');" style="color:#F00; text-decoration:none;"&amp;gt;[ Limpiar contenido ]&amp;lt;/a&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;Las etiquetas HTML más importantes que se muestran arriba están resaltadas en colores.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&amp;lt;script language&amp;gt;: para indicar donde se encuentra el archivo javascript con las funciones a usar.&lt;/li&gt;&lt;li&gt;&amp;lt;div id="contenido"&amp;gt;: el contenido de este div es el que se va a modificar por medio de las funciones "fDatos" y "fBorrar" de javascript.&lt;/li&gt;&lt;li&gt;&amp;lt;form name="frmSexo"&amp;gt;: formulario con un campo select para seleccionar los datos de las personas de la tabla "ajax" según el sexo.&lt;/li&gt;&lt;li&gt;&amp;lt;a href="#" onclick="javascript:fDatos&amp;gt;: Al hacer "click" en éste link se inicia el proceso para la carga de datos mediante AJAX en el DIV correspondiente.&lt;/li&gt;&lt;li&gt;&amp;lt;a href="#" onclick="javascript:fBorrar&amp;gt;: Al hacer "click" en éste link se borra el contenido del DIV.&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;span style="color: red;"&gt;fDatos(&lt;/span&gt;&lt;span style="color: #00b0f0;"&gt;'contenido'&lt;/span&gt;&lt;span style="color: #fabf8f;"&gt;,&lt;/span&gt;&lt;span style="color: #f79646;"&gt;frmSexo.sexo.options[&lt;/span&gt;&lt;span style="color: #548dd4;"&gt;frmSexo.sexo.selectedIndex&lt;/span&gt;&lt;span style="color: #f79646;"&gt;].value&lt;/span&gt;&lt;span style="color: #fabf8f;"&gt; ,&lt;/span&gt;&lt;span style="color: #948a54;"&gt;'ajax.php'&lt;/span&gt;&lt;span style="color: red;"&gt;);&lt;/span&gt;:&lt;/div&gt;&lt;ol&gt;&lt;li&gt;fDatos: nombre de la función javascript.&lt;/li&gt;&lt;li&gt;'contenido': nombre de la etiqueta DIV donde se va a modificar el contenido.&lt;/li&gt;&lt;li&gt;frmSexo.sexo.options[].value: El valor seleccionado por el usuario en el menú desplegable, (frmSexo.sexo.options &lt;span style="font-family: Wingdings;"&gt;à&lt;/span&gt; es un array para poder acceder a los posibles valores), los posibles valores para este caso son: true - "Hombre", false – "Mujer".&lt;/li&gt;&lt;li&gt;frmSexo.sexo.selectedIndex: Sirve para indicar cuál es la opción actualmente seleccionada por el usuario. El valor seleccionado del menú desplegable, (0 - true, 1 - false).&lt;/li&gt;&lt;li&gt;&lt;b&gt;frmSexo.sexo.options[ &lt;/b&gt;frmSexo.sexo.selectedIndex&lt;b&gt; ].value = true o false&lt;/b&gt;.&lt;b&gt;&lt;br /&gt; &lt;/b&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;fBorrar('contenido'): Función que se encarga de borrar el contenido al DIV seleccionado.&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/li&gt;&lt;/ol&gt;Código ajax.js:&lt;br /&gt;&lt;br /&gt;&lt;div id="codigoJS" onmouseout="javascript:Ver('codigoJS',0,'100%','auto','hidden');" onmouseover="javascript:Ver('codigoJS', 1, '150%', 'auto', 'hidden');" style="overflow: hidden; width: 100%;"&gt;&lt;br /&gt;&lt;table border="0" style="background: white repeat scroll 0% 0% rgb(0, 32, 96); border-collapse: collapse;"&gt;&lt;colgroup&gt;&lt;col style="width: 604px;"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody valign="top"&gt;&lt;tr&gt;&lt;td style="border: 0.5pt solid black; font-family: Courier New; font-size: 8pt; padding-left: 7px; padding-right: 7px;"&gt;&lt;pre&gt;/*------------------------------------------------------*/&lt;br /&gt;&lt;br /&gt;//Función para crear el objeto Ajax.                    //&lt;br /&gt;&lt;br /&gt;/*------------------------------------------------------*/&lt;br /&gt;&lt;br /&gt;function nuevoAjax()&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;var xmlhttp=false;&lt;br /&gt;&lt;br /&gt;try&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;catch (e)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;try&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;catch (e)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;xmlhttp = false;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;if (!xmlhttp &amp;amp;&amp;amp; typeof XMLHttpRequest!='undefined')&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;xmlhttp = new XMLHttpRequest();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;return xmlhttp;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/*------------------------------------------------------*/&lt;br /&gt;&lt;br /&gt;//id: id del control div que va a recibir los datos.    //&lt;br /&gt;&lt;br /&gt;//sexo: verdadero o falso, filtro booleando para la     //&lt;br /&gt;&lt;br /&gt;//carga de datos según el campo sexo.                   //&lt;br /&gt;&lt;br /&gt;//url: Dirección url de la página donde se              //&lt;br /&gt;&lt;br /&gt;//obtiene los datos.                                    //&lt;br /&gt;&lt;br /&gt;/*------------------------------------------------------*/&lt;br /&gt;&lt;br /&gt;function fDatos(id, sexo, url)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;var objDiv = document.getElementById(id);&lt;br /&gt;&lt;br /&gt;var objXML = null;&lt;br /&gt;&lt;br /&gt;var objTBL = null;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;if (sexo == 'true')&lt;br /&gt;&lt;br /&gt;sexo = true;&lt;br /&gt;&lt;br /&gt;else&lt;br /&gt;&lt;br /&gt;sexo = false;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ajax = nuevoAjax();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ajax.open("POST", url, true);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ajax.onreadystatechange = function()&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;switch (ajax.readyState)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;case 0:&lt;br /&gt;&lt;br /&gt;objDiv.innerHTML = 'Error 0. No se ha abierto la comunicaci&amp;amp;oacute;n.';&lt;br /&gt;&lt;br /&gt;break;&lt;br /&gt;&lt;br /&gt;case 1:&lt;br /&gt;&lt;br /&gt;objDiv.innerHTML = 'Por favor, espere. Cargando...';&lt;br /&gt;&lt;br /&gt;break;&lt;br /&gt;&lt;br /&gt;case 2:&lt;br /&gt;&lt;br /&gt;objDiv.innerHTML = 'Petici&amp;amp;oacute;n cargada, esperando respuesta del servidor...';&lt;br /&gt;&lt;br /&gt;break;&lt;br /&gt;&lt;br /&gt;case 3:&lt;br /&gt;&lt;br /&gt;objDiv.innerHTML = '';&lt;br /&gt;&lt;br /&gt;break;&lt;br /&gt;&lt;br /&gt;case 4:&lt;br /&gt;&lt;br /&gt;if(ajax.status == 200)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;try&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;objDiv.innerHTML = "Datos a mostrar... &amp;lt;hr /&amp;gt;";&lt;br /&gt;&lt;br /&gt;objXML = ajax.responseXML;&lt;br /&gt;&lt;br /&gt;objTBL = objXML.getElementsByTagName('tabla');&lt;br /&gt;&lt;br /&gt;objDiv.innerHTML += objTBL[0].firstChild.nodeValue;&lt;br /&gt;&lt;br /&gt;objDiv.innerHTML += "&amp;lt;hr /&amp;gt;";&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;catch (e)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;objDiv.innerHTML += e.toString() + " Error al recibir datos de archivo XML...";&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;else&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;objDiv.innerHTML = 'Error 200';&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;break;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");&lt;br /&gt;&lt;br /&gt;ajax.send("sexo="+sexo);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/*------------------------------------------------------*/&lt;br /&gt;&lt;br /&gt;//Borrar los datos de la celda en la página web...      //&lt;br /&gt;&lt;br /&gt;/*------------------------------------------------------*/&lt;br /&gt;&lt;br /&gt;function fBorrar(id)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;document.getElementById(id).innerHTML = "";&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Función nuevoAjax: Se encarga de crear el objeto AJAX para poder hacer la carga de datos de forma asincrónica.&lt;/li&gt;&lt;li&gt;&lt;div&gt;Función fDatos:&lt;/div&gt;&lt;ol&gt;&lt;li&gt;Id = id del objeto DIV que se va a manipular.&lt;/li&gt;&lt;li&gt;Sexo = booleano, filtro para obtener datos según la selección hecha por el usuario mediante el control SELECT del formulario de la página "index.html".&lt;/li&gt;&lt;li&gt;url = página que se va a llamar para obtener los datos deseados mediante AJAX, en este caso la página a llamar es "ajax.php".&lt;/li&gt;&lt;li&gt;El valor de los parámetros es colocado en la llamada a la función fDatos en la página de "index.html".&lt;/li&gt;&lt;li&gt;objXML = ajax.responseXML;: Indica que el tipo de respuesta vendrá en formato XML.&lt;/li&gt;&lt;li&gt;objTBL = objXML.getElementsByTagName('tabla');: Se asigna a la variable objTBL el contenido de la etiqueta "tabla" del archivo XML. "objTBL" es un array del tamaño de todas las etiquetas con el nombre "tabla" que existan en el archivo XML. (En el siguiente apartado se verá el contenido del archivo XML).&lt;/li&gt;&lt;li&gt;objDiv.innerHTML += objTBL[0].firstChild.nodeValue;: Se accede al valor del primer elemento de la variable "objTBL" y se muestra en la etiqueta DIV correspondiente, para este caso 'contenido'.&lt;/li&gt;&lt;li&gt;ajax.send("sexo="+sexo);: En el método "send" del objeto "ajax" se introduce el parámetro que se va a enviar al script "ajax.php". En el caso de que se quiera enviar más parámetros, la cadena de construcción queda con el siguiente formato: [ajax.send("nomvar1="+valvar1+"&amp;amp;nomvar2="+valvar2+"&amp;amp;nomvar3="+valvar3 + … +"&amp;amp;nomvarN="+valvarN)]. Hay que usar el carácter "&amp;amp;" para concatenar las variables.&lt;/li&gt;&lt;li&gt;&lt;b&gt;"nomvar&lt;/b&gt;" acrónimo  de &lt;b&gt;nom&lt;/b&gt;bre de &lt;b&gt;var&lt;/b&gt;iable. "&lt;b&gt;val&lt;/b&gt;var" acrónimo de &lt;b&gt;val&lt;/b&gt;or de &lt;b&gt;var&lt;/b&gt;iable.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;Función fBorrar: Se encarga de limpiar el contenido de la etiqueta DIV.&lt;/li&gt;&lt;/ol&gt;Código ajax.php:&lt;br /&gt;&lt;br /&gt;&lt;div id="codigoPHP" onmouseout="javascript:Ver('codigoPHP',0,'100%','auto','hidden');" onmouseover="javascript:Ver('codigoPHP', 1, '150%', 'auto', 'hidden');" style="overflow: hidden; width: 100%;"&gt;&lt;br /&gt;&lt;table border="0" style="background: white repeat scroll 0% 0% rgb(0, 32, 96); border-collapse: collapse;"&gt;&lt;colgroup&gt;&lt;col style="width: 604px;"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody valign="top"&gt;&lt;tr&gt;&lt;td style="border: 0.5pt solid black; font-family: Courier New; font-size: 8pt; padding-left: 7px; padding-right: 7px;"&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;?php&lt;br /&gt;&lt;br /&gt;$conbd = pg_connect("host=localhost port=5432 dbname=prueba user=tuusuario password=tucontraseña") or die(pg_last_error());&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$sql = "SELECT id, nombre, apellido, cedula FROM ajax WHERE sexo = " . $_POST['sexo'] . ";";&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$res = pg_query($conbd, $sql);&lt;br /&gt;&lt;br /&gt;if($res)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;if(pg_num_rows($res)&amp;gt;0)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;header("Content-Type: text/xml");&lt;br /&gt;&lt;br /&gt;$xml  = "&amp;lt;?xml version='1.0' encoding='ISO-8859-1' ?&amp;gt;\n";&lt;br /&gt;&lt;br /&gt;$xml .= "&amp;lt;datos&amp;gt;\n";&lt;br /&gt;&lt;br /&gt;$xml .= "&amp;lt;tablas&amp;gt;\n";&lt;br /&gt;&lt;br /&gt;$xml .= "&amp;lt;tabla&amp;gt;";&lt;br /&gt;&lt;br /&gt;$xml .= "&amp;lt;!--&amp;lt;table border=\"1\"&amp;gt;\n";&lt;br /&gt;&lt;br /&gt;$xml .= "&amp;lt;tr&amp;gt;\n";&lt;br /&gt;&lt;br /&gt;$xml .= "&amp;lt;td align=\"center\"&amp;gt; [ ID ]           &amp;lt;/td&amp;gt;\n";&lt;br /&gt;&lt;br /&gt;$xml .= "&amp;lt;td align=\"center\"&amp;gt; [ NOMBRE ]       &amp;lt;/td&amp;gt;\n";&lt;br /&gt;&lt;br /&gt;$xml .= "&amp;lt;td align=\"center\"&amp;gt; [ APELLIDO ]     &amp;lt;/td&amp;gt;\n";&lt;br /&gt;&lt;br /&gt;$xml .= "&amp;lt;td align=\"center\"&amp;gt; [ C&amp;amp;#201;DULA ]  &amp;lt;/td&amp;gt;\n";&lt;br /&gt;&lt;br /&gt;$xml .= "&amp;lt;/tr&amp;gt;\n";&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;while($val = pg_fetch_array($res))&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;$xml .= "&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;" . $val[0] . "&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;" . $val[1] . "&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;" . $val[2] . "&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;" . $val[3] . "&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;\n";&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$xml .= "&amp;lt;/table&amp;gt;--&amp;gt;";&lt;br /&gt;&lt;br /&gt;$xml .= "&amp;lt;/tabla&amp;gt;\n";&lt;br /&gt;&lt;br /&gt;$xml .= "&amp;lt;/tablas&amp;gt;\n";&lt;br /&gt;&lt;br /&gt;$xml .= "&amp;lt;/datos&amp;gt;\n";&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;echo $xml;  //escribe, en resultado, un archivo XML con los datos obtenidos mediante la consulta…&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;pg_free_result($res);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;pg_close($conbd);&lt;br /&gt;&lt;br /&gt;?&amp;gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;En el script "ajax.php" es donde se va a crear el contenido XML con los datos que se obtienen de la consulta SQL. Se describe, a continuación, los pasos del script "ajax.php":&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Cadena de conexión para acceder a la base de datos con el nombre de "prueba", ($conbd: ID de conexión).&lt;/li&gt;&lt;li&gt;Cadena de consulta que tiene por filtro la variable "sexo" que viene por POST desde AJAX y se ejecuta sobre la tabla "ajax", ($sql - $_POST['sexo']).&lt;/li&gt;&lt;li&gt;Ejecución de la consulta, ($res = pg_query($conbd, $sql);).&lt;/li&gt;&lt;li&gt;Si la consulta es correcta, entonces…&lt;/li&gt;&lt;li&gt;Si la consulta ha traído más de 0 filas entonces…&lt;/li&gt;&lt;li&gt;Se define la cabecera del archivo con el comando "header". "Content-Type: text/xml", define los datos que siguen como contenido XML.&lt;/li&gt;&lt;li&gt;La primera línea del archivo XML define la versión y la codificación de caracteres.&lt;/li&gt;&lt;li&gt;Primera etiqueta: &amp;lt;datos&amp;gt;\n.&lt;/li&gt;&lt;li&gt;Segunda etiqueta: &amp;lt;tablas&amp;gt;\n.&lt;/li&gt;&lt;li&gt;Tercera etiqueta: &amp;lt;tabla&amp;gt; + código embebido HTML (Siguiente punto a explicar) + &amp;lt;/tabla&amp;gt;\n.&lt;/li&gt;&lt;li&gt;Cerrar segunda etiqueta: &amp;lt;/tablas&amp;gt;\n.&lt;/li&gt;&lt;li&gt;Cerrar primera etiqueta: &amp;lt;/datos&amp;gt;.&lt;/li&gt;&lt;li&gt;echo $xml;: Mostrar el resultado.&lt;/li&gt;&lt;li&gt;Limpiar la consulta, (pg_free_result($res);).&lt;/li&gt;&lt;li&gt;Cerrar la conexión a la base de datos, (pg_close($conbd);).&lt;/li&gt;&lt;/ol&gt;Código embebido HTML:&lt;br /&gt;El código HTML del script "ajax.php" está embebido en el XML resultante del script "ajax.php". Para que se puedan interpretar los tags HTML, el HTML embebido debe empezar como si se tratase como un comentario, como se muestra a continuación: &amp;lt;!—Introducir código HTML aquí. --&amp;gt;. Esto permite la distinción entre las etiquetas XML y las etiquetas HTML.&lt;br /&gt;Todos las etiquetas HTML entre de "&amp;lt;!--" y "--&amp;gt;" serán ignorados como etiquetas XML pero no como etiquetas HTML, lo que permite recuperar el contenido HTML sin que entre en conflicto con las etiquetas XML. Es muy importante que se tenga presente lo siguiente: XML no puede leer, distinguir ni interpretar código HTML, si dentro de un archivo XML se encuentra una etiqueta HTML como por ejemplo "&amp;lt;br&amp;gt;" o "&amp;lt;table&amp;gt;", XML lo tomará como parte del formato del documento, no como una etiqueta HTML.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;"&amp;lt;!--&amp;lt;table border=\"1\"&amp;gt;\n";: Inicio del comentario XML e inicio de la etiqueta &amp;lt;table&amp;gt; para definir la tabla con los resultados a mostrar.&lt;/li&gt;&lt;li&gt;"&amp;lt;tr&amp;gt;\n";: Inicio de la primera fila que contiene la cabecera de la tabla.&lt;/li&gt;&lt;li&gt;"&amp;lt;td align=\"center\"&amp;gt;[ ID ]&amp;lt;/td&amp;gt;\n";: Celda ID.&lt;/li&gt;&lt;li&gt;"&amp;lt;td align=\"center\"&amp;gt;[ NOMBRE ]&amp;lt;/td&amp;gt;\n";: Celda Nombre.&lt;/li&gt;&lt;li&gt;"&amp;lt;td align=\"center\"&amp;gt;[ APELLIDO ]&amp;lt;/td&amp;gt;\n";: Celda Apellido.&lt;/li&gt;&lt;li&gt;"&amp;lt;td align=\"center\"&amp;gt;[ C&amp;amp;#201;DULA ]&amp;lt;/td&amp;gt;\n";: Celda Cédula.&lt;/li&gt;&lt;li&gt;"&amp;lt;/tr&amp;gt;\n";: Fin de la cabecera.&lt;/li&gt;&lt;li&gt;while($val = pg_fetch_array($res)): Bucle para obtener todas las filas devueltas por la consulta.&lt;/li&gt;&lt;li&gt;"&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;" . $val[0] . "&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;" . $val[1] . "&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;" . $val[2] . "&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;" . $val[3] . "&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;\n";: Fila y celdas con los datos obtenidos de la consulta.&lt;/li&gt;&lt;li&gt;"&amp;lt;/table&amp;gt;--&amp;gt;";: Cierre del tag HTML "&amp;lt;/table&amp;gt;" y cierre de la línea de comentario XML "--&amp;gt;".&lt;/li&gt;&lt;/ol&gt;A continuación se muestra como se vería el XML resultante, desde mozilla firefox, al ejecutar el script "ajax.php" con el parámetro "true" en la consulta SQL.&lt;br /&gt;&lt;br /&gt;&lt;div id="codigoXML" onmouseout="javascript:Ver('codigoXML',0,'100%','auto','hidden');" onmouseover="javascript:Ver('codigoXML', 1, '150%', 'auto', 'hidden');" style="overflow: hidden; width: 100%;"&gt;&lt;br /&gt;&lt;table border="0" style="background: white repeat scroll 0% 0% rgb(0, 32, 96); border-collapse: collapse;"&gt;&lt;colgroup&gt;&lt;col style="width: 604px;"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody valign="top"&gt;&lt;tr style="height: 357px;"&gt;&lt;td style="border: 0.5pt solid black; font-family: Courier New; font-size: 8pt; padding-left: 7px; padding-right: 7px;"&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="ISO-8859-1"?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;datos&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;tablas&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;tabla&amp;gt;&amp;lt;!--&amp;lt;table border="1"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;td align="center"&amp;gt; [ ID ]           &amp;lt;/td&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;td align="center"&amp;gt; [ NOMBRE ]       &amp;lt;/td&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;td align="center"&amp;gt; [ APELLIDO ]     &amp;lt;/td&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;td align="center"&amp;gt; [ C&amp;amp;#201;DULA ]  &amp;lt;/td&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;David&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Lastra&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;14852152&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;David&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Lastra&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;14852152&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;David&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Lastra&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;14852152&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;David&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Lastra&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;14852152&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;David&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Lastra&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;14852152&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;12&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;David&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Lastra&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;14852152&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;13&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;David&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Lastra&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;14852152&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;14&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;David&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Lastra&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;14852152&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;15&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;David&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Lastra&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;14852152&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/table&amp;gt;--&amp;gt;&amp;lt;/tabla&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/tablas&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/datos&amp;gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;Caracteres especiales HTML:&lt;br /&gt;Dentro de las etiquetas XML se pueden encontrar fallos a la hora de usar entidades por nombre para visualizar caracteres especiales HTML, la solución pasa por usar su equivalente  entidad numérica.&lt;br /&gt;Si hay errores al visualizar caracteres especiales HTML dentro de las etiquetas XML como entidades por nombre, "&amp;amp;aacute;",  siempre se puede recurrir a su equivalente entidad numérica. Por ejemplo, la palabra "Cédula" en HTML se podría escribir de la siguiente manera "C&amp;amp;eacute;dula", pero, con la codificación de caracteres actual "&amp;amp;eacute;" no funciona dentro del XML, para solucionar este inconveniente se puede recurrir a su entidad numérica "&amp;amp;#201;" y quedaría de la siguiente manera "C&amp;amp;#201;dula".&lt;br /&gt;Usando la correspondiente entidad numérica se puede solventar los fallos de interpretación de las entidades por nombre de las etiquetas HTML en el contenido XML.&lt;br /&gt;A continuación adjunto el link con las tablas de conversiones entre entidades por nombre y su correspondencia a entidades numéricas: &lt;a href="http://www.w3schools.com/tags/ref_entities.asp"&gt;Tablas de conversión&lt;/a&gt;&lt;br /&gt;Resumen:&lt;br /&gt;En este artículo se han cubierto los siguientes puntos:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Paso de parámetros desde AJAX por POST a PHP usando el método "send".&lt;/li&gt;&lt;li&gt;Según el parámetro seleccionado el contenido a mostrar cambia dentro de la página HTML.&lt;/li&gt;&lt;li&gt;Lectura HTML embebido en XML por medio de javascript.&lt;/li&gt;&lt;li&gt;Guardar el resultado obtenido en la consulta SQL a formato XML.&lt;/li&gt;&lt;li&gt;Interpretar caracteres especiales HTML embebidos en XML mediante el uso de entidades numéricas en el caso de que falle la interpretación de entidades por nombre.&lt;/li&gt;&lt;/ul&gt;Si tienen alguna duda o algo constructivo que añadir, pueden dejar un comentario o enviarme un e-mail.&lt;br /&gt;Un cordial saludo.&lt;br /&gt;Firma: &lt;span style="color: #00b050;"&gt;&lt;b&gt;XDRTAS&lt;/b&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2124217069974135740-9186221900836301220?l=xdrtas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xdrtas.blogspot.com/feeds/9186221900836301220/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2124217069974135740&amp;postID=9186221900836301220&amp;isPopup=true' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2124217069974135740/posts/default/9186221900836301220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2124217069974135740/posts/default/9186221900836301220'/><link rel='alternate' type='text/html' href='http://xdrtas.blogspot.com/2010/08/0006-ajax-php-postgresql-ii.html' title='0006 Ajax – PHP – PostgreSQL II'/><author><name>xdrtas</name><uri>http://www.blogger.com/profile/06633503378192749976</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-GTZO4GO-ad0/TW-HR7ov2BI/AAAAAAAAADI/2tiQbfNTfbI/s220/IMG00092-20101128-1206.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2124217069974135740.post-2134086077319908477</id><published>2010-05-11T13:42:00.030-04:30</published><updated>2011-12-15T10:51:17.966-04:30</updated><title type='text'>0005 Excel – PostgreSQL III</title><content type='html'>&lt;span xmlns=""&gt;&lt;/span&gt;&lt;br /&gt;&lt;span xmlns=""&gt;Para este artículo se van a usar las tres librerías para el manejo de &lt;span style="color: #00b050;"&gt;Excel&lt;/span&gt; desde &lt;span style="color: #00b0f0;"&gt;python&lt;/span&gt;, estas librerías son: xlrd, xlwt, xlutils.&lt;/span&gt;&lt;br /&gt;&lt;span xmlns=""&gt;El siguiente diagrama explica lo que se quiere conseguir con el procedimiento almacenado:&lt;/span&gt;&lt;br /&gt;&lt;span xmlns=""&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div id="imagen" onmouseout="javascript:Ver('imagen',0,'100%','auto','hidden');" onmouseover="javascript:Ver('imagen', 1, '100%', 'auto', 'hidden');" style="overflow: hidden; width: 100%;"&gt;&lt;span xmlns=""&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span xmlns=""&gt;&lt;a href="http://img40.imageshack.us/img40/4378/postgresqlexcelultima.png"&gt;&lt;img alt="" border="0" src="http://img40.imageshack.us/img40/4378/postgresqlexcelultima.png" style="cursor: pointer; height: 738px; width: 1023px;" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span xmlns=""&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;span xmlns=""&gt;&lt;li&gt;&lt;div&gt;Hoja de &lt;span style="color: #00b050;"&gt;Excel&lt;/span&gt; "original.xls", (Crear este libro antes de ejecutar el procedimiento almacenado):&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Crear la hoja de &lt;span style="color: #00b050;"&gt;Excel&lt;/span&gt; con los siguientes campos:&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/span&gt;&lt;/ul&gt;&lt;span xmlns=""&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;table border="0" style="border-collapse: collapse;"&gt;&lt;colgroup&gt;&lt;col style="width: 31px;"&gt;&lt;/col&gt;&lt;col style="width: 138px;"&gt;&lt;/col&gt;&lt;col style="width: 136px;"&gt;&lt;/col&gt;&lt;col style="width: 135px;"&gt;&lt;/col&gt;&lt;col style="width: 136px;"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody valign="top"&gt;&lt;tr style="background: none repeat scroll 0% 0% rgb(214, 227, 188);"&gt;&lt;td style="border-bottom: 0.5pt solid white; border-right: 0.5pt solid; border-top: medium none; padding-left: 7px; padding-right: 7px;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;div style="text-align: center;"&gt;&lt;span style="color: black;"&gt;&lt;b&gt;A&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style="border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;div style="text-align: center;"&gt;&lt;span style="color: black;"&gt;&lt;b&gt;B&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style="border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;div style="text-align: center;"&gt;&lt;span style="color: black;"&gt;&lt;b&gt;C&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style="border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;div style="text-align: center;"&gt;&lt;span style="color: black;"&gt;&lt;b&gt;D&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(118, 146, 60); border-bottom: 0.5pt solid white; border-right: 0.5pt solid; border-top: medium none; padding-left: 7px; padding-right: 7px;"&gt;&lt;span style="color: white;"&gt;1&lt;/span&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(205, 221, 172); border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;David&lt;/span&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(205, 221, 172); border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;div style="text-align: right;"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;100&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(205, 221, 172); border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;div style="text-align: right;"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;0&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(205, 221, 172); border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;div style="text-align: right;"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;100&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(118, 146, 60); border-bottom: 0.5pt solid white; border-right: 0.5pt solid; border-top: medium none; padding-left: 7px; padding-right: 7px;"&gt;&lt;span style="color: white;"&gt;2&lt;/span&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(234, 241, 221); border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;Jorge&lt;/span&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(234, 241, 221); border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;div style="text-align: right;"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;100&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(234, 241, 221); border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;div style="text-align: right;"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(234, 241, 221); border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;div style="text-align: right;"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;99&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(118, 146, 60); border-bottom: 0.5pt solid white; border-right: 0.5pt solid; border-top: medium none; padding-left: 7px; padding-right: 7px;"&gt;&lt;span style="color: white;"&gt;3&lt;/span&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(205, 221, 172); border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;Arturo&lt;/span&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(205, 221, 172); border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;div style="text-align: right;"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;100&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(205, 221, 172); border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;div style="text-align: right;"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;2&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(205, 221, 172); border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;div style="text-align: right;"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;98&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(118, 146, 60); border-bottom: 0.5pt solid white; border-right: 0.5pt solid; border-top: medium none; padding-left: 7px; padding-right: 7px;"&gt;&lt;span style="color: white;"&gt;4&lt;/span&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(234, 241, 221); border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;Sylvia&lt;/span&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(234, 241, 221); border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;div style="text-align: right;"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;100&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(234, 241, 221); border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;div style="text-align: right;"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;3&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(234, 241, 221); border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;div style="text-align: right;"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;97&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(118, 146, 60); border-bottom: 0.5pt solid white; border-right: 0.5pt solid; border-top: medium none; padding-left: 7px; padding-right: 7px;"&gt;&lt;span style="color: white;"&gt;5&lt;/span&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(205, 221, 172); border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;Carolina&lt;/span&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(205, 221, 172); border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;div style="text-align: right;"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;100&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(205, 221, 172); border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;div style="text-align: right;"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;4&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(205, 221, 172); border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;div style="text-align: right;"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;96&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(118, 146, 60); border-bottom: 0.5pt solid white; border-right: 0.5pt solid; border-top: medium none; padding-left: 7px; padding-right: 7px;"&gt;&lt;span style="color: white;"&gt;6&lt;/span&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(234, 241, 221); border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;Graciela&lt;/span&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(234, 241, 221); border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;div style="text-align: right;"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;100&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(234, 241, 221); border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;div style="text-align: right;"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;5&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(234, 241, 221); border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;div style="text-align: right;"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;95&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(118, 146, 60); border-bottom: 0.5pt solid white; border-right: 0.5pt solid; border-top: medium none; padding-left: 7px; padding-right: 7px;"&gt;&lt;span style="color: white;"&gt;7&lt;/span&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(205, 221, 172); border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;Fernando&lt;/span&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(205, 221, 172); border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;div style="text-align: right;"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;100&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(205, 221, 172); border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;div style="text-align: right;"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;6&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(205, 221, 172); border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;div style="text-align: right;"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;94&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(118, 146, 60); border-bottom: 0.5pt solid white; border-right: 0.5pt solid; border-top: medium none; padding-left: 7px; padding-right: 7px;"&gt;&lt;span style="color: white;"&gt;8&lt;/span&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(234, 241, 221); border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;Elena&lt;/span&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(234, 241, 221); border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;div style="text-align: right;"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;100&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(234, 241, 221); border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;div style="text-align: right;"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;7&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(234, 241, 221); border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;div style="text-align: right;"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;93&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(118, 146, 60); border-bottom: 0.5pt solid white; border-right: 0.5pt solid; border-top: medium none; padding-left: 7px; padding-right: 7px;"&gt;&lt;span style="color: white;"&gt;9&lt;/span&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(205, 221, 172); border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;Carlos&lt;/span&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(205, 221, 172); border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;div style="text-align: right;"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;100&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(205, 221, 172); border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;div style="text-align: right;"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;8&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(205, 221, 172); border-style: none solid solid none; border-width: medium 0.5pt 0.5pt medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;div style="text-align: right;"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;92&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(118, 146, 60); border-bottom: medium none; border-right: 0.5pt solid; border-top: medium none; padding-left: 7px; padding-right: 7px;"&gt;&lt;span style="color: white;"&gt;10&lt;/span&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(234, 241, 221); border-style: none solid none none; border-width: medium 0.5pt medium medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;Daniela&lt;/span&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(234, 241, 221); border-style: none solid none none; border-width: medium 0.5pt medium medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;div style="text-align: right;"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;100&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(234, 241, 221); border-style: none solid none none; border-width: medium 0.5pt medium medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;div style="text-align: right;"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;9&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(234, 241, 221); border-style: none solid none none; border-width: medium 0.5pt medium medium; padding-left: 7px; padding-right: 7px;" valign="middle"&gt;&lt;div style="text-align: right;"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;91&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;span xmlns=""&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;span xmlns=""&gt;&lt;li&gt;Crear la tabla "excel" en la base de datos:&lt;/li&gt;&lt;/span&gt;&lt;/ul&gt;&lt;span xmlns=""&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="overflow: auto;"&gt;&lt;table border="0" style="background: white repeat scroll 0% 0% rgb(0, 32, 96); border-collapse: collapse;"&gt;&lt;colgroup&gt;&lt;col style="width: 580px;"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody valign="top"&gt;&lt;tr&gt;&lt;td style="border: 0.5pt solid black; padding-left: 7px; padding-right: 7px;"&gt;&lt;pre&gt;CREATE TABLE excel&lt;br /&gt;&lt;br /&gt;(&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-left: 36pt;"&gt;&lt;br /&gt;campo1 character varying(80),&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-left: 36pt;"&gt;&lt;br /&gt;campo2 integer&lt;/div&gt;&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;WITH (&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-left: 36pt;"&gt;&lt;br /&gt;OIDS=FALSE&lt;/div&gt;&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;--Sin registros…&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;span xmlns=""&gt;&lt;div style="margin-left: 18pt;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Procedimiento almacenado: &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;pre&gt;CREATE OR REPLACE FUNCTION f_proceso_completo(nombre character varying, copiar character varying, tabla character varying, actualizar smallint)&lt;br /&gt;&lt;br /&gt;RETURNS integer AS&lt;br /&gt;&lt;br /&gt;$BODY$&lt;br /&gt;&lt;br /&gt;#***************************************************************************************&lt;br /&gt;&lt;br /&gt;#Creado por:    David A. Lastra N.&lt;br /&gt;&lt;br /&gt;#Alias:        xdrtas&lt;br /&gt;&lt;br /&gt;#Fecha:        10/05/2010&lt;br /&gt;&lt;br /&gt;#Objetivo:        Leer celdas desde libro de excel, guardar los datos en la tabla y actualizar el libro de excel...&lt;br /&gt;&lt;br /&gt;#***************************************************************************************&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#Llamar a las librerías que entran en juego para porder realizar el proceso...&lt;br /&gt;&lt;br /&gt;from xlrd import open_workbook&lt;br /&gt;&lt;br /&gt;from xlwt import Formula, XFStyle&lt;br /&gt;&lt;br /&gt;from xlutils.copy import copy&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#Abrir el libro para leer las celdas...&lt;br /&gt;&lt;br /&gt;lb = open_workbook(nombre)    #lb = leer libro...    Abrir el libro...&lt;br /&gt;&lt;br /&gt;lh = lb.sheet_by_index(0)    #lh = leer hoja...    para leer la primera hoja...&lt;br /&gt;&lt;br /&gt;lc = copy(lb)            #lc = libro copia...    copiar el libro...&lt;br /&gt;&lt;br /&gt;eh = lc.get_sheet(0)        #eh = escribir hoja...    escribir en la primera hoja...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#Borrar los datos anteriores de la tabla...&lt;br /&gt;&lt;br /&gt;plpy.execute("DELETE FROM "+tabla+";")&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#Leer el libro para guardar los datos de las celdas en la tabla "excel"...&lt;br /&gt;&lt;br /&gt;for fila_ID in range(lh.nrows):&lt;br /&gt;&lt;br /&gt;uno = lh.cell(fila_ID,0).value        #El valor de la celda fila_ID, columna 0 o "A"...&lt;br /&gt;&lt;br /&gt;dos = int(lh.cell(fila_ID,2).value)    #El valor de la celda fila_ID, columna 2 o "C"...&lt;br /&gt;&lt;br /&gt;sql = "INSERT INTO %s(campo1, campo2) VALUES ('%s', %d::int);" % (tabla, uno, dos)&lt;br /&gt;&lt;br /&gt;plpy.execute(sql)            #Insertar los valores de las celdas en la tabla "nombre"...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#Formato de celda numérico...&lt;br /&gt;&lt;br /&gt;formato = XFStyle()&lt;br /&gt;&lt;br /&gt;formato.num_format_str = '0'&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#Leer los datos de la tabla y grabar los datos en las celdas correspondientes...&lt;br /&gt;&lt;br /&gt;datos = plpy.execute("SELECT campo1, campo2 FROM "+tabla+";")&lt;br /&gt;&lt;br /&gt;fila = 0&lt;br /&gt;&lt;br /&gt;for campo in datos:                    #Escribir en todas las filas de la columna 0 o "A" y columna 2 o "C"...&lt;br /&gt;&lt;br /&gt;eh.write(fila,0,campo['campo1'])        #Escribir el valor de campo1 en la celda "A"...&lt;br /&gt;&lt;br /&gt;eh.write(fila,2,int(campo['campo2']),formato)    #Escribir el valor del campo2 en la celda "C"...&lt;br /&gt;&lt;br /&gt;fila = fila + 1                    #Pasar a la siguiente fila...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#Guardar en las celdas de la columna 1 o "B" la formula: "=Cn+Dn" donde "n" es el valor que va desde 1 hasta n...&lt;br /&gt;&lt;br /&gt;for i, celda in enumerate(lh.col(1)):                    #Escribir en todas las filas de la columna 1 o "B"...&lt;br /&gt;&lt;br /&gt;eh.write(i,1,Formula('C'+str(i+1)+'+D'+str(i+1)),formato)    #Escribir la formula de (Cn+ Dn) en la columna 1 o "B"...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#Guardar en las celdas de la columna 3 o "D" los valores de las celdas del libro abierto...&lt;br /&gt;&lt;br /&gt;for i, celda in enumerate(lh.col(3)):        #Escribir en todas las filas de la columna 3 o "D"...&lt;br /&gt;&lt;br /&gt;eh.write(i,3,celda.value,formato)    #Los datos se obtienen de las celdas del libro "lb" hoja "lh"...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#Actualizar el libro y crear copia, de lo contrario, sólo crear copia...&lt;br /&gt;&lt;br /&gt;if actualizar == 1:&lt;br /&gt;&lt;br /&gt;lc.save(nombre)&lt;br /&gt;&lt;br /&gt;lc.save(copiar)&lt;br /&gt;&lt;br /&gt;else:&lt;br /&gt;&lt;br /&gt;lc.save(copiar)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;return 1;&lt;br /&gt;&lt;br /&gt;$BODY$&lt;br /&gt;&lt;br /&gt;LANGUAGE 'plpythonu' VOLATILE&lt;br /&gt;&lt;br /&gt;COST 100;&lt;/pre&gt;&lt;br /&gt;&lt;ul&gt;&lt;/ul&gt;&lt;div id="texto" onmouseout="javascript:Ver('texto',0,'100%','auto','hidden');" onmouseover="javascript:Ver('texto', 1, '150%', 'auto', 'hidden');" style="overflow: hidden; width: 100%;"&gt;&lt;table border="0" style="background: white repeat scroll 0% 0% rgb(0, 32, 96); border-collapse: collapse;"&gt;&lt;tbody valign="top"&gt;&lt;tr&gt;&lt;td style="border: 0.5pt solid black; padding-left: 7px; padding-right: 7px;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;&lt;div&gt;El procedimiento recibe cuatro valores:&lt;/div&gt;&lt;ol&gt;&lt;li&gt;Ruta del archivo a copiar/Actualizar.&lt;/li&gt;&lt;li&gt;Ruta del archivo que será la copia del original.&lt;/li&gt;&lt;li&gt;Nombre de la tabla donde se van a guardar/recuperar los datos.&lt;/li&gt;&lt;li&gt;Valor para indicar si se quiere actualizar el archivo o si sólo se quiere crear una copia.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;from xlrd import open_workbook&lt;/i&gt;: Abrir el archivo para la lectura de las celdas.&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;from xlwt import Formula, XFStyle&lt;/i&gt;: Preparar la escritura para añadir fórmulas y formatos a las celdas.&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;from xlutils.copy import copy&lt;/i&gt;: Crear una copia virtual del archivo para actualizar los datos de las celdas.&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;lb = open_workbook(nombre)&lt;/i&gt;: Abrir el libro para leer las celdas.&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;lh = lb.sheet_by_index(0)&lt;/i&gt;: Leer las celdas de la primera hoja.&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;lc = copy(lb)&lt;/i&gt;: Crear una copia del libro abierto para actualizar las celdas.&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;eh = lc.get_sheet(0)&lt;/i&gt;: Obtener acceso a la primera hoja para escribir en las celdas.&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;plpy.execute("DELETE FROM "+tabla+";")&lt;/i&gt;: Borrar los datos de la tabla "excel".&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;for fila_ID in range(lh.nrows):&lt;/i&gt;: Iniciar bucle for para cada uno de las filas.&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;uno = lh.cell(fila_ID,0).value&lt;/i&gt;: Obtener los datos de las celdas de la columna "A".&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;dos = int(lh.cell(fila_ID,2).value)&lt;/i&gt;: Obtener los datos de las celdas de la columna "C".&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;sql = "INSERT INTO %s(campo1, campo2) VALUES ('%s', %d::int);" % (tabla, uno, dos)&lt;/i&gt;: Cadena SQL para insertar los datos en la tabla "excel".&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;plpy.execute(sql)&lt;/i&gt;: Ejecutar la consulta, aquí finaliza los comandos internos de este bucle.&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;formato = XFStyle()&lt;/i&gt;: Para establecer el formato de las celdas a numérico sin decimales, en este caso, para las celdas de las columnas "B", "C" y "D", ya que "A" contiene caracteres y por eso el formato de ésta columna no se modifica.&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;formato.num_format_str = '0'&lt;/i&gt;: Formato de las celdas numérico sin decimales.&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;datos = plpy.execute("SELECT campo1, campo2 FROM "+tabla+";")&lt;/i&gt;: Leer los datos de la tabla "excel".&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;fila = 0&lt;/i&gt;: Para ir moviendo el cursor entre las filas de las columnas.&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;for campo in datos:&lt;/i&gt;: Bucle para leer los datos obtenidos de la consulta a la tabla "excel".&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;eh.write(fila,0,campo['campo1'])&lt;/i&gt;: Escribir los datos en las celdas de la columna "A".&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;eh.write(fila,2,int(campo['campo2']),formato)&lt;/i&gt;: Escribir los datos en las celdas de la columna "C" con el formato numérico sin decimal.&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;fila = fila + 1&lt;/i&gt;: Avanzar a la siguiente fila.&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;for i, celda in enumerate(lh.col(1)):&lt;/i&gt;: Bucle para escribir en cada una de las celdas de la columna "B".&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;eh.write(i,1,Formula('C'+str(i+1)+'+D'+str(i+1)),formato)&lt;/i&gt;: Escribir en cada celda la fórmula "Cn+Dn" con formato numérico sin decimal.&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;for i, celda in enumerate(lh.col(3)):&lt;/i&gt;: Bucle para escribir en cada una de las celdas de la columna "D".&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;eh.write(i,3,celda.value,formato)&lt;/i&gt;: Escribir en cada celda los valores tomados del libro "original.xls".&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;if actualizar == 1:&lt;/i&gt;: Si Actualizar es igual a 1, entonces.&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;lc.save(nombre)&lt;/i&gt;: Actualizar el libro "original.xls".&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;lc.save(copiar)&lt;/i&gt;: Crear una copia del libro "original.xls" con el nombre de "copia.xls".&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;else:&lt;/i&gt;: Si actualizar es distinto de 1, entonces.&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;lc.save(copiar)&lt;/i&gt;: Crear una copia del libro "original.xls" con el nombre de "copia.xls".&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;return 1;&lt;/i&gt;: Fin del procedimiento.&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;div style="text-align: justify;"&gt;Ejecutar el procedimiento almacenado:&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;pre&gt;SELECT f_proceso_completo('C:/Users/xdrtas/Documents/Documentos/test/original.xls','C:/Users/xdrtas/Documents/Documentos/test/copia.xls','excel',1::smallint);&lt;/pre&gt;&lt;span xmlns=""&gt;&lt;div id="seltod" onmouseout="javascript:Ver('seltod',0,'100%','auto','hidden');" onmouseover="javascript:Ver('seltod', 1, '150%', 'auto', 'hidden');" style="overflow: hidden; width: 100%;"&gt;&lt;br /&gt;&lt;table border="0" style="background: white repeat scroll 0% 0% rgb(0, 32, 96); border-collapse: collapse;"&gt;&lt;colgroup&gt;&lt;col style="width: 580px;"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody valign="top"&gt;&lt;tr&gt;&lt;td style="border: 0.5pt solid black; padding-left: 7px; padding-right: 7px;"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div style="margin-left: 18pt; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;div style="text-align: justify;"&gt;Puntos a destacar en este procedimiento almacenado:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;div style="text-align: justify;"&gt;El procedimiento está habilitado para la lectura del libro de &lt;span style="color: #00b050;"&gt;Excel&lt;/span&gt;.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="text-align: justify;"&gt;El procedimiento está habilitado para la escritura del libro de &lt;span style="color: #00b050;"&gt;Excel&lt;/span&gt;.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="text-align: justify;"&gt;Hay tres fuentes de datos:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;div style="text-align: justify;"&gt;Datos obtenidos por consulta a la tabla "excel", (líneas 20 y 21).&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="text-align: justify;"&gt;Datos escritos directamente, (línea 24), el programador puede quitar la fórmula e introducir los datos que desee.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="text-align: justify;"&gt;Datos obtenidos desde el libro abierto, (línea26).&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="text-align: justify;"&gt;El procedimiento está habilitado para el cambio de formato de las celdas mediante el módulo XFStyle().&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Como se puede observar, en este procedimiento se hacen todas las operaciones disponibles que permiten las librerías xlrd, xlwt, xlutils.&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;div style="text-align: justify;"&gt;Las operaciones de lectura de celdas viene dado por la librería xlrd.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="text-align: justify;"&gt;Las operaciones de escritura de celdas viene dado por la librería xlwt.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="text-align: justify;"&gt;Librería xlutils, para habilitar la actualización del libro mediante una copia virtual del libro abierto para lectura.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;div style="text-align: justify;"&gt;Links de artículos anteriores:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://xdrtas.blogspot.com/2010/04/0003-excel-postgresql.html"&gt;0003 excel-postgresql&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://xdrtas.blogspot.com/2010/05/0004-excel-postgresql-ii.html"&gt;0004 excel-postgresql II&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="text-align: justify;"&gt;Links de las librerías:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;xlrd-0.7.1.win32 – web: &lt;a href="http://pypi.python.org/pypi/xlrd"&gt;xlrd&lt;/a&gt;&lt;/li&gt;&lt;li&gt;xlwt-0.7.2.win32 – web: &lt;a href="http://pypi.python.org/pypi/xlwt"&gt;xlwt&lt;/a&gt;&lt;/li&gt;&lt;li&gt;xlutils-1.4.1.win32 – web: &lt;a href="http://pypi.python.org/pypi/xlutils/1.4.1"&gt;xlutils&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&lt;span style="color: red;"&gt;Importante: &lt;/span&gt;Es muy importante tener los permisos de lectura y escritura en la ruta donde se va a trabajar con los documentos de Excel, si los permisos no están habilitados para el usuario de postgres que se encarga de la ejecución del/los procedimiento/s entonces el/los procedimiento/s van a fallar.&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Un cordial saludo.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Firma: &lt;span style="color: #00b050;"&gt;&lt;b&gt;XDRTAS&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;br /&gt;&lt;hr /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2124217069974135740-2134086077319908477?l=xdrtas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xdrtas.blogspot.com/feeds/2134086077319908477/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2124217069974135740&amp;postID=2134086077319908477&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2124217069974135740/posts/default/2134086077319908477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2124217069974135740/posts/default/2134086077319908477'/><link rel='alternate' type='text/html' href='http://xdrtas.blogspot.com/2010/05/0005-excel-postgresql-iii.html' title='0005 Excel – PostgreSQL III'/><author><name>xdrtas</name><uri>http://www.blogger.com/profile/06633503378192749976</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-GTZO4GO-ad0/TW-HR7ov2BI/AAAAAAAAADI/2tiQbfNTfbI/s220/IMG00092-20101128-1206.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2124217069974135740.post-7921025356007519188</id><published>2010-05-03T22:13:00.021-04:30</published><updated>2010-05-20T12:23:42.586-04:30</updated><title type='text'>0004 Excel – PostgreSQL II</title><content type='html'>&lt;div style="text-align: left;"&gt;Este es el segundo artículo para trabajar con &lt;span style="color: rgb(0, 112, 192);"&gt;postgreSQL&lt;/span&gt; y &lt;span style="color: rgb(0, 176, 80);"&gt;Excel&lt;/span&gt;, si quieren ver el primero pueden seguir este link: &lt;a href="http://xdrtas.blogspot.com/2010/04/0003-excel-postgresql.html"&gt;0003 excel - postgresql&lt;/a&gt;.&lt;/div&gt;&lt;span xmlns=""&gt;&lt;p&gt;En esta segunda parte se muestra cómo escribir los datos obtenidos mediante una consulta a una tabla de &lt;span style="color: rgb(0, 112, 192);"&gt;postgreSQL&lt;/span&gt; para poder guardar esos datos en un documento de &lt;span style="color: rgb(0, 176, 80);"&gt;Excel&lt;/span&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;La librería que se va a usar para escribir datos en una hoja de &lt;span style="color: rgb(0, 176, 80);"&gt;Excel&lt;/span&gt; se llama "xlwt".&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div id="xlwt" style="overflow: hidden; width: 100%;" onmouseover="javascript:Ver('xlwt', 1, '100%', 'auto', 'hidden');" onmouseout="javascript:Ver('xlwt',0,'100%','auto','hidden');"&gt;&lt;br /&gt;&lt;a target="_blank" title="ImageShack - Image And Video Hosting" href="http://img710.imageshack.us/i/postgresqlexcel.png/"&gt;&lt;img src="http://img710.imageshack.us/img710/1769/postgresqlexcel.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Lo primero que se tiene que hacer, es crear la tabla que contiene los datos. Aquí está el código de la tabla:&lt;br /&gt;&lt;/p&gt;&lt;div style="overflow: auto;"&gt;&lt;table style="border-collapse: collapse; background: none repeat scroll 0% 0% rgb(0, 32, 96);" border="0"&gt;&lt;colgroup&gt;&lt;col style="width: 599px;"&gt;&lt;/colgroup&gt;&lt;tbody valign="top"&gt;&lt;tr&gt;&lt;td style="padding-left: 7px; padding-right: 7px; border: 0.5pt solid black;"&gt;&lt;pre&gt;&lt;p&gt;CREATE TABLE excel&lt;br /&gt;&lt;/p&gt;&lt;p&gt;(&lt;br /&gt;&lt;/p&gt;&lt;p&gt;  campo1 character varying(20),&lt;br /&gt;&lt;/p&gt;&lt;p&gt;  campo2 character varying(20)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;WITH (&lt;br /&gt;&lt;/p&gt;&lt;p&gt;  OIDS=FALSE&lt;br /&gt;&lt;/p&gt;&lt;p&gt;);&lt;br /&gt;&lt;/p&gt;&lt;p&gt;ALTER TABLE excel OWNER TO postgres;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;INSERT INTO excel (campo1, campo2) VALUES ('David', '0.0');&lt;br /&gt;&lt;/p&gt;&lt;p&gt;INSERT INTO excel (campo1, campo2) VALUES ('Jorge', '1.0');&lt;br /&gt;&lt;/p&gt;&lt;p&gt;INSERT INTO excel (campo1, campo2) VALUES ('Arturo', '2.0');&lt;br /&gt;&lt;/p&gt;&lt;p&gt;INSERT INTO excel (campo1, campo2) VALUES ('Sylvia', '3.0');&lt;br /&gt;&lt;/p&gt;&lt;p&gt;INSERT INTO excel (campo1, campo2) VALUES ('Carolina', '4.0');&lt;br /&gt;&lt;/p&gt;&lt;p&gt;INSERT INTO excel (campo1, campo2) VALUES ('Graciela', '5.0');&lt;br /&gt;&lt;/p&gt;&lt;p&gt;INSERT INTO excel (campo1, campo2) VALUES ('Fernando', '6.0');&lt;br /&gt;&lt;/p&gt;&lt;p&gt;INSERT INTO excel (campo1, campo2) VALUES ('Elena', '7.0');&lt;br /&gt;&lt;/p&gt;&lt;p&gt;INSERT INTO excel (campo1, campo2) VALUES ('Carlos', '8.0');&lt;br /&gt;&lt;/p&gt;&lt;p&gt;INSERT INTO excel (campo1, campo2) VALUES ('Daniela', '9.0');&lt;/p&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;El siguiente paso es el procedimiento almacenado hecho en "plpython":&lt;br /&gt;&lt;/p&gt;&lt;div style="overflow: auto;"&gt;&lt;table style="border-collapse: collapse; background: none repeat scroll 0% 0% rgb(0, 32, 96);" border="0"&gt;&lt;colgroup&gt;&lt;col style="width: 599px;"&gt;&lt;/colgroup&gt;&lt;tbody valign="top"&gt;&lt;tr&gt;&lt;td style="padding-left: 7px; padding-right: 7px; border: 0.5pt solid black;"&gt;&lt;pre&gt;&lt;p&gt;CREATE OR REPLACE FUNCTION fescribirexcel() RETURNS text AS&lt;br /&gt;&lt;/p&gt;&lt;p&gt;    $BODY$&lt;br /&gt;&lt;/p&gt;&lt;p&gt;        from xlwt import Workbook&lt;br /&gt;&lt;/p&gt;&lt;p&gt;        libro = Workbook()&lt;br /&gt;&lt;/p&gt;&lt;p&gt;        hoja = libro.add_sheet('Informex')&lt;br /&gt;&lt;/p&gt;&lt;p&gt;        datos = plpy.execute("SELECT * FROM excel")&lt;br /&gt;&lt;/p&gt;&lt;p&gt;        fila = 0&lt;br /&gt;&lt;/p&gt;&lt;p&gt;        for campo in datos:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;            hoja.write(fila,0,campo['campo1'])&lt;br /&gt;&lt;/p&gt;&lt;p&gt;            hoja.write(fila,1,campo['campo2'])&lt;br /&gt;&lt;/p&gt;&lt;p&gt;            fila = fila + 1&lt;br /&gt;&lt;/p&gt;&lt;p&gt;        libro.save("C:/prueba.xls")&lt;br /&gt;&lt;/p&gt;&lt;p&gt;        return "Funciona"&lt;br /&gt;&lt;/p&gt;&lt;p&gt;    $BODY$&lt;br /&gt;&lt;/p&gt;&lt;p&gt;LANGUAGE 'plpythonu' VOLATILE;&lt;/p&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;El procedimiento "fescribirexcel()" hace lo siguiente:&lt;br /&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Llamar a la librería xlwt e importar el módulo Workbook.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Asignar el nuevo Workbook a la variable "libro", esto significa que libro se convierte en un objeto "libro de &lt;span style="color: rgb(0, 176, 80);"&gt;Excel&lt;/span&gt;".&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Asignar a la variable "hoja" una nueva hoja con el nombre de "Informe".&lt;br /&gt;&lt;/li&gt;&lt;li&gt;"datos" contendrá los datos obtenidos por medio de la consulta a la tabla "excel".&lt;br /&gt;&lt;/li&gt;&lt;li&gt;"fila" guarda el número de fila donde se quiere guardar los datos.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Se crea un bucle para recorrer los datos obtenidos por medio de la consulta.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;"hoja.write(&lt;span style="color: rgb(227, 108, 10);"&gt;fila&lt;/span&gt;,&lt;span style="color: rgb(49, 132, 155);"&gt;0&lt;/span&gt;,&lt;span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;campo['campo1']&lt;/span&gt;&lt;/span&gt;)": Se asigna el valor de "&lt;span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;campo['campo1']&lt;/span&gt;&lt;/span&gt;" a la fila "&lt;span style="color: rgb(227, 108, 10);"&gt;fila&lt;/span&gt;" columna "&lt;span style="color: rgb(49, 132, 155);"&gt;0&lt;/span&gt;".&lt;br /&gt;&lt;/li&gt;&lt;li&gt;"hoja.write(&lt;span style="color: rgb(227, 108, 10);"&gt;fila&lt;/span&gt;,&lt;span style="color: rgb(49, 132, 155);"&gt;1&lt;/span&gt;,&lt;span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;campo['campo2']&lt;/span&gt;&lt;/span&gt;)": Se asigna el valor de "&lt;span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;campo['campo2']&lt;/span&gt;&lt;/span&gt;" a la fila "&lt;span style="color: rgb(227, 108, 10);"&gt;fila&lt;/span&gt;" columna "&lt;span style="color: rgb(49, 132, 155);"&gt;1&lt;/span&gt;".&lt;br /&gt;&lt;/li&gt;&lt;li&gt;"&lt;span style="color: rgb(227, 108, 10);"&gt;fila&lt;/span&gt;" se le suma 1 para pasar a la siguiente fila, ( &lt;span style="color: rgb(227, 108, 10);"&gt;fila&lt;/span&gt; = &lt;span style="color: rgb(227, 108, 10);"&gt;fila&lt;/span&gt; + 1 ).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Una vez finalizado el bucle se salva el nuevo libro en la ruta deseada, en este caso es: "libro.save("C:/prueba.xls")".&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;El último paso es llamar al procedimiento:&lt;br /&gt;&lt;/p&gt;&lt;div&gt;&lt;table style="border-collapse: collapse; background: none repeat scroll 0% 0% rgb(0, 32, 96);" border="0"&gt;&lt;colgroup&gt;&lt;col style="width: 599px;"&gt;&lt;/colgroup&gt;&lt;tbody valign="top"&gt;&lt;tr&gt;&lt;td style="padding-left: 7px; padding-right: 7px; border: 0.5pt solid black;"&gt;&lt;pre&gt;&lt;p&gt;select fescribirexcel();&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Links de las librerías:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;xlrd-0.7.1.win32 – web: &lt;a href="http://pypi.python.org/pypi/xlrd"&gt;xlrd&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;xlwt-0.7.2.win32 – web: &lt;a href="http://pypi.python.org/pypi/xlwt"&gt;xlwt&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;xlutils-1.4.1.win32 – web: &lt;a href="http://pypi.python.org/pypi/xlutils/1.4.1"&gt;xlutils&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="color:red;"&gt;&lt;strong&gt;Nota importante:&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Con este procedimiento: Hay que tener en cuenta que si el libro de Excel ya existe, éste será sustituido por completo con los datos nuevos.&lt;br /&gt;&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Este ejemplo se probó bajo Windows 7, por lo tanto se tiene que tener en cuenta los permisos de escritura; en el ejemplo expuesto, el nuevo documento se crea en la ruta "C:\" por mi configuración personal sobre esa ruta; si no tiene permisos de escritura en esa ruta entonces no va a funcionar el procedimiento.&lt;br /&gt;&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Si quiere cambiar la ruta a una carpeta en la cual tenga los permisos, sustituya la siguiente línea "&lt;em&gt;libro.save("C:/prueba.xls")&lt;/em&gt;" por "&lt;em&gt;libro.save("C:/RutaConLosPermisos/prueba.xls")"&lt;/em&gt; en el procedimiento almacenado con el nombre de "fescribirexcel()".&lt;br /&gt;&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Un cordial saludo.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Firma: &lt;span style="color: rgb(0, 176, 80);"&gt;XDRTAS&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;&lt;hr /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2124217069974135740-7921025356007519188?l=xdrtas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xdrtas.blogspot.com/feeds/7921025356007519188/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2124217069974135740&amp;postID=7921025356007519188&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2124217069974135740/posts/default/7921025356007519188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2124217069974135740/posts/default/7921025356007519188'/><link rel='alternate' type='text/html' href='http://xdrtas.blogspot.com/2010/05/0004-excel-postgresql-ii.html' title='0004 Excel – PostgreSQL II'/><author><name>xdrtas</name><uri>http://www.blogger.com/profile/06633503378192749976</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-GTZO4GO-ad0/TW-HR7ov2BI/AAAAAAAAADI/2tiQbfNTfbI/s220/IMG00092-20101128-1206.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2124217069974135740.post-406974368998843479</id><published>2010-04-28T18:56:00.008-04:30</published><updated>2010-05-14T11:25:46.163-04:30</updated><title type='text'>0003 Excel - PostgreSQL</title><content type='html'>&lt;span xmlns=""&gt;&lt;p&gt;En muchas ocasiones me he encontrado con el siguiente problema: "¿Cómo hacer para pasar datos de Excel a postgreSQL?" Para ésta pregunta hay varias respuestas:&lt;br /&gt;&lt;/p&gt;&lt;ol style="margin-left: 38pt;"&gt;&lt;li&gt;La más común es pasar del formato &lt;span style="color: rgb(0, 176, 80);"&gt;&lt;strong&gt;XLS&lt;/strong&gt;&lt;/span&gt;, (&lt;span style="color: rgb(0, 176, 80);"&gt;&lt;strong&gt;Excel&lt;/strong&gt;&lt;/span&gt;), a el formato &lt;span style="color: rgb(192, 0, 0);"&gt;&lt;strong&gt;CSV&lt;/strong&gt;&lt;/span&gt;, (&lt;em&gt;comma-separated values&lt;/em&gt;), y desde &lt;span style="color: rgb(84, 141, 212);"&gt;&lt;strong&gt;postgreSQL&lt;/strong&gt;&lt;/span&gt; llamar al archivo &lt;span style="color: rgb(192, 0, 0);"&gt;&lt;strong&gt;CSV&lt;/strong&gt;&lt;/span&gt; por medio de un procedimiento almacenado para añadir los datos a una tabla en la base de datos.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Otra forma es usar los drivers &lt;span style="color: rgb(118, 146, 60);"&gt;&lt;strong&gt;ODBC&lt;/strong&gt;&lt;/span&gt; desde el archivo de &lt;span style="color: rgb(0, 176, 80);"&gt;&lt;strong&gt;Excel&lt;/strong&gt;&lt;/span&gt; para pasar los datos de las celdas a una tabla o varia tablas en &lt;span style="color: rgb(84, 141, 212);"&gt;&lt;strong&gt;postgreSQL&lt;/strong&gt;&lt;/span&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Una tercera sería pasar los datos desde &lt;span style="color: rgb(0, 176, 80);"&gt;&lt;strong&gt;Excel&lt;/strong&gt;&lt;/span&gt; a &lt;span style="color:red;"&gt;&lt;strong&gt;MS-Access&lt;/strong&gt;&lt;br /&gt;    &lt;/span&gt;y luego desde &lt;span style="color:red;"&gt;&lt;strong&gt;Access &lt;/strong&gt;&lt;/span&gt;pasar a &lt;span style="color: rgb(84, 141, 212);"&gt;&lt;strong&gt;postgreSQL&lt;/strong&gt;&lt;/span&gt;.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;En el siguiente tutorial explico cómo leer directamente los datos desde un archivo de &lt;span style="color: rgb(0, 176, 80);"&gt;&lt;strong&gt;Excel&lt;/strong&gt;&lt;/span&gt; mediante un procedimiento almacenado de &lt;span style="color: rgb(84, 141, 212);"&gt;&lt;strong&gt;postgreSQL&lt;/strong&gt;&lt;/span&gt; para añadir los datos a una tabla.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Con los métodos antes expuestos tenemos los siguientes problemas:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: rgb(0, 176, 80);"&gt;&lt;strong&gt;Excel&lt;/strong&gt;&lt;/span&gt; a &lt;span style="color: rgb(192, 0, 0);"&gt;&lt;strong&gt;CSV&lt;/strong&gt;&lt;/span&gt;: Cada vez que se haga una modificación sobre el archivo de &lt;span style="color: rgb(0, 176, 80);"&gt;&lt;strong&gt;Excel&lt;/strong&gt;&lt;/span&gt; habrá que pasar nuevamente al formato &lt;span style="color: rgb(192, 0, 0);"&gt;&lt;strong&gt;CSV&lt;/strong&gt;&lt;/span&gt; para leer los nuevos valores.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(0, 176, 80);"&gt;&lt;strong&gt;Excel&lt;/strong&gt;&lt;/span&gt; con &lt;span style="color: rgb(118, 146, 60);"&gt;&lt;strong&gt;ODBC&lt;/strong&gt;&lt;/span&gt;: Si se tienen varios archivos de &lt;span style="color: rgb(0, 176, 80);"&gt;&lt;strong&gt;Excel&lt;/strong&gt;&lt;/span&gt;, cada uno de ellos tiene que estar configurado para poder trabajar con el driver &lt;span style="color: rgb(118, 146, 60);"&gt;&lt;strong&gt;ODBC&lt;/strong&gt;&lt;/span&gt;, si uno de ellos no está configurado entonces no se podrá pasar la información a la base de datos. Otro inconveniente es que se tiene que ejecutar el archivo de &lt;span style="color: rgb(0, 176, 80);"&gt;&lt;strong&gt;Excel&lt;/strong&gt;&lt;/span&gt; cada vez que se hagan cambios en sus celdas.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(0, 176, 80);"&gt;&lt;strong&gt;Excel&lt;/strong&gt;&lt;/span&gt; a &lt;span style="color:red;"&gt;&lt;strong&gt;Access&lt;/strong&gt;&lt;/span&gt;: Los mismos problemas antes mencionados, añadiendo un nivel extra de incomodidad y dificultad al proceso cada vez que se hagan actualizaciones en los archivos de &lt;span style="color: rgb(0, 176, 80);"&gt;&lt;strong&gt;Excel&lt;/strong&gt;&lt;/span&gt;.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Método a tratar: Leer el archivo desde un procedimiento almacenado de postgreSQL.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;¿Qué ventaja puede traer este método?: Al estar el proceso de lectura de un archivo de &lt;span style="color: rgb(0, 176, 80);"&gt;&lt;strong&gt;Excel&lt;/strong&gt;&lt;/span&gt; en un procedimiento almacenado en &lt;span style="color: rgb(84, 141, 212);"&gt;&lt;strong&gt;postgreSQL&lt;/strong&gt;&lt;/span&gt;,  se automatiza el proceso de actualización de datos de la tabla relacionada cada vez que el usuario quiera con tantos archivos de &lt;span style="color: rgb(0, 176, 80);"&gt;&lt;strong&gt;Excel&lt;/strong&gt;&lt;/span&gt; que se esté trabajando, eliminando así los inconvenientes antes mencionados.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;¿Cómo es esto posible?: Una de las razones por la cual he seleccionado &lt;span style="color: rgb(84, 141, 212);"&gt;&lt;strong&gt;postgreSQL&lt;/strong&gt;&lt;/span&gt; como plataforma de base de datos es su capacidad para usar varios lenguajes de programación para el desarrollo de procedimientos almacenados y es aquí donde viene el "quid" de la cuestión. Para leer directamente de un archivo de &lt;span style="color: rgb(0, 176, 80);"&gt;&lt;strong&gt;Excel&lt;/strong&gt;&lt;/span&gt; desde un procedimiento almacenado en &lt;span style="color: rgb(84, 141, 212);"&gt;&lt;strong&gt;postgreSQL&lt;/strong&gt;&lt;/span&gt; se va a usar el lenguaje &lt;span style="color: rgb(0, 176, 240);font-size:14pt;" &gt;&lt;strong&gt;plpythonu&lt;/strong&gt;&lt;/span&gt;, una vez leídas las celdas, los datos de éstas serán guardadas en la tabla correspondiente.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;El siguiente ejemplo es muy sencillo pero será suficiente para ver el funcionamiento del procedimiento.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Aplicaciones y versiones que se usaron para este ejemplo:&lt;br /&gt;&lt;/p&gt;&lt;div&gt;&lt;table style="border-collapse: collapse;" border="0"&gt;&lt;colgroup&gt;&lt;col style="width: 299px;"&gt;&lt;col style="width: 299px;"&gt;&lt;/colgroup&gt;&lt;tbody valign="top"&gt;&lt;tr&gt;&lt;td style="padding-left: 7px; padding-right: 7px; border-width: 1pt medium; border-style: solid none; border-color: rgb(75, 172, 198) -moz-use-text-color;"&gt;&lt;p&gt;&lt;span style="color: rgb(49, 132, 155);"&gt;&lt;strong&gt;Aplicación&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="padding-left: 7px; padding-right: 7px; border-width: 1pt medium; border-style: solid none; border-color: rgb(75, 172, 198) -moz-use-text-color;"&gt;&lt;p&gt;&lt;span style="color: rgb(49, 132, 155);"&gt;&lt;strong&gt;Versión&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="background: none repeat scroll 0% 0% rgb(210, 234, 241);"&gt;&lt;td style="padding-left: 7px; padding-right: 7px; border-left: medium none; border-right: medium none;"&gt;&lt;p&gt;&lt;span style="color: rgb(49, 132, 155);"&gt;&lt;strong&gt;S.O.: Windows 7&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="padding-left: 7px; padding-right: 7px; border-left: medium none; border-right: medium none;"&gt;&lt;p&gt;&lt;span style="color: rgb(49, 132, 155);"&gt;6.1 compilación 7600&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="padding-left: 7px; padding-right: 7px;"&gt;&lt;p&gt;&lt;span style="color: rgb(49, 132, 155);"&gt;&lt;strong&gt;PostgreSQL&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="padding-left: 7px; padding-right: 7px;"&gt;&lt;p&gt;&lt;span style="color: rgb(49, 132, 155);"&gt;8.4&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="background: none repeat scroll 0% 0% rgb(210, 234, 241);"&gt;&lt;td style="padding-left: 7px; padding-right: 7px; border-left: medium none; border-right: medium none;"&gt;&lt;p&gt;&lt;span style="color: rgb(49, 132, 155);"&gt;&lt;strong&gt;Python&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="padding-left: 7px; padding-right: 7px; border-left: medium none; border-right: medium none;"&gt;&lt;p&gt;&lt;span style="color: rgb(49, 132, 155);"&gt;2.6.5&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="padding-left: 7px; padding-right: 7px; border-bottom: 1pt solid rgb(75, 172, 198);"&gt;&lt;p&gt;&lt;span style="color: rgb(49, 132, 155);"&gt;&lt;strong&gt;MS-Excel 2007&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="padding-left: 7px; padding-right: 7px; border-bottom: 1pt solid rgb(75, 172, 198);"&gt;&lt;p&gt;&lt;span style="color: rgb(49, 132, 155);"&gt;12.0.6524.5003 SP2&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Librerias python que se usan para la comunicación con archivos de excel:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;xlrd-0.7.1.win32 – web: &lt;a href="http://pypi.python.org/pypi/xlrd"&gt;xlrd&lt;/a&gt;&lt;br /&gt;   &lt;/li&gt;&lt;li&gt;xlwt-0.7.2.win32 – web: &lt;a href="http://pypi.python.org/pypi/xlwt"&gt;xlwt&lt;/a&gt;&lt;br /&gt;   &lt;/li&gt;&lt;li&gt;xlutils-1.4.1.win32 – web: &lt;a href="http://pypi.python.org/pypi/xlutils/1.4.1"&gt;xlutils 1.4.1&lt;/a&gt;&lt;br /&gt;   &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Una vez bajados, instalar los archivos empezando por el archivo xlrd-0.7.1.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Archivo Excel:&lt;br /&gt;&lt;table style="border-collapse: collapse;" border="0"&gt;&lt;colgroup&gt;&lt;col style="width: 30px;"&gt;&lt;col style="width: 200px;"&gt;&lt;col style="width: 200px;"&gt;&lt;/colgroup&gt;&lt;tbody valign="top"&gt;&lt;tr style="background: none repeat scroll 0% 0% black;"&gt;&lt;td style="padding-left: 7px; padding-right: 7px; border-width: 2.25pt medium; border-style: solid none;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td  style="padding-left: 7px; padding-right: 7px; border-width: 2.25pt medium; border-style: solid none;color:-moz-use-text-color;"&gt;&lt;p style="text-align: center;"&gt;&lt;span style="color:white;"&gt;&lt;strong&gt;A&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td  style="padding-left: 7px; padding-right: 7px; border-width: 2.25pt medium; border-style: solid none;color:-moz-use-text-color;"&gt;&lt;p style="text-align: center;"&gt;&lt;span style="color:white;"&gt;&lt;strong&gt;B&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="background: none repeat scroll 0% 0% black; padding-left: 7px; padding-right: 7px; border-left: medium none;"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(0, 32, 96); padding-left: 7px; padding-right: 7px;"&gt;&lt;p style="text-align: center;"&gt;David&lt;/p&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(0, 32, 96); padding-left: 7px; padding-right: 7px;"&gt;&lt;p style="text-align: center;"&gt;0&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="background: none repeat scroll 0% 0% black; padding-left: 7px; padding-right: 7px; border-left: medium none;"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="padding-left: 7px; padding-right: 7px;"&gt;&lt;p style="text-align: center;"&gt;Jorge&lt;/p&gt;&lt;/td&gt;&lt;td style="padding-left: 7px; padding-right: 7px;"&gt;&lt;p style="text-align: center;"&gt;1&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="background: none repeat scroll 0% 0% black; padding-left: 7px; padding-right: 7px; border-left: medium none;"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;&lt;strong&gt;3&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(0, 32, 96); padding-left: 7px; padding-right: 7px;"&gt;&lt;p style="text-align: center;"&gt;Arturo&lt;/p&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(0, 32, 96); padding-left: 7px; padding-right: 7px;"&gt;&lt;p style="text-align: center;"&gt;2&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="background: none repeat scroll 0% 0% black; padding-left: 7px; padding-right: 7px; border-left: medium none;"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;&lt;strong&gt;4&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="padding-left: 7px; padding-right: 7px;"&gt;&lt;p style="text-align: center;"&gt;Sylvia&lt;/p&gt;&lt;/td&gt;&lt;td style="padding-left: 7px; padding-right: 7px;"&gt;&lt;p style="text-align: center;"&gt;3&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="background: none repeat scroll 0% 0% black; padding-left: 7px; padding-right: 7px; border-left: medium none;"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(0, 32, 96); padding-left: 7px; padding-right: 7px;"&gt;&lt;p style="text-align: center;"&gt;Carolina&lt;/p&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(0, 32, 96); padding-left: 7px; padding-right: 7px;"&gt;&lt;p style="text-align: center;"&gt;4&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="background: none repeat scroll 0% 0% black; padding-left: 7px; padding-right: 7px; border-left: medium none;"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;&lt;strong&gt;6&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="padding-left: 7px; padding-right: 7px;"&gt;&lt;p style="text-align: center;"&gt;Graciela&lt;/p&gt;&lt;/td&gt;&lt;td style="padding-left: 7px; padding-right: 7px;"&gt;&lt;p style="text-align: center;"&gt;5&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="background: none repeat scroll 0% 0% black; padding-left: 7px; padding-right: 7px; border-left: medium none;"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;&lt;strong&gt;7&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(0, 32, 96); padding-left: 7px; padding-right: 7px;"&gt;&lt;p style="text-align: center;"&gt;Fernando&lt;/p&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(0, 32, 96); padding-left: 7px; padding-right: 7px;"&gt;&lt;p style="text-align: center;"&gt;6&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="background: none repeat scroll 0% 0% black; padding-left: 7px; padding-right: 7px; border-left: medium none;"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;&lt;strong&gt;8&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="padding-left: 7px; padding-right: 7px;"&gt;&lt;p style="text-align: center;"&gt;Elena&lt;/p&gt;&lt;/td&gt;&lt;td style="padding-left: 7px; padding-right: 7px;"&gt;&lt;p style="text-align: center;"&gt;7&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="background: none repeat scroll 0% 0% black; padding-left: 7px; padding-right: 7px; border-left: medium none;"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;&lt;strong&gt;9&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(0, 32, 96); padding-left: 7px; padding-right: 7px;"&gt;&lt;p style="text-align: center;"&gt;Carlos&lt;/p&gt;&lt;/td&gt;&lt;td style="background: none repeat scroll 0% 0% rgb(0, 32, 96); padding-left: 7px; padding-right: 7px;"&gt;&lt;p style="text-align: center;"&gt;8&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="background: none repeat scroll 0% 0% black; padding-left: 7px; padding-right: 7px; border-left: medium none; border-bottom: 2.25pt solid;"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="padding-left: 7px; padding-right: 7px; border-bottom: 2.25pt solid;"&gt;&lt;p style="text-align: center;"&gt;Daniela&lt;/p&gt;&lt;/td&gt;&lt;td style="padding-left: 7px; padding-right: 7px; border-bottom: 2.25pt solid;"&gt;&lt;p style="text-align: center;"&gt;9&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Guardar el archivo en formato &lt;span style="color: rgb(118, 146, 60);"&gt;&lt;em&gt;"Libro de Excel 97 – 2003 *.xls"&lt;/em&gt;&lt;/span&gt;, en la ruta "c:\" con el nombre de prueba.xls, ejemplo: &lt;span style="color: rgb(0, 112, 192);"&gt;&lt;strong&gt;C:\prueba.xls&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;   &lt;/p&gt;&lt;p&gt; Crear tabla:&lt;br /&gt;&lt;/p&gt;&lt;table style="border-collapse: collapse; background: none repeat scroll 0% 0% rgb(0, 32, 96);" border="0"&gt;&lt;colgroup&gt;&lt;col style="width: 599px;"&gt;&lt;/colgroup&gt;&lt;tbody valign="top"&gt;&lt;tr&gt;&lt;td style="padding-left: 7px; padding-right: 7px; border: 0.5pt solid;"&gt;&lt;p&gt;&lt;span style="font-size:8pt;"&gt;CREATE TABLE excel&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;"&gt;(&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;"&gt;  campo1 character varying(20),&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;"&gt;  campo2 character varying(20)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;"&gt;WITH (&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;"&gt;  OIDS=FALSE&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;"&gt;ALTER TABLE excel OWNER TO postgres;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Pocedimiento almacenado:&lt;br /&gt;&lt;/p&gt;&lt;div id='codxlrd' style="overflow: hidden; width:100%" onmouseover="javascript:Ver('codxlrd', 1, '150%', 'auto', 'hidden');" onmouseout="javascript:Ver('codxlrd',0,'100%','auto','hidden');"&gt;&lt;table style="border-collapse: collapse; background: none repeat scroll 0% 0% rgb(0, 32, 96);" border="0"&gt;&lt;colgroup&gt;&lt;col style="width: 599px;"&gt;&lt;/colgroup&gt;&lt;tbody valign="top"&gt;&lt;tr&gt;&lt;td style="padding-left: 7px; padding-right: 7px; border: 0.5pt solid black;"&gt;&lt;pre&gt;&lt;p&gt;&lt;span style="font-size:8pt;"&gt;CREATE OR REPLACE FUNCTION fexcel1() RETURNS text AS&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;"&gt;$BODY$&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;"&gt;    from xlrd import open_workbook,cellname&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;"&gt;    libro = open_workbook('c:/prueba.xls')&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;"&gt;    hoja = libro.sheet_by_index(0)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;"&gt;    for row_index in range(hoja.nrows):&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;"&gt;        val1 = hoja.cell(row_index,0).value&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;"&gt;        val2 = hoja.cell(row_index,1).value&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;"&gt;        plpy.execute("INSERT INTO excel(campo1, campo2) VALUES ( '" + val1 + "', '" + str(val2) + "' )")&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;"&gt;    return "Funciona"&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;"&gt;$BODY$&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;"&gt;  LANGUAGE 'plpythonu' VOLATILE&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;"&gt;  COST 100;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;"&gt;ALTER FUNCTION fexcel1() OWNER TO postgres;&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Comentarios:&lt;br /&gt;&lt;/p&gt;&lt;table style="border-collapse: collapse;" border="0"&gt;&lt;colgroup&gt;&lt;col style="width: 299px;"&gt;&lt;col style="width: 299px;"&gt;&lt;/colgroup&gt;&lt;tbody valign="top"&gt;&lt;tr&gt;&lt;td style="padding-left: 7px; padding-right: 7px; border-top: 0.5pt solid; border-left: 0.5pt solid; border-bottom: 1pt solid rgb(75, 172, 198);"&gt;&lt;p&gt;&lt;span style="color: rgb(148, 138, 84);"&gt;from xlrd import open_workbook,cellname:&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="padding-left: 7px; padding-right: 7px; border-top: 0.5pt solid; border-bottom: 1pt solid rgb(75, 172, 198); border-right: 0.5pt solid;"&gt;&lt;p&gt;&lt;span style="color: rgb(49, 132, 155);"&gt;Esta línea indica que se va a importar la librería xlrd para abrir y leer un archivo de Excel.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="background: none repeat scroll 0% 0% rgb(210, 234, 241);"&gt;&lt;td style="padding-left: 7px; padding-right: 7px; border-top: medium none; border-left: 0.5pt solid; border-bottom: 1pt solid rgb(75, 172, 198);"&gt;&lt;p&gt;&lt;span style="color: rgb(148, 138, 84);"&gt;libro = open_workbook('c:/prueba.xls'):&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="padding-left: 7px; padding-right: 7px; border-top: medium none; border-bottom: 1pt solid rgb(75, 172, 198); border-right: 0.5pt solid;"&gt;&lt;p&gt;&lt;span style="color: rgb(49, 132, 155);"&gt;Se abre el archivo de Excel y se asigna a la variable "libro".&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="padding-left: 7px; padding-right: 7px; border-top: medium none; border-left: 0.5pt solid; border-bottom: 1pt solid rgb(75, 172, 198);"&gt;&lt;p&gt;&lt;span style="color: rgb(148, 138, 84);"&gt;hoja = libro.sheet_by_index(0):&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="padding-left: 7px; padding-right: 7px; border-top: medium none; border-bottom: 1pt solid rgb(75, 172, 198); border-right: 0.5pt solid;"&gt;&lt;p&gt;&lt;span style="color: rgb(49, 132, 155);"&gt;Se accede a la primera hoja del libro abierto y se le asigna a la variable "hoja".&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="background: none repeat scroll 0% 0% rgb(210, 234, 241);"&gt;&lt;td style="padding-left: 7px; padding-right: 7px; border-top: medium none; border-left: 0.5pt solid; border-bottom: 1pt solid rgb(75, 172, 198);"&gt;&lt;p&gt;&lt;span style="color: rgb(148, 138, 84);"&gt;for row_index in range(hoja.nrows):&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="padding-left: 7px; padding-right: 7px; border-top: medium none; border-bottom: 1pt solid rgb(75, 172, 198); border-right: 0.5pt solid;"&gt;&lt;p&gt;&lt;span style="color: rgb(49, 132, 155);"&gt;Se comienza un bucle con el número de iteraciones igual al número máximo de filas.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="padding-left: 7px; padding-right: 7px; border-top: medium none; border-left: 0.5pt solid; border-bottom: 1pt solid rgb(75, 172, 198);"&gt;&lt;p&gt;&lt;span style="color: rgb(148, 138, 84);"&gt;val1 = hoja.cell(row_index,0).value:&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="padding-left: 7px; padding-right: 7px; border-top: medium none; border-bottom: 1pt solid rgb(75, 172, 198); border-right: 0.5pt solid;"&gt;&lt;p&gt;&lt;span style="color: rgb(49, 132, 155);"&gt;Se asigna el valor de la fila en que se encuentre el bucle de la primera columna a la variable "val1".&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="background: none repeat scroll 0% 0% rgb(210, 234, 241);"&gt;&lt;td style="padding-left: 7px; padding-right: 7px; border-width: medium medium 1pt; border-style: none none solid; border-color: -moz-use-text-color -moz-use-text-color rgb(75, 172, 198);"&gt;&lt;p&gt;&lt;span style="color: rgb(148, 138, 84);"&gt;val2 = hoja.cell(row_index,1).value:&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="padding-left: 7px; padding-right: 7px; border-width: medium medium 1pt; border-style: none none solid; border-color: -moz-use-text-color -moz-use-text-color rgb(75, 172, 198);"&gt;&lt;p&gt;&lt;span style="color: rgb(49, 132, 155);"&gt;Se asigna el valor de la fila en que se encuentre el bucle de la segunda columna a la variable "val2".&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="padding-left: 7px; padding-right: 7px; border-top: medium none; border-left: 0.5pt solid; border-bottom: 0.5pt solid;"&gt;&lt;p&gt;&lt;span style="color: rgb(148, 138, 84);"&gt;plpy.execute("INSERT INTO excel(campo1, campo2) VALUES ( '" + val1 + "', '" + str(val2) + "' )"):&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="padding-left: 7px; padding-right: 7px; border-top: medium none; border-bottom: 0.5pt solid; border-right: 0.5pt solid;"&gt;&lt;p&gt;&lt;span style="color: rgb(49, 132, 155);"&gt;Se ejecuta el "insert" para guardar los valores obtenidos de las celdas.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Ejecución del script:&lt;br /&gt;&lt;/p&gt;&lt;table style="border-collapse: collapse; background: none repeat scroll 0% 0% rgb(0, 32, 96);" border="0"&gt;&lt;colgroup&gt;&lt;col style="width: 599px;"&gt;&lt;/colgroup&gt;&lt;tbody valign="top"&gt;&lt;tr&gt;&lt;td style="padding-left: 7px; padding-right: 7px; border: 0.5pt solid black;"&gt;&lt;p&gt;select fexcel1();&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Comentarios finales:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Con las librerías de python antes expuestas se pueden hacer muchas más cosas, como por ejemplo actualizar los valores de una celda en el archivo de Excel y combinando esto con postgreSQL se puede hacer la actualización de un libro obteniendo primero los datos de una tabla, aunque eso quedará para otro tutorial.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Recuerden instalar el lenguaje plpythonu, si no, este ejemplo no funcionará.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Sólo ha sido probado bajo Windows, los usuarios de Linux están marginados de momento.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color:red;"&gt;Nota importante:&lt;/span&gt; Recién estoy aprendiendo python, cualquier comentario sobre el lenguaje les recomiendo que busquen por "San" google, les proporcionará más información de la que yo les puedo dar.&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Muchas gracias.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Firma: &lt;span style="color: rgb(0, 176, 80);"&gt;XDRTAS&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;&lt;hr /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2124217069974135740-406974368998843479?l=xdrtas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xdrtas.blogspot.com/feeds/406974368998843479/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2124217069974135740&amp;postID=406974368998843479&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2124217069974135740/posts/default/406974368998843479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2124217069974135740/posts/default/406974368998843479'/><link rel='alternate' type='text/html' href='http://xdrtas.blogspot.com/2010/04/0003-excel-postgresql.html' title='0003 Excel - PostgreSQL'/><author><name>xdrtas</name><uri>http://www.blogger.com/profile/06633503378192749976</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-GTZO4GO-ad0/TW-HR7ov2BI/AAAAAAAAADI/2tiQbfNTfbI/s220/IMG00092-20101128-1206.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2124217069974135740.post-879499445779689400</id><published>2010-04-22T20:40:00.034-04:30</published><updated>2010-07-18T16:53:08.966-04:30</updated><title type='text'>0002 Ajax – PHP – PostgreSQL I</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-family:'Courier New',serif;"&gt;La explicación de lo que es AJAX va más allá de este tema, por "San" google podrán encontrar referencias excelentes de qué es AJAX y su historia.&lt;/span&gt;&lt;/div&gt;&lt;span xmlns=""&gt;&lt;p style="text-align: justify;"&gt;&lt;span style="font-family:Courier New;"&gt;En este artículo se va a mostrar el funcionamiento básico de AJAX puro y duro, los frameworks los veremos más adelante. &lt;span style="color: rgb(0, 176, 80);"&gt;Espero que les guste&lt;/span&gt;.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: justify;"&gt;&lt;span style="font-family:Courier New;"&gt;En este ejemplo se establece la comunicación por medio del método "POST".&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: justify;"&gt;&lt;span style="font-family:Courier New;"&gt;Lo primero es, tener claro lo que se va a realizar en este artículo y para eso he realizado el siguiente diagrama con &lt;span style="color: rgb(0, 176, 80);"&gt;MS-Visio&lt;/span&gt;:&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;div id='imgAjax' style="overflow:hidden; width:100%;" onmouseover="javascript:Ver('imgAjax', 1, '100%', 'auto', 'hidden');" onmouseout="javascript:Ver('imgAjax',0,'100%','auto','hidden');"&gt;&lt;br /&gt;&lt;img src="http://img709.imageshack.us/img709/1593/ajaxg.png" alt="Image Hosted by ImageShack.us" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-family:'Courier New',serif;"&gt;Explicación:&lt;/span&gt;&lt;/p&gt;&lt;ol&gt;&lt;li style="text-align: justify;"&gt;&lt;span style="font-family:Courier New;"&gt;El cliente llama al servidor para visualizar la página "html", (&lt;span style="color: rgb(0, 176, 80);"&gt;&lt;em&gt;testhtml.html&lt;/em&gt;&lt;/span&gt;), que contiene la información.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-family:'Courier New',serif;"&gt;La página &lt;em&gt;&lt;span style="color: rgb(0, 176, 80);"&gt;testhtml.html&lt;/span&gt; contiene un link que al hacer "click" en él, éste hace la llamada a la función correspondiente para obtener los datos que el usuario busca.&lt;/em&gt;&lt;/span&gt;&lt;em&gt;&lt;/em&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-family:'Courier New',serif;"&gt;La función javascript se encarga de llamar al script &lt;span style="color: rgb(255, 192, 0);"&gt;&lt;strong&gt;php&lt;/strong&gt;&lt;/span&gt;, (&lt;span style="color: rgb(255, 192, 0);"&gt;&lt;em&gt;testphp.php&lt;/em&gt;&lt;/span&gt;). El script &lt;strong&gt;&lt;span style="color: rgb(255, 192, 0);"&gt;php&lt;/span&gt;&lt;/strong&gt; contiene la conexión a la base de datos y la consulta SQL que trae los datos de la tabla.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;span style="font-family:Courier New;"&gt;El script &lt;span style="color: rgb(255, 192, 0);"&gt;&lt;em&gt;testphp.php &lt;/em&gt;&lt;/span&gt;se ejecuta, éste llama a la base de datos "pruebas" tabla "prueba" y devuelve el resultado a la función javascript que hizo la llamada, (&lt;span style="font-weight: bold;"&gt;fDatos(id, url)&lt;/span&gt;),desde el script javascript, (&lt;span style="color:red;"&gt;&lt;em&gt;testajax.js&lt;/em&gt;&lt;/span&gt;) luego se actualiza la página "html" con los resultados obtenidos.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;span style="font-family:Courier New;"&gt;El cliente visualiza el nuevo resultado.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-family:courier new;"&gt;Código SQL:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: darkblue; color: white; font-size: 10px;"&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;CREATE TABLE prueba (&lt;br /&gt;   id integer NOT NULL,&lt;br /&gt;   nombre character varying(50),&lt;br /&gt;   apellido character varying(50),&lt;br /&gt;   cedula character varying(10)&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;--Recuerden añadir datos a la tabla...&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p style="text-align: justify;"&gt;&lt;span style="font-family:Courier New;"&gt;Código HTML – (&lt;span style="color: rgb(0, 176, 80);"&gt;testhtml.html&lt;/span&gt;):&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;div id='htmltxt' style="overflow:hidden; width:100%; background-color:darkblue; color:white; font-size: 10px;" onmouseover="javascript:Ver('htmltxt', 1, '150%', 'auto', 'hidden');" onmouseout="javascript:Ver('htmltxt',0,'100%','auto','hidden');"&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;  &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&amp;gt;&lt;br /&gt;  &amp;lt;title&amp;gt;&lt;span style="color: rgb(204, 0, 0);"&gt;Prueba de [ AJAX - PHP - POSTGRESQL ]&lt;/span&gt;&amp;lt;/title&amp;gt;&lt;br /&gt;  &amp;lt;script language="javascript" src="testajax.js" type="application/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body style="background-color:#366;"&amp;gt;&lt;br /&gt;  &amp;lt;table border="0" style="color:white; background-color:#000;" align="center"&amp;gt;&lt;br /&gt;    &amp;lt;tr&amp;gt;&lt;br /&gt;      &amp;lt;td colspan="2" align="center"&amp;gt;&lt;br /&gt;        &amp;lt;strong&amp;gt;&lt;span style="color: rgb(204, 0, 0);"&gt;Prueba de:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/strong&amp;gt;&amp;lt;span style="color:#F00; font-weight:bolder;"&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;[ AJAX - PHP - POSTGRESQL ]&lt;/span&gt;&amp;lt;/span&amp;gt;&lt;br /&gt;      &amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt;    &amp;lt;tr&amp;gt;&lt;br /&gt;      &amp;lt;td colspan="2"&amp;gt;&lt;br /&gt;        &lt;span style="color: rgb(102, 102, 51);"&gt;&amp;lt;div id="contenido" style="color:#1FE4EF; font-family:'Times New Roman', Times, serif;"&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;br /&gt;      &amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt;    &amp;lt;tr&amp;gt;&lt;br /&gt;      &amp;lt;td align="center"&amp;gt;&lt;br /&gt;        &amp;lt;a href="#" onclick="javascript:fDatos('contenido','testphp.php');" style="color:#0F0; text-decoration:none;"&amp;gt;&lt;span style="color: rgb(204, 0, 0);"&gt;[ Mostrar datos ]&lt;/span&gt;&amp;lt;/a&amp;gt;&lt;br /&gt;      &amp;lt;/td&amp;gt;&lt;br /&gt;      &amp;lt;td align="center"&amp;gt;&lt;br /&gt;        &amp;lt;a href="#" onclick="javascript:fBorrar('contenido');" style="color:#F00; text-decoration:none;"&amp;gt;&lt;span style="color: rgb(204, 0, 0);"&gt;[ Limpiar contenido ]&lt;/span&gt;&amp;lt;/a&amp;gt;&lt;br /&gt;      &amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt; &amp;lt;/table&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;Código JavaScript – (&lt;span style="color:red;"&gt;testajax.js&lt;/span&gt;):&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;div id='jsAjax' style="overflow:hidden; width:100%; background-color:darkblue; color:white; font-size: 10;" onmouseover="javascript:Ver('jsAjax', 1, '150%', 'auto', 'hidden');" onmouseout="javascript:Ver('jsAjax',0,'100%','auto','hidden');"&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;/*------------------------------------------------------*/&lt;br /&gt;//Función para crear el objeto Ajax.     //&lt;br /&gt;/*------------------------------------------------------*/&lt;br /&gt;function nuevoAjax()&lt;br /&gt;{&lt;br /&gt;  var xmlhttp=false;&lt;br /&gt;  try&lt;br /&gt;  {&lt;br /&gt;       xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");&lt;br /&gt;  }&lt;br /&gt;  catch (e)&lt;br /&gt;  {&lt;br /&gt;       try&lt;br /&gt;       {&lt;br /&gt;             xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");&lt;br /&gt;       }&lt;br /&gt;       catch (e)&lt;br /&gt;       {&lt;br /&gt;             xmlhttp = false;&lt;br /&gt;       }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  if (!xmlhttp &amp;amp;&amp;amp; typeof XMLHttpRequest!='undefined')&lt;br /&gt;  {&lt;br /&gt;       xmlhttp = new XMLHttpRequest();&lt;br /&gt;  }&lt;br /&gt;  return xmlhttp;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*------------------------------------------------------*/&lt;br /&gt;//id: id del control div que va a recibir los datos. //&lt;br /&gt;//url: Dirección url de la página donde se    //&lt;br /&gt;//  obtiene los datos.        //&lt;br /&gt;/*------------------------------------------------------*/&lt;br /&gt;function fDatos(id, url)&lt;br /&gt;{&lt;br /&gt;  var objDiv = document.getElementById(id);&lt;br /&gt;&lt;br /&gt;  ajax = nuevoAjax();&lt;br /&gt;&lt;br /&gt;  ajax.open("POST", url, true);&lt;br /&gt;&lt;br /&gt;  ajax.onreadystatechange = function()&lt;br /&gt;  {&lt;br /&gt;      switch (ajax.readyState)&lt;br /&gt;      {&lt;br /&gt;            case 0:&lt;br /&gt;                 objDiv.innerHTML = 'Error 0. No se ha abierto la comunicaci&amp;amp;oacute;n.';&lt;br /&gt;                 break;&lt;br /&gt;            case 1:&lt;br /&gt;                 objDiv.innerHTML = 'Por favor, espere. Cargando...';&lt;br /&gt;                 break;&lt;br /&gt;            case 2:&lt;br /&gt;                 objDiv.innerHTML = 'Petici&amp;amp;oacute;n cargada, esperando respuesta del servidor...';&lt;br /&gt;                 break;&lt;br /&gt;            case 3:&lt;br /&gt;                 objDiv.innerHTML = '';&lt;br /&gt;                 break;&lt;br /&gt;            case 4:&lt;br /&gt;                 if(ajax.status == 200)&lt;br /&gt;                 {&lt;br /&gt;                      objDiv.innerHTML = "";&lt;br /&gt;                      objDiv.innerHTML = ajax.responseText;&lt;br /&gt;                 }&lt;br /&gt;                 else&lt;br /&gt;                 {&lt;br /&gt;                      objDiv.innerHTML = 'Error 200';&lt;br /&gt;                 }&lt;br /&gt;                 break;&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;  ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");&lt;br /&gt;  ajax.send();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*------------------------------------------------------*/&lt;br /&gt;//Borrar los datos de la celda en la página web...  //&lt;br /&gt;/*------------------------------------------------------*/&lt;br /&gt;function fBorrar(id)&lt;br /&gt;{&lt;br /&gt;   document.getElementById(id).innerHTML = "";&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p style="margin-left: 35pt;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="text-align: justify;"&gt;&lt;span style="font-family:Courier New;"&gt;La función nuevoAjax() es la función estándar que sirve para crear el objeto ajax que se encarga de la actualización del contenido de forma asincrónica, o sea, que un elemento de la página se actualice sin que el resto de la página se vea afectada.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: justify;"&gt;&lt;span style="font-family:Courier New;"&gt;La función fDatos(id, url) es la función que se encarga de obtener los datos del script de &lt;span style="color: rgb(255, 192, 0);"&gt;&lt;strong&gt;php &lt;/strong&gt;&lt;/span&gt;para poder visualizarlo en la página html, (&lt;span style="color: rgb(0, 176, 80);"&gt;&lt;em&gt;testhtml.html&lt;/em&gt;&lt;/span&gt;). El parámetro "id" contiene el nombre de la etiqueta "&lt;span style="color: rgb(0, 176, 80);"&gt;DIV&lt;/span&gt;" con el nombre "&lt;span style="color: rgb(0, 176, 80);"&gt;contenido&lt;/span&gt;" de la página &lt;span style="color: rgb(0, 176, 80);"&gt;&lt;em&gt;testhtml.html&lt;/em&gt;&lt;/span&gt;. El parámetro "url" contiene la dirección del script &lt;span style="color: rgb(255, 192, 0);"&gt;&lt;strong&gt;php&lt;/strong&gt;&lt;/span&gt; que se va a ejecutar, en este caso es &lt;span style="color: rgb(255, 192, 0);"&gt;&lt;em&gt;testphp.php&lt;/em&gt;&lt;/span&gt;.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: justify;"&gt;&lt;span style="font-family:Courier New;"&gt;La función fBorrar(id), borra el contenido de la etiqueta "&lt;span style="color: rgb(0, 176, 80);"&gt;DIV&lt;/span&gt;" denominado "&lt;span style="color: rgb(0, 176, 80);"&gt;contenido&lt;/span&gt;".&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: justify;"&gt;&lt;span style="font-family:Courier New;"&gt;Código PHP – &lt;span style="color: rgb(255, 192, 0);"&gt;testphp.php&lt;/span&gt;:&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;div id='phptxt' style="overflow:hidden; width:100%; background-color:darkblue; color:white; font-size: 10;" onmouseover="javascript:Ver('phptxt', 1, '150%', 'auto', 'hidden');" onmouseout="javascript:Ver('phptxt',0,'100%','auto','hidden');"&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;//Conexión a la BBDD en postgreSQL...&lt;br /&gt;$conbd = pg_connect("host=localhost port=5432 dbname=pruebas user=tuusuario password=tupassword") or die(pg_last_error());&lt;br /&gt;&lt;br /&gt;$sql = "SELECT * FROM prueba;";  //Consulta SQL...&lt;br /&gt;$res = pg_query($conbd, $sql);&lt;br /&gt;if($res)&lt;br /&gt;{&lt;br /&gt;   $html  = "&amp;lt;table border=\"1\"&amp;gt;";&lt;br /&gt;   $html .= "&amp;lt;tr&amp;gt;";&lt;br /&gt;   $html .= "&amp;lt;td align=\"center\"&amp;gt; [ ID ]    &amp;lt;/td&amp;gt;";&lt;br /&gt;   $html .= "&amp;lt;td align=\"center\"&amp;gt; [ NOMBRE ]   &amp;lt;/td&amp;gt;";&lt;br /&gt;   $html .= "&amp;lt;td align=\"center\"&amp;gt; [ APELLIDO ]  &amp;lt;/td&amp;gt;";&lt;br /&gt;   $html .= "&amp;lt;td align=\"center\"&amp;gt; [ C&amp;amp;Eacute;DULA ] &amp;lt;/td&amp;gt;";&lt;br /&gt;   $html .= "&amp;lt;/tr&amp;gt;";&lt;br /&gt;&lt;br /&gt;   while($val = pg_fetch_array($res))&lt;br /&gt;   {&lt;br /&gt;       $html .= "&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;" . $val[0] . "&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;" . $val[1] . "&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;" . $val[2] . "&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;" . $val[3] . "&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;";&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   $html .= "&amp;lt;/table&amp;gt;";&lt;br /&gt;   &lt;br /&gt;   pg_close($conbd);&lt;br /&gt;   echo $html;&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p style="text-align: justify;"&gt;&lt;span style="font-family:Courier New;"&gt;El código &lt;span style="color: rgb(255, 192, 0);"&gt;&lt;strong&gt;php&lt;/strong&gt;&lt;/span&gt; muestra la conexión a la base de datos con la función "pg_connect()", la variable "$sql" contiene la cadena de consulta SQL para obtener los datos y la variable "$html" contiene una cadena de caracteres con el código HTML más el resultado de la consulta que es devuelta por medio del comando "echo".&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: justify;"&gt;&lt;span style="font-family:Courier New;"&gt;"$html" es la variable que se devuelve a la función de javascript fDatos(id, url). fDatos(id, url) se encarga de actualizar la página html por medio del siguiente método "innerHTML" que pertenece al objeto document.getElmentId().&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: justify;"&gt;&lt;span style="font-family:Courier New;"&gt;Elementos de la función fDatos(id, url) - &lt;span style="color:red;"&gt;AJAX&lt;/span&gt;:&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;&lt;span style="font-family:Courier New;"&gt;Ajax = nuevoAjax() – para crear el objeto ajax.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;span style="font-family:Courier New;"&gt;Ajax.open: Método que abre el script para obtener los datos.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family:Courier New;"&gt;Ajax.onreadystatechange: Método que se encarga de evaluar el estado del script que se ha llamado, hay 5 estados posibles:&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;&lt;span style="font-family:Courier New;"&gt;0: No se ha abierto la comunicación con el script seleccionado.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;span style="font-family:Courier New;"&gt;1: Estado en espera.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;span style="font-family:Courier New;"&gt;2: La petición está cargando, esperando respuesta del servidor.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;span style="font-family:Courier New;"&gt;3: Estado interactivo.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;span style="font-family:Courier New;"&gt;4: Comprobar el status de la respuesta, si es 200 todo ok, si no, hubo un fallo.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;span style="font-family:Courier New;"&gt;Ajax.setRequestHeader: el formato de la cabecera del archivo para procesar los datos.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;span style="font-family:Courier New;"&gt;Ajax.send(): Para enviar parámetros al script &lt;span style="color: rgb(255, 192, 0);"&gt;&lt;strong&gt;php&lt;/strong&gt;&lt;/span&gt;. Más adelante colocaré un ejemplo de cómo usar este método.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style="text-align: justify;"&gt;&lt;span style="font-family:Courier New;"&gt;Para más información sobre AJAX, pueden visitar la siguiente página: &lt;a href="http://www.librosweb.es/"&gt;librosweb&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: justify;"&gt;&lt;span style="font-family:Courier New;"&gt;Conclusión:&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: justify;"&gt;&lt;span style="font-family:Courier New;"&gt;Usar AJAX es realmente muy sencillo sólo hay que tener claro cómo funciona básicamente el proceso de comunicación, aquí les dejo un pequeño resumen visual del proceso.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: justify;"&gt;&lt;span style="font-family:Courier New;"&gt;Petición de datos:&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;div id='imgPetDat' style="overflow:hidden; width:100%;" onmouseover="javascript:Ver('imgPetDat', 1, '150%', 'auto', 'hidden');" onmouseout="javascript:Ver('imgPetDat',0,'100%','auto','hidden');"&gt;&lt;br /&gt;&lt;img src="http://img228.imageshack.us/img228/8998/ajaxida.png" alt="Image Hosted by ImageShack.us" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p style="text-align: justify;"&gt;&lt;span style="font-family:Courier New;"&gt;Recepción de datos:&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;div id='imgRecDat' style="overflow:hidden; width:100%;" onmouseover="javascript:Ver('imgRecDat', 1, '150%', 'auto', 'hidden');" onmouseout="javascript:Ver('imgRecDat',0,'100%','auto','hidden');"&gt;&lt;br /&gt;&lt;img src="http://img59.imageshack.us/img59/4808/ajaxvenida.png" alt="Image Hosted by ImageShack.us" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p style="text-align: justify;"&gt;&lt;span style="font-family:Courier New;"&gt;De momento esto es todo, recuerden que "San" google les puede proveer más información, esto es sólo un ejemplo de lo que se puede hacer con AJAX – PHP – POSTGRESQL sin usar ningún framework.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: justify;"&gt;&lt;span style="font-family:Courier New;"&gt;Un cordial saludo.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: justify;"&gt;&lt;span style="font-family:Courier New;"&gt;Firma: &lt;span style="color: rgb(0, 176, 80);"&gt;XDRTAS&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;hr /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2124217069974135740-879499445779689400?l=xdrtas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xdrtas.blogspot.com/feeds/879499445779689400/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2124217069974135740&amp;postID=879499445779689400&amp;isPopup=true' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2124217069974135740/posts/default/879499445779689400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2124217069974135740/posts/default/879499445779689400'/><link rel='alternate' type='text/html' href='http://xdrtas.blogspot.com/2010/04/0002-ajax-php-postgresql-i.html' title='0002 Ajax – PHP – PostgreSQL I'/><author><name>xdrtas</name><uri>http://www.blogger.com/profile/06633503378192749976</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-GTZO4GO-ad0/TW-HR7ov2BI/AAAAAAAAADI/2tiQbfNTfbI/s220/IMG00092-20101128-1206.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2124217069974135740.post-910390750529939668</id><published>2010-04-19T14:59:00.008-04:30</published><updated>2010-05-05T15:43:41.039-04:30</updated><title type='text'>0001 Consejos básicos de programación</title><content type='html'>&lt;div  style="text-align: justify;font-family:'Courier New';"&gt;He decidido empezar este blog con unos tips o consejos de programación básica, los que más tengo en cuenta a la hora de programar.&lt;br /&gt;Estoy seguro de que "googleando" encontrarán muchos tips y seguramente muy buenos, sin embargo, he querido hacer mi propia contribución al tema. Los puntos son los siguientes:&lt;br /&gt;&lt;/div&gt;&lt;div face="'Courier New'" style="text-align: justify;"&gt;&lt;ol&gt;&lt;li&gt;Tener claras las estructuras básicas de control: &lt;span class="Apple-style-span" style="color: rgb(0, 153, 0);font-family:'Courier New';" &gt;Secuencial&lt;/span&gt; - &lt;span class="Apple-style-span" style="color: rgb(0, 153, 0);font-family:'Courier New';" &gt;Selectivas&lt;/span&gt; - &lt;span class="Apple-style-span" style="color: rgb(0, 153, 0);font-family:'Courier New';" &gt;Repetitivas&lt;/span&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Tener claro la idea de como se construye un procedimiento o función.&lt;/li&gt;&lt;li&gt;Saber programar y usar estructuras de datos, &lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;(No confundir con estructuras de control)&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;"Una imagen vale más que mil palabras". Usar siempre diagramas para la definición del módulo, procedimiento o función, los diagramas aclaran mucho el objetivo del módulo.&lt;/li&gt;&lt;li&gt;Las ideas claras; saber cual es el objetivo del procedimiento, lo que va a hacer internamente, y a que otros procedimientos afecta.&lt;/li&gt;&lt;li&gt;Identar el código. Este punto es muy importante, una buena identación hace que el código  sea mucho más fácil de leer.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Más adelante seguiré añadiendo otros puntos.&lt;br /&gt;&lt;br /&gt;Firma:&lt;span class="Apple-style-span" style="color: rgb(0, 153, 0);font-family:'Courier New';" &gt; XDRTAS&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;hr /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2124217069974135740-910390750529939668?l=xdrtas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xdrtas.blogspot.com/feeds/910390750529939668/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2124217069974135740&amp;postID=910390750529939668&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2124217069974135740/posts/default/910390750529939668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2124217069974135740/posts/default/910390750529939668'/><link rel='alternate' type='text/html' href='http://xdrtas.blogspot.com/2010/04/0001-consejos-b-de-programaci.html' title='0001 Consejos b&amp;aacute;sicos de programaci&amp;oacute;n'/><author><name>xdrtas</name><uri>http://www.blogger.com/profile/06633503378192749976</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-GTZO4GO-ad0/TW-HR7ov2BI/AAAAAAAAADI/2tiQbfNTfbI/s220/IMG00092-20101128-1206.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2124217069974135740.post-3271198790369229962</id><published>2010-04-17T17:03:00.001-04:30</published><updated>2010-04-23T18:24:29.232-04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='xdrtas'/><category scheme='http://www.blogger.com/atom/ns#' term='Bienvenida'/><title type='text'>Bienvenid@</title><content type='html'>&lt;div style="text-align:justify;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;Bienvenid@ a mi pequeño blog sobre programación y otros campos relacionados a la informática.&lt;br /&gt;&lt;br /&gt;Mi objetivo es crear tutoriales extremadamente claros sobre los distíntos temas que serán expuestos en este blog.&lt;br /&gt;&lt;br /&gt;En algunas ocasiones usaré información de otras fuentes y éstas &lt;span class="Apple-style-span"  style="color:#009900;"&gt;SIEMPRE&lt;/span&gt; estarán referenciadas, ya sea por medio de un link hacia la fuente referenciada o el título y autor de una obra del cual se tomen los datos para explicar el artículo.&lt;br /&gt;&lt;br /&gt;Si en alguna ocasión no encuentran dicha referencia, sientanse en la libertad de hacermelo notar.&lt;br /&gt;&lt;br /&gt;Muchas gracias por visitar mi blog, espero que lo disfruten y lo más importante: &lt;span class="Apple-style-span"  style="color:#009900;"&gt;QUE LES SEA DE AYUDA.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Firma: &lt;span class="Apple-style-span"  style="color:#009900;"&gt;XDRTAS&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;hr /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2124217069974135740-3271198790369229962?l=xdrtas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2124217069974135740/posts/default/3271198790369229962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2124217069974135740/posts/default/3271198790369229962'/><link rel='alternate' type='text/html' href='http://xdrtas.blogspot.com/2010/04/bienvenid.html' title='Bienvenid@'/><author><name>xdrtas</name><uri>http://www.blogger.com/profile/06633503378192749976</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-GTZO4GO-ad0/TW-HR7ov2BI/AAAAAAAAADI/2tiQbfNTfbI/s220/IMG00092-20101128-1206.jpg'/></author></entry></feed>
