INNER JOIN y LEFT JOIN.

PostgreSQL 9.1: integridad referencial y consultas por uniones.

Esta vez realizaremos unas consultas por uniones no sin antes dar una breve explicación de la integridad referencial, una característica de las bases de datos relacionales, siempre de la manera más sencilla posible.

Para los que el orden es importante esta serie de artículos sobre PostgreSQL 9.1 comienzan acá y la manera de conectarnos al servidor vía phpPgAdmin se describe aquí.

Pues bien, comenzemos ya: tenemos creadas dos tablas llamadas students y phone_numbers y como bien lo describe sus nombres en inglés, sirven para almacenar datos de estudiantes y sus números telefónicos. Como cada persona puede tener varios teléfonos (casa, trabajo, móvil, fax, etc.) y a su vez cada una de esas ubicaciones hoy en día pueden tener varios números diferentes (en mi caso tengo 2 en casa, 3 en el trabajo y uno celular) no tiene sentido crear campos para cada uno de ellos en la tabla students porque no sabemos cuántos va a tener cada inviduo. Cualquiera me puede rebatir diciendo que aunque sea debería suministrar un número de teléfono para alguna emergencia en clase (desde el punto de vista de este ejercicio donde somos una Academia de Software Libre) pero ni con eso contaría yo, es decir, puede darse el caso que no tenga ningún teléfono (hermosa es la película «Enemy of the State» ojalá la disfruten tanto como yo la disfruté en 1999). Es por tanto que en la tabla students no dejamos ningún campo para almacenar el o los que nos suministren y los guardaremos en la tabla phone_numbers teniendo cuidado de guardar de quién es cada cual.

Observemos que al seleccionar la tabla phone_numbers desde phpPgAdmin haciendo click en «constraints» («restricciones») descubriremos el trabajo que hizo Visual Paradigm traduciendo nuestro organigrama a la base de datos:

Postgresql_2015-02-04 09:20:28Como en la entrada anterior agregamos algunos datos de los estudiantes tenemos dicha tabla de ejemplos de la siguiente manera:

Postgresql_2015-02-04 09:22:25De nuevo hacemos click en la tabla phone_numbers e insertamos un registro tal como lo hicimos en la entrada anterior, sólo que en este caso y cuando lleguemos al campo idstudent automáticamente aparecerá una lista de los estudiantes que ya tenemos registrados, en este caso identificados del 1 al 4:

Postgresql_2015-02-04 09:23:06Para probar si la base de datos funciona correctamente en su integridad referencial colocaremos el idstudent = 5 (que aún no está registrado) y le damos click a «insert»:

Postgresql_2015-02-04 09:31:18¡Oh, sorpresa! nos devuelve un mensaje de error y no es para menos ¿para qué querríamos guardar un número de teléfono si no sabemos quién es su propietario? (a menos que trabajeís como detective, hay «caso de casos»).

Desistimos pues en nuestro intento de «embasurar» nuestra base de datos y procedemos a colocarles a los tres números telefónicos que insertemos un idstudent cualquiera entre 1 y 4 y al poco rato tenemos una bonita matrícula lista para clases (aunque falta agregar cursos, aulas, profesores, horarios… «Roma no se construyó en un solo día» reza el refrán, vamos poco a poco).

Una vez hecho esto ya estamos listos para hacer unas consultas entre ambas tablas y con propósitos didácticos ejecutamos la primera consulta (y de manera similar a nuestra entrada anterior):

SELECT students.name, phone_numbers.number

FROM students, phone_numbers

WHERE students.id = phone_numbers.idstudent;

Postgresql_2015-02-04 09:44:09La consulta está en escrita en tres líneas pero la base de datos «sabe» que la misma termina cuando alcanza el punto y coma «;» y dicha manera de escribirla nos proporciona legibilidad para desglosarla y explicarla, línea por línea:

  • La primera línea ordena que seleccione «SELECT» los campos «name» de la tabla «students» (de allí el punto como unión) e igual con «number» que pertenece a la tabla «phone_numbers». Esta sintaxis permite que, por ejemplo, dos campos con el mismo nombre en diferentes tablas sean identificados sin ambigüedad alguna.
  • La segunda línea «FROM» instruye de cuáles tablas sacarán los datos.
  • La tercera línea «WHERE» está el condicional: para cada estudiante que devuelva el o los números telefónico(s) registrado(s) relacionados entre sí por el identificador numérico.

Como sólo insertamos tres números telefónicos pues sólo tres estudiantes con teléfonos será lo que veremos (en este caso para cada estudiante un solo número telefónico que sería el caso más común). ¿Pero y si queremos visualizar TODOS los estudiantes, tengan o no número telefónico registrado?

Uniones o «JOIN»:

En el lenguaje SQL existe el comando JOIN con sus prefijos INNER, LEFT y RIGHT haciendo la salvedad que «JOIN» = «INNER JOIN» y será el primero que veremos para realizar la misma consulta que hicimos con el condicional WHERE:

SELECT students.name, phone_numbers.number

FROM students

INNER JOIN phone_numbers

ON students.id=phone_numbers.idstudent;

Postgresql_2015-02-04 09:44:49

De nuevo desglosamos y analizamos línea por línea (recordad el para qué sirve el punto y coma al final de la consulta):

  • La primera línea solicitamos los campos que nos interesan de ambas tablas, cada uno con su espacio de nombres para evitar confusiones.
  • La segunda línea específicamos la tabla «principal» (esto tendrá sentido más adelante) es decir los estudiantes, ya que ellos son los propietarios de cada número de teléfono.
  • La tercera línea indica hacia cual tabla se hará la unión, osea con cual se combinará.
  • La última linea establece cómo relacionar los datos, en este caso una sola condición posible de relación entre ambas tablas (pudieran haber otras relaciones posibles pero por ahora no complicaremos las cosas).
INNER JOIN
INNER JOIN

Hasta aquí todo bien pero volvamos a la pregunta:

¿Pero y si queremos visualizar TODOS los estudiantes -y su(s) número(s) telefónico(s)-, tengan o no número telefónico registrado?

Es aquí que utilizaremos LEFT JOIN en vez de INNER JOIN, simplemente ese cambio, una sola palabra por otra:

Postgresql_2015-02-04 09:45:02

SELECT students.name, phone_numbers.number

FROM students

LEFT JOIN phone_numbers

ON students.id=phone_numbers.idstudent;

Y AHORA SÍ que observamos que el estudiante Pedro aparece pero en donde va el número telefónico muestra NULL el cual es una palabra que encierra un concepto que en base de datos trae aún hoy en día candentes discusiones pero que en este caso práctico muestra su utilidad: «NO TIENE NÚMERO TELEFÓNICO REGISTRADO Y NO SABEMOS SI REALMENTE LO TIENE YA QUE SIMPLEMENTE O SE NEGÓ A SUMINISTRARLO O EL INSCRIPTOR OLVIDÓ REGISTRARLO». Todo eso encierra el concepto de NULL.


