sábado, 13 de abril de 2013

Consulta de Código Postal [Tutorial Parte 1 - Importación a BD]

La intención de este post es crear un pequeño tutorial de varios temas en su manera más básica pero asegurándose que sean útiles. En resumen se creará un servicio web que se encargará de devolver el código postal del algún lugar de méxico, o viceversa. Para mostrarlo utilizaremos PrimeFaces, en el lado de la Base de Datos usaremos PostgreSQL y Hibernate para realizar los mapeos.
Lo primero que necesitamos es tener la información, así que iremos directamente a la página de SEPOMEX (Servicio Postal Mexicano) en el apartado de Descarga Códigos Postales
Esto nos llevará a una página donde nos da la posibilidad de elegir el formato en que se realizará la descarga, para facilitar la importación a la Base de Datos seleccionaremos en tipo TXT.
Ya que tenemos el archivo de texto descomprimido, eliminamos las 2 primeras líneas de éste (ya que sólo contiene una leyenda informativa de la SEPOMEX y si no la eliminamos nos causará Warnings en el momento de importar el archivo a la Base de Datos) y lo guardamos en algún lugar con acceso público de nuestro file system, por ejemplo en C:\Users\Public\Documents.
(Nota: En caso de que tener algún problema para descargar el archivo pueden hacerlo directamente desde este link, aunque tengan en cuenta que la información que en él se encuentre no estará actualizada)
Ahora se requiere crear la Base de Datos en donde se guardará esta información, esto lo hacemos desde el pgAdmin y la llamaremos sepomex:

 
Ahora que tenemos creada nuestra Base de Datos, crearemos una tabla para la información los códigos postales, a la cual llamaremos codigo_postal, pero como serán varias columnas lo haremos desde el editor SQL para facilitar el proceso. En este ejemplo respetaremos los nombres de las columnas de acuerdo al archivo de texto descargado:

CREATE TABLE codigo_postal
(
d_codigo character varying, -- Código Postal asentamiento
d_asenta character varying, -- Nombre asentamiento
d_tipo_asenta character varying, -- Tipo de asentamiento (Catálogo SEPOMEX)
d_mnpio character varying, -- Nombre Municipio (INEGI, Octubre 2012)
d_estado character varying, -- Nombre Entidad (INEGI, Octubre 2012)
d_ciudad character varying, -- Nombre Ciudad (Catálogo SEPOMEX)
d_cp character varying, -- Código Postal de la Administración Postal que reparte al asentamiento
c_estado character varying, -- Clave Entidad (INEGI, Octubre 2012)
c_oficina character varying, -- Clavel del Código Postal de la Administración Postal que reparte al asentamiento
c_cp character varying, -- Campo vacío
c_tipo_asenta character varying, -- Clave Tipo de asentamiento (Catálogo SEPOMEX)
c_mnpio character varying, -- Clave Municipio (INEGI, Octubre 2012)
id_asenta_cpcons character varying, -- Identificador único del asentamiento (nivel estatal)
d_zona character varying, -- Zona en la que se ubica el asentamiento (Urbano/Rural)
c_cve_ciudad character varying -- Clave Ciudad (Catálogo SEPOMEX)
)
WITH (
OIDS=FALSE
);
ALTER TABLE codigo_postal
OWNER TO postgres;
COMMENT ON COLUMN codigo_postal.d_codigo IS 'Código Postal asentamiento';
COMMENT ON COLUMN codigo_postal.d_asenta IS 'Nombre asentamiento';
COMMENT ON COLUMN codigo_postal.d_tipo_asenta IS 'Tipo de asentamiento (Catálogo SEPOMEX)';
COMMENT ON COLUMN codigo_postal.d_mnpio IS 'Nombre Municipio (INEGI, Octubre 2012)';
COMMENT ON COLUMN codigo_postal.d_estado IS 'Nombre Entidad (INEGI, Octubre 2012)';
COMMENT ON COLUMN codigo_postal.d_ciudad IS 'Nombre Ciudad (Catálogo SEPOMEX) ';
COMMENT ON COLUMN codigo_postal.d_cp IS 'Código Postal de la Administración Postal que reparte al asentamiento';
COMMENT ON COLUMN codigo_postal.c_estado IS 'Clave Entidad (INEGI, Octubre 2012)';
COMMENT ON COLUMN codigo_postal.c_oficina IS 'Clavel del Código Postal de la Administración Postal que reparte al asentamiento';
COMMENT ON COLUMN codigo_postal.c_cp IS 'Campo vacío';
COMMENT ON COLUMN codigo_postal.c_tipo_asenta IS 'Clave Tipo de asentamiento (Catálogo SEPOMEX)';
COMMENT ON COLUMN codigo_postal.c_mnpio IS 'Clave Municipio (INEGI, Octubre 2012)';
COMMENT ON COLUMN codigo_postal.id_asenta_cpcons IS 'Identificador único del asentamiento (nivel estatal)';
COMMENT ON COLUMN codigo_postal.d_zona IS 'Zona en la que se ubica el asentamiento (Urbano/Rural) ';
COMMENT ON COLUMN codigo_postal.c_cve_ciudad IS 'Clave Ciudad (Catálogo SEPOMEX)';
Copiamos estas instrucciones y las ejecutamos en el Editor SQL:
Si todo esto se ejecutó de manera correcta importaremos la información de nuestro archivo de texto a la tabla recién creada. Para esto abriremos el SQL Shell
Entraremos a la Base de Datos sepomex y ejecutaremos la siguiente instrucción (suponiendo que nuestro archivo se llama CPdescarga.txt y se encuentra en C:\Users\Public\Documents):

COPY codigo_postal FROM 'C:\Users\Public\Documents\CPdescarga.txt' DELIMITERS '|' CSV;
(Nota: Esto lo hacemos desde el shell y no desde el editor SQL debido a que el archivo de texto que descargamos se encuentra codificado en ANSI, mientras que el editor SQL ejecuta las sentencias en UTF8)
Y listo! Tenemos nuestra tabla con los Códigos Postales de todo el país.
El siguiente paso es realizar el mapeo a la Base de Datos usando Hibernate.