Actualizado el martes 12 de enero de 2016: me hacen la sugerencia que pudieramos colocar un campo lógico (verdadero o falso) para saber a ciencia cierta si la persona posee algún teléfono. No veo mala esa idea pero recomiendo que le coloquen NULL como valor predeterminado pero que sea obligatorio ese dato -y por ende no permitirá guardar con NULL-. A nivel de la interfaz del usuario, el formulario que introduce datos para agregar personas deberá utilizarse un RADIO BUTTON sin valor preseleccionado en ninguno de los dos. Ejemplo:

¿Posee teléfono?
Sí.
No.

LEFT JOIN
LEFT JOIN

Ya cerrando la entrada podemos  acotar la consulta JOIN con un simple WHERE tal como ejercitamos en otra entrada:

SELECT students.name, phone_numbers.number
FROM students
LEFT JOIN phone_numbers
ON students.id=phone_numbers.idstudent
WHERE LOWER(students.email) ~ ‘hotmail.com’;

sólo que esta vez veremos sólamente los estudiantes que posean correo electrónico en «hotmail.com» (hoy día «outlook.com») y que tengan al menos un número telefónico registrado.

En la próxima entrada veremos y estudiaremos cuáles otras opciones existen sobre JOIN, tan importante es que en Wikipedia en castellano tiene su propia entrada completa.

<Eso es todo, por ahora>.

PostgreSQL 9.1: consultas SQL sencillas con phpPgAdmin.

Aprovecho el breve receso de estas fechas carnestolendas de 2015 para continuar con esta miniserie de artículos sobre PostgreSQL 9.1. Para aquellos que quieran llevar la secuencia correcta del tema éste se inicia acá .

La fotografía que veís y que encabeza esta entrada es la del Doctor Donald Chamberlin, investigador de la IBM quien junto al Doctor Raymond Boyce (quien falleció en 1974 y muy poquísimas fotografías dejó) ambos idearon (y nos legaron) el «Structured Query Language» (SQL).

Lo que haremos hoy son unas consultas sencillas en SQL no sin antes haber agregado unos cuantos datos de prueba (cualquier semejanza con personas reales es pura y casual coincidencia).

Utilizando el navegador web predeterminado en Debian, el Iceweasel (que cada día aprecio más por su economía de recursos y por ende rapidez) nos vamos a la consabida dirección IP de nuestro servidor virtual:

Postgresql_2015-02-02 19:52:43

Introducimos el «login» y la contraseña (si no lo recuerdan ir a esta entrada ) y una vez hayamos logrado acceso hacemos click («o vamos») a la tabla students (aunque soy fanático del castellano, debo reconocer que el inglés es hoy en día lo que fue el latín en el mundo entero) y observamos su estructura de datos más sin embargo nos interesa, por ahora, el enlace «insert» para dar algunas altas en la tabla:

Postgresql_2015-02-02 19:53:20

Tras lo cual se nos abre el siguiente cuadro de diálogo el cual procedemos a llenar sin cortapisa:

Postgresql_2015-02-02 19:54:05Observen que dejé el campo «id» intencionalmente en blanco: nuestro primer valor será, naturalmente, el 1 pero en los siguientes registros que insertemos intenten guardar ese valor de nuevo y observarán una de las restricciones de la tabla: los valores no pueden repetirse para ese campo en particular. A la final verán algo parecido a esto, ya con los registros insertados:

Postgresql_2015-02-02 19:54:30 Postgresql_2015-02-02 19:58:16

Vuelvo a repetir: cualquier parecido con los datos personales en la realidad es simple y feliz coincidencia. Ahora que tenemos unos cuantos registros insertados podemos hacer unas consultas sencillas, para ello bastará con hacer click en el enlace «SQL» que está en el borde superior derecho de la web, cerquita de

«SQL | History |Find | Logout»

¿lo vieron? en el cuadro de diálogo que se abre escribimos la siguiente sentencia para visualizar los correos electrónicos de los estudiantes:

select email from students;

Antes que hagan click en «execute» («ejecutar -sentencia-«) observen atentamente que estamos trabajando con la base de datos «GNU_academy» y que nuestro vía de búsqueda de esquema está apuntada a «public» (ésto último permite que al ejecutar una sentencia SQL los nombres de tablas y campos sean buscados y verificados primero antes de comenzar a buscar datos, e incluso es útil para asuntos de seguridad y privilegios pero ese tema es más avanzado; si luego quieren aprender más sobre ello aquí el enlace introductorio al asunto ).

Así pues, sin más, ejecutamos la sentencia tras lo cual veremos algo parecido a esto:

Postgresql_2015-02-02 19:59:41

La explicación breve de la sentencia SQL es traducirla del inglés:

«select»->»selecciona»

«from»->»desde (la tabla)»

«;»-> indica fin de la sentencia, no es obligatorio pero es útil si vamos a introducir varias sentencias que deben ir en un orden específico (por ejemplo insertar más datos de estudiantes y luego mostrarlos en un listado para asistencia -ya le vamos dando utilidad en la vida real a esto de las bases de datos-).

Como hay comandos específicos del lenguaje SQL yo opto (y hay varias personas que lo hacen) por escribir dichos comandos en mayúsculas y los nombres de tablas (y/o variables y/o constantes) en minúsculas y como pueden ver se ejecutan sin ningún problema, el asunto es de legibilidad para nosotros los humanos:

SELECT email FROM students;

Importante: los nombres de campos y tablas han escribirse tal cual fueron creados en la base de datos correspondiente, de no ser así nos devuelve error; es por ello que desde un principio en estos tutoriales los creamos todos en minúsculas -y en inglés, de paso-.

Volviendo al tema de la realidad, supongamos que por cualquier razón necesitamos saber cúales (y cuántos) estudiantes utilizan correo hotmail pues simplemente introducimos la siguiente sentencia SQL

SELECT email FROM students WHERE email ~ ‘hotmail.com’;

Observen el nuevo comando

«WHERE»->»donde (satisfazga la condición)»

y el uso de la virgulilla como comparador lógico indicando que dicha condición tenga la cadena de texto ‘hotmail.com’. Otros detalles a considerar es el uso de las comillas simples y el uso de mayúsculas: si usamos comillas dobles se interpreta como nombre de columna y si usamos mayúsculas NO devuelve los correos electrónicos ya que «hoTMail.com» NO ES IGUAL A «hotmail.com»:

«hoTMail.com» <> «hotmail.com»

Sobre nomenclatura del correo electrónico:

Esto nos plantea desde ya nuevos retos: si vamos a desarrollar una aplicación seria es deber que los usuarios ingresen direcciones de correo válidos (sintaxis usuario@dominio ):

  • El nombre del usuario NO debe llevar espacios a menos que estén precedidos por una barra inversa y entrecomillado.
  • El dominio NUNCA debe llevar espacios (ni arrobas, claro está).
  • No pueden haber espacios antes o después de una dirección válida.
  • No pueden llevar dobles puntos «..», así estén entrecomillados.
  • El nombre del usuario no pueden contener dobles arrobas a menos que estén debidamente entrecomillados.

Y son sólo algunas de las reglas que aplican a la sintaxis de una dirección de correo electrónico, para mayor información (en inglés, ¡cuando no!) en RFC 822 y dirección de correo electrónico . La buena noticia es que PosgreSQL admite varios lenguajes de programación que junto con triggers o «disparadores» nos permitirán capturar y revisar los correos electrónicos antes de agregarlos a la base de datos (serán tratados a futuro en una entrada aparte). Y aunque nos hemos salido un poco de las consultas sencillas era necesario ir abonando el terreno hacia temas más avanzados (oh idioma castellano, qué poético eres, nunca cambies 😉 ).

Os ruego hagan la prueba escribiendo las sentencias en sus múltiples variantes, como ayuda os dejo el comando LIKE cuyo uso tiene una sintaxis más elaborada:

SELECT email FROM students WHERE email LIKE ‘%hotmail.com%’;

Produciendo el mismo resultado que con la virgulilla; vale destacar que al colocar el símbolo de porcentaje como comodín le estamos ordenando que nos busque cualquier dirección de correo electrónico registrado en nuestra tabla students que contenga la cadena de caracteres «hotmail.com» (obsérvese que si algún bromista registrara la dirección de correo electrónico «hotmail.com@gmail.com» sería devuelta también en la consulta, os animo a probarla -aunque dudo que alguien en verdad tenga ésa dirección-) pero eso aún no resuelve nuestro problema de mayúsculas y minúsculas.

Una solución sería utilizar una función integrada por defecto en nuestra base de datos, es decir, una serie de programas ya registrados y de propósito general; dicha función para este caso es LOWER() aplicado al campo email (ojo que si es así lo que entrecomillamos como condición debe ir todo en minúsculas):

SELECT email FROM students WHERE LOWER(email) LIKE ‘%hotmail.com%’;

o también podemos usar, como al principio, la virgulilla que nos ahorra el uso de comodines:

SELECT email FROM students WHERE LOWER(email) ~ ‘hotmail.com’;

Si quereís ver el resto de funciones de cadena, haced click aquí.

Por último, si quiséramos el caso contrario, listar los estudiantes que no tienen correo «hotmail» registrado:

SELECT email FROM students WHERE LOWER(email) !~ ‘hotmail.com’;

y lo único que hicimos fue agregarle el operador lógico «!» que indica negación «NOT», el cual si que lo podemos usar con LIKE:

SELECT email FROM students WHERE LOWER(email) NOT LIKE ‘%hotmail.com%’;

Y entonces nos desconectamos de la base de datos como es debido:

Postgresql_2015-02-02 20:01:21

<Eso es todo, por ahora>.

Gaceta Oficial N° 40.597: aumento 15% sueldo 1° febrero 2015.

Son 3 hojitas en formato pdf  (agradezco a «pdfsam» y lo recomiendo para dividir y combinar documentos en ese formato); con este aumento el sueldo mínimo en Venezuela se ubica en Bs. 5.622,48 (si tomamos como referencia el SICAD II serían aproximadamente US$ 114 mensuales).

Para descargar dicho ejemplar electrónico de la Gaceta Oficial desde nuestra página web haga click aquí.

Si desea descargarla desde el Tribunal Supremo de Justicia  deberá luego introducir el número «40597» en el cuadro de búsqueda rápida.

<Eso es todo, por ahora>.

PostgreSQL 9.1: su uso con Visual Paradigm.

En la entrada anterior explicamos cómo instalar y configurar el phpPgAdmin y creamos nuestra primera base de datos (basados en el usuario «adminsql» de la primera entrada de esta mini serie de artículos), y esta entrada estará dedicada a la poderosa herramienta Visual Paradigm (que puede descargar para GNU/Linux en este enlace ) con la cual podremos crear tablas y sus relaciones de una manera gráfica y hasta amena (si se quiere) en comparación a los comandos por cónsola. Para mí es una novedad esta herramienta, y creo que es representativa del nivel de calidad de software que contamos hoy en día no obstante dedicaremos una entrada a las órdenes por cónsola, por aquello de la nostalgia. 😉

Pues bien, empecemos: de primero ya descargamos el archivo llamado Visual_Paradigm_12_0_20150106_Linux32.sh que no es más que un archivo de procesamiento por lotes (o shell script en idioma inglés) en este caso MUY GRANDE que ocupa 253,3 megabytes y al cual hay que dedicarle al menos mil megabytes de espacio en disco para ser instalado. Es grande.

Abrimos una terminal con derechos de usuario root y nos vamos a la carpeta de descargas de nuestro navegador web (o a la carpeta donde realmente los guardamos) y ejecutamos:

./Visual_Paradigm_12_0_20150106_Linux32.sh

Postgresql_2015-02-02 18:45:03Hacemos click en «next» y veremos lo siguiente:

Postgresql_2015-02-02 18:46:09Pueden leer completo (en inglés) la el acuerdo de licencia completo haciendo click aquí. Seleccionamos «I accept the agreement» y hacemos click en «next»:

Postgresql_2015-02-02 18:46:16En nuestro caso dejamos el directorio por defecto (si hacen click en «browse» pueden seleccionar otra ubicación) y hacemos click en «next»:

Postgresql_2015-02-02 18:46:23Dejamos los «symlinks» o «symbolic link» (o «enlace simbólico«) en su directorio por defecto (dichos enlaces simbólicos son archivos que apunta hacia la ubicación real de los archivos y ayudan, por ejemplo, dar nombres cortos a los programas que nos ahorran trabajo cuando escribimos por cónsola). Hacemos click en «next» y comienza realmente la instalación en sí:

Postgresql_2015-02-02 18:47:30 Postgresql_2015-02-02 18:47:39Como queda seleccionada por defecto la opción de ejecutar (o «correr») el programa hacemos click en «next» para seleccionar la opción de uso, en nuestro caso seleccionamos los 30 días de prueba:

Postgresql_2015-02-02 18:47:59Recuerden que «Thus, ‘free software’ is a matter of liberty, not price.» («software libre es cuestión de libertad, no de precio») para nuestros propósitos didácticos la versiónde prueba es más que suficiente:

Postgresql_2015-02-02 18:48:09 Postgresql_2015-02-02 18:48:13Hasta acá queda instalado la herramienta de software, ahora a trabajar en la creación de las tablas y sus relaciones.

Creación de tablas y relaciones.

Nos proponemos crear dos tablas sencillas, una para contener los datos básicos de los estudiantes y otra con los números de teléfonos (teniendo en cuenta que cada persona puede tener un celular o móvil, el teléfono de casa, el de oficina u otro(s) números) relacionados por una «foreign key» que apunta a una «primary key» y en su debida oportunidad veremos las ventajas (y desventajas) de dicha forma de trabajar, todo bajo la «Normalización de base de datos«; por ahora basta con saber que ésos son los conceptos que nos basaremos para modelar.

Una vez que arranca el programa seleccionamos «Database modeling»:

Postgresql_2015-02-02 18:48:56 Postgresql_2015-02-02 18:49:29y luego hacemos click en «Entity Relationship Diagram» y le asignamos el nombre «pupils» al nuevo proyecto:

Postgresql_2015-02-02 19:04:55y procedemos primero que nada a configurar con cuál motor de base de datos vamos a trabajar, PostgreSQL para lo cual nos vamos a la pestaña «tools» y luego «Database Configuration«:

Postgresql_2015-02-02 19:05:06Hacemos click y se abre un cuadro de diálogo para que seleccionemos «PostgreSQL» no sin antes indicar dónde tenemos el «driver file» o «archivo controlador» que servirá para que Visual Paradigm pueda «hablar» con nuestro servidor recién instalado. Si nos fijamos bien en el mismo cuadro de diálogo nos indica de dónde podemos descargarlo:

Postgresql_2015-02-02 19:38:16si hacemos click en «Download link» y tenemos paciencia se abre nuestro navegador web predeterminado con la siguiente página:

Postgresql_2015-02-02 19:09:31 Postgresql_2015-02-02 19:10:00procedemos a descargar el identificado como «postgresql-9.1-903.jdbc4.jar» (observen que para cada versión de PostgreSQL hay su correspondiente controlador, sean cuidadosos al elegir por favor):

Postgresql_2015-02-02 19:11:48Este último cuadro de diálogo para elegir el controlador aparece al hacer click en el botón que muestra 3 puntitos en la misma línea de «Driver file». Al clickear en «Open» procedemos a llenar el resto de los valores que configuramos en las dos entradas anteriores, que en un papelito debemos haber anotado y puesto al alcance de la mano para ganar tiempo:

Postgresql_2015-02-02 19:38:16Luego hacemos click en «Test Connection» y si hemos realizado bien nuestro trabajo veremos algo como esto:

Postgresql_2015-02-02 19:38:23Le damos click a «OK» para entonces agregar la primera futura tabla al hacer click en «Entity -a table-» en el icono que se ve en la siguiente imagen (me disculpan el errorcito de nombre de proyecto, si se fijan) y acto seguido «dibujamos» un rectángulo con tamaño a nuestra apetencia en el área de trabajo:

Postgresql_2015-02-02 18:49:49Lo que viene a continuacón es largo de describir en palabras, pero como decimos en farmacia «hágase según arte» y siendo así manipulamos dicho objeto colocandole los nombres siguientes (no se preocupen, más adelante especificaremos los tipos de datos):

Postgresql_2015-02-02 19:40:05Tal como lo hicimos, de buenas a primera, los tipos de datos son «integer» de allí la letra «N» gorda rellena de blanco en cada renglón. Repetimos el procedimiento pero esta vez debe quedar de esta manera:

Postgresql_2015-02-02 19:40:24

Postgresql_2015-02-02 19:40:55

Ahora si hacemos «click derecho» – click con el botón secundario del ratón- para que en el cuadro de diálogo de cada linea (campo de la tabla) nos permita modificarlo; EJEMPLO seleccionamos el «id» de «students» y lo marcamos como «Primary Key» y un «Id Generator-> Increment»:

Postgresql_2015-02-02 19:42:47Hacemos click en «Ok» y repetimos el procedimiento para el campo «name» PERO lo colocamos para que sea tipo «varchar» (cadena de texto) y acepte hasta 255 letras -toda una exageración- pero vuelvo a repetir «con propósitos didácticos»:

Postgresql_2015-02-02 19:43:25A la final (TÓMENSE SU TIEMPO) las dos tablas han de quedar de la siguiente manera:

Postgresql_2015-02-02 19:48:28Luego procedemos a simplemente hacer click sobre la tabla «students» y al mover el puntero del ratón hacia el borde superior aprecerá rápidamente unos iconos con descripción rápida de uso para cada uno de ellos:

Postgresql_2015-02-02 19:49:03Escogemos «One-to-Many Relationship» (un estudiante puede tener varios números de telefonos distintos -o ninguno-) y arrastramos la línea hasta la tabla «phone_numbers» como aprecian en figura:

Postgresql_2015-02-02 19:49:23A continuación soltamos y se abre menú para escoger detalladamente la relación que queremos:

Postgresql_2015-02-02 19:50:02 Postgresql_2015-02-02 19:50:30Y listo, ya tenemos definida la estructura de datos, sólo que falta el pequeño detalle de «enviarla» al servidor PostgreSQL, para ello de nuevo nos vamos la pestaña «Tools» y luego en «DB»->»Generate Database» (no se preocupen NO vamos a generar base de datos, aunque se puede hacer ya nosotros la creamos cuando instalamos phpPgAdmin ¿se recuerdan?) sólo es cuestión de seleccionar «Update Database» y marcar «Export to database», observen bien:

Postgresql_2015-02-02 19:51:48Recordemos que habíamos configurado previamente las propiedades de conexión, una vez pulsado «OK» (y sin seleccionar «Close dialog…») y si ampliamos y ajustamos el tamaño de ventana detallaremos el maravillos trabajo que nos ahorramos (sí, todas esas líneas de comandos que para este ejemplo son pocas pero imagínense que trabajamos en una empresa que manufactura clavos y nos piden hacer una aplicación que lleve el inventario de materia prima y productos terminados… ufff y eso sin meter las ventas, pedidos, despachos, comisiones de vendedores…):

Postgresql_2015-02-02 19:52:26Ya para finalizar esta entrada, y sólo por desconfianza inherente a nuestra naturaleza humana, verificamos con phpPgAdmin cómo quedaron nuestras tablas (cómo navegar e ingresar están descritos en la entrada anterior) :

Postgresql_2015-02-02 19:52:43En nuestra próxima entrada veremos cómo añadir unos cuantos datos (registros) y los primeros comandos básicos de SQL.

<Eso es todo, por ahora>.

PostgreSQL 9.1: su uso con phpPgAdmin.

En la entrada anterior  dejamos listo el servidor de base de datos PostgreSQL 9.1 y ahora vamos a utilizar software de administración basado en web phpPgAdmin para lo cual echamos mano de una cónsola con derechos (aquí utilizamos root de una buena vez) y luego usamos apt (también pueden utilizar  aptitude-install si gustan y lo tienen configurado):

apt-get install phppgadmin

Recordad que aunque nos referimos como «phpPgAdmin» para el apt debemos escribirlo todo en letras minúsculas para que pueda haber coincidencia con los repositorios, ojito con eso que en GNU/Linux es motivo de frustración en muchas personas (eso y el NUMLOCK encendido). La buena noticia es que, si no lo tenemos instalado, la orden de manera tácita instala el servidor web Apache y el lenguaje de programación PHP a nuestra máquina (los módulos necesarios sólamente, ni más ni menos):

Postgresql_2015-02-02 19:20:34

Una vez que pulsamos la letra «Y» y presionamos «Enter» («S» e «Intro» para los que hablamos castellano):

Postgresql_2015-02-02 19:21:59 Postgresql_2015-02-02 19:22:08

Al finalizar la instalación podemos configurar el phpPgAdmin para que admita conexiones desde cualquier computadora, por seguridad viene sólo para sea administrado directa y únicamente por cónsola de la máquina, así que:

cd /etc/apache2.d

nano phppgadmin

Postgresql_2015-02-02 19:22:50

Así descomentamos (eliminamos «# » del inicio de línea) justo la que está debajo de «allow from 127.0.0. (..)», veréis algo así como esto:

Postgresql_2015-02-02 19:29:38

Guardamos y salimos para luego reiniciar el servidor Apache y que acepte así la nueva configuración que necesitamos:

/etc/init.d/apache2 restart

Postgresql_2015-02-02 19:31:04

Ahora desde cualquier otra máquina en la misma red de área local (recordáis que les dije que anotaran ése valor) podemos proceder a verificar primero si el servidor web funciona:

Postgresql_2015-02-02 19:31:47Esta última captura de pantalla, tal y como se los describí en la entrada origen a este trabajo, es la máquina real que contiene a la máquina virtual en la cual está alojada la máquina virtual cuyo nuestro enrutador de red inalámbrico le asignó la dirección 192.168.1.27 y utilizamos Iceweasel que es el navegador web predeterminado en Debian. Luego procedemos a verificar si el phpPgAdmin está corriendo al introducir en la barra de direcciones el siguiente comando:

http://192.168.1.27/phppgadmin

Postgresql_2015-02-02 19:32:03Hacemos click en el panel izquierdo en donde dice «Servers->PostgreSQL» y nos aparece la pantalla para iniciar sesión:

Postgresql_2015-02-02 19:32:19Para nuestro caso el usuario que le colocamos: «adminsql» y contraseña «12345», entramos y podemos observar que la única base de datos es postgres la cual es utilizada para almacenar valores del PostgreSQL y permitir su funcionamiento, la dejamos tranquilita, si queréis podeís ver sus valor sin modificar nada (por ahora):

Postgresql_2015-02-02 19:32:40Fijad la mirada en el enlace «Create database» allí mismo hacemos click para comenzar a trabajar (¡por fin!) en el proyecto en sí:

Postgresql_2015-02-02 19:37:56Le colocamos el nombre «GNU_academy» en el «encoding» seleccionamos «UTF8» para que acepte nuestros caracteres castellanos («ñÑáÁéÉíÍóÓúUüÜ») y no se preocupen por «Collation» que automáticamente toma la configuración regional del sistema.

Hasta aquí finaliza el tema de phpPgAdmin en la próxima entrada comenzaremos con la poderosa herramienta Visual Paradigm.

<Eso es todo, por ahora>.

Postgresql logo

PostgreSQL 9.1: primeros pasos.

Por motivos de trabajo y estudio hemos descuidado un poco nuestro blog pero antes que termine el mes de enero de 2015 traemos a caso de análisis el potente motor  para bases de datos PostgreSQL y aunque al momento de escribir esto ya van por la versión 9.4 (diciembre de 2014) utilizaremos para nuestro estudio la versión 9.1 (ojito con estos numeritos de la versión que lo usaremos bastante).

En esta entrada haremos un trabajo eminentemente práctico, las teorías y detalles serán tradadas en entradas posterios, dado el tamaño del tema en cuestión. Mi reconocimiento especial a @phenobarbital por su blog que sirve como preciada guía para este nuestro proceso de aprendizaje.

A manera de resumen enumeramos lo siguiente:

  1. Con VirtualBox haremos una máquina virtual Debian 32 bits para hacer allí las pruebas necesarias sin comprometer nuestra máquina real (uso y creación de máquinas virtuales merece una entrada completa aparte a futuro).
  2. Una vez instalada y configurada con sus repositorios instalaremos PostgreSQL y la configuraremos para aceptar conexiones de usuarios de la red de área local (no obstante los comandos los introduciremos directamente por cónsola, las sesiones ssh y Tmux merecen entrada aparte en el blog -a futuro-).
  3. Una vez tengamos el terreno abonado usaremos Visual Paradigm para linux 32 bits en modo demostrativo ya que con esta herramienta definiremos las tablas de una base de datos sencilla, manejo de inscripción de personas en cursos, haciendo una abstracción generalizada de dicho proceso.
  4. Instalaremos phpPgAdmin como herramienta para administrar la base de datos vía web, verificar las tablas e incluso agregar y/o modificar datos.
  5. Con datos agregados (y esperamos agregar unos cuantos millones de usuarios) realizaremos algunas sentencias SQL, uniones y consultas.

 

Pues bien, manos a la obra.


Instalación de PostgreSQL.

Con la máquina virtual corriendo  (512 megabytes RAM, 1 CPU y 1 NIC 100 mbps asignados virtualmente) abrimos una terminal y nos registramos como super usuario, recuerden que debemos tener configurados ya nuestros repositorios y una buena conexión a internet. Para nuestro caso es específico tenemos a la máquina virtual alojada en una red de área local cuyo enrutador asigna direcciones IP internas con DHCP basado en la dirección MAC de la tarjeta de red virtual que está en puente «bridge» con la máquina real así que al arrancar automáticamente ya la tenemos en la dirección 192.168.1.27 y con  5 mbps de velocidad al internet asignada a ella solita para no molestar a los demás usuarios, si no hacemos esto monopolizaremos al modem y no es la idea (de nuevo, todo esto merece una entrada aparte en nuestro blog, a futuro lo haremos).

Ejecutamos en la cónsola:

apt-get update (intro).

apt-get install postgresql-9.1

Recordando siempre que estamos como super usuario, aquí una captura de pantalla de los procesos que más o menos vereís sobre el proceso de instalación.

Postgresql_2015-01-30 07_36_26Postgresql_2015-01-30 07_36_35Postgresql_2015-01-30 07_37_28

Configuración de PostgreSQL.

Una vez finalizada la instalación es que comienza en realidad nuestro trabajo, verificamos si la instalación agregó un usuario llamado «postgres» con el comando:

cat /etc/shadow | egrep «postgres»

a lo cual devuelve algo parecido a esto (si está está agregado el usuario):

postgres:*:16465:0:99999:7:::

Postgresql_2015-01-30 08_30_29

Si es positivo procedemos a conectarnos como usuario «postgres»:

su postgres

y el indicador se convierte en «postgres@postgresql:/home/jimmy$» y esto quiere decir que estamos conectados como usuario «postgres» en la máquina «postgresql» y ubicados en la carpeta «home» del usuario «jimmy». Si queremos ver cual es nuestra carpeta «home», osea el «home» del usuario «postgre» escribimos:

echo $HOME

lo cual devuelve «/var/lib/postgresql».

Postgresql_2015-01-30 08_42_26

La idea es crear un nuevo usuario utilizando la sencilla nomenclatura para nombres y contraseñas (que para propósitos didácticos es excelente PERO para la vida real NO cuidadito con dejar un servidor PostgreSQL configurado así 😯 ).

createuser -sPl adminsql

y nos pregunta contraseña a lo cual introducimos «12345» y confirmamos nuestra elección.

Postgresql_2015-01-30 09_00_52

Ahora si es que vamos a entrar al propio PostgreSQL, escribimos:

psql

lo cual nos devuelve algo parecido a esto (imagen):

Postgresql_2015-01-30 09_04_17

y acto seguido garantizamos que el usuario que acabamos de agregar tenga acceso libre a las bases de datos:

grant all on database postgres to adminsql;

y si nos acepta el comando nos devuelve «GRANT» y listo, salimos de la cónsola con

\quit

Postgresql_2015-01-30 09_08_48

Acceso remoto a PostgreSQL.

No obstante que estamos trabajando en cónsola directamente a la máquina virtual lo más probable es que tengamos que acceder a ella remotamente así que agregamos el usuario que acabamos de agregar al archivo siguiente:

nano /etc/postgresql/9.1/main/pg_hba.conf

y quiere decir que utilizamos el editor de texto «nano» para editar el archivo pg_hba.conf (o utilicen su editor de texto favorito, muy populares son «vi» y pueden instalar «vim» o «gedit», el que gusten). Editamos el archivo donde especifican las direcciones IPv4:

#IPv4 local conections:

host   all   127.0.0.1/32   md5

host    all   192.168.1.0/24   md5

Teniendo cuidado de insertar sólo espacios en blanco entre las palabras (que si usaís la tecla TAB configurar para que la misma inserte espacios y no el caracter mismo tabulador) y recordemos hacer esto cada vez que agreguemos un usuario a la base de datos y así permitirle conectarse de manera remota en una red de área local con su respectiva submáscara de red (en notación CIDR:  «192.168.1.0/24»), me disculpan el error al colocar 255:

Postgresql_2015-01-30 09_18_58

Guardamos y salimos a la linea de comando para ejecutar:

nano /etc/postgresql/9.1/main/postgresql.conf

y modificamos y agregamos los siguientes datos (todo lo que esté escrito a la derecha del símbolo «#» son comentarios que no toma en cuenta el servidor PostgreSQL pero que para nosotros los humanos son importantes):


# – Connection settings –

listen_addresses = ‘*’     #valor por defecto ‘localhost’

max_connections = 50     # valor por defecto 100

# – Memory –

shared_buffers = 16MB   #valor por defecto 24 se requiere «fórmula» para hallar el mejor valor para nuestro servidor según nuestro hardware -nunca más del 40% de la memoria instalada o virtualizada-.

temp_buffers = 8MB   #8 por defecto la subimos a 16 pero eso depende de las consultes que pensemos ejecutar, hay que tantear este valor.

work-men = 16MB    #para las INSERT, DELETE para cada usuario por cada segundo

# – Background Writer –

bgwriter_delay = 500ms #cada medio segundo escribe al disco duro y así evitamos sobrecargar al hardware.

En las siguientes imágenes sólo falta el valor de acceso al disco duro descrito poco antes, observen que coloco una estrella para resaltar los valores que necesitan reiniciar al servidor PostgreSQL (dado el caso que tengamos usuarios conectados utilizamos reload en vez de restart):

Postgresql_2015-01-30 09_43_22


 

Observen escribir cuidadosamente cada uno de los valores antes de guardar (si yo tengo algún error o sugerencia COMENTAR esta entrada) así que si todo está correcto guardamos y salimos a la cónsola de entrada y una vez hecho esto procedemos a reiniciar el servidor de base de datos con la orden:

/etc/init.d/postgresql restart

y si hemos colocado bien las modificaciones devolverá lo siguiente (imagen):

Postgresql_2015-01-30 09_52_09

De no ser así volvemos sobre nuestros pasos hasta que se reinicie el servidor postgresql y avanzar hacia la siguiente etapa de configuración.

En este punto debemos advertir que tocaremos variables de configuración del sistem Debian por lo tanto debemos ser cuidadosos con lo que escribimos, vericar 3 veces lo ingresado; ya que estamos como usuario «postgres» debemos teclear «exit» y presionar la tecla intro y ganar acceso como «root» para así poder ejecutar en cónsola:

nano /etc/sysctl.conf

y agregamos al final los siguientes valores (que por ahora no sabemos qué significan pero en una futura entrada le dedicaremos su correspondiente espacio bien explicado):


kernel.sem = 100 32000 100 128
kernel.shmall = 3279547
kernel.shmmax = 289128448
kernel.shmmni = 8192
fs.file-max = 287573
vm.dirty_bytes = 67108864
vm.dirty_background_bytes = 134217728



 

Revisamos bien los valores guardamos y salimos para ejecutar:

sysctl -p

a lo cual nos devuelve por pantalla precisamente los guarismos que introdujimos:

Postgresql_2015-01-30 10_16_19

Acto seguido comprobamos que el servidor PostgreSQL acepte la nueva configuración pormedio de la orden que ya sabemos:

/etc/init.d/postgresql restart

y si todo va bien veremos lo siguiente:

Postgresql_2015-01-30 10_17_41

Ahora  vamos a instalar el Visual Paradigm 12  phpPgAdmin  desde el enlace que colocamos al inicio de esta entrada y para no resultar tediosa y larga esta entrada continuaremos en otra en el siguente enlace.

<Eso es todo, por ahora>.

Enlaces relacionados.

En castellano:

En inglés:

Anexo:Decreto Presidencial N° 5.229 con Rango, Valor y Fuerza de Ley de Reconversión Monetaria (año 2007)

Fuente:


Decreto Presidencial N° 5.229 con Rango, Valor y Fuerza de Ley de Reconversión Monetaria (año 2007)

HUGO CHÁVEZ FRÍAS
Presidente de la República

En ejercicio de la atribución que le confiere el numeral 8 del artículo 236 de la Constitución de la República Bolivariana de Venezuela, y de conformidad con lo establecido en el numeral 5 del artículo 1° de la Ley que autoriza al Presidente de la República para dictar Decretos con Rango, Valor y Fuerza de Ley, en las materias que se delegan, publicada en la Gaceta Oficial de la República Bolivariana de Venezuela No 38.617 de fecha 1° de febrero de 2007, en Consejo de Ministros,

DICTA

El siguiente,

DECRETO CON RANGO, VALOR Y FUERZA DE LEY DE RECONVERSIÓN MONETARIA

Capítulo I
DISPOSICIONES GENERALES
Artículo 1.

A partir del 1° de enero de 2008, se reexpresa la unidad del sistema monetario de la República Bolivariana de Venezuela, en el equivalente a un mil bolívares actuales. El bolívar resultante de esta reconversión, continuará representándose con el símbolo “Bs.”, siendo divisible en cien (100) céntimos. En consecuencia, todo importe expresado en moneda nacional antes de la citada fecha, deberá ser convertido a la nueva unidad, dividiendo entre 1.000, y llevado al céntimo más cercano.

El redondeo de toda fracción resultante de la reexpresión a que se contrae el presente artículo que sea inferior a cero coma cinco (0,5) céntimos será igual al céntimo inferior; mientras que el de toda fracción resultante de la citada reexpresión que sea igual o superior a cero coma cinco (0,5) céntimos será igual al céntimo superior.

Artículo 2.

Con ocasión de la reconversión monetaria a la que se refiere el artículo anterior, las obligaciones en moneda nacional deberán contraerse en el bolívar reexpresado, en sus múltiplos y, en su caso, submúltiplos. Asimismo, sin perjuicio de lo establecido en la Disposición Transitoria Primera de este Decreto-Ley, a partir del 1° de enero de 2008, las obligaciones de pago en moneda nacional se solventarán mediante la entrega, por su valor nominal, de los signos monetarios que representen al bolívar reexpresado.

Artículo 3.

A partir del 1° de enero de 2008, los precios, salarios y demás prestaciones de carácter social, así como los tributos y demás sumas en moneda nacional contenidas en estados financieros u otros documentos contables, o en títulos de crédito y en general, cualquier operación o referencia expresada en moneda nacional, deberán expresarse conforme al bolívar reexpresado.

Artículo 4.

La reconversión monetaria prevista en el artículo 1° del presente Decreto-Ley, está regida por los principios de igualdad de valor, equivalencia nominal, fungibilidad y gratuidad, en los términos siguientes:

  1. Igualdad de valor: La reconversión monetaria es neutra en el sentido de que no produce alteración del valor de los bienes, servicios, créditos y deudas, cualquiera que sea su naturaleza.
  2. Equivalencia nominal: Todo importe expresado antes del 1° de enero de 2008 será equivalente al importe monetario expresado en bolívares luego de aplicar la conversión prevista en el artículo 1°.
  3. Fungibilidad: Las expresiones contenidas en cualquier medio o instrumento tendrán la misma validez y cualeficacia cuando se hayan convertido con arreglo a la equivalencia prevista en el artículo 1° del presente Decreto-Ley.
  4. Gratuidad: La conversión del bolívar, así como la realización de las operaciones previstas en este Decreto-Ley o de cualesquiera otras que fueren necesarias para su aplicación, será gratuita para los consumidores y usuarios, sin que pueda suponer el cobro de gastos, comisiones, honorarios, precios o conceptos análogos. Se considerará nulo de pleno derecho cualquier cláusula, pacto o convenio que contravenga lo dispuesto en este literal.
Artículo 5.

El Banco Central de Venezuela queda facultado para regular mediante Resoluciones, todo lo relacionado con la ejecución de la reconversión monetaria objeto del presente Decreto-Ley, así como para efectuar todas las actividades conducentes a la dcualebida sustitución de las especies monetarias hasta la puesta en circulación de los nuevos billetes y monedas. A estos efectos, los demás integrantes de los Poderes Públicos deberán, en el ejercicio de sus competencias, brindar el apoyo y la colaboración necesarios y facilitarán los medios que coadyuven al cumplimiento del citado objeto, a fin de preparar y asegurar la adecuada y oportuna operación del sistema monetario reexpresado con la debida salvaguarda de los intereses del público.

Artículo 6.

El Banco Central de Venezuela, en coordinación con el Ejecutivo Nacional, tendrá la responsabilidad de definir la campaña de comunicación de la reconversión monetaria establecida en el artículo 1° del presente Decreto-Ley, la cual tendrá carácter formativo y divulgativo, y se ejecutará a través de todos los medios de comunicación, incluyendo el diseño de iniciativas informativas dirigidas a las comunidades más aisladas.

A tales fines, la campaña integral divulgativa y formativa de la reconversión monetaria asegurará el proceso de aprendizaje en materia de conversión y redondeo de precios, mediante el establecimiento de reglas y ejemplos prácticos que permitan ilustrar los efectos de la reconversión; sensibilizará sobre la importancia y utilidad de la medida de reconversión; advertirá los mecanismos, lapsos y detalles operativos del proceso; enfatizará sobre las características físicas de las nuevas especies monetarias; y recomendará medidas de precaución para proteger a la población.

Las entidades del sector financiero y los órganos y entes de la Administración Pública deberán dedicar en sus planes publicitarios, cualquiera sea el medio aplicable a sus operaciones o actividades con el público, un espacio a la difusión de la nueva equivalencia del bolívar prevista en el artículo 1° del presente Decreto-Ley, en concordancia con las Resoluciones que dicte el Banco Central de Venezuela sobre la materia.

Artículo 7.

La Defensoría del Pueblo, el Instituto Autónomo para la Defensa y Educación del Consumidor y del Usuario, la Superintendencia de Bancos y Otras Instituciones Financieras, el Servicio Nacional Integrado de Administración Aduanera y Tributaria, la Superintendencia de Seguros y la Comisión Nacional de Valores, velarán por el cumplimiento de este Decreto-Ley, actuando cada uno de ellos dentro de las atribuciones y materias que fueren de su específica competencia de acuerdo con la normativa que los rigen.

Artículo 8.

Corresponde al Instituto Autónomo para la Defensa y Educación del Consumidor y del Usuario, recibir y tramitar todas las denuncias y reclamaciones que se susciten en virtud del incumplimiento de alguno de los preceptos contenidos en el presente Decreto-Ley, salvo que, por su naturaleza, correspondan ser conocidas por otro órgano o ente de supervisión y fiscalización de conformidad con las leyes que los rijan.

Dichas denuncias y reclamaciones deberán ser sustanciadas y resueltas conforme al procedimiento administrativo especial, previsto en las leyes respectivas.

Artículo 9.

Salvo disposición especial, los que se nieguen a efectuar la conversión contenida en el artículo 1° de este Decreto-Ley, o incumplan cualesquiera de las obligaciones establecidas en el presente Decreto-Ley, serán sancionados con multa de diez unidades tributarias (10 U.T.) a diez mil unidades tributarias (10.000 U.T.). La multa a que refiere este artículo será impuesta y liquidada por el Instituto Autónomo para la Defensa y Educación del Consumidor y del Usuario, conforme a lo establecido en la Ley de Protección al Consumidor y al Usuario.

En los casos en que el sujeto sea una institución financiera, la multa a que refiere este artículo será impuesta y liquidada por el órgano u organismo de control, vigilancia y fiscalización al que se encuentra sujeta, conforme al procedimiento correspondiente.

Capítulo II
DISPOSICIONES TRANSITORIAS
Primera:

Los billetes y monedas metálicas emitidos por el Banco Central de Venezuela, representativos de la unidad monetaria que se reexpresa en virtud del presente Decreto-Ley, podrán circular con posterioridad al 1° de enero de 2008, quedando expresamente entendido que tales especies monetarias continuarán conservando su poder liberatorio hasta que sean desmonetizadas de acuerdo con Resolución del Banco Central de Venezuela.

Segunda:

En tanto los billetes y monedas metálicas referidos en la Disposición Transitoria Primera del presente Decreto-Ley no hayan sido desmonetizados, el Banco Central de Venezuela incluirá dentro de las características y diseño de los billetes y monedas representativos del bolívar reexpresado, indicaciones que los distingan de las especies monetarias en circulación.

Tercera:

A partir del 1° de enero de 2008 y hasta que el Banco Central de Venezuela mediante Resolución disponga otra cosa, las obligaciones de pago en moneda nacional deberán indicar que se denominan en la nueva unidad mediante la expresión “Bolívares Fuerte” o el símbolo “Bs. F”.

Los cheques y demás títulos de crédito emitidos hasta el 31 de diciembre de 2007, y presentados al cobro a partir del 1° de enero de 2008, serán pagados por los bancos y demás instituciones financieras de acuerdo con la equivalencia establecida en el artículo 1° del presente Decreto-Ley.

Los cheques y demás títulos de crédito emitidos a partir del 1° de enero de 2008, se entenderán que atienden en su monto a la reconversión contenida en este Decreto-Ley.

Cuarta:

Las expresiones en moneda nacional contenidas en leyes, reglamentos, decretos, resoluciones, providencias, circulares, instrumentos o actos administrativos de efectos generales y/o particulares, así como en decisiones judiciales, instrumentos negociables, u otros documentos que produzcan efectos legales que hayan sido dictados y/o entrado en vigor, según el caso, antes del 1° de enero de 2008, deberán ser convertidas conforme a la equivalencia prevista en el artículo 1° del presente Decreto-Ley.

De igual modo, el papel sellado, los timbres fiscales, estampillas y/o sellos postales, así como cualquier otra especie valorada en bolívares actuales deberán ser utilizados hasta su agotamiento, entendiéndose su valor a partir del 1° de enero de 2008 conforme a la equivalencia establecida en el artículo 1° del presente Decreto-Ley.

Quinta:

A partir del 1° de enero de 2008, y hasta tanto el Servicio Nacional Integrado de Administración Aduanera y Tributaria fije el nuevo valor de la unidad tributaria, la misma será la que resulte de aplicar a la vigente la equivalencia establecida en el artículo 1° del presente Decreto-Ley.

Sexta:

Los estados financieros correspondientes a ejercicios concluidos antes del 1° de enero de 2008, cuya aprobación se efectúe con posterioridad a esta fecha, deberán ser expresados en la nueva unidad monetaria.

Séptima:

A partir del 1° de octubre de 2007, y hasta que el Banco Central de Venezuela mediante Resolución disponga lo contrario, todos los instrumentos por los cuales se ofertan los precios de bienes y servicios, así como otros que expresen importes monetarios, emplearán en su referencia tanto la unidad de cuenta previa a la reexpresión a que se contrae el artículo 1°, como la resultante de esta última.

Octava:

El Banco Central de Venezuela deberá realizar, de manera perentoria, las acciones requeridas para satisfacer la producción y distribución de los nuevos billetes y monedas que le corresponde emitir de conformidad con lo previsto en el presente Decreto-Ley, debiendo en consecuencia seleccionar los proveedores de billetes y monedas como productos terminados, así como de los bienes y servicios para su fabricación, y contratar los servicios relacionados con la sustitución de las especies monetarias existentes y la puesta en circulación de las nuevas especies monetarias, a través del procedimiento establecido en el Capítulo II del Título IV del Decreto con Fuerza de Ley de Reforma Parcial de la Ley de Licitaciones, publicada en la Gaceta Oficial de la República Bolivariana de Venezuela No 5.556 Extraordinario de fecha 13 de noviembre de 2001.

Novena:

Corresponde a las personas naturales y jurídicas de derecho público o privado, gestionar lo conducente para que el 1° de enero de 2008, los sistemas de cómputo y cualquier otro mecanismo empleado por éstos para el procesamiento de los negocios y/u operaciones que realicen y que impliquen la referencia a la moneda nacional, estén adaptados a los fines de expresarla conforme a la reconversión prevista en el artículo 1° del presente Decreto-Ley.

A tales efectos, el Banco Central de Venezuela queda facultado para tomar las medidas necesarias y dictar las disposiciones conducentes para facilitar las adecuaciones a que se refiere este artículo.

Décima:

Los bancos y demás instituciones financieras, deberán ajustar sus sistemas y gestionar lo conducente para que el 1° de enero de 2008, estén convertidos en su totalidad los saldos de las cuentas de sus clientes bien sea por operaciones activas, pasivas y otras, de conformidad con lo establecido en el presente Decreto-Ley, e informarla oportunamente a través de los medios que se consideren pertinentes; sin perjuicio de la normativa que dicten los organismos de supervisión y fiscalización a tal efecto.

Undécima:

Quedan exentas de todo impuesto, tasa, arancel o contribución, sean éstos nacionales, estadales, municipales y/o distritales, aquellas actividades u operaciones necesarias para la producción y distribución de los nuevos billetes y monedas que le corresponda emitir al Banco Central de Venezuela de conformidad con el presente Decreto-Ley, así como los bienes y servicios necesarios para su fabricación, y la contratación de los servicios relacionados con la sustitución de las especies monetarias existentes y la puesta en circulación de los billetes y monedas de los bolívares reexpresados, así como aquellas que se generen en la formulación y ejecución de la estrategia divulgativa que deberá efectuar el Banco Central de Venezuela con ocasión de la reexpresión objeto del presente Decreto-Ley.

El Servicio Nacional Integrado de Administración Aduanera y Tributaria, prestará toda la colaboración necesaria para el trámite expedito de todas las importaciones relacionadas con el objeto del presente Decreto-Ley.

Decimosegunda:

Los que se nieguen a recibir las especies monetarias a que se refiere la Disposición Transitoria Primera del presente Decreto-Ley, en concepto de liberación de obligaciones dinerarias, serán sancionados con multa equivalente al cuádruple de la cantidad cuya aceptación se haya rehusado. La multa que refiere este artículo será impuesta y liquidada por el Banco Central de Venezuela.

Capítulo III
DISPOSICIÓN FINAL
Única:

El presente Decreto con Rango, Valor y Fuerza de Ley entrará en vigencia desde la fecha de su publicación en la Gaceta Oficial de la República Bolivariana de Venezuela. Dado en Caracas, a los seis días del mes de marzo de dos mil siete. Años 196° de la Independencia y 148° de la Federación.

Ejecútese,
(L.S.)

HUGO CHÁVEZ FRÍAS